From 881cb418b52f1f66fa778f58ffbfebf1cbdcf842 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 4 Jul 2019 12:50:13 +0300 Subject: [PATCH 001/117] Added kotlin interpreter stub --- conf/interpreter-list | 1 + kotlin/pom.xml | 67 +++++++++++++++++++ .../zeppelin/kotlin/KotlinInterpreter.java | 45 +++++++++++++ .../main/resources/interpreter-setting.json | 14 ++++ pom.xml | 1 + 5 files changed, 128 insertions(+) create mode 100644 kotlin/pom.xml create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java create mode 100644 kotlin/src/main/resources/interpreter-setting.json diff --git a/conf/interpreter-list b/conf/interpreter-list index 7c746d7e0b1..dd70f781182 100644 --- a/conf/interpreter-list +++ b/conf/interpreter-list @@ -38,3 +38,4 @@ pig org.apache.zeppelin:zeppelin-pig:0.9.0 Pig inte python org.apache.zeppelin:zeppelin-python:0.9.0 Python interpreter scio org.apache.zeppelin:zeppelin-scio_2.11:0.9.0 Scio interpreter shell org.apache.zeppelin:zeppelin-shell:0.9.0 Shell command +kotlin org.apache.zeppelin:zeppelin-kotlin:0.9.0 Kotlin interpreter diff --git a/kotlin/pom.xml b/kotlin/pom.xml new file mode 100644 index 00000000000..b32c1501de9 --- /dev/null +++ b/kotlin/pom.xml @@ -0,0 +1,67 @@ + + + + + 4.0.0 + + + zeppelin-interpreter-parent + org.apache.zeppelin + 0.9.0-SNAPSHOT + ../zeppelin-interpreter-parent/pom.xml + + + org.apache.zeppelin + zeppelin-kotlin + jar + 0.9.0-SNAPSHOT + Zeppelin: Kotlin interpreter + + + + kotlin + + + + + + + + + + maven-enforcer-plugin + + + maven-dependency-plugin + + + maven-resources-plugin + + + maven-shade-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + false + + + + + diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java new file mode 100644 index 00000000000..c1f6ddcee2e --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -0,0 +1,45 @@ +package org.apache.zeppelin.kotlin; + +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterResult; + +import java.util.Properties; + +public class KotlinInterpreter extends Interpreter { + public KotlinInterpreter(Properties properties) { + super(properties); + } + + @Override + public void open() throws InterpreterException { + + } + + @Override + public void close() throws InterpreterException { + + } + + @Override + public InterpreterResult interpret(String st, + InterpreterContext context) throws InterpreterException { + return new InterpreterResult(InterpreterResult.Code.SUCCESS, st); + } + + @Override + public void cancel(InterpreterContext context) throws InterpreterException { + + } + + @Override + public FormType getFormType() throws InterpreterException { + return FormType.SIMPLE; + } + + @Override + public int getProgress(InterpreterContext context) throws InterpreterException { + return 0; + } +} diff --git a/kotlin/src/main/resources/interpreter-setting.json b/kotlin/src/main/resources/interpreter-setting.json new file mode 100644 index 00000000000..ef432f3b68c --- /dev/null +++ b/kotlin/src/main/resources/interpreter-setting.json @@ -0,0 +1,14 @@ +[ + { + "group": "kotlin", + "name": "kotlin", + "className": "org.apache.zeppelin.kotlin.KotlinInterpreter", + "defaultInterpreter": true, + "properties": { + }, + "editor": { + "language": "kotlin", + "editOnDblClick": false + } + } +] diff --git a/pom.xml b/pom.xml index 6f32b9b919e..ab65cfbf808 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,7 @@ zeppelin-interpreter-api zeppelin-zengine zeppelin-display + kotlin groovy spark submarine From 61ff6d3c693bd3829a31e7f6275498573f491588 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 4 Jul 2019 16:53:42 +0300 Subject: [PATCH 002/117] Loading compiler configuration --- .../zeppelin/kotlin/KotlinInterpreter.java | 11 ++- .../kotlin/repl/KotlinPluginLoader.java | 70 +++++++++++++++++++ .../kotlin/repl/MessageCollectorImpl.java | 34 +++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index c1f6ddcee2e..16dbe7f9481 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -4,6 +4,9 @@ import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.repl.KotlinPluginLoader; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.scripting.repl.ReplInterpreter; import java.util.Properties; @@ -12,8 +15,13 @@ public KotlinInterpreter(Properties properties) { super(properties); } + private KotlinPluginLoader loader; + private ReplInterpreter interpreter; + @Override public void open() throws InterpreterException { + loader = new KotlinPluginLoader(); + CompilerConfiguration configuration = loader.loadCompilerConfiguration(); } @@ -25,7 +33,8 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { - return new InterpreterResult(InterpreterResult.Code.SUCCESS, st); + String result = loader.getJarPathByName(st); + return new InterpreterResult(InterpreterResult.Code.SUCCESS, result); } @Override diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java new file mode 100644 index 00000000000..2d5697b461c --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java @@ -0,0 +1,70 @@ +package org.apache.zeppelin.kotlin.repl; + +import org.apache.zeppelin.dep.Booter; +import org.apache.zeppelin.dep.DependencyResolver; +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; +import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.sonatype.aether.RepositoryException; +import org.sonatype.aether.repository.RemoteRepository; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; + +import static org.jetbrains.kotlin.utils.PathUtil.*; + +public class KotlinPluginLoader { + + private DependencyResolver resolver; + private static final List pluginJars = Arrays.asList( + KOTLIN_SCRIPTING_COMPILER_PLUGIN_JAR, + KOTLIN_SCRIPTING_COMPILER_IMPL_JAR, + KOTLIN_SCRIPTING_COMMON_JAR, + KOTLIN_SCRIPTING_JVM_JAR, + KOTLIN_JAVA_STDLIB_SRC_JAR + ); + private static final String KOTLIN_STDLIB_JAR = "kotlin-stdlib.jar"; + + public KotlinPluginLoader() { + RemoteRepository mvnLocalRepo = Booter.newLocalRepository(); + String path = mvnLocalRepo.getUrl(); + resolver = new DependencyResolver(path); + } + + public String getJarPathByName(String name) { + try { + return resolver.load(name).get(0).getAbsolutePath(); + } catch (RepositoryException | IOException e) { + return null; + } + } + + private String findJavaRuntimeJarPath() { + // TODO get actual runtime jar + return "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/"; + } + + private void addClassPathRoot(CompilerConfiguration configuration, String path) { + configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, + new JvmClasspathRoot(new File(path))); + } + + public CompilerConfiguration loadCompilerConfiguration() { // TODO split into two classes w/ plugin and compiler loader + CompilerConfiguration configuration = new CompilerConfiguration(); + + configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, new MessageCollectorImpl()); + + addClassPathRoot(configuration, findJavaRuntimeJarPath()); + addClassPathRoot(configuration, getJarPathByName(KOTLIN_STDLIB_JAR)); + + PluginCliParser.loadPluginsSafe(pluginJars, null, configuration); + + return configuration; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java new file mode 100644 index 00000000000..e094d506986 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java @@ -0,0 +1,34 @@ +package org.apache.zeppelin.kotlin.repl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation; +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity; +import org.jetbrains.kotlin.cli.common.messages.MessageCollector; + +public class MessageCollectorImpl implements MessageCollector { + @Override + public void clear() {} + + @Override + public boolean hasErrors() { + return false; + } + + @Override + public void report(@NotNull CompilerMessageSeverity severity, + @NotNull String message, + @Nullable CompilerMessageLocation location) { + if (severity.isError()) { + String prefix = ""; + if (location != null) { + prefix = formatLocationPrefix(location); + throw new AssertionError(prefix + message); + } + } + } + + private static String formatLocationPrefix(CompilerMessageLocation location) { + return "(" + location.getPath() + ":" + location.getLine() + ":" + location.getColumn() + ") "; + } +} From bf6825ee586a31d97a2430046cdc1b67f22b3682 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 4 Jul 2019 17:18:55 +0300 Subject: [PATCH 003/117] Added kotlin REPL interpreter with IO stubs --- kotlin/pom.xml | 26 ++++ .../zeppelin/kotlin/KotlinInterpreter.java | 35 ++++- .../kotlin/repl/KotlinPluginLoader.java | 11 +- .../repl/ZeppelinReplConfiguration.java | 122 ++++++++++++++++++ 4 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java diff --git a/kotlin/pom.xml b/kotlin/pom.xml index b32c1501de9..5fc1b3bd6b1 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -38,6 +38,32 @@ + + + org.jetbrains.kotlin + kotlin-scripting-compiler-impl + 1.3.40 + + + org.jetbrains.kotlin + kotlin-compiler + 1.3.40 + + + org.jetbrains.kotlin + kotlin-stdlib + 1.3.40 + + + org.jetbrains.kotlin + kotlin-scripting-common + 1.3.40 + + + org.jetbrains.kotlin + kotlin-scripting-jvm + 1.3.40 + diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 16dbe7f9481..d9d48829baa 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -1,12 +1,16 @@ package org.apache.zeppelin.kotlin; + import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.repl.KotlinPluginLoader; +import org.apache.zeppelin.kotlin.repl.ZeppelinReplConfiguration; +import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.scripting.repl.ReplInterpreter; +import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; import java.util.Properties; @@ -21,8 +25,12 @@ public KotlinInterpreter(Properties properties) { @Override public void open() throws InterpreterException { loader = new KotlinPluginLoader(); - CompilerConfiguration configuration = loader.loadCompilerConfiguration(); - + CompilerConfiguration compilerConf = loader.loadCompilerConfiguration(); + ReplConfiguration replConf = new ZeppelinReplConfiguration(); + interpreter = new ReplInterpreter( + () -> {}, + compilerConf, + replConf); } @Override @@ -33,14 +41,27 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { - String result = loader.getJarPathByName(st); - return new InterpreterResult(InterpreterResult.Code.SUCCESS, result); + ReplEvalResult result = interpreter.eval(st); + if (result instanceof ReplEvalResult.ValueResult) { + String value = ((ReplEvalResult.ValueResult) result).getValue().toString(); + return new InterpreterResult(InterpreterResult.Code.SUCCESS, value); + } + if (result instanceof ReplEvalResult.UnitResult) { + return new InterpreterResult(InterpreterResult.Code.SUCCESS, ""); + } + if (result instanceof ReplEvalResult.Error) { + String errorMsg = ((ReplEvalResult.Error) result).getMessage(); + return new InterpreterResult(InterpreterResult.Code.ERROR, errorMsg); + } + if (result instanceof ReplEvalResult.Incomplete) { + return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); + } + + return new InterpreterResult(InterpreterResult.Code.ERROR, "Unknown error"); } @Override - public void cancel(InterpreterContext context) throws InterpreterException { - - } + public void cancel(InterpreterContext context) throws InterpreterException { } @Override public FormType getFormType() throws InterpreterException { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java index 2d5697b461c..2b2fdc5026d 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java @@ -16,7 +16,11 @@ import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; -import static org.jetbrains.kotlin.utils.PathUtil.*; +import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMPILER_PLUGIN_JAR; +import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMPILER_IMPL_JAR; +import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMMON_JAR; +import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_JVM_JAR; +import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_JAVA_STDLIB_SRC_JAR; public class KotlinPluginLoader { @@ -45,7 +49,7 @@ public String getJarPathByName(String name) { } private String findJavaRuntimeJarPath() { - // TODO get actual runtime jar + // TODO(dk) get actual runtime jar return "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/"; } @@ -54,7 +58,8 @@ private void addClassPathRoot(CompilerConfiguration configuration, String path) new JvmClasspathRoot(new File(path))); } - public CompilerConfiguration loadCompilerConfiguration() { // TODO split into two classes w/ plugin and compiler loader + // TODO(dk) split into two classes w/ plugin and compiler loader + public CompilerConfiguration loadCompilerConfiguration() { CompilerConfiguration configuration = new CompilerConfiguration(); configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java new file mode 100644 index 00000000000..b93e0ca253d --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java @@ -0,0 +1,122 @@ +package org.apache.zeppelin.kotlin.repl; + +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.diagnostics.Diagnostic; +import org.jetbrains.kotlin.scripting.repl.ReplExceptionReporter; +import org.jetbrains.kotlin.scripting.repl.ReplFromTerminal; +import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; +import org.jetbrains.kotlin.scripting.repl.configuration.SnippetExecutionInterceptor; +import org.jetbrains.kotlin.scripting.repl.messages.DiagnosticMessageHolder; +import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; +import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; + + +// TODO(dk) implement everything +public class ZeppelinReplConfiguration implements ReplConfiguration { + @Override + public boolean getAllowIncompleteLines() { + return false; + } + + @NotNull + @Override + public ReplCommandReader getCommandReader() { + return new ReplCommandReader() { + @Nullable + @Override + public String readLine(@NotNull ReplFromTerminal.WhatNextAfterOneLine next) { + return ""; + } + + @Override + public void flushHistory() { } + }; + } + + @NotNull + @Override + public ReplExceptionReporter getExceptionReporter() { + return ReplExceptionReporter.DoNothing; + } + + @NotNull + @Override + public SnippetExecutionInterceptor getExecutionInterceptor() { + return SnippetExecutionInterceptor.Plain; + } + + @NotNull + @Override + public ReplWriter getWriter() { + return new ReplWriter() { + @Override + public void printlnWelcomeMessage(@NotNull String s) { + + } + + @Override + public void printlnHelpMessage(@NotNull String s) { + + } + + @Override + public void outputCommandResult(@NotNull String s) { + + } + + @Override + public void notifyReadLineStart() { + + } + + @Override + public void notifyReadLineEnd() { + + } + + @Override + public void notifyIncomplete() { + + } + + @Override + public void notifyCommandSuccess() { + + } + + @Override + public void outputCompileError(@NotNull String s) { + + } + + @Override + public void outputRuntimeError(@NotNull String s) { + + } + + @Override + public void sendInternalErrorReport(@NotNull String s) { + + } + }; + } + + @NotNull + @Override + public DiagnosticMessageHolder createDiagnosticHolder() { + return new DiagnosticMessageHolder() { + @NotNull + @Override + public String renderMessage() { + return ""; + } + + @Override + public void report(@NotNull Diagnostic diagnostic, + @NotNull PsiFile psiFile, + @NotNull String s) { } + }; + } +} From 2cca5c999dab3c122326c9e86d34f5e5fc383fa5 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 8 Jul 2019 15:41:24 +0300 Subject: [PATCH 004/117] Fixed kotlin interpreter, path to java and kotlin runtimes are hardcoded --- kotlin/kotlin-compiler-shaded/pom.xml | 62 ++++++++++ kotlin/pom.xml | 10 +- .../zeppelin/kotlin/KotlinInterpreter.java | 16 ++- .../conf/compiler/KotlinPluginLoader.java | 51 +++++++++ .../compiler}/MessageCollectorImpl.java | 2 +- .../zeppelin/kotlin/conf/repl/ReaderStub.java | 17 +++ .../zeppelin/kotlin/conf/repl/WriterStub.java | 56 +++++++++ .../repl/ZeppelinReplConfiguration.java | 89 ++++----------- .../kotlin/conf/repl/ZeppelinReplWriter.java | 106 ++++++++++++++++++ .../kotlin/repl/KotlinPluginLoader.java | 75 ------------- 10 files changed, 331 insertions(+), 153 deletions(-) create mode 100644 kotlin/kotlin-compiler-shaded/pom.xml create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{repl => conf/compiler}/MessageCollectorImpl.java (95%) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{ => conf}/repl/ZeppelinReplConfiguration.java (52%) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java diff --git a/kotlin/kotlin-compiler-shaded/pom.xml b/kotlin/kotlin-compiler-shaded/pom.xml new file mode 100644 index 00000000000..1aaa57e9dfd --- /dev/null +++ b/kotlin/kotlin-compiler-shaded/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + + zeppelin-interpreter-parent + org.apache.zeppelin + 0.9.0-SNAPSHOT + ../../zeppelin-interpreter-parent/pom.xml + + + kotlin-compiler-shaded + 1.3.40 + jar + + + + org.jetbrains.kotlin + kotlin-compiler + 1.3.40 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.0 + + + package + + shade + + + + + org.apache.log4j + org.jetbrains.kotlin.shaded.log4j + + + com.google + org.jetbrains.kotlin.shaded.com.google + + + net.jpountz + org.jetbrains.kotlin.shaded.net.jpountz + + + + + + + + + + + + diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 5fc1b3bd6b1..80f51e12314 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -33,7 +33,6 @@ Zeppelin: Kotlin interpreter - kotlin @@ -41,12 +40,16 @@ org.jetbrains.kotlin - kotlin-scripting-compiler-impl + kotlin-compiler-embeddable + 1.3.40 + + org.jetbrains.kotlin + kotlin-scripting-compiler-embeddable 1.3.40 org.jetbrains.kotlin - kotlin-compiler + kotlin-scripting-compiler-impl-embeddable 1.3.40 @@ -64,7 +67,6 @@ kotlin-scripting-jvm 1.3.40 - diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index d9d48829baa..2f10abaac08 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -4,13 +4,13 @@ import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterOutput; import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.kotlin.repl.KotlinPluginLoader; -import org.apache.zeppelin.kotlin.repl.ZeppelinReplConfiguration; +import org.apache.zeppelin.kotlin.conf.compiler.KotlinPluginLoader; +import org.apache.zeppelin.kotlin.conf.repl.ZeppelinReplConfiguration; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.scripting.repl.ReplInterpreter; -import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; import java.util.Properties; @@ -19,14 +19,14 @@ public KotlinInterpreter(Properties properties) { super(properties); } - private KotlinPluginLoader loader; private ReplInterpreter interpreter; + private ZeppelinReplConfiguration replConf; @Override public void open() throws InterpreterException { - loader = new KotlinPluginLoader(); + KotlinPluginLoader loader = new KotlinPluginLoader(); CompilerConfiguration compilerConf = loader.loadCompilerConfiguration(); - ReplConfiguration replConf = new ZeppelinReplConfiguration(); + replConf = new ZeppelinReplConfiguration(); interpreter = new ReplInterpreter( () -> {}, compilerConf, @@ -41,7 +41,11 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { + ReplEvalResult result = interpreter.eval(st); + InterpreterOutput out = context.out; + replConf.setOutput(out); + if (result instanceof ReplEvalResult.ValueResult) { String value = ((ReplEvalResult.ValueResult) result).getValue().toString(); return new InterpreterResult(InterpreterResult.Code.SUCCESS, value); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java new file mode 100644 index 00000000000..234ade2419d --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java @@ -0,0 +1,51 @@ +package org.apache.zeppelin.kotlin.conf.compiler; + +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; +import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +public class KotlinPluginLoader { + private static final Logger LOGGER = LoggerFactory.getLogger(KotlinPluginLoader.class); + private static final String KOTLIN_STDLIB_JAR = "kotlin-stdlib.jar"; + private static final String LIB_PATH = "/Users/dmitry.kaznacheev/zeppelin/dist/kotlinc/lib/"; + + public KotlinPluginLoader() { + } + + String pathTo(String path) { + return LIB_PATH + path; + } + + private String findJavaRuntimeJarPath() { + // TODO(dk) get actual runtime jar + return "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/"; + } + + private void addClassPathRoot(CompilerConfiguration configuration, String path) { + configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, + new JvmClasspathRoot(new File(path))); + } + + // TODO(dk) split into two classes w/ plugin and compiler loader + public CompilerConfiguration loadCompilerConfiguration() { + CompilerConfiguration configuration = new CompilerConfiguration(); + + configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, new MessageCollectorImpl()); + + addClassPathRoot(configuration, findJavaRuntimeJarPath()); + addClassPathRoot(configuration, pathTo(KOTLIN_STDLIB_JAR)); + + configuration.add(ComponentRegistrar.Companion.getPLUGIN_COMPONENT_REGISTRARS(), + new ScriptingCompilerConfigurationComponentRegistrar()); + + return configuration; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java similarity index 95% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java index e094d506986..b9d1698d660 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/MessageCollectorImpl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java @@ -1,4 +1,4 @@ -package org.apache.zeppelin.kotlin.repl; +package org.apache.zeppelin.kotlin.conf.compiler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java new file mode 100644 index 00000000000..5f83af2221f --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java @@ -0,0 +1,17 @@ +package org.apache.zeppelin.kotlin.conf.repl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.scripting.repl.ReplFromTerminal; +import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; + +public class ReaderStub implements ReplCommandReader { + @Nullable + @Override + public String readLine(@NotNull ReplFromTerminal.WhatNextAfterOneLine next) { + return ""; + } + + @Override + public void flushHistory() { } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java new file mode 100644 index 00000000000..ff75b3ae347 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java @@ -0,0 +1,56 @@ +package org.apache.zeppelin.kotlin.conf.repl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; + +public class WriterStub implements ReplWriter { + @Override + public void notifyCommandSuccess() { + + } + + @Override + public void notifyIncomplete() { + + } + + @Override + public void notifyReadLineEnd() { + + } + + @Override + public void notifyReadLineStart() { + + } + + @Override + public void outputCommandResult(@NotNull String s) { + + } + + @Override + public void outputCompileError(@NotNull String s) { + + } + + @Override + public void outputRuntimeError(@NotNull String s) { + + } + + @Override + public void printlnHelpMessage(@NotNull String s) { + + } + + @Override + public void printlnWelcomeMessage(@NotNull String s) { + + } + + @Override + public void sendInternalErrorReport(@NotNull String s) { + + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java similarity index 52% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java index b93e0ca253d..473905e8b4c 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ZeppelinReplConfiguration.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java @@ -1,20 +1,33 @@ -package org.apache.zeppelin.kotlin.repl; +package org.apache.zeppelin.kotlin.conf.repl; -import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.com.intellij.psi.PsiFile; import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.scripting.repl.ReplExceptionReporter; -import org.jetbrains.kotlin.scripting.repl.ReplFromTerminal; import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; import org.jetbrains.kotlin.scripting.repl.configuration.SnippetExecutionInterceptor; import org.jetbrains.kotlin.scripting.repl.messages.DiagnosticMessageHolder; import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; +import java.io.OutputStream; + // TODO(dk) implement everything public class ZeppelinReplConfiguration implements ReplConfiguration { + + private ReplCommandReader reader; + private ReplWriter writer; + + public ZeppelinReplConfiguration() { + reader = new ReaderStub(); + writer = new WriterStub(); + } + + public void setOutput(OutputStream out) { + this.writer = new ZeppelinReplWriter(out); + } + @Override public boolean getAllowIncompleteLines() { return false; @@ -23,16 +36,7 @@ public boolean getAllowIncompleteLines() { @NotNull @Override public ReplCommandReader getCommandReader() { - return new ReplCommandReader() { - @Nullable - @Override - public String readLine(@NotNull ReplFromTerminal.WhatNextAfterOneLine next) { - return ""; - } - - @Override - public void flushHistory() { } - }; + return reader; } @NotNull @@ -50,57 +54,7 @@ public SnippetExecutionInterceptor getExecutionInterceptor() { @NotNull @Override public ReplWriter getWriter() { - return new ReplWriter() { - @Override - public void printlnWelcomeMessage(@NotNull String s) { - - } - - @Override - public void printlnHelpMessage(@NotNull String s) { - - } - - @Override - public void outputCommandResult(@NotNull String s) { - - } - - @Override - public void notifyReadLineStart() { - - } - - @Override - public void notifyReadLineEnd() { - - } - - @Override - public void notifyIncomplete() { - - } - - @Override - public void notifyCommandSuccess() { - - } - - @Override - public void outputCompileError(@NotNull String s) { - - } - - @Override - public void outputRuntimeError(@NotNull String s) { - - } - - @Override - public void sendInternalErrorReport(@NotNull String s) { - - } - }; + return writer; } @NotNull @@ -115,8 +69,9 @@ public String renderMessage() { @Override public void report(@NotNull Diagnostic diagnostic, - @NotNull PsiFile psiFile, - @NotNull String s) { } + @NotNull PsiFile psiFile, @NotNull String s) { + + } }; } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java new file mode 100644 index 00000000000..c39f4adc43d --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java @@ -0,0 +1,106 @@ +package org.apache.zeppelin.kotlin.conf.repl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; + +public class ZeppelinReplWriter implements ReplWriter { + + private OutputStreamWriter out; + + public ZeppelinReplWriter(OutputStream out) { + this.out = new OutputStreamWriter(out); + } + + @Override + public void notifyCommandSuccess() { + try { + out.write("SUCCESS"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void notifyIncomplete() { + try { + out.write("INCOMPLETE"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void notifyReadLineEnd() { + try { + out.write("READLINEEND"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void notifyReadLineStart() { + try { + out.write("READLINESTART"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void outputCommandResult(@NotNull String s) { + try { + out.write("RESULT " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void outputCompileError(@NotNull String s) { + try { + out.write("COMPILE ERROR " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void outputRuntimeError(@NotNull String s) { + try { + out.write("COMPILE ERROR " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void printlnHelpMessage(@NotNull String s) { + try { + out.write("HELP " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void printlnWelcomeMessage(@NotNull String s) { + try { + out.write("WELCOME " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void sendInternalErrorReport(@NotNull String s) { + try { + out.write("INTERNAL ERROR " + s); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java deleted file mode 100644 index 2b2fdc5026d..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinPluginLoader.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.apache.zeppelin.kotlin.repl; - -import org.apache.zeppelin.dep.Booter; -import org.apache.zeppelin.dep.DependencyResolver; -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; -import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser; -import org.jetbrains.kotlin.config.CommonConfigurationKeys; -import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.sonatype.aether.RepositoryException; -import org.sonatype.aether.repository.RemoteRepository; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; - -import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; - -import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMPILER_PLUGIN_JAR; -import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMPILER_IMPL_JAR; -import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_COMMON_JAR; -import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_SCRIPTING_JVM_JAR; -import static org.jetbrains.kotlin.utils.PathUtil.KOTLIN_JAVA_STDLIB_SRC_JAR; - -public class KotlinPluginLoader { - - private DependencyResolver resolver; - private static final List pluginJars = Arrays.asList( - KOTLIN_SCRIPTING_COMPILER_PLUGIN_JAR, - KOTLIN_SCRIPTING_COMPILER_IMPL_JAR, - KOTLIN_SCRIPTING_COMMON_JAR, - KOTLIN_SCRIPTING_JVM_JAR, - KOTLIN_JAVA_STDLIB_SRC_JAR - ); - private static final String KOTLIN_STDLIB_JAR = "kotlin-stdlib.jar"; - - public KotlinPluginLoader() { - RemoteRepository mvnLocalRepo = Booter.newLocalRepository(); - String path = mvnLocalRepo.getUrl(); - resolver = new DependencyResolver(path); - } - - public String getJarPathByName(String name) { - try { - return resolver.load(name).get(0).getAbsolutePath(); - } catch (RepositoryException | IOException e) { - return null; - } - } - - private String findJavaRuntimeJarPath() { - // TODO(dk) get actual runtime jar - return "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/"; - } - - private void addClassPathRoot(CompilerConfiguration configuration, String path) { - configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, - new JvmClasspathRoot(new File(path))); - } - - // TODO(dk) split into two classes w/ plugin and compiler loader - public CompilerConfiguration loadCompilerConfiguration() { - CompilerConfiguration configuration = new CompilerConfiguration(); - - configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); - configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, new MessageCollectorImpl()); - - addClassPathRoot(configuration, findJavaRuntimeJarPath()); - addClassPathRoot(configuration, getJarPathByName(KOTLIN_STDLIB_JAR)); - - PluginCliParser.loadPluginsSafe(pluginJars, null, configuration); - - return configuration; - } -} From 4016576ac3ceeeda8ffba4e3d88b8ebd60ba4730 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 8 Jul 2019 16:02:19 +0300 Subject: [PATCH 005/117] Turned on Kotlin syntax highlighting --- kotlin/kotlin-compiler-shaded/pom.xml | 62 --------------------------- zeppelin-web/bower.json | 1 + 2 files changed, 1 insertion(+), 62 deletions(-) delete mode 100644 kotlin/kotlin-compiler-shaded/pom.xml diff --git a/kotlin/kotlin-compiler-shaded/pom.xml b/kotlin/kotlin-compiler-shaded/pom.xml deleted file mode 100644 index 1aaa57e9dfd..00000000000 --- a/kotlin/kotlin-compiler-shaded/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - - - zeppelin-interpreter-parent - org.apache.zeppelin - 0.9.0-SNAPSHOT - ../../zeppelin-interpreter-parent/pom.xml - - - kotlin-compiler-shaded - 1.3.40 - jar - - - - org.jetbrains.kotlin - kotlin-compiler - 1.3.40 - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - - - org.apache.log4j - org.jetbrains.kotlin.shaded.log4j - - - com.google - org.jetbrains.kotlin.shaded.com.google - - - net.jpountz - org.jetbrains.kotlin.shaded.net.jpountz - - - - - - - - - - - - diff --git a/zeppelin-web/bower.json b/zeppelin-web/bower.json index 1e9c480dda5..1d037863285 100644 --- a/zeppelin-web/bower.json +++ b/zeppelin-web/bower.json @@ -47,6 +47,7 @@ "main": [ "src-noconflict/ace.js", "src-noconflict/mode-scala.js", + "src-noconflict/mode-kotlin.js", "src-noconflict/mode-python.js", "src-noconflict/mode-sql.js", "src-noconflict/mode-markdown.js", From 422c76ded3d9b90d6994a3fd04ce92da8bc4ea5c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 8 Jul 2019 18:04:30 +0300 Subject: [PATCH 006/117] Added output and cancellation --- .../zeppelin/kotlin/KotlinInterpreter.java | 88 +++++++++++++++---- .../conf/compiler/KotlinCompilerLoader.java | 49 +++++++++++ .../conf/compiler/KotlinPluginLoader.java | 51 ----------- .../conf/compiler/MessageCollectorImpl.java | 34 ------- zeppelin-web/karma.conf.js | 1 + zeppelin-web/src/index.html | 1 + 6 files changed, 123 insertions(+), 101 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 2f10abaac08..37b4858b61b 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -4,59 +4,88 @@ import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; -import org.apache.zeppelin.interpreter.InterpreterOutput; import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.kotlin.conf.compiler.KotlinPluginLoader; +import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; import org.apache.zeppelin.kotlin.conf.repl.ZeppelinReplConfiguration; +import org.apache.zeppelin.scheduler.Job; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; +import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.scripting.repl.ReplInterpreter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.PrintStream; +import java.util.Collection; +import java.util.Map; import java.util.Properties; +import static org.apache.zeppelin.kotlin.conf.compiler.KotlinCompilerLoader.loadCompilerConfiguration; + public class KotlinInterpreter extends Interpreter { - public KotlinInterpreter(Properties properties) { - super(properties); - } + + private static Logger logger = LoggerFactory.getLogger(KotlinInterpreter.class); private ReplInterpreter interpreter; private ZeppelinReplConfiguration replConf; + private InterpreterOutputStream out; + + public KotlinInterpreter(Properties properties) { + super(properties); + } @Override public void open() throws InterpreterException { - KotlinPluginLoader loader = new KotlinPluginLoader(); - CompilerConfiguration compilerConf = loader.loadCompilerConfiguration(); + CompilerConfiguration compilerConf = loadCompilerConfiguration(); replConf = new ZeppelinReplConfiguration(); interpreter = new ReplInterpreter( - () -> {}, + Disposer.newDisposable(), compilerConf, replConf); + + out = new InterpreterOutputStream(logger); + System.setOut(new PrintStream(out)); } @Override - public void close() throws InterpreterException { + public void close() { } @Override public InterpreterResult interpret(String st, - InterpreterContext context) throws InterpreterException { + InterpreterContext context) { + + // saving job's running thread for cancelling + Job runningJob = getRunningJob(context.getParagraphId()); + if (runningJob != null) { + runningJob.info().put("CURRENT_THREAD", Thread.currentThread()); + } + + out.setInterpreterOutput(context.out); ReplEvalResult result = interpreter.eval(st); - InterpreterOutput out = context.out; - replConf.setOutput(out); if (result instanceof ReplEvalResult.ValueResult) { - String value = ((ReplEvalResult.ValueResult) result).getValue().toString(); - return new InterpreterResult(InterpreterResult.Code.SUCCESS, value); + Object value = ((ReplEvalResult.ValueResult) result).getValue(); + String valueString; + if (value != null) { + valueString = value.toString(); + } else { + valueString = "null"; + } + return new InterpreterResult(InterpreterResult.Code.SUCCESS, valueString); } + if (result instanceof ReplEvalResult.UnitResult) { - return new InterpreterResult(InterpreterResult.Code.SUCCESS, ""); + return new InterpreterResult(InterpreterResult.Code.SUCCESS); } + if (result instanceof ReplEvalResult.Error) { String errorMsg = ((ReplEvalResult.Error) result).getMessage(); return new InterpreterResult(InterpreterResult.Code.ERROR, errorMsg); } + if (result instanceof ReplEvalResult.Incomplete) { return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); } @@ -65,7 +94,21 @@ public InterpreterResult interpret(String st, } @Override - public void cancel(InterpreterContext context) throws InterpreterException { } + public void cancel(InterpreterContext context) throws InterpreterException { + Job runningJob = getRunningJob(context.getParagraphId()); + if (runningJob != null) { + Map info = runningJob.info(); + Object object = info.get("CURRENT_THREAD"); + if (object instanceof Thread) { + try { + Thread t = (Thread) object; + t.interrupt(); + } catch (Throwable t) { + logger.error("Failed to cancel script: " + t, t); + } + } + } + } @Override public FormType getFormType() throws InterpreterException { @@ -76,4 +119,17 @@ public FormType getFormType() throws InterpreterException { public int getProgress(InterpreterContext context) throws InterpreterException { return 0; } + + + private Job getRunningJob(String paragraphId) { + Job foundJob = null; + Collection jobsRunning = getScheduler().getAllJobs(); + for (Job job : jobsRunning) { + if (job.getId().equals(paragraphId)) { + foundJob = job; + } + } + return foundJob; + } + } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java new file mode 100644 index 00000000000..bb027de1d04 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java @@ -0,0 +1,49 @@ +package org.apache.zeppelin.kotlin.conf.compiler; + +import org.apache.zeppelin.interpreter.InterpreterException; +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer; +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; +import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; +import org.jetbrains.kotlin.com.intellij.openapi.util.Pair; +import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar; +import org.jetbrains.kotlin.utils.PathUtil; + +import java.io.File; +import java.io.IOException; + +public class KotlinCompilerLoader { + + private static void addClassPathRoot(CompilerConfiguration configuration, String path) { + configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, + new JvmClasspathRoot(new File(path))); + } + + private static String getKotlinStdlibPath() throws InterpreterException { + try { + return PathUtil.getResourcePathForClass(Pair.class).getCanonicalPath(); + } catch (IOException e) { + throw new InterpreterException("Kotlin stdlib not found"); + } + } + + public static CompilerConfiguration loadCompilerConfiguration() throws InterpreterException { + + CompilerConfiguration configuration = new CompilerConfiguration(); + + configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, + new PrintingMessageCollector(System.out, MessageRenderer.WITHOUT_PATHS, false)); + + addClassPathRoot(configuration, getKotlinStdlibPath()); + + // loading compiler scripting plugins + configuration.add(ComponentRegistrar.Companion.getPLUGIN_COMPONENT_REGISTRARS(), + new ScriptingCompilerConfigurationComponentRegistrar()); + + return configuration; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java deleted file mode 100644 index 234ade2419d..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinPluginLoader.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.compiler; - -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; -import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar; -import org.jetbrains.kotlin.config.CommonConfigurationKeys; -import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; - -public class KotlinPluginLoader { - private static final Logger LOGGER = LoggerFactory.getLogger(KotlinPluginLoader.class); - private static final String KOTLIN_STDLIB_JAR = "kotlin-stdlib.jar"; - private static final String LIB_PATH = "/Users/dmitry.kaznacheev/zeppelin/dist/kotlinc/lib/"; - - public KotlinPluginLoader() { - } - - String pathTo(String path) { - return LIB_PATH + path; - } - - private String findJavaRuntimeJarPath() { - // TODO(dk) get actual runtime jar - return "/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home/jre/lib/"; - } - - private void addClassPathRoot(CompilerConfiguration configuration, String path) { - configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, - new JvmClasspathRoot(new File(path))); - } - - // TODO(dk) split into two classes w/ plugin and compiler loader - public CompilerConfiguration loadCompilerConfiguration() { - CompilerConfiguration configuration = new CompilerConfiguration(); - - configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); - configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, new MessageCollectorImpl()); - - addClassPathRoot(configuration, findJavaRuntimeJarPath()); - addClassPathRoot(configuration, pathTo(KOTLIN_STDLIB_JAR)); - - configuration.add(ComponentRegistrar.Companion.getPLUGIN_COMPONENT_REGISTRARS(), - new ScriptingCompilerConfigurationComponentRegistrar()); - - return configuration; - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java deleted file mode 100644 index b9d1698d660..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/MessageCollectorImpl.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.compiler; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation; -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity; -import org.jetbrains.kotlin.cli.common.messages.MessageCollector; - -public class MessageCollectorImpl implements MessageCollector { - @Override - public void clear() {} - - @Override - public boolean hasErrors() { - return false; - } - - @Override - public void report(@NotNull CompilerMessageSeverity severity, - @NotNull String message, - @Nullable CompilerMessageLocation location) { - if (severity.isError()) { - String prefix = ""; - if (location != null) { - prefix = formatLocationPrefix(location); - throw new AssertionError(prefix + message); - } - } - } - - private static String formatLocationPrefix(CompilerMessageLocation location) { - return "(" + location.getPath() + ":" + location.getLine() + ":" + location.getColumn() + ") "; - } -} diff --git a/zeppelin-web/karma.conf.js b/zeppelin-web/karma.conf.js index 5daceb91fff..705433cd64b 100644 --- a/zeppelin-web/karma.conf.js +++ b/zeppelin-web/karma.conf.js @@ -56,6 +56,7 @@ module.exports = function(config) { 'bower_components/angular-websocket/angular-websocket.min.js', 'bower_components/ace-builds/src-noconflict/ace.js', 'bower_components/ace-builds/src-noconflict/mode-scala.js', + 'bower_components/ace-builds/src-noconflict/mode-kotlin.js', 'bower_components/ace-builds/src-noconflict/mode-python.js', 'bower_components/ace-builds/src-noconflict/mode-sql.js', 'bower_components/ace-builds/src-noconflict/mode-markdown.js', diff --git a/zeppelin-web/src/index.html b/zeppelin-web/src/index.html index fb831c8d1d4..d664a8dae26 100644 --- a/zeppelin-web/src/index.html +++ b/zeppelin-web/src/index.html @@ -180,6 +180,7 @@ + From d79df4d4413700a023a2405da26795ff593e5fa4 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 8 Jul 2019 18:39:04 +0300 Subject: [PATCH 007/117] Implemented kotlin repl diagnostic message holder --- .../conf/repl/ZeppelinReplConfiguration.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java index 473905e8b4c..36f8dd3c080 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java @@ -3,19 +3,21 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.com.intellij.psi.PsiFile; import org.jetbrains.kotlin.diagnostics.Diagnostic; +import org.jetbrains.kotlin.diagnostics.Severity; import org.jetbrains.kotlin.scripting.repl.ReplExceptionReporter; import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; import org.jetbrains.kotlin.scripting.repl.configuration.SnippetExecutionInterceptor; import org.jetbrains.kotlin.scripting.repl.messages.DiagnosticMessageHolder; import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.OutputStream; - -// TODO(dk) implement everything public class ZeppelinReplConfiguration implements ReplConfiguration { + private final Logger logger = LoggerFactory.getLogger(ZeppelinReplConfiguration.class); + private ReplCommandReader reader; private ReplWriter writer; @@ -24,10 +26,6 @@ public ZeppelinReplConfiguration() { writer = new WriterStub(); } - public void setOutput(OutputStream out) { - this.writer = new ZeppelinReplWriter(out); - } - @Override public boolean getAllowIncompleteLines() { return false; @@ -70,7 +68,21 @@ public String renderMessage() { @Override public void report(@NotNull Diagnostic diagnostic, @NotNull PsiFile psiFile, @NotNull String s) { - + Severity severity = diagnostic.getSeverity(); + switch (severity) { + case INFO: { + logger.info(s); + break; + } + case WARNING: { + logger.warn(s, psiFile); + break; + } + case ERROR: { + logger.error(s, psiFile); + break; + } + } } }; } From bc018c7b950b761cd4bc5bc0572d44e922a9aa4a Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 8 Jul 2019 19:10:37 +0300 Subject: [PATCH 008/117] Added tests --- kotlin/pom.xml | 10 --- .../zeppelin/java/KotlinInterpreterTest.java | 75 +++++++++++++++++++ 2 files changed, 75 insertions(+), 10 deletions(-) create mode 100644 kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 80f51e12314..fe5ee135bf2 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -57,16 +57,6 @@ kotlin-stdlib 1.3.40 - - org.jetbrains.kotlin - kotlin-scripting-common - 1.3.40 - - - org.jetbrains.kotlin - kotlin-scripting-jvm - 1.3.40 - diff --git a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java new file mode 100644 index 00000000000..0f51480cdef --- /dev/null +++ b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java @@ -0,0 +1,75 @@ +package org.apache.zeppelin.java; + +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.KotlinInterpreter; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Properties; + +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; +import static org.junit.Assert.assertEquals; + +/** + * KotlinInterpreterTest + */ +public class KotlinInterpreterTest { + + private static KotlinInterpreter interpreter; + private static InterpreterContext context; + + @BeforeClass + public static void setUp() throws InterpreterException { + context = InterpreterContext.builder().build(); + interpreter = new KotlinInterpreter(new Properties()); + interpreter.open(); + } + + @AfterClass + public static void tearDown() { + interpreter.close(); + } + + private static void testCodeforResult(String code, String expected) { + InterpreterResult result = interpreter.interpret(code, context); + assertEquals(SUCCESS, result.code()); + assertEquals(1, result.message().size()); + assertEquals(expected, result.message().get(0).getData().trim()); + } + + @Test + public void testLiteral() { + testCodeforResult("1", "1"); + } + + @Test + public void testOperation() { + testCodeforResult("\"foo\" + \"bar\"", "foobar"); + } + + @Test + public void testFunction() { + testCodeforResult("fun square(x: Int): Int = x * x\nsquare(10)", "100"); + } + + @Test + public void testIncomplete() { + InterpreterResult result = interpreter.interpret("if (10 > 2) {\n", context); + assertEquals(ERROR, result.code()); + assertEquals("incomplete code", result.message().get(0).getData().trim()); + } + + @Test + public void testCompileError() { + InterpreterResult result = interpreter.interpret("prinln(1)", context); + assertEquals(ERROR, result.code()); + assertEquals( + "error: unresolved reference: prinln\n" + + "prinln(1)\n" + + "^", result.message().get(0).getData().trim()); + } +} From 6add47d46eae89913bdfb74546048af5c73063a2 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 9 Jul 2019 11:54:03 +0300 Subject: [PATCH 009/117] Minor cleanups --- kotlin/pom.xml | 9 +++++---- .../org/apache/zeppelin/java/KotlinInterpreterTest.java | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index fe5ee135bf2..9e83f27db76 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,6 +34,7 @@ kotlin + 1.3.40 @@ -41,21 +42,21 @@ org.jetbrains.kotlin kotlin-compiler-embeddable - 1.3.40 + ${kotlin-version} org.jetbrains.kotlin kotlin-scripting-compiler-embeddable - 1.3.40 + ${kotlin-version} org.jetbrains.kotlin kotlin-scripting-compiler-impl-embeddable - 1.3.40 + ${kotlin-version} org.jetbrains.kotlin kotlin-stdlib - 1.3.40 + ${kotlin-version} diff --git a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java index 0f51480cdef..9d48aaba6a4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java @@ -34,7 +34,7 @@ public static void tearDown() { interpreter.close(); } - private static void testCodeforResult(String code, String expected) { + private static void testCodeForResult(String code, String expected) { InterpreterResult result = interpreter.interpret(code, context); assertEquals(SUCCESS, result.code()); assertEquals(1, result.message().size()); @@ -43,17 +43,17 @@ private static void testCodeforResult(String code, String expected) { @Test public void testLiteral() { - testCodeforResult("1", "1"); + testCodeForResult("1", "1"); } @Test public void testOperation() { - testCodeforResult("\"foo\" + \"bar\"", "foobar"); + testCodeForResult("\"foo\" + \"bar\"", "foobar"); } @Test public void testFunction() { - testCodeforResult("fun square(x: Int): Int = x * x\nsquare(10)", "100"); + testCodeForResult("fun square(x: Int): Int = x * x\nsquare(10)", "100"); } @Test From b29c4484781e94d2640bdb91d1dce32e70efa1b9 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 12 Jul 2019 17:27:43 +0300 Subject: [PATCH 010/117] Added bind method to Kotlin interpreter --- .../apache/zeppelin/kotlin/KotlinInterpreter.java | 5 ++++- .../apache/zeppelin/java/KotlinInterpreterTest.java | 12 ++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 37b4858b61b..6eb1de1ac36 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -54,7 +54,7 @@ public void close() { @Override public InterpreterResult interpret(String st, - InterpreterContext context) { + InterpreterContext context) throws InterpreterException{ // saving job's running thread for cancelling Job runningJob = getRunningJob(context.getParagraphId()); @@ -120,6 +120,9 @@ public int getProgress(InterpreterContext context) throws InterpreterException { return 0; } + private void bind(String className, String module, String alias) { + interpreter.eval("import " + className + "." + module + " as " + alias); + } private Job getRunningJob(String paragraphId) { Job foundJob = null; diff --git a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java index 9d48aaba6a4..c7114ef17a4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java @@ -34,7 +34,7 @@ public static void tearDown() { interpreter.close(); } - private static void testCodeForResult(String code, String expected) { + private static void testCodeForResult(String code, String expected) throws Exception { InterpreterResult result = interpreter.interpret(code, context); assertEquals(SUCCESS, result.code()); assertEquals(1, result.message().size()); @@ -42,29 +42,29 @@ private static void testCodeForResult(String code, String expected) { } @Test - public void testLiteral() { + public void testLiteral() throws Exception { testCodeForResult("1", "1"); } @Test - public void testOperation() { + public void testOperation() throws Exception { testCodeForResult("\"foo\" + \"bar\"", "foobar"); } @Test - public void testFunction() { + public void testFunction() throws Exception { testCodeForResult("fun square(x: Int): Int = x * x\nsquare(10)", "100"); } @Test - public void testIncomplete() { + public void testIncomplete() throws Exception { InterpreterResult result = interpreter.interpret("if (10 > 2) {\n", context); assertEquals(ERROR, result.code()); assertEquals("incomplete code", result.message().get(0).getData().trim()); } @Test - public void testCompileError() { + public void testCompileError() throws Exception { InterpreterResult result = interpreter.interpret("prinln(1)", context); assertEquals(ERROR, result.code()); assertEquals( From 6c01762f0893da3a32c137f8692edda542ce88fe Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 17 Jul 2019 17:26:50 +0300 Subject: [PATCH 011/117] Changed KotlinInterpreter to use new scripting API --- kotlin/pom.xml | 23 +++- .../zeppelin/kotlin/KotlinInterpreter.java | 49 +------- .../apache/zeppelin/kotlin/KotlinRepl.java | 83 ++++++++++++++ .../zeppelin/kotlin/KotlinReplBuilder.java | 52 +++++++++ .../conf/compiler/KotlinCompilerLoader.java | 49 -------- .../zeppelin/kotlin/conf/repl/ReaderStub.java | 17 --- .../zeppelin/kotlin/conf/repl/WriterStub.java | 56 --------- .../conf/repl/ZeppelinReplConfiguration.java | 89 --------------- .../kotlin/conf/repl/ZeppelinReplWriter.java | 106 ------------------ 9 files changed, 156 insertions(+), 368 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 9e83f27db76..6281bebed63 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,25 +34,38 @@ kotlin - 1.3.40 + 1.3.50-eap-5 + + + bintray-kotlin + https://dl.bintray.com/kotlin/kotlin-dev + + + org.jetbrains.kotlin - kotlin-compiler-embeddable + kotlin-scripting-jvm-host-embeddable ${kotlin-version} - + + org.jetbrains.kotlin - kotlin-scripting-compiler-embeddable + kotlin-compiler-embeddable ${kotlin-version} org.jetbrains.kotlin - kotlin-scripting-compiler-impl-embeddable + kotlin-scripting-jvm ${kotlin-version} + + org.jetbrains.kotlin + kotlin-scripting-compiler-embeddable + 1.3.50-eap-5 + org.jetbrains.kotlin kotlin-stdlib diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 6eb1de1ac36..256783c8a70 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -6,12 +6,7 @@ import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; -import org.apache.zeppelin.kotlin.conf.repl.ZeppelinReplConfiguration; import org.apache.zeppelin.scheduler.Job; -import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; -import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer; -import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.jetbrains.kotlin.scripting.repl.ReplInterpreter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,15 +15,12 @@ import java.util.Map; import java.util.Properties; -import static org.apache.zeppelin.kotlin.conf.compiler.KotlinCompilerLoader.loadCompilerConfiguration; - public class KotlinInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(KotlinInterpreter.class); - private ReplInterpreter interpreter; - private ZeppelinReplConfiguration replConf; private InterpreterOutputStream out; + private KotlinRepl interpreter; public KotlinInterpreter(Properties properties) { super(properties); @@ -36,12 +28,7 @@ public KotlinInterpreter(Properties properties) { @Override public void open() throws InterpreterException { - CompilerConfiguration compilerConf = loadCompilerConfiguration(); - replConf = new ZeppelinReplConfiguration(); - interpreter = new ReplInterpreter( - Disposer.newDisposable(), - compilerConf, - replConf); + interpreter = new KotlinReplBuilder().build(); out = new InterpreterOutputStream(logger); System.setOut(new PrintStream(out)); @@ -64,33 +51,7 @@ public InterpreterResult interpret(String st, out.setInterpreterOutput(context.out); - ReplEvalResult result = interpreter.eval(st); - - if (result instanceof ReplEvalResult.ValueResult) { - Object value = ((ReplEvalResult.ValueResult) result).getValue(); - String valueString; - if (value != null) { - valueString = value.toString(); - } else { - valueString = "null"; - } - return new InterpreterResult(InterpreterResult.Code.SUCCESS, valueString); - } - - if (result instanceof ReplEvalResult.UnitResult) { - return new InterpreterResult(InterpreterResult.Code.SUCCESS); - } - - if (result instanceof ReplEvalResult.Error) { - String errorMsg = ((ReplEvalResult.Error) result).getMessage(); - return new InterpreterResult(InterpreterResult.Code.ERROR, errorMsg); - } - - if (result instanceof ReplEvalResult.Incomplete) { - return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); - } - - return new InterpreterResult(InterpreterResult.Code.ERROR, "Unknown error"); + return interpreter.eval(st); } @Override @@ -120,10 +81,6 @@ public int getProgress(InterpreterContext context) throws InterpreterException { return 0; } - private void bind(String className, String module, String alias) { - interpreter.eval("import " + className + "." + module + " as " + alias); - } - private Job getRunningJob(String paragraphId) { Job foundJob = null; Collection jobsRunning = getScheduler().getAllJobs(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java new file mode 100644 index 00000000000..1898b35a9b2 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -0,0 +1,83 @@ +package org.apache.zeppelin.kotlin; + +import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; +import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; +import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; +import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; +import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class KotlinRepl { + private JvmReplCompiler compiler; + private JvmReplEvaluator evaluator; + + private AggregatedReplStageState state; + + private AtomicInteger counter; + + @SuppressWarnings("unchecked") + public KotlinRepl(JvmReplCompiler compiler, + JvmReplEvaluator evaluator) { + this.compiler = compiler; + this.evaluator = evaluator; + ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); + state = new AggregatedReplStageState( + compiler.createState(stateLock), + evaluator.createState(stateLock), + stateLock); + + counter = new AtomicInteger(0); + } + + public InterpreterResult eval(String code) { + ReplCompileResult compileResult = compiler.compile(state, + new ReplCodeLine(counter.getAndIncrement(), 0, code)); + + if (compileResult instanceof ReplCompileResult.Incomplete) { + return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); + } + if (compileResult instanceof ReplCompileResult.Error) { + ReplCompileResult.Error e = (ReplCompileResult.Error) compileResult; + return new InterpreterResult(InterpreterResult.Code.ERROR, e.toString()); + } + if (!(compileResult instanceof ReplCompileResult.CompiledClasses)) { + return new InterpreterResult(InterpreterResult.Code.ERROR, + "unknown compilation result:" + compileResult.toString()); + } + + ReplCompileResult.CompiledClasses classes = + (ReplCompileResult.CompiledClasses) compileResult; + + ReplEvalResult evalResult = evaluator.eval(state, classes, null, null); + + if (evalResult instanceof ReplEvalResult.Error) { + ReplEvalResult.Error e = (ReplEvalResult.Error) evalResult; + return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()); + } + if (evalResult instanceof ReplEvalResult.Incomplete) { + return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); + } + if (evalResult instanceof ReplEvalResult.HistoryMismatch) { + ReplEvalResult.HistoryMismatch e = (ReplEvalResult.HistoryMismatch) evalResult; + return new InterpreterResult( + InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); + } + if (evalResult instanceof ReplEvalResult.UnitResult) { + return new InterpreterResult(InterpreterResult.Code.SUCCESS); + } + if (evalResult instanceof ReplEvalResult.ValueResult) { + ReplEvalResult.ValueResult e = (ReplEvalResult.ValueResult) evalResult; + Object value = e.getValue(); + String valueString = (value != null) ? value.toString() : "null"; + + return new InterpreterResult( + InterpreterResult.Code.SUCCESS, valueString + ": " + e.getType()); + } + return new InterpreterResult(InterpreterResult.Code.ERROR, + "unknown evaluation result: " + evalResult.toString()); + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java new file mode 100644 index 00000000000..b6fd45be1cf --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -0,0 +1,52 @@ +package org.apache.zeppelin.kotlin; + +import kotlin.Unit; +import kotlin.script.experimental.api.ScriptCompilationConfiguration; +import kotlin.script.experimental.api.ScriptCompilationKt; +import kotlin.script.experimental.api.ScriptEvaluationConfiguration; +import kotlin.script.experimental.api.ScriptEvaluationKt; +import kotlin.script.experimental.host.ScriptingHostConfiguration; +import kotlin.script.experimental.jvm.BasicJvmScriptEvaluator; +import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; +import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; +import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; + +import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; + +public class KotlinReplBuilder { + + private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); + + public KotlinRepl build() { + KJvmReplCompilerImpl compilerImpl = + new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); + + JvmReplCompiler compiler = new JvmReplCompiler( + buildCompilationConfiguration(), + hostConf, + compilerImpl); + + JvmReplEvaluator evaluator = new JvmReplEvaluator( + buildEvaluationConfiguration(), + new BasicJvmScriptEvaluator()); + + return new KotlinRepl(compiler, evaluator); + } + + private ScriptCompilationConfiguration buildCompilationConfiguration() { + return new ScriptCompilationConfiguration((b) -> { + b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); + + return Unit.INSTANCE; + }); + } + + private ScriptEvaluationConfiguration buildEvaluationConfiguration() { + return new ScriptEvaluationConfiguration((b) -> { + b.invoke(ScriptEvaluationKt.getHostConfiguration(b), hostConf); + + return Unit.INSTANCE; + }); + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java deleted file mode 100644 index bb027de1d04..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/compiler/KotlinCompilerLoader.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.compiler; - -import org.apache.zeppelin.interpreter.InterpreterException; -import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; -import org.jetbrains.kotlin.cli.common.messages.MessageRenderer; -import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; -import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot; -import org.jetbrains.kotlin.com.intellij.openapi.util.Pair; -import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar; -import org.jetbrains.kotlin.config.CommonConfigurationKeys; -import org.jetbrains.kotlin.config.CompilerConfiguration; -import org.jetbrains.kotlin.scripting.compiler.plugin.ScriptingCompilerConfigurationComponentRegistrar; -import org.jetbrains.kotlin.utils.PathUtil; - -import java.io.File; -import java.io.IOException; - -public class KotlinCompilerLoader { - - private static void addClassPathRoot(CompilerConfiguration configuration, String path) { - configuration.add(CLIConfigurationKeys.CONTENT_ROOTS, - new JvmClasspathRoot(new File(path))); - } - - private static String getKotlinStdlibPath() throws InterpreterException { - try { - return PathUtil.getResourcePathForClass(Pair.class).getCanonicalPath(); - } catch (IOException e) { - throw new InterpreterException("Kotlin stdlib not found"); - } - } - - public static CompilerConfiguration loadCompilerConfiguration() throws InterpreterException { - - CompilerConfiguration configuration = new CompilerConfiguration(); - - configuration.put(CommonConfigurationKeys.MODULE_NAME, "zeppelin-kotlin"); - configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, - new PrintingMessageCollector(System.out, MessageRenderer.WITHOUT_PATHS, false)); - - addClassPathRoot(configuration, getKotlinStdlibPath()); - - // loading compiler scripting plugins - configuration.add(ComponentRegistrar.Companion.getPLUGIN_COMPONENT_REGISTRARS(), - new ScriptingCompilerConfigurationComponentRegistrar()); - - return configuration; - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java deleted file mode 100644 index 5f83af2221f..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ReaderStub.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.repl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.scripting.repl.ReplFromTerminal; -import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; - -public class ReaderStub implements ReplCommandReader { - @Nullable - @Override - public String readLine(@NotNull ReplFromTerminal.WhatNextAfterOneLine next) { - return ""; - } - - @Override - public void flushHistory() { } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java deleted file mode 100644 index ff75b3ae347..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/WriterStub.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.repl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; - -public class WriterStub implements ReplWriter { - @Override - public void notifyCommandSuccess() { - - } - - @Override - public void notifyIncomplete() { - - } - - @Override - public void notifyReadLineEnd() { - - } - - @Override - public void notifyReadLineStart() { - - } - - @Override - public void outputCommandResult(@NotNull String s) { - - } - - @Override - public void outputCompileError(@NotNull String s) { - - } - - @Override - public void outputRuntimeError(@NotNull String s) { - - } - - @Override - public void printlnHelpMessage(@NotNull String s) { - - } - - @Override - public void printlnWelcomeMessage(@NotNull String s) { - - } - - @Override - public void sendInternalErrorReport(@NotNull String s) { - - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java deleted file mode 100644 index 36f8dd3c080..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplConfiguration.java +++ /dev/null @@ -1,89 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.repl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.com.intellij.psi.PsiFile; -import org.jetbrains.kotlin.diagnostics.Diagnostic; -import org.jetbrains.kotlin.diagnostics.Severity; -import org.jetbrains.kotlin.scripting.repl.ReplExceptionReporter; -import org.jetbrains.kotlin.scripting.repl.configuration.ReplConfiguration; -import org.jetbrains.kotlin.scripting.repl.configuration.SnippetExecutionInterceptor; -import org.jetbrains.kotlin.scripting.repl.messages.DiagnosticMessageHolder; -import org.jetbrains.kotlin.scripting.repl.reader.ReplCommandReader; -import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - - -public class ZeppelinReplConfiguration implements ReplConfiguration { - - private final Logger logger = LoggerFactory.getLogger(ZeppelinReplConfiguration.class); - - private ReplCommandReader reader; - private ReplWriter writer; - - public ZeppelinReplConfiguration() { - reader = new ReaderStub(); - writer = new WriterStub(); - } - - @Override - public boolean getAllowIncompleteLines() { - return false; - } - - @NotNull - @Override - public ReplCommandReader getCommandReader() { - return reader; - } - - @NotNull - @Override - public ReplExceptionReporter getExceptionReporter() { - return ReplExceptionReporter.DoNothing; - } - - @NotNull - @Override - public SnippetExecutionInterceptor getExecutionInterceptor() { - return SnippetExecutionInterceptor.Plain; - } - - @NotNull - @Override - public ReplWriter getWriter() { - return writer; - } - - @NotNull - @Override - public DiagnosticMessageHolder createDiagnosticHolder() { - return new DiagnosticMessageHolder() { - @NotNull - @Override - public String renderMessage() { - return ""; - } - - @Override - public void report(@NotNull Diagnostic diagnostic, - @NotNull PsiFile psiFile, @NotNull String s) { - Severity severity = diagnostic.getSeverity(); - switch (severity) { - case INFO: { - logger.info(s); - break; - } - case WARNING: { - logger.warn(s, psiFile); - break; - } - case ERROR: { - logger.error(s, psiFile); - break; - } - } - } - }; - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java deleted file mode 100644 index c39f4adc43d..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/conf/repl/ZeppelinReplWriter.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.apache.zeppelin.kotlin.conf.repl; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.scripting.repl.writer.ReplWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; - -public class ZeppelinReplWriter implements ReplWriter { - - private OutputStreamWriter out; - - public ZeppelinReplWriter(OutputStream out) { - this.out = new OutputStreamWriter(out); - } - - @Override - public void notifyCommandSuccess() { - try { - out.write("SUCCESS"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void notifyIncomplete() { - try { - out.write("INCOMPLETE"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void notifyReadLineEnd() { - try { - out.write("READLINEEND"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void notifyReadLineStart() { - try { - out.write("READLINESTART"); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void outputCommandResult(@NotNull String s) { - try { - out.write("RESULT " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void outputCompileError(@NotNull String s) { - try { - out.write("COMPILE ERROR " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void outputRuntimeError(@NotNull String s) { - try { - out.write("COMPILE ERROR " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void printlnHelpMessage(@NotNull String s) { - try { - out.write("HELP " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void printlnWelcomeMessage(@NotNull String s) { - try { - out.write("WELCOME " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void sendInternalErrorReport(@NotNull String s) { - try { - out.write("INTERNAL ERROR " + s); - } catch (IOException e) { - e.printStackTrace(); - } - } -} From 634b75749b1a05b3ce6255e58a93bf12d8735581 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 17 Jul 2019 18:40:04 +0300 Subject: [PATCH 012/117] Added object binding to KotlinInterpreter --- .../zeppelin/kotlin/ExecutionContext.java | 11 +++++++ .../zeppelin/kotlin/KotlinInterpreter.java | 5 +-- .../apache/zeppelin/kotlin/KotlinRepl.java | 2 +- .../zeppelin/kotlin/KotlinReplBuilder.java | 31 ++++++++++++++++--- .../zeppelin/java/KotlinInterpreterTest.java | 12 +++---- 5 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java new file mode 100644 index 00000000000..f563e108015 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java @@ -0,0 +1,11 @@ +package org.apache.zeppelin.kotlin; + +public class ExecutionContext { + public String msg; + public StringBuilder sb; + + public ExecutionContext(String msg) { + this.msg = msg; + this.sb = new StringBuilder(); + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 256783c8a70..17dbf2f517a 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -21,14 +21,16 @@ public class KotlinInterpreter extends Interpreter { private InterpreterOutputStream out; private KotlinRepl interpreter; + private ExecutionContext ctx; public KotlinInterpreter(Properties properties) { super(properties); + ctx = new ExecutionContext("Hello!"); } @Override public void open() throws InterpreterException { - interpreter = new KotlinReplBuilder().build(); + interpreter = new KotlinReplBuilder().build(ctx); out = new InterpreterOutputStream(logger); System.setOut(new PrintStream(out)); @@ -91,5 +93,4 @@ private Job getRunningJob(String paragraphId) { } return foundJob; } - } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 1898b35a9b2..2d6b956f22e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -42,7 +42,7 @@ public InterpreterResult eval(String code) { } if (compileResult instanceof ReplCompileResult.Error) { ReplCompileResult.Error e = (ReplCompileResult.Error) compileResult; - return new InterpreterResult(InterpreterResult.Code.ERROR, e.toString()); + return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()); } if (!(compileResult instanceof ReplCompileResult.CompiledClasses)) { return new InterpreterResult(InterpreterResult.Code.ERROR, diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index b6fd45be1cf..befab2c9ebd 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -1,51 +1,72 @@ package org.apache.zeppelin.kotlin; import kotlin.Unit; +import kotlin.script.experimental.api.KotlinType; import kotlin.script.experimental.api.ScriptCompilationConfiguration; import kotlin.script.experimental.api.ScriptCompilationKt; import kotlin.script.experimental.api.ScriptEvaluationConfiguration; import kotlin.script.experimental.api.ScriptEvaluationKt; import kotlin.script.experimental.host.ScriptingHostConfiguration; import kotlin.script.experimental.jvm.BasicJvmScriptEvaluator; +import kotlin.script.experimental.jvm.JvmScriptCompilationConfigurationBuilder; +import kotlin.script.experimental.jvm.JvmScriptCompilationKt; import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; +import java.util.Collections; +import java.util.List; + import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; public class KotlinReplBuilder { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); - public KotlinRepl build() { + public KotlinRepl build(ExecutionContext ctx) { KJvmReplCompilerImpl compilerImpl = new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); JvmReplCompiler compiler = new JvmReplCompiler( - buildCompilationConfiguration(), + buildCompilationConfiguration(ctx), hostConf, compilerImpl); JvmReplEvaluator evaluator = new JvmReplEvaluator( - buildEvaluationConfiguration(), + buildEvaluationConfiguration(ctx), new BasicJvmScriptEvaluator()); return new KotlinRepl(compiler, evaluator); } - private ScriptCompilationConfiguration buildCompilationConfiguration() { + private ScriptCompilationConfiguration buildCompilationConfiguration(final ExecutionContext ctx) { return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); + JvmScriptCompilationConfigurationBuilder jvmBuilder = + JvmScriptCompilationKt.getJvm(b); + JvmScriptCompilationKt.dependenciesFromCurrentContext( + jvmBuilder, new String[0], true, false); + + + KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); + List receivers = + Collections.singletonList(kt); + b.invoke(ScriptCompilationKt.getImplicitReceivers(b), receivers); + return Unit.INSTANCE; }); } - private ScriptEvaluationConfiguration buildEvaluationConfiguration() { + private ScriptEvaluationConfiguration buildEvaluationConfiguration(final ExecutionContext ctx) { return new ScriptEvaluationConfiguration((b) -> { b.invoke(ScriptEvaluationKt.getHostConfiguration(b), hostConf); + List receivers = + Collections.singletonList(ctx); + b.invoke(ScriptEvaluationKt.getImplicitReceivers(b), receivers); + return Unit.INSTANCE; }); } diff --git a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java index c7114ef17a4..a41ff48effe 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java @@ -43,20 +43,20 @@ private static void testCodeForResult(String code, String expected) throws Excep @Test public void testLiteral() throws Exception { - testCodeForResult("1", "1"); + testCodeForResult("1", "1: kotlin.Int"); } @Test public void testOperation() throws Exception { - testCodeForResult("\"foo\" + \"bar\"", "foobar"); + testCodeForResult("\"foo\" + \"bar\"", "foobar: kotlin.String"); } @Test public void testFunction() throws Exception { - testCodeForResult("fun square(x: Int): Int = x * x\nsquare(10)", "100"); + testCodeForResult("fun square(x: Int): Int = x * x\nsquare(10)", "100: kotlin.Int"); } - @Test + // TODO(dkaznacheev): work out why it's not incomplete public void testIncomplete() throws Exception { InterpreterResult result = interpreter.interpret("if (10 > 2) {\n", context); assertEquals(ERROR, result.code()); @@ -68,8 +68,6 @@ public void testCompileError() throws Exception { InterpreterResult result = interpreter.interpret("prinln(1)", context); assertEquals(ERROR, result.code()); assertEquals( - "error: unresolved reference: prinln\n" + - "prinln(1)\n" + - "^", result.message().get(0).getData().trim()); + "Unresolved reference: prinln", result.message().get(0).getData().trim()); } } From f135a06e7a21dd37410c684edb3b6caad43be5a8 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 12 Jul 2019 17:40:49 +0300 Subject: [PATCH 013/117] Added Kotlin Spark interpreter stub --- spark/interpreter/pom.xml | 7 ++ .../spark/KotlinSparkInterpreter.java | 47 ++++++++ .../main/resources/interpreter-setting.json | 104 ++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java diff --git a/spark/interpreter/pom.xml b/spark/interpreter/pom.xml index ba2fbd2cc71..db8bb5311b7 100644 --- a/spark/interpreter/pom.xml +++ b/spark/interpreter/pom.xml @@ -95,12 +95,19 @@ ${project.version} + org.apache.zeppelin spark2-shims ${project.version} + + org.apache.zeppelin + zeppelin-kotlin + ${project.version} + + org.apache.zeppelin zeppelin-python diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java new file mode 100644 index 00000000000..2a480e7602e --- /dev/null +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -0,0 +1,47 @@ +package org.apache.zeppelin.spark; + +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.KotlinInterpreter; + +import java.util.Properties; + +public class KotlinSparkInterpreter extends Interpreter { + public KotlinSparkInterpreter(Properties properties) { + super(properties); + } + + private KotlinInterpreter interpreter; + + @Override + public void open() throws InterpreterException { + interpreter.open(); + } + + @Override + public void close() throws InterpreterException { + interpreter.close(); + } + + @Override + public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { + return interpreter.interpret(st, context); + } + + @Override + public void cancel(InterpreterContext context) throws InterpreterException { + interpreter.cancel(context); + } + + @Override + public FormType getFormType() throws InterpreterException { + return interpreter.getFormType(); + } + + @Override + public int getProgress(InterpreterContext context) throws InterpreterException { + return interpreter.getProgress(context); + } +} diff --git a/spark/interpreter/src/main/resources/interpreter-setting.json b/spark/interpreter/src/main/resources/interpreter-setting.json index e85509c5b53..47084eaf8ec 100644 --- a/spark/interpreter/src/main/resources/interpreter-setting.json +++ b/spark/interpreter/src/main/resources/interpreter-setting.json @@ -243,5 +243,109 @@ "editOnDblClick": false, "completionSupport": false } + }, + { + "group": "spark", + "name": "kotlin", + "className": "org.apache.zeppelin.spark.KotlinSparkInterpreter", + "properties": { + "spark.executor.memory": { + "envName": null, + "propertyName": "spark.executor.memory", + "defaultValue": "", + "description": "Executor memory per worker instance. ex) 512m, 32g", + "type": "string" + }, + "args": { + "envName": null, + "propertyName": null, + "defaultValue": "", + "description": "spark commandline args", + "type": "textarea" + }, + "zeppelin.spark.useHiveContext": { + "envName": "ZEPPELIN_SPARK_USEHIVECONTEXT", + "propertyName": "zeppelin.spark.useHiveContext", + "defaultValue": true, + "description": "Use HiveContext instead of SQLContext if it is true.", + "type": "checkbox" + }, + "spark.app.name": { + "envName": "SPARK_APP_NAME", + "propertyName": "spark.app.name", + "defaultValue": "Zeppelin", + "description": "The name of spark application.", + "type": "string" + }, + "zeppelin.spark.printREPLOutput": { + "envName": null, + "propertyName": "zeppelin.spark.printREPLOutput", + "defaultValue": true, + "description": "Print REPL output", + "type": "checkbox" + }, + "spark.cores.max": { + "envName": null, + "propertyName": "spark.cores.max", + "defaultValue": "", + "description": "Total number of cores to use. Empty value uses all available core.", + "type": "number" + }, + "zeppelin.spark.maxResult": { + "envName": "ZEPPELIN_SPARK_MAXRESULT", + "propertyName": "zeppelin.spark.maxResult", + "defaultValue": "1000", + "description": "Max number of Spark SQL result to display.", + "type": "number" + }, + "master": { + "envName": "MASTER", + "propertyName": "spark.master", + "defaultValue": "local[*]", + "description": "Spark master uri. ex) spark://masterhost:7077", + "type": "string" + }, + "zeppelin.spark.enableSupportedVersionCheck": { + "envName": null, + "propertyName": "zeppelin.spark.enableSupportedVersionCheck", + "defaultValue": true, + "description": "Do not change - developer only setting, not for production use", + "type": "checkbox" + }, + "zeppelin.spark.uiWebUrl": { + "envName": null, + "propertyName": "zeppelin.spark.uiWebUrl", + "defaultValue": "", + "description": "Override Spark UI default URL", + "type": "string" + }, + "zeppelin.spark.useNew": { + "envName": null, + "propertyName": "zeppelin.spark.useNew", + "defaultValue": true, + "description": "Whether use new spark interpreter implementation", + "type": "checkbox" + }, + "zeppelin.spark.ui.hidden": { + "envName": null, + "propertyName": "zeppelin.spark.ui.hidden", + "defaultValue": false, + "description": "Whether to hide spark ui in zeppelin ui", + "type": "checkbox" + }, + "zeppelin.spark.scala.color": { + "envName": null, + "propertyName": "zeppelin.spark.scala.color", + "defaultValue": true, + "description": "Whether to enable color output of spark scala interpreter", + "type": "checkbox" + } + }, + "editor": { + "language": "kotlin", + "editOnDblClick": false, + "completionKey": "TAB", + "completionSupport": false + } } ] From eed0d9451b2a891b1350431b5ea8882103d81390 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 12 Jul 2019 18:30:22 +0300 Subject: [PATCH 014/117] Fixed maven-enforcer package version error --- .../zeppelin/spark/KotlinSparkInterpreter.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 2a480e7602e..7a9e4903887 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,5 +1,7 @@ package org.apache.zeppelin.spark; +import org.apache.spark.SparkContext; +import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -9,15 +11,26 @@ import java.util.Properties; public class KotlinSparkInterpreter extends Interpreter { + private KotlinInterpreter interpreter; + public KotlinSparkInterpreter(Properties properties) { super(properties); + interpreter = new KotlinInterpreter(properties); } + + public static class SparkHolder { + public static SparkContext sc; + public static SparkSession spark; + public static String test = "TEST!"; - private KotlinInterpreter interpreter; + } @Override public void open() throws InterpreterException { interpreter.open(); + interpreter.bind(SparkHolder.class.getCanonicalName(), "sc", "sc"); + interpreter.bind(SparkHolder.class.getCanonicalName(), "spark", "spark"); + interpreter.bind(SparkHolder.class.getCanonicalName(), "test", "test"); } @Override @@ -26,7 +39,8 @@ public void close() throws InterpreterException { } @Override - public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { + public InterpreterResult interpret(String st, InterpreterContext context) + throws InterpreterException { return interpreter.interpret(st, context); } From 01cd61ef8a9368ffde1a8a8d2dc952b6ace30194 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 18 Jul 2019 12:14:25 +0300 Subject: [PATCH 015/117] Updated KotlinInterpreter to use new API --- kotlin/pom.xml | 27 +++++++++++++++++++ .../spark/KotlinSparkInterpreter.java | 12 --------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 6281bebed63..d259c32f0b4 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -50,21 +50,48 @@ org.jetbrains.kotlin kotlin-scripting-jvm-host-embeddable ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-stdlib + + org.jetbrains.kotlin + kotlin-stdlib-common + + org.jetbrains.kotlin kotlin-compiler-embeddable ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-stdlib + + org.jetbrains.kotlin kotlin-scripting-jvm ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-stdlib + + org.jetbrains.kotlin kotlin-scripting-compiler-embeddable 1.3.50-eap-5 + + + org.jetbrains.kotlin + kotlin-stdlib + + org.jetbrains.kotlin diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 7a9e4903887..a32ce0a14f5 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,7 +1,5 @@ package org.apache.zeppelin.spark; -import org.apache.spark.SparkContext; -import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -17,20 +15,10 @@ public KotlinSparkInterpreter(Properties properties) { super(properties); interpreter = new KotlinInterpreter(properties); } - - public static class SparkHolder { - public static SparkContext sc; - public static SparkSession spark; - public static String test = "TEST!"; - - } @Override public void open() throws InterpreterException { interpreter.open(); - interpreter.bind(SparkHolder.class.getCanonicalName(), "sc", "sc"); - interpreter.bind(SparkHolder.class.getCanonicalName(), "spark", "spark"); - interpreter.bind(SparkHolder.class.getCanonicalName(), "test", "test"); } @Override From d196552a950ab58cdeb1b5873e55899ce8d08afa Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 18 Jul 2019 13:13:18 +0300 Subject: [PATCH 016/117] Attempt to add spark context to ExecutionContext --- .../apache/zeppelin/kotlin/KotlinInterpreter.java | 4 ++++ .../zeppelin/spark/KotlinSparkInterpreter.java | 7 +++++++ .../zeppelin/spark/SparkExecutionContext.java | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 17dbf2f517a..61d955f92fe 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -28,6 +28,10 @@ public KotlinInterpreter(Properties properties) { ctx = new ExecutionContext("Hello!"); } + public void setExecutionContext(ExecutionContext ctx) { + this.ctx = ctx; + } + @Override public void open() throws InterpreterException { interpreter = new KotlinReplBuilder().build(ctx); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index a32ce0a14f5..dd33965a480 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,5 +1,6 @@ package org.apache.zeppelin.spark; +import org.apache.spark.api.java.JavaSparkContext; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -10,6 +11,7 @@ public class KotlinSparkInterpreter extends Interpreter { private KotlinInterpreter interpreter; + private SparkInterpreter sparkInterpreter; public KotlinSparkInterpreter(Properties properties) { super(properties); @@ -18,6 +20,11 @@ public KotlinSparkInterpreter(Properties properties) { @Override public void open() throws InterpreterException { + sparkInterpreter = + getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); + Object spark = sparkInterpreter.getSparkSession(); + JavaSparkContext sc = sparkInterpreter.getJavaSparkContext(); + interpreter.setExecutionContext(new SparkExecutionContext(spark, sc)); interpreter.open(); } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java new file mode 100644 index 00000000000..b11c8e160b6 --- /dev/null +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java @@ -0,0 +1,15 @@ +package org.apache.zeppelin.spark; + +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.zeppelin.kotlin.ExecutionContext; + +public class SparkExecutionContext extends ExecutionContext { + public Object spark; + public JavaSparkContext sc; + + public SparkExecutionContext(Object spark, JavaSparkContext sc) { + super("HELLO SPARK"); + this.spark = spark; + this.sc = sc; + } +} From 2eeb2f6dda2c956f913894f784d89e9cb994114f Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 18 Jul 2019 14:18:51 +0300 Subject: [PATCH 017/117] Reordered imports for checkstyle --- .../apache/zeppelin/kotlin/KotlinInterpreter.java | 13 ++++++------- .../java/org/apache/zeppelin/kotlin/KotlinRepl.java | 7 +++---- .../apache/zeppelin/kotlin/KotlinReplBuilder.java | 10 ++++------ ...ontext.java => KotlinSparkExecutionContext.java} | 4 ++-- .../zeppelin/spark/KotlinSparkInterpreter.java | 5 ++--- 5 files changed, 17 insertions(+), 22 deletions(-) rename spark/interpreter/src/main/java/org/apache/zeppelin/spark/{SparkExecutionContext.java => KotlinSparkExecutionContext.java} (65%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 61d955f92fe..b5b90fd49f7 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -1,19 +1,18 @@ package org.apache.zeppelin.kotlin; -import org.apache.zeppelin.interpreter.Interpreter; -import org.apache.zeppelin.interpreter.InterpreterContext; -import org.apache.zeppelin.interpreter.InterpreterException; -import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; -import org.apache.zeppelin.scheduler.Job; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import java.io.PrintStream; import java.util.Collection; import java.util.Map; import java.util.Properties; +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; +import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 2d6b956f22e..a0d5147696f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -1,15 +1,14 @@ package org.apache.zeppelin.kotlin; -import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; -import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.apache.zeppelin.interpreter.InterpreterResult; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; - import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; +import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; +import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +import org.apache.zeppelin.interpreter.InterpreterResult; public class KotlinRepl { private JvmReplCompiler compiler; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index befab2c9ebd..2b3a3682da1 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -1,5 +1,9 @@ package org.apache.zeppelin.kotlin; +import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; +import java.util.Collections; +import java.util.List; import kotlin.Unit; import kotlin.script.experimental.api.KotlinType; import kotlin.script.experimental.api.ScriptCompilationConfiguration; @@ -13,12 +17,6 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; - -import java.util.Collections; -import java.util.List; - -import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; public class KotlinReplBuilder { diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java similarity index 65% rename from spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java rename to spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java index b11c8e160b6..f6f388a88fb 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkExecutionContext.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java @@ -3,11 +3,11 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.zeppelin.kotlin.ExecutionContext; -public class SparkExecutionContext extends ExecutionContext { +public class KotlinSparkExecutionContext extends ExecutionContext { public Object spark; public JavaSparkContext sc; - public SparkExecutionContext(Object spark, JavaSparkContext sc) { + public KotlinSparkExecutionContext(Object spark, JavaSparkContext sc) { super("HELLO SPARK"); this.spark = spark; this.sc = sc; diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index dd33965a480..c992fa9aa92 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,14 +1,13 @@ package org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; +import java.util.Properties; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.KotlinInterpreter; -import java.util.Properties; - public class KotlinSparkInterpreter extends Interpreter { private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; @@ -24,7 +23,7 @@ public void open() throws InterpreterException { getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); Object spark = sparkInterpreter.getSparkSession(); JavaSparkContext sc = sparkInterpreter.getJavaSparkContext(); - interpreter.setExecutionContext(new SparkExecutionContext(spark, sc)); + interpreter.setExecutionContext(new KotlinSparkExecutionContext(spark, sc)); interpreter.open(); } From eb00b5c321e5a6d5bfa86681883c2a8b33d1de65 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 18 Jul 2019 17:24:48 +0300 Subject: [PATCH 018/117] Passing compiler options to KotlinInterpreter --- .../zeppelin/kotlin/KotlinInterpreter.java | 14 ++++-- .../zeppelin/kotlin/KotlinReplBuilder.java | 16 ++++++- .../spark/KotlinSparkInterpreter.java | 44 +++++++++++++++++++ 3 files changed, 69 insertions(+), 5 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index b5b90fd49f7..9077d0b6cda 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import java.io.PrintStream; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.zeppelin.interpreter.Interpreter; @@ -20,20 +21,25 @@ public class KotlinInterpreter extends Interpreter { private InterpreterOutputStream out; private KotlinRepl interpreter; - private ExecutionContext ctx; + + private KotlinReplBuilder builder; public KotlinInterpreter(Properties properties) { super(properties); - ctx = new ExecutionContext("Hello!"); + builder = new KotlinReplBuilder(); } public void setExecutionContext(ExecutionContext ctx) { - this.ctx = ctx; + builder.executionContext(ctx); + } + + public void setCompilerOptions(List options) { + builder.compilerOptions(options); } @Override public void open() throws InterpreterException { - interpreter = new KotlinReplBuilder().build(ctx); + interpreter = new KotlinReplBuilder().build(); out = new InterpreterOutputStream(logger); System.setOut(new PrintStream(out)); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 2b3a3682da1..a9d6de972f6 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -22,7 +22,10 @@ public class KotlinReplBuilder { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); - public KotlinRepl build(ExecutionContext ctx) { + private ExecutionContext ctx; + private List compilerOptions; + + public KotlinRepl build() { KJvmReplCompilerImpl compilerImpl = new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); @@ -38,6 +41,16 @@ public KotlinRepl build(ExecutionContext ctx) { return new KotlinRepl(compiler, evaluator); } + public KotlinReplBuilder executionContext(ExecutionContext ctx) { + this.ctx = ctx; + return this; + } + + public KotlinReplBuilder compilerOptions(List options) { + this.compilerOptions = options; + return this; + } + private ScriptCompilationConfiguration buildCompilationConfiguration(final ExecutionContext ctx) { return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); @@ -47,6 +60,7 @@ private ScriptCompilationConfiguration buildCompilationConfiguration(final Execu JvmScriptCompilationKt.dependenciesFromCurrentContext( jvmBuilder, new String[0], true, false); + b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); List receivers = diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index c992fa9aa92..b8aae5cea67 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,7 +1,15 @@ package org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.util.Utils; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; import java.util.Properties; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -17,13 +25,49 @@ public KotlinSparkInterpreter(Properties properties) { interpreter = new KotlinInterpreter(properties); } + + private String sparkClasspath() { + String sparkJars = System.getProperty("spark.jars"); + Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); + + Stream addedJars = Arrays.stream(Utils.resolveURIs(sparkJars).split(",")) + .filter(s -> !s.trim().equals("")) + .filter(s -> !isKotlinJar.matcher(s).find()) + .map(s -> { + int p = s.indexOf(':'); + return new File(s.substring(p + 1)); + }); + + Stream systemJars = Arrays.stream( + System.getProperty("java.class.path").split(File.pathSeparator)) + .map(File::new); + + return Stream.concat(addedJars, systemJars) + .map(file -> { + try { + return file.getCanonicalPath(); + } catch (IOException e) { + return ""; + } + }) + .collect(Collectors.joining(File.pathSeparator)); + } + + @Override public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); + + Object spark = sparkInterpreter.getSparkSession(); JavaSparkContext sc = sparkInterpreter.getJavaSparkContext(); + interpreter.setExecutionContext(new KotlinSparkExecutionContext(spark, sc)); + + List compilerOptions = Arrays.asList("-classpath", sparkClasspath()); + + interpreter.setCompilerOptions(compilerOptions); interpreter.open(); } From b9a3927b19c8eb3a34dedd9a22f53abb2168fe37 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 22 Jul 2019 12:50:41 +0300 Subject: [PATCH 019/117] Fixed REPLInterpreter not using builder --- .../zeppelin/kotlin/KotlinInterpreter.java | 6 +++- .../zeppelin/kotlin/KotlinReplBuilder.java | 29 ++++++++++++++++--- .../spark/KotlinSparkInterpreter.java | 15 ++++++++-- 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 9077d0b6cda..b2842b29b18 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -26,20 +26,24 @@ public class KotlinInterpreter extends Interpreter { public KotlinInterpreter(Properties properties) { super(properties); + logger.debug("Creating KotlinInterpreter"); builder = new KotlinReplBuilder(); } public void setExecutionContext(ExecutionContext ctx) { + logger.debug("Setting ctx in KotlinIntp to " + ctx); builder.executionContext(ctx); } public void setCompilerOptions(List options) { + logger.debug("Setting options in KotlinIntp to " + options); builder.compilerOptions(options); } @Override public void open() throws InterpreterException { - interpreter = new KotlinReplBuilder().build(); + + interpreter = builder.build(); out = new InterpreterOutputStream(logger); System.setOut(new PrintStream(out)); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index a9d6de972f6..6bff6ee77c7 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -2,6 +2,9 @@ import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import kotlin.Unit; @@ -20,38 +23,54 @@ public class KotlinReplBuilder { + private static Logger logger = LoggerFactory.getLogger(KotlinReplBuilder.class); + private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); private ExecutionContext ctx; private List compilerOptions; + public KotlinReplBuilder() { + logger.debug("KotlinReplBuilder created"); + this.ctx = new ExecutionContext("Simple Execution Context"); + this.compilerOptions = new ArrayList<>(); + } + public KotlinRepl build() { + logger.debug("build called"); + KJvmReplCompilerImpl compilerImpl = new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); JvmReplCompiler compiler = new JvmReplCompiler( - buildCompilationConfiguration(ctx), + buildCompilationConfiguration(), hostConf, compilerImpl); JvmReplEvaluator evaluator = new JvmReplEvaluator( - buildEvaluationConfiguration(ctx), + buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); return new KotlinRepl(compiler, evaluator); } public KotlinReplBuilder executionContext(ExecutionContext ctx) { + logger.debug("executionContext changed from" + this.ctx + " to " + ctx); + this.ctx = ctx; return this; } public KotlinReplBuilder compilerOptions(List options) { + logger.debug("options set to " + options); + options.forEach(logger::info); this.compilerOptions = options; return this; } - private ScriptCompilationConfiguration buildCompilationConfiguration(final ExecutionContext ctx) { + private ScriptCompilationConfiguration buildCompilationConfiguration() { + logger.debug("building comp conf w/ " + ctx + " and " + compilerOptions); + return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); @@ -71,7 +90,9 @@ private ScriptCompilationConfiguration buildCompilationConfiguration(final Execu }); } - private ScriptEvaluationConfiguration buildEvaluationConfiguration(final ExecutionContext ctx) { + private ScriptEvaluationConfiguration buildEvaluationConfiguration() { + logger.debug("building eval conf w/ " + ctx); + return new ScriptEvaluationConfiguration((b) -> { b.invoke(ScriptEvaluationKt.getHostConfiguration(b), hostConf); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index b8aae5cea67..f0687635e6f 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -2,6 +2,8 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.util.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -16,12 +18,16 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.KotlinInterpreter; + public class KotlinSparkInterpreter extends Interpreter { + private static Logger logger = LoggerFactory.getLogger(KotlinSparkInterpreter.class); + private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; public KotlinSparkInterpreter(Properties properties) { super(properties); + logger.debug("Creating KotlinSparkInterpreter"); interpreter = new KotlinInterpreter(properties); } @@ -59,15 +65,20 @@ public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); - Object spark = sparkInterpreter.getSparkSession(); JavaSparkContext sc = sparkInterpreter.getJavaSparkContext(); + logger.debug("setting execution ctx now"); interpreter.setExecutionContext(new KotlinSparkExecutionContext(spark, sc)); - List compilerOptions = Arrays.asList("-classpath", sparkClasspath()); + String cp = sparkClasspath(); + logger.debug(cp); + List compilerOptions = Arrays.asList("-classpath", cp); + logger.debug("setting compiler options now"); interpreter.setCompilerOptions(compilerOptions); + + logger.debug("opening inner intp now"); interpreter.open(); } From 04e86d1c3a8a39aadf2354fbbeb6f4f47c313aa4 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 22 Jul 2019 13:22:29 +0300 Subject: [PATCH 020/117] Added class writing to classoutputdir --- .../zeppelin/kotlin/KotlinInterpreter.java | 15 +----- .../apache/zeppelin/kotlin/KotlinRepl.java | 46 +++++++++++++++++-- .../zeppelin/kotlin/KotlinReplBuilder.java | 17 +++---- .../spark/KotlinSparkInterpreter.java | 19 ++++---- 4 files changed, 61 insertions(+), 36 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index b2842b29b18..4d45eca5d18 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -5,7 +5,6 @@ import org.slf4j.LoggerFactory; import java.io.PrintStream; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.zeppelin.interpreter.Interpreter; @@ -21,28 +20,19 @@ public class KotlinInterpreter extends Interpreter { private InterpreterOutputStream out; private KotlinRepl interpreter; - private KotlinReplBuilder builder; public KotlinInterpreter(Properties properties) { super(properties); - logger.debug("Creating KotlinInterpreter"); builder = new KotlinReplBuilder(); } - public void setExecutionContext(ExecutionContext ctx) { - logger.debug("Setting ctx in KotlinIntp to " + ctx); - builder.executionContext(ctx); - } - - public void setCompilerOptions(List options) { - logger.debug("Setting options in KotlinIntp to " + options); - builder.compilerOptions(options); + public KotlinReplBuilder getBuilder() { + return builder; } @Override public void open() throws InterpreterException { - interpreter = builder.build(); out = new InterpreterOutputStream(logger); @@ -57,7 +47,6 @@ public void close() { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException{ - // saving job's running thread for cancelling Job runningJob = getRunningJob(context.getParagraphId()); if (runningJob != null) { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index a0d5147696f..f893652caca 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -1,9 +1,17 @@ package org.apache.zeppelin.kotlin; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; +import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; @@ -11,16 +19,23 @@ import org.apache.zeppelin.interpreter.InterpreterResult; public class KotlinRepl { + private static Logger logger = LoggerFactory.getLogger(KotlinRepl.class); + private JvmReplCompiler compiler; private JvmReplEvaluator evaluator; - private AggregatedReplStageState state; - private AtomicInteger counter; + private String outputDir; - @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator) { + this(compiler, evaluator, null); + } + + @SuppressWarnings("unchecked") + public KotlinRepl(JvmReplCompiler compiler, + JvmReplEvaluator evaluator, + String outputDir) { this.compiler = compiler; this.evaluator = evaluator; ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); @@ -30,6 +45,8 @@ public KotlinRepl(JvmReplCompiler compiler, stateLock); counter = new AtomicInteger(0); + + this.outputDir = outputDir; } public InterpreterResult eval(String code) { @@ -50,6 +67,7 @@ public InterpreterResult eval(String code) { ReplCompileResult.CompiledClasses classes = (ReplCompileResult.CompiledClasses) compileResult; + writeClasses(classes); ReplEvalResult evalResult = evaluator.eval(state, classes, null, null); @@ -79,4 +97,26 @@ public InterpreterResult eval(String code) { return new InterpreterResult(InterpreterResult.Code.ERROR, "unknown evaluation result: " + evalResult.toString()); } + + private void writeClasses(ReplCompileResult.CompiledClasses classes) { + if (outputDir == null) { + return; + } + + for (CompiledClassData compiledClass: classes.getClasses()) { + String filePath = compiledClass.getPath(); + if (filePath.contains("/")) { + continue; + } + String classWritePath = outputDir + File.separator + filePath; + + try (FileOutputStream fos = new FileOutputStream(classWritePath); + OutputStream out = new BufferedOutputStream(fos)) { + out.write(compiledClass.getBytes()); + out.flush(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } + } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 6bff6ee77c7..d0b5d4c6072 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -29,16 +29,14 @@ public class KotlinReplBuilder { private ExecutionContext ctx; private List compilerOptions; + private String outputDir; public KotlinReplBuilder() { - logger.debug("KotlinReplBuilder created"); this.ctx = new ExecutionContext("Simple Execution Context"); this.compilerOptions = new ArrayList<>(); } public KotlinRepl build() { - logger.debug("build called"); - KJvmReplCompilerImpl compilerImpl = new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); @@ -51,26 +49,21 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - return new KotlinRepl(compiler, evaluator); + return new KotlinRepl(compiler, evaluator, outputDir); } public KotlinReplBuilder executionContext(ExecutionContext ctx) { - logger.debug("executionContext changed from" + this.ctx + " to " + ctx); - this.ctx = ctx; return this; } public KotlinReplBuilder compilerOptions(List options) { - logger.debug("options set to " + options); options.forEach(logger::info); this.compilerOptions = options; return this; } private ScriptCompilationConfiguration buildCompilationConfiguration() { - logger.debug("building comp conf w/ " + ctx + " and " + compilerOptions); - return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); @@ -91,8 +84,6 @@ private ScriptCompilationConfiguration buildCompilationConfiguration() { } private ScriptEvaluationConfiguration buildEvaluationConfiguration() { - logger.debug("building eval conf w/ " + ctx); - return new ScriptEvaluationConfiguration((b) -> { b.invoke(ScriptEvaluationKt.getHostConfiguration(b), hostConf); @@ -103,4 +94,8 @@ private ScriptEvaluationConfiguration buildEvaluationConfiguration() { return Unit.INSTANCE; }); } + + public void outputDir(String outputDir) { + this.outputDir = outputDir; + } } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index f0687635e6f..ea6f3166ea7 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -65,20 +65,21 @@ public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); - Object spark = sparkInterpreter.getSparkSession(); - JavaSparkContext sc = sparkInterpreter.getJavaSparkContext(); - - logger.debug("setting execution ctx now"); - interpreter.setExecutionContext(new KotlinSparkExecutionContext(spark, sc)); + JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); + KotlinSparkExecutionContext ctx = new KotlinSparkExecutionContext( + sparkInterpreter.getSparkSession(), + jsc); String cp = sparkClasspath(); - logger.debug(cp); List compilerOptions = Arrays.asList("-classpath", cp); - logger.debug("setting compiler options now"); - interpreter.setCompilerOptions(compilerOptions); + String outputDir = jsc.getConf().get("spark.repl.class.outputDir"); + + interpreter.getBuilder() + .executionContext(ctx) + .compilerOptions(compilerOptions) + .outputDir(outputDir); - logger.debug("opening inner intp now"); interpreter.open(); } From d89dbe696daa2714fe3495762ecb5ee4b10a1d21 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 24 Jul 2019 16:36:18 +0300 Subject: [PATCH 021/117] Shading jpountz module --- kotlin/pom.xml | 19 +++++++++++++++++++ .../zeppelin/kotlin/KotlinInterpreter.java | 9 +++++++++ .../spark/KotlinSparkInterpreter.java | 14 ++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index d259c32f0b4..056a119ee68 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -113,6 +113,25 @@ maven-shade-plugin + + + package + + shade + + + + + net.jpountz + org.apache.zeppelin.kotlin.shaded.net.jpountz + + + + + + + + org.apache.maven.plugins diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 4d45eca5d18..8f0057fbeee 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -4,13 +4,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.PrintStream; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; import org.apache.zeppelin.scheduler.Job; @@ -85,6 +88,12 @@ public int getProgress(InterpreterContext context) throws InterpreterException { return 0; } + @Override + public List completion(String buf, int cursor, + InterpreterContext interpreterContext) throws InterpreterException { + return new ArrayList<>(); + } + private Job getRunningJob(String paragraphId) { Job foundJob = null; Collection jobsRunning = getScheduler().getAllJobs(); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index ea6f3166ea7..d8a4488d10f 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,5 +1,6 @@ package org.apache.zeppelin.spark; +import net.jpountz.xxhash.StreamingXXHash32; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.util.Utils; import org.slf4j.Logger; @@ -16,9 +17,9 @@ import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinInterpreter; - public class KotlinSparkInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(KotlinSparkInterpreter.class); @@ -28,9 +29,11 @@ public class KotlinSparkInterpreter extends Interpreter { public KotlinSparkInterpreter(Properties properties) { super(properties); logger.debug("Creating KotlinSparkInterpreter"); + logger.info("jpountz path: " + StreamingXXHash32.class.getProtectionDomain().getCodeSource().getLocation().getPath()); + logger.info("classpath: " + System.getProperty("java.class.path")); interpreter = new KotlinInterpreter(properties); - } + } private String sparkClasspath() { String sparkJars = System.getProperty("spark.jars"); @@ -57,6 +60,7 @@ private String sparkClasspath() { } }) .collect(Collectors.joining(File.pathSeparator)); + } @@ -108,4 +112,10 @@ public FormType getFormType() throws InterpreterException { public int getProgress(InterpreterContext context) throws InterpreterException { return interpreter.getProgress(context); } + + @Override + public List completion(String buf, int cursor, + InterpreterContext interpreterContext) throws InterpreterException { + return interpreter.completion(buf, cursor, interpreterContext); + } } From d478dd1bfc8c21f8688bcfb9023ce5d51378abab Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 26 Jul 2019 14:56:03 +0300 Subject: [PATCH 022/117] Switched to local kotlin JARs with bugfixes --- kotlin-compiler-shaded/pom.xml | 188 +++++++++++++++++++++++++++++++++ kotlin/pom.xml | 66 ++++++------ 2 files changed, 222 insertions(+), 32 deletions(-) create mode 100644 kotlin-compiler-shaded/pom.xml diff --git a/kotlin-compiler-shaded/pom.xml b/kotlin-compiler-shaded/pom.xml new file mode 100644 index 00000000000..775d55196b2 --- /dev/null +++ b/kotlin-compiler-shaded/pom.xml @@ -0,0 +1,188 @@ + + + + + 4.0.0 + + + zeppelin + org.apache.zeppelin + 0.9.0-SNAPSHOT + .. + + + kotlin-compiler-shaded + 0.9.0-SNAPSHOT + Shaded Kotlin Compiler + + + 1.3.50-eap-5 + + + + + bintray-kotlin + https://dl.bintray.com/kotlin/kotlin-dev + + + + + + org.jetbrains.kotlin + kotlin-compiler + ${kotlin-version} + + + org.jetbrains.kotlin + * + + + org.intellij.lang.annotations + * + + + org.jetbrains.jps + * + + + com.sun.jna + * + + + com.thoughtworks.xstream + * + + + javaslang + * + + + messages + * + + + net.sf.cglib + * + + + one.util.streamex + * + + + org.iq80.snappy + * + + + org.jline + * + + + org.xmlpull + * + + + org.slf4j + * + + + + + + + + + maven-enforcer-plugin + + + maven-dependency-plugin + + + maven-resources-plugin + + + maven-shade-plugin + + + package + + shade + + + + + com.intellij + org.jetbrains.kotlin.shaded.com.intellij + + + com.google + org.jetbrains.kotlin.shaded.com.google + + + com.sampullara + org.jetbrains.kotlin.shaded.com.sampullara + + + org.apache + org.jetbrains.kotlin.shaded.org.apache + + + org.jdom + org.jetbrains.kotlin.shaded.org.jdom + + + org.picocontainer + org.jetbrains.kotlin.shaded.org.picocontainer + + + org.jline + org.jetbrains.kotlin.shaded.org.jline + + + org.fusesource + org.jetbrains.kotlin.shaded.org.fusesource + + + kotlinx.coroutines + org.jetbrains.kotlin.shaded.kotlinx.coroutines + + + net.jpountz + org.jetbrains.kotlin.shaded.net.jpountz + + + org.slf4j + org.jetbrains.kotlin.shaded.org.slf4j + + + + + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + false + + + + + diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 056a119ee68..4b14bb2d6b9 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,16 +34,16 @@ kotlin - 1.3.50-eap-5 + 1.3-SNAPSHOT - + @@ -52,9 +52,6 @@ ${kotlin-version} - org.jetbrains.kotlin - kotlin-stdlib - org.jetbrains.kotlin kotlin-stdlib-common @@ -64,12 +61,6 @@ org.jetbrains.kotlin kotlin-compiler-embeddable ${kotlin-version} - - - org.jetbrains.kotlin - kotlin-stdlib - - org.jetbrains.kotlin @@ -85,7 +76,7 @@ org.jetbrains.kotlin kotlin-scripting-compiler-embeddable - 1.3.50-eap-5 + ${kotlin-version} org.jetbrains.kotlin @@ -93,11 +84,41 @@ + + org.jetbrains.kotlin + kotlin-scripting-common + ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin-version} + org.jetbrains.kotlin kotlin-stdlib ${kotlin-version} + + org.jetbrains.kotlin + kotlin-script-runtime + ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-scripting-compiler-impl-embeddable + ${kotlin-version} + + + org.jetbrains.intellij.deps + trove4j + 1.0.20190514 + + + org.jetbrains + annotations + 17.0.0 + @@ -113,25 +134,6 @@ maven-shade-plugin - - - package - - shade - - - - - net.jpountz - org.apache.zeppelin.kotlin.shaded.net.jpountz - - - - - - - - org.apache.maven.plugins From ea024b5a81af7897a6b508991d029ebbb4b4884c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 26 Jul 2019 15:17:13 +0300 Subject: [PATCH 023/117] Added ZeppelinContext to ExecutionContext --- .../zeppelin/spark/KotlinSparkExecutionContext.java | 6 +++++- .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 8 ++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java index f6f388a88fb..7f4821d08d0 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java @@ -6,10 +6,14 @@ public class KotlinSparkExecutionContext extends ExecutionContext { public Object spark; public JavaSparkContext sc; + public SparkZeppelinContext z; - public KotlinSparkExecutionContext(Object spark, JavaSparkContext sc) { + public KotlinSparkExecutionContext(Object spark, + JavaSparkContext sc, + SparkZeppelinContext z) { super("HELLO SPARK"); this.spark = spark; this.sc = sc; + this.z = z; } } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index d8a4488d10f..8e8887a5d40 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,6 +1,5 @@ package org.apache.zeppelin.spark; -import net.jpountz.xxhash.StreamingXXHash32; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.util.Utils; import org.slf4j.Logger; @@ -29,10 +28,7 @@ public class KotlinSparkInterpreter extends Interpreter { public KotlinSparkInterpreter(Properties properties) { super(properties); logger.debug("Creating KotlinSparkInterpreter"); - logger.info("jpountz path: " + StreamingXXHash32.class.getProtectionDomain().getCodeSource().getLocation().getPath()); - logger.info("classpath: " + System.getProperty("java.class.path")); interpreter = new KotlinInterpreter(properties); - } private String sparkClasspath() { @@ -60,7 +56,6 @@ private String sparkClasspath() { } }) .collect(Collectors.joining(File.pathSeparator)); - } @@ -72,7 +67,8 @@ public void open() throws InterpreterException { JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); KotlinSparkExecutionContext ctx = new KotlinSparkExecutionContext( sparkInterpreter.getSparkSession(), - jsc); + jsc, + (SparkZeppelinContext) sparkInterpreter.getZeppelinContext()); String cp = sparkClasspath(); List compilerOptions = Arrays.asList("-classpath", cp); From 62d87c1afde788455aee3d79b6c90b8cb69e0ae2 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 26 Jul 2019 16:15:02 +0300 Subject: [PATCH 024/117] Fixed show in ZeppelinContext --- .../zeppelin/spark/KotlinSparkInterpreter.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 8e8887a5d40..1a6dd43cc38 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -24,6 +24,7 @@ public class KotlinSparkInterpreter extends Interpreter { private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; + private SparkZeppelinContext z; public KotlinSparkInterpreter(Properties properties) { super(properties); @@ -63,12 +64,11 @@ private String sparkClasspath() { public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); - JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); + z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); + KotlinSparkExecutionContext ctx = new KotlinSparkExecutionContext( - sparkInterpreter.getSparkSession(), - jsc, - (SparkZeppelinContext) sparkInterpreter.getZeppelinContext()); + sparkInterpreter.getSparkSession(), jsc, z); String cp = sparkClasspath(); List compilerOptions = Arrays.asList("-classpath", cp); @@ -91,6 +91,12 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { + + z.setInterpreterContext(context); + z.setGui(context.getGui()); + z.setNoteGui(context.getNoteGui()); + InterpreterContext.set(context); + return interpreter.interpret(st, context); } From fb5a64b3aedfdfbdcb5992f1385d987fb0ef7be6 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 29 Jul 2019 15:44:55 +0300 Subject: [PATCH 025/117] Fixed interpreter output error --- .../java/org/apache/zeppelin/kotlin/KotlinInterpreter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 8f0057fbeee..f1386a4694d 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -39,7 +39,6 @@ public void open() throws InterpreterException { interpreter = builder.build(); out = new InterpreterOutputStream(logger); - System.setOut(new PrintStream(out)); } @Override @@ -58,7 +57,11 @@ public InterpreterResult interpret(String st, out.setInterpreterOutput(context.out); - return interpreter.eval(st); + PrintStream oldOut = System.out; + System.setOut(new PrintStream(out)); + InterpreterResult res = interpreter.eval(st); + System.setOut(oldOut); + return res; } @Override From b9e9f7e7f986ea66ca8459f666511084c16c1630 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 29 Jul 2019 17:09:48 +0300 Subject: [PATCH 026/117] Refactored Kotlin execution context --- .../zeppelin/kotlin/ExecutionContext.java | 11 ---------- .../zeppelin/kotlin/KotlinReplBuilder.java | 7 ++++--- .../kotlin/context/KotlinContext.java | 10 ++++++++++ .../kotlin/context/ZeppelinKotlinContext.java | 10 ++++++++++ .../spark/KotlinSparkExecutionContext.java | 19 ------------------ .../spark/KotlinSparkInterpreter.java | 5 +++-- .../zeppelin/spark/SparkKotlinContext.java | 20 +++++++++++++++++++ 7 files changed, 47 insertions(+), 35 deletions(-) delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java delete mode 100644 spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java create mode 100644 spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java deleted file mode 100644 index f563e108015..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ExecutionContext.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.apache.zeppelin.kotlin; - -public class ExecutionContext { - public String msg; - public StringBuilder sb; - - public ExecutionContext(String msg) { - this.msg = msg; - this.sb = new StringBuilder(); - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index d0b5d4c6072..3cf8c636289 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -20,6 +20,7 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +import org.apache.zeppelin.kotlin.context.KotlinContext; public class KotlinReplBuilder { @@ -27,12 +28,12 @@ public class KotlinReplBuilder { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); - private ExecutionContext ctx; + private KotlinContext ctx; private List compilerOptions; private String outputDir; public KotlinReplBuilder() { - this.ctx = new ExecutionContext("Simple Execution Context"); + this.ctx = new KotlinContext(); this.compilerOptions = new ArrayList<>(); } @@ -52,7 +53,7 @@ public KotlinRepl build() { return new KotlinRepl(compiler, evaluator, outputDir); } - public KotlinReplBuilder executionContext(ExecutionContext ctx) { + public KotlinReplBuilder executionContext(KotlinContext ctx) { this.ctx = ctx; return this; } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java new file mode 100644 index 00000000000..1aaabc1a8ae --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java @@ -0,0 +1,10 @@ +package org.apache.zeppelin.kotlin.context; + +/** + The execution context for lines in Kotlin REPL. + It is passed to the script as an implicit receiver, identical to: + with (context) { + ... + } + */ +public class KotlinContext {} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java new file mode 100644 index 00000000000..46b3d6defe0 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java @@ -0,0 +1,10 @@ +package org.apache.zeppelin.kotlin.context; + +import org.apache.zeppelin.interpreter.BaseZeppelinContext; + +public class ZeppelinKotlinContext extends KotlinContext { + public BaseZeppelinContext z; + public ZeppelinKotlinContext(BaseZeppelinContext z) { + this.z = z; + } +} diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java deleted file mode 100644 index 7f4821d08d0..00000000000 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkExecutionContext.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.apache.zeppelin.spark; - -import org.apache.spark.api.java.JavaSparkContext; -import org.apache.zeppelin.kotlin.ExecutionContext; - -public class KotlinSparkExecutionContext extends ExecutionContext { - public Object spark; - public JavaSparkContext sc; - public SparkZeppelinContext z; - - public KotlinSparkExecutionContext(Object spark, - JavaSparkContext sc, - SparkZeppelinContext z) { - super("HELLO SPARK"); - this.spark = spark; - this.sc = sc; - this.z = z; - } -} diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 1a6dd43cc38..d8ffb342f0d 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,6 +1,7 @@ package org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.sql.SparkSession; import org.apache.spark.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,8 +68,8 @@ public void open() throws InterpreterException { JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); - KotlinSparkExecutionContext ctx = new KotlinSparkExecutionContext( - sparkInterpreter.getSparkSession(), jsc, z); + SparkKotlinContext ctx = new SparkKotlinContext( + (SparkSession) sparkInterpreter.getSparkSession(), jsc, z); String cp = sparkClasspath(); List compilerOptions = Arrays.asList("-classpath", cp); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java new file mode 100644 index 00000000000..ca4359fd8fd --- /dev/null +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java @@ -0,0 +1,20 @@ +package org.apache.zeppelin.spark; + +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.sql.SparkSession; +import org.apache.zeppelin.kotlin.context.ZeppelinKotlinContext; + +public class SparkKotlinContext extends ZeppelinKotlinContext { + public SparkSession spark; + public JavaSparkContext sc; + public SparkZeppelinContext z; + + public SparkKotlinContext(SparkSession spark, + JavaSparkContext sc, + SparkZeppelinContext z) { + super(z); + this.spark = spark; + this.sc = sc; + this.z = z; + } +} From 4aaf0bb3e284c4a866afc26fa3f9f312e70fd267 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 30 Jul 2019 12:05:26 +0300 Subject: [PATCH 027/117] Added kotlin interpreter to SparkZeppelinContext list of interpreters --- kotlin-compiler-shaded/pom.xml | 188 ------------------ .../zeppelin/spark/SparkZeppelinContext.scala | 12 +- 2 files changed, 7 insertions(+), 193 deletions(-) delete mode 100644 kotlin-compiler-shaded/pom.xml diff --git a/kotlin-compiler-shaded/pom.xml b/kotlin-compiler-shaded/pom.xml deleted file mode 100644 index 775d55196b2..00000000000 --- a/kotlin-compiler-shaded/pom.xml +++ /dev/null @@ -1,188 +0,0 @@ - - - - - 4.0.0 - - - zeppelin - org.apache.zeppelin - 0.9.0-SNAPSHOT - .. - - - kotlin-compiler-shaded - 0.9.0-SNAPSHOT - Shaded Kotlin Compiler - - - 1.3.50-eap-5 - - - - - bintray-kotlin - https://dl.bintray.com/kotlin/kotlin-dev - - - - - - org.jetbrains.kotlin - kotlin-compiler - ${kotlin-version} - - - org.jetbrains.kotlin - * - - - org.intellij.lang.annotations - * - - - org.jetbrains.jps - * - - - com.sun.jna - * - - - com.thoughtworks.xstream - * - - - javaslang - * - - - messages - * - - - net.sf.cglib - * - - - one.util.streamex - * - - - org.iq80.snappy - * - - - org.jline - * - - - org.xmlpull - * - - - org.slf4j - * - - - - - - - - - maven-enforcer-plugin - - - maven-dependency-plugin - - - maven-resources-plugin - - - maven-shade-plugin - - - package - - shade - - - - - com.intellij - org.jetbrains.kotlin.shaded.com.intellij - - - com.google - org.jetbrains.kotlin.shaded.com.google - - - com.sampullara - org.jetbrains.kotlin.shaded.com.sampullara - - - org.apache - org.jetbrains.kotlin.shaded.org.apache - - - org.jdom - org.jetbrains.kotlin.shaded.org.jdom - - - org.picocontainer - org.jetbrains.kotlin.shaded.org.picocontainer - - - org.jline - org.jetbrains.kotlin.shaded.org.jline - - - org.fusesource - org.jetbrains.kotlin.shaded.org.fusesource - - - kotlinx.coroutines - org.jetbrains.kotlin.shaded.kotlinx.coroutines - - - net.jpountz - org.jetbrains.kotlin.shaded.net.jpountz - - - org.slf4j - org.jetbrains.kotlin.shaded.org.slf4j - - - - - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - - false - - - - - diff --git a/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala b/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala index 83594d06605..ec3c88026c2 100644 --- a/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala +++ b/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala @@ -37,11 +37,13 @@ class SparkZeppelinContext(val sc: SparkContext, val maxResult2: Int) extends BaseZeppelinContext(hooks2, maxResult2) { private val interpreterClassMap = Map( - ("spark", "org.apache.zeppelin.spark.SparkInterpreter"), - ("sql", "org.apache.zeppelin.spark.SparkSqlInterpreter"), - ("pyspark", "org.apache.zeppelin.spark.PySparkInterpreter"), - ("ipyspark", "org.apache.zeppelin.spark.IPySparkInterpreter"), - ("r", "org.apache.zeppelin.spark.SparkRInterpreter") + "spark" -> "org.apache.zeppelin.spark.SparkInterpreter", + "sql" -> "org.apache.zeppelin.spark.SparkSqlInterpreter", + "dep" -> "org.apache.zeppelin.spark.DepInterpreter", + "pyspark" -> "org.apache.zeppelin.spark.PySparkInterpreter", + "ipyspark" -> "org.apache.zeppelin.spark.IPySparkInterpreter", + "r" -> "org.apache.zeppelin.spark.SparkRInterpreter", + "kotlin" -> "org.apache.zeppelin.spark.KotlinSparkInterpreter" ) private val supportedClasses = scala.collection.mutable.ArrayBuffer[Class[_]]() From 019a7c5a3b264433dae4c25d4a68f71d9254dbbd Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 30 Jul 2019 15:57:52 +0300 Subject: [PATCH 028/117] Added ZeppelinContext to default Kotlin Interpreter --- .../kotlin/BaseKotlinZeppelinContext.java | 28 +++++++++++++++++++ .../zeppelin/kotlin/KotlinInterpreter.java | 6 ++++ .../apache/zeppelin/kotlin/KotlinRepl.java | 3 +- .../main/resources/interpreter-setting.json | 7 +++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java new file mode 100644 index 00000000000..d620130731a --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java @@ -0,0 +1,28 @@ +package org.apache.zeppelin.kotlin; + +import java.util.List; +import java.util.Map; +import org.apache.zeppelin.interpreter.BaseZeppelinContext; +import org.apache.zeppelin.interpreter.InterpreterHookRegistry; + +public class BaseKotlinZeppelinContext extends BaseZeppelinContext { + + public BaseKotlinZeppelinContext(InterpreterHookRegistry hooks, int maxResult) { + super(hooks, maxResult); + } + + @Override + public Map getInterpreterClassMap() { + return null; + } + + @Override + public List getSupportedClasses() { + return null; + } + + @Override + public String showData(Object obj, int maxResult) { + return null; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index f1386a4694d..6620905cbdb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -15,6 +15,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; +import org.apache.zeppelin.kotlin.context.ZeppelinKotlinContext; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -28,6 +29,11 @@ public class KotlinInterpreter extends Interpreter { public KotlinInterpreter(Properties properties) { super(properties); builder = new KotlinReplBuilder(); + BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext( + getInterpreterGroup().getInterpreterHookRegistry(), + Integer.parseInt(properties.getProperty("zeppelin.kotlin.maxResult", "1000")) + ); + builder.executionContext(new ZeppelinKotlinContext(defaultCtx)); } public KotlinReplBuilder getBuilder() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index f893652caca..8b0c0b9e46f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -92,7 +92,8 @@ public InterpreterResult eval(String code) { String valueString = (value != null) ? value.toString() : "null"; return new InterpreterResult( - InterpreterResult.Code.SUCCESS, valueString + ": " + e.getType()); + InterpreterResult.Code.SUCCESS, + e.getName() + ": " + e.getType() + " = " + valueString); } return new InterpreterResult(InterpreterResult.Code.ERROR, "unknown evaluation result: " + evalResult.toString()); diff --git a/kotlin/src/main/resources/interpreter-setting.json b/kotlin/src/main/resources/interpreter-setting.json index ef432f3b68c..ffd296d1991 100644 --- a/kotlin/src/main/resources/interpreter-setting.json +++ b/kotlin/src/main/resources/interpreter-setting.json @@ -5,6 +5,13 @@ "className": "org.apache.zeppelin.kotlin.KotlinInterpreter", "defaultInterpreter": true, "properties": { + "zeppelin.kotlin.maxResult": { + "envName": null, + "propertyName": "zeppelin.kotlin.maxResult", + "defaultValue": "1000", + "description": "Max number of dataframe rows to display.", + "type": "number" + } }, "editor": { "language": "kotlin", From de1cd14e57acd925daac4827b8a973f50eb5e4e0 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 30 Jul 2019 16:00:33 +0300 Subject: [PATCH 029/117] Refactoring: renamed KotlinContext and children to KotlinReceiver to avoid confusion with ZeppelinContext --- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 4 ++-- .../org/apache/zeppelin/kotlin/KotlinReplBuilder.java | 8 ++++---- .../{KotlinContext.java => KotlinReceiver.java} | 2 +- ...nKotlinContext.java => ZeppelinKotlinReceiver.java} | 4 ++-- .../apache/zeppelin/spark/KotlinSparkInterpreter.java | 2 +- ...parkKotlinContext.java => SparkKotlinReceiver.java} | 10 +++++----- 6 files changed, 15 insertions(+), 15 deletions(-) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/context/{KotlinContext.java => KotlinReceiver.java} (86%) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/context/{ZeppelinKotlinContext.java => ZeppelinKotlinReceiver.java} (57%) rename spark/interpreter/src/main/java/org/apache/zeppelin/spark/{SparkKotlinContext.java => SparkKotlinReceiver.java} (51%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 6620905cbdb..0f2c4f478c8 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -15,7 +15,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; -import org.apache.zeppelin.kotlin.context.ZeppelinKotlinContext; +import org.apache.zeppelin.kotlin.context.ZeppelinKotlinReceiver; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -33,7 +33,7 @@ public KotlinInterpreter(Properties properties) { getInterpreterGroup().getInterpreterHookRegistry(), Integer.parseInt(properties.getProperty("zeppelin.kotlin.maxResult", "1000")) ); - builder.executionContext(new ZeppelinKotlinContext(defaultCtx)); + builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)); } public KotlinReplBuilder getBuilder() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 3cf8c636289..303d12a0ecb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -20,7 +20,7 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.apache.zeppelin.kotlin.context.KotlinContext; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; public class KotlinReplBuilder { @@ -28,12 +28,12 @@ public class KotlinReplBuilder { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); - private KotlinContext ctx; + private KotlinReceiver ctx; private List compilerOptions; private String outputDir; public KotlinReplBuilder() { - this.ctx = new KotlinContext(); + this.ctx = new KotlinReceiver(); this.compilerOptions = new ArrayList<>(); } @@ -53,7 +53,7 @@ public KotlinRepl build() { return new KotlinRepl(compiler, evaluator, outputDir); } - public KotlinReplBuilder executionContext(KotlinContext ctx) { + public KotlinReplBuilder executionContext(KotlinReceiver ctx) { this.ctx = ctx; return this; } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java similarity index 86% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index 1aaabc1a8ae..a9c998d3889 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinContext.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -7,4 +7,4 @@ ... } */ -public class KotlinContext {} +public class KotlinReceiver {} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java similarity index 57% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java index 46b3d6defe0..0a493af10c0 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinContext.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java @@ -2,9 +2,9 @@ import org.apache.zeppelin.interpreter.BaseZeppelinContext; -public class ZeppelinKotlinContext extends KotlinContext { +public class ZeppelinKotlinReceiver extends KotlinReceiver { public BaseZeppelinContext z; - public ZeppelinKotlinContext(BaseZeppelinContext z) { + public ZeppelinKotlinReceiver(BaseZeppelinContext z) { this.z = z; } } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index d8ffb342f0d..5009395a358 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -68,7 +68,7 @@ public void open() throws InterpreterException { JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); - SparkKotlinContext ctx = new SparkKotlinContext( + SparkKotlinReceiver ctx = new SparkKotlinReceiver( (SparkSession) sparkInterpreter.getSparkSession(), jsc, z); String cp = sparkClasspath(); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java similarity index 51% rename from spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java rename to spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java index ca4359fd8fd..bdc33c0044a 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinContext.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java @@ -2,16 +2,16 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SparkSession; -import org.apache.zeppelin.kotlin.context.ZeppelinKotlinContext; +import org.apache.zeppelin.kotlin.context.ZeppelinKotlinReceiver; -public class SparkKotlinContext extends ZeppelinKotlinContext { +public class SparkKotlinReceiver extends ZeppelinKotlinReceiver { public SparkSession spark; public JavaSparkContext sc; public SparkZeppelinContext z; - public SparkKotlinContext(SparkSession spark, - JavaSparkContext sc, - SparkZeppelinContext z) { + public SparkKotlinReceiver(SparkSession spark, + JavaSparkContext sc, + SparkZeppelinContext z) { super(z); this.spark = spark; this.sc = sc; From 060a82209172dae40a4f63f11cb4fca2e71f4c01 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 30 Jul 2019 17:15:53 +0300 Subject: [PATCH 030/117] Added max result output limit for Kotlin REPL --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../apache/zeppelin/kotlin/KotlinRepl.java | 36 ++++++-- .../zeppelin/kotlin/KotlinReplBuilder.java | 8 +- .../main/resources/interpreter-setting.json | 83 +------------------ 4 files changed, 39 insertions(+), 90 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 0f2c4f478c8..c0ef6689997 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -30,7 +30,7 @@ public KotlinInterpreter(Properties properties) { super(properties); builder = new KotlinReplBuilder(); BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext( - getInterpreterGroup().getInterpreterHookRegistry(), + null, // TODO(dk) figure out why getInterpreterGroup().getInterpreterHookRegistry() NPEs Integer.parseInt(properties.getProperty("zeppelin.kotlin.maxResult", "1000")) ); builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 8b0c0b9e46f..d1570d1c8f3 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -12,8 +12,10 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Collection; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.stream.Collectors; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; @@ -26,16 +28,18 @@ public class KotlinRepl { private AggregatedReplStageState state; private AtomicInteger counter; private String outputDir; + private int maxResult; public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator) { - this(compiler, evaluator, null); + this(compiler, evaluator, null, 0); } @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator, - String outputDir) { + String outputDir, + int maxResult) { this.compiler = compiler; this.evaluator = evaluator; ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); @@ -43,10 +47,10 @@ public KotlinRepl(JvmReplCompiler compiler, compiler.createState(stateLock), evaluator.createState(stateLock), stateLock); - counter = new AtomicInteger(0); this.outputDir = outputDir; + this.maxResult = maxResult; } public InterpreterResult eval(String code) { @@ -87,18 +91,34 @@ public InterpreterResult eval(String code) { return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { - ReplEvalResult.ValueResult e = (ReplEvalResult.ValueResult) evalResult; - Object value = e.getValue(); - String valueString = (value != null) ? value.toString() : "null"; - + ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; + String valueString = prepareValueString(v.getValue()); return new InterpreterResult( InterpreterResult.Code.SUCCESS, - e.getName() + ": " + e.getType() + " = " + valueString); + v.getName() + ": " + v.getType() + " = " + valueString); } return new InterpreterResult(InterpreterResult.Code.ERROR, "unknown evaluation result: " + evalResult.toString()); } + private String prepareValueString(Object value) { + if (value == null) { + return "null"; + } + if (!(value instanceof Collection)) { + return value.toString(); + } + Collection collection = (Collection) value; + if (collection.size() <= maxResult) { + return value.toString(); + } + return "[" + collection.stream() + .limit(maxResult) + .map(Object::toString) + .collect(Collectors.joining(",")) + + "..." + (collection.size() - maxResult) + " more]"; + } + private void writeClasses(ReplCompileResult.CompiledClasses classes) { if (outputDir == null) { return; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 303d12a0ecb..45e53d72fd5 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -31,6 +31,7 @@ public class KotlinReplBuilder { private KotlinReceiver ctx; private List compilerOptions; private String outputDir; + private int maxResult; public KotlinReplBuilder() { this.ctx = new KotlinReceiver(); @@ -50,7 +51,12 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - return new KotlinRepl(compiler, evaluator, outputDir); + return new KotlinRepl(compiler, evaluator, outputDir, maxResult); + } + + public KotlinReplBuilder maxResult(int maxResult) { + this.maxResult = maxResult; + return this; } public KotlinReplBuilder executionContext(KotlinReceiver ctx) { diff --git a/spark/interpreter/src/main/resources/interpreter-setting.json b/spark/interpreter/src/main/resources/interpreter-setting.json index 47084eaf8ec..eed41f323ed 100644 --- a/spark/interpreter/src/main/resources/interpreter-setting.json +++ b/spark/interpreter/src/main/resources/interpreter-setting.json @@ -249,34 +249,6 @@ "name": "kotlin", "className": "org.apache.zeppelin.spark.KotlinSparkInterpreter", "properties": { - "spark.executor.memory": { - "envName": null, - "propertyName": "spark.executor.memory", - "defaultValue": "", - "description": "Executor memory per worker instance. ex) 512m, 32g", - "type": "string" - }, - "args": { - "envName": null, - "propertyName": null, - "defaultValue": "", - "description": "spark commandline args", - "type": "textarea" - }, - "zeppelin.spark.useHiveContext": { - "envName": "ZEPPELIN_SPARK_USEHIVECONTEXT", - "propertyName": "zeppelin.spark.useHiveContext", - "defaultValue": true, - "description": "Use HiveContext instead of SQLContext if it is true.", - "type": "checkbox" - }, - "spark.app.name": { - "envName": "SPARK_APP_NAME", - "propertyName": "spark.app.name", - "defaultValue": "Zeppelin", - "description": "The name of spark application.", - "type": "string" - }, "zeppelin.spark.printREPLOutput": { "envName": null, "propertyName": "zeppelin.spark.printREPLOutput", @@ -284,61 +256,12 @@ "description": "Print REPL output", "type": "checkbox" }, - "spark.cores.max": { - "envName": null, - "propertyName": "spark.cores.max", - "defaultValue": "", - "description": "Total number of cores to use. Empty value uses all available core.", - "type": "number" - }, "zeppelin.spark.maxResult": { - "envName": "ZEPPELIN_SPARK_MAXRESULT", - "propertyName": "zeppelin.spark.maxResult", + "envName": null, + "propertyName": "zeppelin.kotlin.maxResult", "defaultValue": "1000", - "description": "Max number of Spark SQL result to display.", + "description": "Max number of result to display.", "type": "number" - }, - "master": { - "envName": "MASTER", - "propertyName": "spark.master", - "defaultValue": "local[*]", - "description": "Spark master uri. ex) spark://masterhost:7077", - "type": "string" - }, - "zeppelin.spark.enableSupportedVersionCheck": { - "envName": null, - "propertyName": "zeppelin.spark.enableSupportedVersionCheck", - "defaultValue": true, - "description": "Do not change - developer only setting, not for production use", - "type": "checkbox" - }, - "zeppelin.spark.uiWebUrl": { - "envName": null, - "propertyName": "zeppelin.spark.uiWebUrl", - "defaultValue": "", - "description": "Override Spark UI default URL", - "type": "string" - }, - "zeppelin.spark.useNew": { - "envName": null, - "propertyName": "zeppelin.spark.useNew", - "defaultValue": true, - "description": "Whether use new spark interpreter implementation", - "type": "checkbox" - }, - "zeppelin.spark.ui.hidden": { - "envName": null, - "propertyName": "zeppelin.spark.ui.hidden", - "defaultValue": false, - "description": "Whether to hide spark ui in zeppelin ui", - "type": "checkbox" - }, - "zeppelin.spark.scala.color": { - "envName": null, - "propertyName": "zeppelin.spark.scala.color", - "defaultValue": true, - "description": "Whether to enable color output of spark scala interpreter", - "type": "checkbox" } }, "editor": { From 76eaf171eafbc9e744ca374bc6f4a29f88b1130b Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 30 Jul 2019 18:20:15 +0300 Subject: [PATCH 031/117] Fixed max result output limit for Kotlin REPL --- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 11 ++++++----- .../java/org/apache/zeppelin/kotlin/KotlinRepl.java | 5 ++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index c0ef6689997..9a3d483ef64 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -29,11 +29,12 @@ public class KotlinInterpreter extends Interpreter { public KotlinInterpreter(Properties properties) { super(properties); builder = new KotlinReplBuilder(); - BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext( - null, // TODO(dk) figure out why getInterpreterGroup().getInterpreterHookRegistry() NPEs - Integer.parseInt(properties.getProperty("zeppelin.kotlin.maxResult", "1000")) - ); - builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)); + int maxResult = Integer.parseInt( + properties.getProperty("zeppelin.kotlin.maxResult", "1000")); + + // TODO(dk) figure out why getInterpreterGroup().getInterpreterHookRegistry() NPEs + BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext(null, maxResult); + builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)).maxResult(maxResult); } public KotlinReplBuilder getBuilder() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index d1570d1c8f3..1e428e0954a 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -108,15 +108,18 @@ private String prepareValueString(Object value) { if (!(value instanceof Collection)) { return value.toString(); } + Collection collection = (Collection) value; + if (collection.size() <= maxResult) { return value.toString(); } + return "[" + collection.stream() .limit(maxResult) .map(Object::toString) .collect(Collectors.joining(",")) - + "..." + (collection.size() - maxResult) + " more]"; + + " ... " + (collection.size() - maxResult) + " more]"; } private void writeClasses(ReplCompileResult.CompiledClasses classes) { From 64f5849d27c56e2e6859af02d711f988f6b5bfcc Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 14 Aug 2019 10:12:22 +0300 Subject: [PATCH 032/117] Removed local mvn repo dependencies --- kotlin/pom.xml | 47 +++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 34 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 4b14bb2d6b9..73809f894a7 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,23 +34,26 @@ kotlin - 1.3-SNAPSHOT + 1.3.50-eap-86 - + - org.jetbrains.kotlin kotlin-scripting-jvm-host-embeddable ${kotlin-version} + + org.jetbrains.kotlin + kotlin-stdlib + org.jetbrains.kotlin kotlin-stdlib-common @@ -61,6 +64,12 @@ org.jetbrains.kotlin kotlin-compiler-embeddable ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-stdlib + + org.jetbrains.kotlin @@ -84,41 +93,11 @@ - - org.jetbrains.kotlin - kotlin-scripting-common - ${kotlin-version} - - - org.jetbrains.kotlin - kotlin-reflect - ${kotlin-version} - org.jetbrains.kotlin kotlin-stdlib ${kotlin-version} - - org.jetbrains.kotlin - kotlin-script-runtime - ${kotlin-version} - - - org.jetbrains.kotlin - kotlin-scripting-compiler-impl-embeddable - ${kotlin-version} - - - org.jetbrains.intellij.deps - trove4j - 1.0.20190514 - - - org.jetbrains - annotations - 17.0.0 - From 6d48f6f8126ea0601c5334b199bd70e4d4250218 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 14 Aug 2019 11:54:57 +0300 Subject: [PATCH 033/117] Added SQLContext to spark kotlin context --- .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 5 ++++- .../java/org/apache/zeppelin/spark/SparkKotlinReceiver.java | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 5009395a358..8746ab4e9c9 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -69,7 +69,10 @@ public void open() throws InterpreterException { z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); SparkKotlinReceiver ctx = new SparkKotlinReceiver( - (SparkSession) sparkInterpreter.getSparkSession(), jsc, z); + (SparkSession) sparkInterpreter.getSparkSession(), + jsc, + sparkInterpreter.getSQLContext(), + z); String cp = sparkClasspath(); List compilerOptions = Arrays.asList("-classpath", cp); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java index bdc33c0044a..74769387129 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java @@ -1,20 +1,24 @@ package org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.kotlin.context.ZeppelinKotlinReceiver; public class SparkKotlinReceiver extends ZeppelinKotlinReceiver { public SparkSession spark; public JavaSparkContext sc; + public SQLContext sqlContext; public SparkZeppelinContext z; public SparkKotlinReceiver(SparkSession spark, JavaSparkContext sc, + SQLContext sqlContext, SparkZeppelinContext z) { super(z); this.spark = spark; this.sc = sc; + this.sqlContext = sqlContext; this.z = z; } } From e919e92193d6e22e4e76e41a7838418beeaa889d Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 14 Aug 2019 14:14:15 +0300 Subject: [PATCH 034/117] Fixed zeppelin dynamic forms overriding kotlin string interpolation --- .../apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java | 7 ++++++- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 8 +++++--- .../org/apache/zeppelin/kotlin/KotlinReplBuilder.java | 2 +- .../kotlin/{context => receiver}/KotlinReceiver.java | 2 +- .../{context => receiver}/ZeppelinKotlinReceiver.java | 2 +- .../org/apache/zeppelin/spark/SparkKotlinReceiver.java | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{context => receiver}/KotlinReceiver.java (80%) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{context => receiver}/ZeppelinKotlinReceiver.java (83%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java index d620130731a..c541aed1b44 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java @@ -1,5 +1,6 @@ package org.apache.zeppelin.kotlin; +import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.zeppelin.interpreter.BaseZeppelinContext; @@ -7,13 +8,17 @@ public class BaseKotlinZeppelinContext extends BaseZeppelinContext { + private Map interpreterClassMap; + public BaseKotlinZeppelinContext(InterpreterHookRegistry hooks, int maxResult) { super(hooks, maxResult); + interpreterClassMap = new HashMap<>(); + interpreterClassMap.put("kotlin", "org.apache.zeppelin.kotlin.KotlinInterpreter"); } @Override public Map getInterpreterClassMap() { - return null; + return interpreterClassMap; } @Override diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 9a3d483ef64..7136b67ee3e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -15,7 +15,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; -import org.apache.zeppelin.kotlin.context.ZeppelinKotlinReceiver; +import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -33,7 +33,9 @@ public KotlinInterpreter(Properties properties) { properties.getProperty("zeppelin.kotlin.maxResult", "1000")); // TODO(dk) figure out why getInterpreterGroup().getInterpreterHookRegistry() NPEs - BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext(null, maxResult); + BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext( + null, //getInterpreterGroup().getInterpreterHookRegistry(), + maxResult); builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)).maxResult(maxResult); } @@ -90,7 +92,7 @@ public void cancel(InterpreterContext context) throws InterpreterException { @Override public FormType getFormType() throws InterpreterException { - return FormType.SIMPLE; + return FormType.NATIVE; } @Override diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 45e53d72fd5..a1800aca37c 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -20,7 +20,7 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.apache.zeppelin.kotlin.context.KotlinReceiver; +import org.apache.zeppelin.kotlin.receiver.KotlinReceiver; public class KotlinReplBuilder { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java similarity index 80% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java index a9c998d3889..1cd89ea5343 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java @@ -1,4 +1,4 @@ -package org.apache.zeppelin.kotlin.context; +package org.apache.zeppelin.kotlin.receiver; /** The execution context for lines in Kotlin REPL. diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java similarity index 83% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java index 0a493af10c0..a485cecd35d 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/ZeppelinKotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java @@ -1,4 +1,4 @@ -package org.apache.zeppelin.kotlin.context; +package org.apache.zeppelin.kotlin.receiver; import org.apache.zeppelin.interpreter.BaseZeppelinContext; diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java index 74769387129..2970cc9a879 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java @@ -3,7 +3,7 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; -import org.apache.zeppelin.kotlin.context.ZeppelinKotlinReceiver; +import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; public class SparkKotlinReceiver extends ZeppelinKotlinReceiver { public SparkSession spark; From cbe0ed04c4ad015b8275957760d326aba2f2fd13 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 14 Aug 2019 16:45:05 +0300 Subject: [PATCH 035/117] Fixed dataframe show() and showSchema() not working --- kotlin/pom.xml | 6 +++++ .../zeppelin/kotlin/KotlinInterpreter.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 73809f894a7..93fbf1cdffb 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -98,6 +98,12 @@ kotlin-stdlib ${kotlin-version} + + org.scala-lang + scala-library + ${scala.version} + provided + diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 7136b67ee3e..56364d0ab2b 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import scala.Console; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -66,11 +67,7 @@ public InterpreterResult interpret(String st, out.setInterpreterOutput(context.out); - PrintStream oldOut = System.out; - System.setOut(new PrintStream(out)); - InterpreterResult res = interpreter.eval(st); - System.setOut(oldOut); - return res; + return (InterpreterResult) Console.withOut(out, new RunCodeWithScalaOut(st)); } @Override @@ -116,4 +113,21 @@ private Job getRunningJob(String paragraphId) { } return foundJob; } + + class RunCodeWithScalaOut extends scala.runtime.AbstractFunction0 { + + RunCodeWithScalaOut(String code) { + this.code = code; + } + + public String code; + + public InterpreterResult apply() { + PrintStream oldOut = System.out; + System.setOut(new PrintStream(out)); + InterpreterResult res = interpreter.eval(code); + System.setOut(oldOut); + return res; + } + } } From 21bb4582350fe8db029fc0f05c456e20de12e84c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 14 Aug 2019 16:59:47 +0300 Subject: [PATCH 036/117] Refactored df show fix --- .../zeppelin/kotlin/KotlinInterpreter.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 56364d0ab2b..023a56fe73e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -13,6 +13,7 @@ import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterOutput; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; @@ -57,7 +58,7 @@ public void close() { } @Override - public InterpreterResult interpret(String st, + public InterpreterResult interpret(String code, InterpreterContext context) throws InterpreterException{ // saving job's running thread for cancelling Job runningJob = getRunningJob(context.getParagraphId()); @@ -65,9 +66,7 @@ public InterpreterResult interpret(String st, runningJob.info().put("CURRENT_THREAD", Thread.currentThread()); } - out.setInterpreterOutput(context.out); - - return (InterpreterResult) Console.withOut(out, new RunCodeWithScalaOut(st)); + return runWithOutput(code, context.out); } @Override @@ -114,20 +113,21 @@ private Job getRunningJob(String paragraphId) { return foundJob; } - class RunCodeWithScalaOut extends scala.runtime.AbstractFunction0 { + private InterpreterResult runWithOutput(String code, InterpreterOutput out) { + this.out.setInterpreterOutput(out); - RunCodeWithScalaOut(String code) { - this.code = code; - } + PrintStream oldOut = System.out; + PrintStream scalaOut = Console.out(); - public String code; + PrintStream newOut = new PrintStream(out); + System.setOut(newOut); + Console.setOut(newOut); - public InterpreterResult apply() { - PrintStream oldOut = System.out; - System.setOut(new PrintStream(out)); - InterpreterResult res = interpreter.eval(code); - System.setOut(oldOut); - return res; - } + InterpreterResult res = interpreter.eval(code); + + System.setOut(oldOut); + Console.setOut(scalaOut); + + return res; } } From 0b95f1f32a7d1e6fd0b61ca4e5153b47ef9519d2 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 15 Aug 2019 07:55:13 +0300 Subject: [PATCH 037/117] Added Apache 2.0 license to project files --- .../kotlin/BaseKotlinZeppelinContext.java | 17 +++++++++++++++++ .../zeppelin/kotlin/KotlinInterpreter.java | 18 +++++++++++++++++- .../org/apache/zeppelin/kotlin/KotlinRepl.java | 17 +++++++++++++++++ .../zeppelin/kotlin/KotlinReplBuilder.java | 17 +++++++++++++++++ .../kotlin/receiver/KotlinReceiver.java | 17 +++++++++++++++++ .../receiver/ZeppelinKotlinReceiver.java | 17 +++++++++++++++++ .../zeppelin/spark/KotlinSparkInterpreter.java | 17 +++++++++++++++++ .../zeppelin/spark/SparkKotlinReceiver.java | 17 +++++++++++++++++ 8 files changed, 136 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java index c541aed1b44..8d0f6bcfd7f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; import java.util.HashMap; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 023a56fe73e..30d4ec3f273 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -1,5 +1,21 @@ -package org.apache.zeppelin.kotlin; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 1e428e0954a..33dbaae920e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index a1800aca37c..41b89b99c57 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java index 1cd89ea5343..20fcc20e773 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.receiver; /** diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java index a485cecd35d..1e607b01dc6 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.receiver; import org.apache.zeppelin.interpreter.BaseZeppelinContext; diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 8746ab4e9c9..075462396ef 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java index 2970cc9a879..377989f5d79 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.spark; import org.apache.spark.api.java.JavaSparkContext; From 7b2ed795f9b76c6db66702686809a5d4cb1a04cd Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 15 Aug 2019 08:26:52 +0300 Subject: [PATCH 038/117] Added initial code execution to KotlinRepl --- .../zeppelin/kotlin/KotlinReplBuilder.java | 27 +++++++-- .../spark/KotlinSparkInterpreter.java | 58 +++++++++---------- .../{ => kotlin}/SparkKotlinReceiver.java | 3 +- 3 files changed, 53 insertions(+), 35 deletions(-) rename spark/interpreter/src/main/java/org/apache/zeppelin/spark/{ => kotlin}/SparkKotlinReceiver.java (93%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 41b89b99c57..7755ba5a03f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -47,12 +47,14 @@ public class KotlinReplBuilder { private KotlinReceiver ctx; private List compilerOptions; + private List codeOnLoad; private String outputDir; private int maxResult; public KotlinReplBuilder() { this.ctx = new KotlinReceiver(); this.compilerOptions = new ArrayList<>(); + this.codeOnLoad = new ArrayList<>(); } public KotlinRepl build() { @@ -68,7 +70,11 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - return new KotlinRepl(compiler, evaluator, outputDir, maxResult); + KotlinRepl repl = new KotlinRepl(compiler, evaluator, outputDir, maxResult); + for (String line: codeOnLoad) { + repl.eval(line); + } + return repl; } public KotlinReplBuilder maxResult(int maxResult) { @@ -87,6 +93,21 @@ public KotlinReplBuilder compilerOptions(List options) { return this; } + public KotlinReplBuilder codeOnLoad(String code) { + this.codeOnLoad.add(code); + return this; + } + + public KotlinReplBuilder codeOnLoad(List code) { + this.codeOnLoad.addAll(code); + return this; + } + + public KotlinReplBuilder outputDir(String outputDir) { + this.outputDir = outputDir; + return this; + } + private ScriptCompilationConfiguration buildCompilationConfiguration() { return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); @@ -118,8 +139,4 @@ private ScriptEvaluationConfiguration buildEvaluationConfiguration() { return Unit.INSTANCE; }); } - - public void outputDir(String outputDir) { - this.outputDir = outputDir; - } } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 075462396ef..3b30bde633e 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -36,6 +36,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinInterpreter; +import org.apache.zeppelin.spark.kotlin.SparkKotlinReceiver; public class KotlinSparkInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(KotlinSparkInterpreter.class); @@ -50,34 +51,6 @@ public KotlinSparkInterpreter(Properties properties) { interpreter = new KotlinInterpreter(properties); } - private String sparkClasspath() { - String sparkJars = System.getProperty("spark.jars"); - Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); - - Stream addedJars = Arrays.stream(Utils.resolveURIs(sparkJars).split(",")) - .filter(s -> !s.trim().equals("")) - .filter(s -> !isKotlinJar.matcher(s).find()) - .map(s -> { - int p = s.indexOf(':'); - return new File(s.substring(p + 1)); - }); - - Stream systemJars = Arrays.stream( - System.getProperty("java.class.path").split(File.pathSeparator)) - .map(File::new); - - return Stream.concat(addedJars, systemJars) - .map(file -> { - try { - return file.getCanonicalPath(); - } catch (IOException e) { - return ""; - } - }) - .collect(Collectors.joining(File.pathSeparator)); - } - - @Override public void open() throws InterpreterException { sparkInterpreter = @@ -112,7 +85,7 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { - + z.setInterpreterContext(context); z.setGui(context.getGui()); z.setNoteGui(context.getNoteGui()); @@ -141,4 +114,31 @@ public List completion(String buf, int cursor, InterpreterContext interpreterContext) throws InterpreterException { return interpreter.completion(buf, cursor, interpreterContext); } + + private String sparkClasspath() { + String sparkJars = System.getProperty("spark.jars"); + Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); + + Stream addedJars = Arrays.stream(Utils.resolveURIs(sparkJars).split(",")) + .filter(s -> !s.trim().equals("")) + .filter(s -> !isKotlinJar.matcher(s).find()) + .map(s -> { + int p = s.indexOf(':'); + return new File(s.substring(p + 1)); + }); + + Stream systemJars = Arrays.stream( + System.getProperty("java.class.path").split(File.pathSeparator)) + .map(File::new); + + return Stream.concat(addedJars, systemJars) + .map(file -> { + try { + return file.getCanonicalPath(); + } catch (IOException e) { + return ""; + } + }) + .collect(Collectors.joining(File.pathSeparator)); + } } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java similarity index 93% rename from spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java rename to spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index 377989f5d79..5322f5244a9 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -15,12 +15,13 @@ * limitations under the License. */ -package org.apache.zeppelin.spark; +package org.apache.zeppelin.spark.kotlin; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; +import org.apache.zeppelin.spark.SparkZeppelinContext; public class SparkKotlinReceiver extends ZeppelinKotlinReceiver { public SparkSession spark; From 7c9ea16634603bfcf2667b827d491985ac2f9cfc Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 15 Aug 2019 08:34:03 +0300 Subject: [PATCH 039/117] Added z.select binding for Kotlin --- .../spark/KotlinSparkInterpreter.java | 4 +- .../spark/kotlin/KotlinZeppelinBindings.java | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 3b30bde633e..6e42f349c01 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -36,6 +36,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinInterpreter; +import org.apache.zeppelin.spark.kotlin.KotlinZeppelinBindings; import org.apache.zeppelin.spark.kotlin.SparkKotlinReceiver; public class KotlinSparkInterpreter extends Interpreter { @@ -72,7 +73,8 @@ public void open() throws InterpreterException { interpreter.getBuilder() .executionContext(ctx) .compilerOptions(compilerOptions) - .outputDir(outputDir); + .outputDir(outputDir) + .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX); interpreter.open(); } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java new file mode 100644 index 00000000000..ece75de5054 --- /dev/null +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.spark.kotlin; + +public class KotlinZeppelinBindings { + public static final String Z_SELECT_KOTLIN_SYNTAX = + "import org.apache.zeppelin.display.ui.OptionInput.ParamOption;\n" + + "import org.apache.zeppelin.spark.SparkZeppelinContext\n" + + "import scala.collection.JavaConverters;\n" + + "fun SparkZeppelinContext.select(" + + "name: String, defaultValue: Any?, options: List>): Any {\n" + + " val tupleList = options.map{scala.Tuple2(it.first, it.second)}\n" + + " val seq = JavaConverters" + + ".asScalaIteratorConverter(tupleList.iterator())" + + ".asScala().toSeq()\n" + + " return select(name, seq)\n" + + "}\n" + + "\n" + + "fun SparkZeppelinContext.select(name: String, options: List>): Any? {\n" + + " return select(name, \"\", options)\n" + + "}"; +} \ No newline at end of file From fc88280c0444b8756682ec8b80cf1cec15666459 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 15 Aug 2019 13:23:50 +0300 Subject: [PATCH 040/117] Fixed spark job cancellation for kotlin interpreter --- .../apache/zeppelin/spark/KotlinSparkInterpreter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 6e42f349c01..485b4ad4950 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -17,6 +17,8 @@ package org.apache.zeppelin.spark; +import static org.apache.zeppelin.spark.Utils.buildJobDesc; +import static org.apache.zeppelin.spark.Utils.buildJobGroupId; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SparkSession; import org.apache.spark.util.Utils; @@ -45,6 +47,7 @@ public class KotlinSparkInterpreter extends Interpreter { private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; private SparkZeppelinContext z; + private JavaSparkContext jsc; public KotlinSparkInterpreter(Properties properties) { super(properties); @@ -56,7 +59,7 @@ public KotlinSparkInterpreter(Properties properties) { public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); - JavaSparkContext jsc = sparkInterpreter.getJavaSparkContext(); + jsc = sparkInterpreter.getJavaSparkContext(); z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); SparkKotlinReceiver ctx = new SparkKotlinReceiver( @@ -93,11 +96,13 @@ public InterpreterResult interpret(String st, InterpreterContext context) z.setNoteGui(context.getNoteGui()); InterpreterContext.set(context); + jsc.setJobGroup(buildJobGroupId(context), buildJobDesc(context), false); return interpreter.interpret(st, context); } @Override public void cancel(InterpreterContext context) throws InterpreterException { + jsc.cancelJobGroup(buildJobGroupId(context)); interpreter.cancel(context); } @@ -108,7 +113,7 @@ public FormType getFormType() throws InterpreterException { @Override public int getProgress(InterpreterContext context) throws InterpreterException { - return interpreter.getProgress(context); + return sparkInterpreter.getProgress(context); } @Override From 54bdbdd4d260a96ea2129319a643de72cb970553 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 15 Aug 2019 13:54:32 +0300 Subject: [PATCH 041/117] setting spark scheduler pool for Kotlin --- .../java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 485b4ad4950..00e873beb6f 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -97,6 +97,8 @@ public InterpreterResult interpret(String st, InterpreterContext context) InterpreterContext.set(context); jsc.setJobGroup(buildJobGroupId(context), buildJobDesc(context), false); + jsc.setLocalProperty("spark.scheduler.pool", context.getLocalProperties().get("pool")); + return interpreter.interpret(st, context); } From fec0b9ba6faf7e879f3d09ea6ef72d6b7005d873 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 11:01:14 +0300 Subject: [PATCH 042/117] Fixing kotlin zeppelin interpreter not working --- .../apache/zeppelin/kotlin/KotlinInterpreter.java | 7 ------- .../zeppelin/spark/KotlinSparkInterpreter.java | 13 ++++++++++++- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 30d4ec3f273..89fd01cc4e5 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -25,7 +25,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import scala.Console; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -133,16 +132,10 @@ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { this.out.setInterpreterOutput(out); PrintStream oldOut = System.out; - PrintStream scalaOut = Console.out(); - PrintStream newOut = new PrintStream(out); System.setOut(newOut); - Console.setOut(newOut); - InterpreterResult res = interpreter.eval(code); - System.setOut(oldOut); - Console.setOut(scalaOut); return res; } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 00e873beb6f..9dfd1be749c 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -26,15 +26,18 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.util.Arrays; import java.util.List; import java.util.Properties; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; +import scala.Console; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterOutput; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinInterpreter; @@ -99,7 +102,15 @@ public InterpreterResult interpret(String st, InterpreterContext context) jsc.setJobGroup(buildJobGroupId(context), buildJobDesc(context), false); jsc.setLocalProperty("spark.scheduler.pool", context.getLocalProperties().get("pool")); - return interpreter.interpret(st, context); + InterpreterOutput out = context.out; + PrintStream scalaOut = Console.out(); + PrintStream newOut = (out != null) ? new PrintStream(out) : null; + + Console.setOut(newOut); + InterpreterResult result = interpreter.interpret(st, context); + Console.setOut(scalaOut); + + return result; } @Override From 8e7221efd90284a7122d24f98b54ce31125dc491 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 11:49:27 +0300 Subject: [PATCH 043/117] Updated tests for plain Kotlin interpreter --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../KotlinInterpreterTest.java | 60 ++++++++++++++----- 2 files changed, 45 insertions(+), 17 deletions(-) rename kotlin/src/test/java/org/apache/zeppelin/{java => kotlin}/KotlinInterpreterTest.java (51%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 89fd01cc4e5..f56319b23a7 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -132,7 +132,7 @@ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { this.out.setInterpreterOutput(out); PrintStream oldOut = System.out; - PrintStream newOut = new PrintStream(out); + PrintStream newOut = (out != null) ? new PrintStream(out) : null; System.setOut(newOut); InterpreterResult res = interpreter.eval(code); System.setOut(oldOut); diff --git a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java similarity index 51% rename from kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java rename to kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index a41ff48effe..21e6ae922a0 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/java/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -1,18 +1,35 @@ -package org.apache.zeppelin.java; +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ -import org.apache.zeppelin.interpreter.InterpreterContext; -import org.apache.zeppelin.interpreter.InterpreterException; -import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.kotlin.KotlinInterpreter; +package org.apache.zeppelin.kotlin; + +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; +import static org.junit.Assert.assertEquals; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; - +import java.io.File; +import java.util.Arrays; import java.util.Properties; - -import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; -import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; -import static org.junit.Assert.assertEquals; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; /** * KotlinInterpreterTest @@ -26,6 +43,11 @@ public class KotlinInterpreterTest { public static void setUp() throws InterpreterException { context = InterpreterContext.builder().build(); interpreter = new KotlinInterpreter(new Properties()); + + String cp = System.getProperty("java.class.path") + File.pathSeparator + + ZeppelinKotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + + interpreter.getBuilder().compilerOptions(Arrays.asList("-classpath", cp)); interpreter.open(); } @@ -36,24 +58,31 @@ public static void tearDown() { private static void testCodeForResult(String code, String expected) throws Exception { InterpreterResult result = interpreter.interpret(code, context); + assertEquals(SUCCESS, result.code()); assertEquals(1, result.message().size()); - assertEquals(expected, result.message().get(0).getData().trim()); + + String message = result.message().get(0).getData().trim(); + // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" + String value = message.substring(message.indexOf(':') + 2); + assertEquals(expected, value); } @Test public void testLiteral() throws Exception { - testCodeForResult("1", "1: kotlin.Int"); + testCodeForResult("1", "kotlin.Int = 1"); } @Test public void testOperation() throws Exception { - testCodeForResult("\"foo\" + \"bar\"", "foobar: kotlin.String"); + testCodeForResult("\"foo\" + \"bar\"", "kotlin.String = foobar"); } @Test public void testFunction() throws Exception { - testCodeForResult("fun square(x: Int): Int = x * x\nsquare(10)", "100: kotlin.Int"); + testCodeForResult( + "fun square(x: Int): Int = x * x\nsquare(10)", + "kotlin.Int = 100"); } // TODO(dkaznacheev): work out why it's not incomplete @@ -67,7 +96,6 @@ public void testIncomplete() throws Exception { public void testCompileError() throws Exception { InterpreterResult result = interpreter.interpret("prinln(1)", context); assertEquals(ERROR, result.code()); - assertEquals( - "Unresolved reference: prinln", result.message().get(0).getData().trim()); + assertEquals("Unresolved reference: prinln", result.message().get(0).getData().trim()); } } From 0a71d93dc65afd591db48ff0eebf159c9d57ca9c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 12:23:47 +0300 Subject: [PATCH 044/117] Added output test --- .../kotlin/KotlinInterpreterTest.java | 62 ++++++++++++++++--- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 21e6ae922a0..e8883ff298a 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -24,24 +24,28 @@ import org.junit.BeforeClass; import org.junit.Test; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.Properties; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterOutput; +import org.apache.zeppelin.interpreter.InterpreterOutputListener; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; -/** - * KotlinInterpreterTest - */ + public class KotlinInterpreterTest { private static KotlinInterpreter interpreter; private static InterpreterContext context; + private static volatile String output = ""; + @BeforeClass public static void setUp() throws InterpreterException { - context = InterpreterContext.builder().build(); + context = getInterpreterContext(); interpreter = new KotlinInterpreter(new Properties()); String cp = System.getProperty("java.class.path") + File.pathSeparator + @@ -59,12 +63,17 @@ public static void tearDown() { private static void testCodeForResult(String code, String expected) throws Exception { InterpreterResult result = interpreter.interpret(code, context); - assertEquals(SUCCESS, result.code()); - assertEquals(1, result.message().size()); + String value; + if (result.message().isEmpty()) { + value = ""; + } else { + String message = result.message().get(0).getData().trim(); + System.err.println(message); + // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" + value = message.substring(message.indexOf(':') + 2); + } - String message = result.message().get(0).getData().trim(); - // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" - String value = message.substring(message.indexOf(':') + 2); + assertEquals(SUCCESS, result.code()); assertEquals(expected, value); } @@ -98,4 +107,39 @@ public void testCompileError() throws Exception { assertEquals(ERROR, result.code()); assertEquals("Unresolved reference: prinln", result.message().get(0).getData().trim()); } + + @Test + public void testOutput() throws Exception { + testCodeForResult("println(\"Hello Kotlin\")", ""); + assertEquals("Hello Kotlin\n", output); + } + + private static InterpreterContext getInterpreterContext() { + output = ""; + InterpreterContext context = InterpreterContext.builder() + .setInterpreterOut(new InterpreterOutput(null)) + .build(); + context.out = new InterpreterOutput( + new InterpreterOutputListener() { + @Override + public void onUpdateAll(InterpreterOutput out) { + + } + + @Override + public void onAppend(int index, InterpreterResultMessageOutput out, byte[] line) { + try { + output = out.toInterpreterResultMessage().getData(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void onUpdate(int index, InterpreterResultMessageOutput out) { + + } + }); + return context; + } } From 839361fca3dcf39f344bf50c5f733485e996054d Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 13:29:25 +0300 Subject: [PATCH 045/117] Resolved dependency issues on test run --- kotlin/pom.xml | 2 +- spark/interpreter/pom.xml | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 93fbf1cdffb..7fda90b41bf 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -40,7 +40,7 @@ bintray-kotlin - https://dl.bintray.com/kotlin/kotlin-dev + https://dl.bintray.com/kotlin/kotlin-eap diff --git a/spark/interpreter/pom.xml b/spark/interpreter/pom.xml index db8bb5311b7..17902ce0aec 100644 --- a/spark/interpreter/pom.xml +++ b/spark/interpreter/pom.xml @@ -55,6 +55,13 @@ **/*Test.* + + + bintray-kotlin + https://dl.bintray.com/kotlin/kotlin-eap + + + org.apache.zeppelin @@ -95,7 +102,6 @@ ${project.version} - org.apache.zeppelin spark2-shims From 0b2ab05af28cfad77c44344df42d78383457328f Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 14:46:44 +0300 Subject: [PATCH 046/117] Added cancellation and runtime exception tests for Kotlin interpreter --- .../kotlin/KotlinInterpreterTest.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index e8883ff298a..7c2520d0726 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -20,8 +20,9 @@ import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; import static org.junit.Assert.assertEquals; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; @@ -43,10 +44,11 @@ public class KotlinInterpreterTest { private static volatile String output = ""; - @BeforeClass - public static void setUp() throws InterpreterException { + @Before + public void setUp() throws InterpreterException { context = getInterpreterContext(); interpreter = new KotlinInterpreter(new Properties()); + output = ""; String cp = System.getProperty("java.class.path") + File.pathSeparator + ZeppelinKotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); @@ -55,8 +57,8 @@ public static void setUp() throws InterpreterException { interpreter.open(); } - @AfterClass - public static void tearDown() { + @After + public void tearDown() { interpreter.close(); } @@ -68,7 +70,7 @@ private static void testCodeForResult(String code, String expected) throws Excep value = ""; } else { String message = result.message().get(0).getData().trim(); - System.err.println(message); + System.out.println(message); // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" value = message.substring(message.indexOf(':') + 2); } @@ -114,6 +116,31 @@ public void testOutput() throws Exception { assertEquals("Hello Kotlin\n", output); } + @Test + public void testRuntimeError() throws Exception { + InterpreterResult result = interpreter.interpret( + "throw RuntimeException(\"Error Message\")", context); + assertEquals(ERROR, result.code()); + assertEquals("Error Message", result.message().get(0).getData().trim()); + } + + @Test + public void testCancel() throws Exception { + Thread t = new Thread(() -> { + try { + InterpreterResult result = interpreter.interpret( + "repeat(10000000) { Thread.sleep(100) }", context); + assertEquals(ERROR, result.code()); + assertEquals("sleep interrupted", result.message().get(0).getData().trim()); + } catch (InterpreterException e) { + Assert.fail(e.getMessage()); + } + }); + t.start(); + Thread.sleep(200); + interpreter.cancel(context); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 6d30cf3d89b8a08de54680c1cceb25717e304053 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 16 Aug 2019 18:02:46 +0300 Subject: [PATCH 047/117] Added tests for Kotlin Spark interpreter --- .../spark/KotlinSparkInterpreter.java | 8 +- .../spark/KotlinSparkInterpreterTest.java | 178 ++++++++++++++++++ 2 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 9dfd1be749c..a7a8c9dd607 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -74,7 +74,13 @@ public void open() throws InterpreterException { String cp = sparkClasspath(); List compilerOptions = Arrays.asList("-classpath", cp); - String outputDir = jsc.getConf().get("spark.repl.class.outputDir"); + // TODO(dk) fix NPE in tests + String outputDir; + try { + outputDir = jsc.getConf().getOption("spark.repl.class.outputDir").getOrElse(null); + } catch (NullPointerException e) { + outputDir = null; + } interpreter.getBuilder() .executionContext(ctx) diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java new file mode 100644 index 00000000000..96d31ff7ecf --- /dev/null +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -0,0 +1,178 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.spark; + +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import java.io.IOException; +import java.util.LinkedList; +import java.util.Properties; +import org.apache.zeppelin.display.AngularObjectRegistry; +import org.apache.zeppelin.display.ui.TextBox; +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterException; +import org.apache.zeppelin.interpreter.InterpreterGroup; +import org.apache.zeppelin.interpreter.InterpreterOutput; +import org.apache.zeppelin.interpreter.InterpreterOutputListener; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; +import org.apache.zeppelin.interpreter.remote.RemoteInterpreterEventClient; +import org.apache.zeppelin.resource.LocalResourcePool; + +public class KotlinSparkInterpreterTest { + + @ClassRule + public static TemporaryFolder tmpDir = new TemporaryFolder(); + + private static SparkInterpreter repl; + private static InterpreterGroup intpGroup; + private static InterpreterContext context; + private static KotlinSparkInterpreter interpreter; + private static String output; + + public static Properties getSparkTestProperties(TemporaryFolder tmpDir) throws IOException { + Properties p = new Properties(); + p.setProperty("master", "local[*]"); + p.setProperty("spark.app.name", "Zeppelin Test"); + p.setProperty("zeppelin.spark.useHiveContext", "true"); + p.setProperty("zeppelin.spark.maxResult", "1000"); + p.setProperty("zeppelin.spark.importImplicit", "true"); + p.setProperty("zeppelin.dep.localrepo", tmpDir.newFolder().getAbsolutePath()); + p.setProperty("zeppelin.spark.property_1", "value_1"); + return p; + } + + private static void testCodeForResult(String code, String expected) throws Exception { + InterpreterResult result = interpreter.interpret(code, context); + + String value; + if (result.message().isEmpty()) { + value = ""; + } else { + String message = result.message().get(0).getData().trim(); + System.out.println(message); + // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" + value = message.substring(message.indexOf(':') + 2); + } + + assertEquals(SUCCESS, result.code()); + assertEquals(expected, value); + } + + @BeforeClass + public static void setUp() throws Exception { + intpGroup = new InterpreterGroup(); + context = InterpreterContext.builder() + .setNoteId("noteId") + .setParagraphId("paragraphId") + .setParagraphTitle("title") + .setAngularObjectRegistry(new AngularObjectRegistry(intpGroup.getId(), null)) + .setResourcePool(new LocalResourcePool("id")) + .setInterpreterOut(new InterpreterOutput(null)) + .setIntpEventClient(mock(RemoteInterpreterEventClient.class)) + .build(); + context.out = new InterpreterOutput( + new InterpreterOutputListener() { + @Override + public void onUpdateAll(InterpreterOutput out) { + + } + + @Override + public void onAppend(int index, InterpreterResultMessageOutput out, byte[] line) { + try { + output = out.toInterpreterResultMessage().getData(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void onUpdate(int index, InterpreterResultMessageOutput out) { + + } + }); + + InterpreterContext.set(context); + + intpGroup.put("note", new LinkedList()); + + Properties properties = getSparkTestProperties(tmpDir); + repl = new SparkInterpreter(properties); + repl.setInterpreterGroup(intpGroup); + intpGroup.get("note").add(repl); + repl.open(); + repl.interpret("sc", context); + + interpreter = new KotlinSparkInterpreter(properties); + interpreter.setInterpreterGroup(intpGroup); + intpGroup.get("note").add(interpreter); + interpreter.open(); + } + + @AfterClass + public static void tearDown() throws InterpreterException { + repl.close(); + } + + @Test + public void simpleSparkTest() throws Exception { + testCodeForResult("1 + 1", "kotlin.Int = 2"); + } + + @Test + public void dataFrameTest() throws Exception { + interpreter.interpret("spark.range(100, 0, -1).sort(\"id\").show(2)", context); + assertTrue(output.contains( + "+---+\n" + + "| id|\n" + + "+---+\n" + + "| 1|\n" + + "| 2|\n" + + "+---+")); + } + + @Test + public void sparkPropertiesTest() throws Exception { + InterpreterResult result = interpreter.interpret( + "sc.conf.all.map{ it.toString() }", context); + String message = result.message().get(0).getData().trim(); + System.out.println("MSG: " + message); + assertTrue(message.contains("(property_1,value_1)")); + } + + @Test + public void zeppelinContextTest() throws Exception { + InterpreterResult result = interpreter.interpret("z.input(\"name\", \"default_name\")", context); + assertEquals(InterpreterResult.Code.SUCCESS, result.code()); + assertEquals(1, context.getGui().getForms().size()); + assertTrue(context.getGui().getForms().get("name") instanceof TextBox); + TextBox textBox = (TextBox) context.getGui().getForms().get("name"); + assertEquals("name", textBox.getName()); + assertEquals("default_name", textBox.getDefaultValue()); + } +} From 040d00edb578a5f33f53be86922cadab9a2932b4 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 19 Aug 2019 09:27:42 +0300 Subject: [PATCH 048/117] (not pretty) Fixed not writing in-memory Kotlin classes to repl output directory --- .../apache/zeppelin/kotlin/KotlinRepl.java | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 33dbaae920e..fef2408a36f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedOutputStream; @@ -33,6 +34,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; +import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; @@ -150,14 +152,29 @@ private void writeClasses(ReplCompileResult.CompiledClasses classes) { continue; } String classWritePath = outputDir + File.separator + filePath; + writeClass(compiledClass.getBytes(), classWritePath); + } - try (FileOutputStream fos = new FileOutputStream(classWritePath); - OutputStream out = new BufferedOutputStream(fos)) { - out.write(compiledClass.getBytes()); - out.flush(); - } catch (IOException e) { - logger.error(e.getMessage()); - } + // TODO(dk) refactor this nonsense + try { + ((KJvmCompiledModuleInMemory) ((KJvmCompiledScript) classes.getData()).getCompiledModule()) + .getCompilerOutputFiles().forEach((name, bytes) -> { + if (name.contains("class")) { + writeClass(bytes, outputDir + File.separator + name); + } + }); + } catch (Exception e) { + logger.info(e.getMessage()); + } + } + + private void writeClass(byte[] classBytes, String path) { + try (FileOutputStream fos = new FileOutputStream(path); + OutputStream out = new BufferedOutputStream(fos)) { + out.write(classBytes); + out.flush(); + } catch (IOException e) { + logger.error(e.getMessage()); } } } From e1e05c89455665307e834a1d5a1a06e7b1aebe25 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 19 Aug 2019 10:07:02 +0300 Subject: [PATCH 049/117] Refactored in-memory class output --- .../apache/zeppelin/kotlin/KotlinRepl.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index fef2408a36f..76e3c43f33e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -31,6 +31,7 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Collection; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -155,16 +156,24 @@ private void writeClasses(ReplCompileResult.CompiledClasses classes) { writeClass(compiledClass.getBytes(), classWritePath); } - // TODO(dk) refactor this nonsense + writeModuleInMemory(classes); + } + + private void writeModuleInMemory(ReplCompileResult.CompiledClasses classes) { try { - ((KJvmCompiledModuleInMemory) ((KJvmCompiledScript) classes.getData()).getCompiledModule()) - .getCompilerOutputFiles().forEach((name, bytes) -> { - if (name.contains("class")) { - writeClass(bytes, outputDir + File.separator + name); - } - }); - } catch (Exception e) { - logger.info(e.getMessage()); + KJvmCompiledScript compiledScript = Objects.requireNonNull( + (KJvmCompiledScript) classes.getData()); + + KJvmCompiledModuleInMemory moduleInMemory = Objects.requireNonNull( + (KJvmCompiledModuleInMemory) compiledScript.getCompiledModule()); + + moduleInMemory.getCompilerOutputFiles().forEach((name, bytes) -> { + if (name.contains("class")) { + writeClass(bytes, outputDir + File.separator + name); + } + }); + } catch (ClassCastException | NullPointerException e) { + logger.info("Compiled line #" + classes.getLineId().getNo() + "has no in-memory modules"); } } From 0cc65bfdf64ad58fd4ce87f58d67544701b8267b Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 19 Aug 2019 11:41:15 +0300 Subject: [PATCH 050/117] Added spark job cancellation test --- .../spark/KotlinSparkInterpreterTest.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 96d31ff7ecf..9af97f49c51 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.spark; +import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -140,7 +141,7 @@ public static void tearDown() throws InterpreterException { } @Test - public void simpleSparkTest() throws Exception { + public void simpleKotlinTest() throws Exception { testCodeForResult("1 + 1", "kotlin.Int = 2"); } @@ -156,6 +157,23 @@ public void dataFrameTest() throws Exception { "+---+")); } + @Test + public void testCancel() throws Exception { + Thread t = new Thread(() -> { + try { + InterpreterResult result = interpreter.interpret( + "spark.range(90000000, 0, -1).sort(\"id\").show(1000)", context); + assertEquals(ERROR, result.code()); + assertTrue(result.message().get(0).getData().trim().contains("cancelled")); + } catch (InterpreterException e) { + Assert.fail(e.getMessage()); + } + }); + t.start(); + Thread.sleep(1000); + interpreter.cancel(context); + } + @Test public void sparkPropertiesTest() throws Exception { InterpreterResult result = interpreter.interpret( From f1c4188f739b8435f454b165ced46ce523f4b916 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 19 Aug 2019 12:21:09 +0300 Subject: [PATCH 051/117] Fixed spark cancel test --- .../org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 9af97f49c51..4d12e7281e0 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -162,7 +162,7 @@ public void testCancel() throws Exception { Thread t = new Thread(() -> { try { InterpreterResult result = interpreter.interpret( - "spark.range(90000000, 0, -1).sort(\"id\").show(1000)", context); + "spark.range(10).foreach { Thread.sleep(1000) }", context); assertEquals(ERROR, result.code()); assertTrue(result.message().get(0).getData().trim().contains("cancelled")); } catch (InterpreterException e) { From 7cd7d3454f8a520088a8d2d4946c03379620e2ae Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 19 Aug 2019 14:58:58 +0300 Subject: [PATCH 052/117] Removed z from base kotlin interpreter --- .../kotlin/BaseKotlinZeppelinContext.java | 50 ------------------- .../zeppelin/kotlin/KotlinInterpreter.java | 7 +-- .../kotlin/{receiver => }/KotlinReceiver.java | 2 +- .../zeppelin/kotlin/KotlinReplBuilder.java | 1 - .../receiver/ZeppelinKotlinReceiver.java | 27 ---------- .../kotlin/KotlinInterpreterTest.java | 3 +- .../spark/kotlin/SparkKotlinReceiver.java | 5 +- .../spark/KotlinSparkInterpreterTest.java | 2 - 8 files changed, 5 insertions(+), 92 deletions(-) delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{receiver => }/KotlinReceiver.java (95%) delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java deleted file mode 100644 index 8d0f6bcfd7f..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/BaseKotlinZeppelinContext.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.zeppelin.interpreter.BaseZeppelinContext; -import org.apache.zeppelin.interpreter.InterpreterHookRegistry; - -public class BaseKotlinZeppelinContext extends BaseZeppelinContext { - - private Map interpreterClassMap; - - public BaseKotlinZeppelinContext(InterpreterHookRegistry hooks, int maxResult) { - super(hooks, maxResult); - interpreterClassMap = new HashMap<>(); - interpreterClassMap.put("kotlin", "org.apache.zeppelin.kotlin.KotlinInterpreter"); - } - - @Override - public Map getInterpreterClassMap() { - return interpreterClassMap; - } - - @Override - public List getSupportedClasses() { - return null; - } - - @Override - public String showData(Object obj, int maxResult) { - return null; - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index f56319b23a7..8a059740b13 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -32,7 +32,6 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; -import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -49,11 +48,7 @@ public KotlinInterpreter(Properties properties) { int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); - // TODO(dk) figure out why getInterpreterGroup().getInterpreterHookRegistry() NPEs - BaseKotlinZeppelinContext defaultCtx = new BaseKotlinZeppelinContext( - null, //getInterpreterGroup().getInterpreterHookRegistry(), - maxResult); - builder.executionContext(new ZeppelinKotlinReceiver(defaultCtx)).maxResult(maxResult); + builder.executionContext(new KotlinReceiver()).maxResult(maxResult); } public KotlinReplBuilder getBuilder() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java similarity index 95% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java index 20fcc20e773..b6b2c8e5b20 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.zeppelin.kotlin.receiver; +package org.apache.zeppelin.kotlin; /** The execution context for lines in Kotlin REPL. diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 7755ba5a03f..5d4311f59df 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -37,7 +37,6 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.apache.zeppelin.kotlin.receiver.KotlinReceiver; public class KotlinReplBuilder { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java deleted file mode 100644 index 1e607b01dc6..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/receiver/ZeppelinKotlinReceiver.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.receiver; - -import org.apache.zeppelin.interpreter.BaseZeppelinContext; - -public class ZeppelinKotlinReceiver extends KotlinReceiver { - public BaseZeppelinContext z; - public ZeppelinKotlinReceiver(BaseZeppelinContext z) { - this.z = z; - } -} diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 7c2520d0726..61df1aa3e78 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -34,7 +34,6 @@ import org.apache.zeppelin.interpreter.InterpreterOutputListener; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; -import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; public class KotlinInterpreterTest { @@ -51,7 +50,7 @@ public void setUp() throws InterpreterException { output = ""; String cp = System.getProperty("java.class.path") + File.pathSeparator + - ZeppelinKotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + KotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); interpreter.getBuilder().compilerOptions(Arrays.asList("-classpath", cp)); interpreter.open(); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index 5322f5244a9..0ee101d78da 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -20,10 +20,10 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; -import org.apache.zeppelin.kotlin.receiver.ZeppelinKotlinReceiver; +import org.apache.zeppelin.kotlin.KotlinReceiver; import org.apache.zeppelin.spark.SparkZeppelinContext; -public class SparkKotlinReceiver extends ZeppelinKotlinReceiver { +public class SparkKotlinReceiver extends KotlinReceiver { public SparkSession spark; public JavaSparkContext sc; public SQLContext sqlContext; @@ -33,7 +33,6 @@ public SparkKotlinReceiver(SparkSession spark, JavaSparkContext sc, SQLContext sqlContext, SparkZeppelinContext z) { - super(z); this.spark = spark; this.sc = sc; this.sqlContext = sqlContext; diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 4d12e7281e0..5eab36c67ee 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -75,7 +75,6 @@ private static void testCodeForResult(String code, String expected) throws Excep value = ""; } else { String message = result.message().get(0).getData().trim(); - System.out.println(message); // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" value = message.substring(message.indexOf(':') + 2); } @@ -179,7 +178,6 @@ public void sparkPropertiesTest() throws Exception { InterpreterResult result = interpreter.interpret( "sc.conf.all.map{ it.toString() }", context); String message = result.message().get(0).getData().trim(); - System.out.println("MSG: " + message); assertTrue(message.contains("(property_1,value_1)")); } From 375e175319e5f97de4fd20a4baf9db60cc644cac Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 20 Aug 2019 13:14:57 +0300 Subject: [PATCH 053/117] Fixed BaseZeppelinContext compile error --- .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 5 +++-- .../apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index a7a8c9dd607..f140ca7671a 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import scala.Console; +import org.apache.zeppelin.interpreter.BaseZeppelinContext; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -49,7 +50,7 @@ public class KotlinSparkInterpreter extends Interpreter { private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; - private SparkZeppelinContext z; + private BaseZeppelinContext z; private JavaSparkContext jsc; public KotlinSparkInterpreter(Properties properties) { @@ -63,7 +64,7 @@ public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); jsc = sparkInterpreter.getJavaSparkContext(); - z = (SparkZeppelinContext) sparkInterpreter.getZeppelinContext(); + z = sparkInterpreter.getZeppelinContext(); SparkKotlinReceiver ctx = new SparkKotlinReceiver( (SparkSession) sparkInterpreter.getSparkSession(), diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index 0ee101d78da..eb56e38aa59 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -20,19 +20,19 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; +import org.apache.zeppelin.interpreter.BaseZeppelinContext; import org.apache.zeppelin.kotlin.KotlinReceiver; -import org.apache.zeppelin.spark.SparkZeppelinContext; public class SparkKotlinReceiver extends KotlinReceiver { public SparkSession spark; public JavaSparkContext sc; public SQLContext sqlContext; - public SparkZeppelinContext z; + public BaseZeppelinContext z; public SparkKotlinReceiver(SparkSession spark, JavaSparkContext sc, SQLContext sqlContext, - SparkZeppelinContext z) { + BaseZeppelinContext z) { this.spark = spark; this.sc = sc; this.sqlContext = sqlContext; From 99f4342b724ae728e00ebed64d4ad7c0e16f7350 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 20 Aug 2019 15:04:43 +0300 Subject: [PATCH 054/117] Fixed z.select for Kotlin --- .../spark/kotlin/KotlinZeppelinBindings.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java index ece75de5054..89dd1a21662 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -19,19 +19,16 @@ public class KotlinZeppelinBindings { public static final String Z_SELECT_KOTLIN_SYNTAX = - "import org.apache.zeppelin.display.ui.OptionInput.ParamOption;\n" + - "import org.apache.zeppelin.spark.SparkZeppelinContext\n" + - "import scala.collection.JavaConverters;\n" + - "fun SparkZeppelinContext.select(" + - "name: String, defaultValue: Any?, options: List>): Any {\n" + - " val tupleList = options.map{scala.Tuple2(it.first, it.second)}\n" + - " val seq = JavaConverters" + - ".asScalaIteratorConverter(tupleList.iterator())" + - ".asScala().toSeq()\n" + - " return select(name, seq)\n" + + "import org.apache.zeppelin.display.ui.OptionInput.ParamOption\n" + + "import org.apache.zeppelin.interpreter.BaseZeppelinContext\n" + + "\n" + + "fun BaseZeppelinContext.select(name: String, defaultValue: Any?, " + + "options: List>): Any? {\n" + + " return select(name, defaultValue, " + + "options.map{ ParamOption(it.first, it.second) }.toTypedArray())\n" + "}\n" + "\n" + - "fun SparkZeppelinContext.select(name: String, options: List>): Any? {\n" + + "fun BaseZeppelinContext.select(name: String, options: List>): Any? {\n" + " return select(name, \"\", options)\n" + "}"; -} \ No newline at end of file +} From d30a1e4068dda3c2319c1bf2ec2750a423d1500a Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 21 Aug 2019 16:14:26 +0300 Subject: [PATCH 055/117] Importing java udf libraries on startup --- .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 3 ++- .../zeppelin/spark/kotlin/KotlinZeppelinBindings.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index f140ca7671a..97f132f8327 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -87,7 +87,8 @@ public void open() throws InterpreterException { .executionContext(ctx) .compilerOptions(compilerOptions) .outputDir(outputDir) - .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX); + .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX) + .codeOnLoad(KotlinZeppelinBindings.SPARK_UDF_IMPORTS); interpreter.open(); } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java index 89dd1a21662..b9655efd94a 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -31,4 +31,10 @@ public class KotlinZeppelinBindings { "fun BaseZeppelinContext.select(name: String, options: List>): Any? {\n" + " return select(name, \"\", options)\n" + "}"; + + public static final String SPARK_UDF_IMPORTS = + "import org.apache.spark.sql.types.DataTypes\n" + + "import org.apache.spark.sql.functions.*\n" + + "import org.apache.spark.sql.expressions.UserDefinedFunction\n" + + "import org.apache.spark.sql.api.java.*"; } From 54a322fabf6b139cde559d479086f1a581813eac Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Wed, 21 Aug 2019 18:01:44 +0300 Subject: [PATCH 056/117] Retrieving variables from runtime --- .../zeppelin/kotlin/KotlinInterpreter.java | 4 +++ .../apache/zeppelin/kotlin/KotlinRepl.java | 32 +++++++++++++++++++ .../kotlin/KotlinInterpreterTest.java | 6 ++++ 3 files changed, 42 insertions(+) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 8a059740b13..057057f7ddb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -112,6 +112,10 @@ public List completion(String buf, int cursor, return new ArrayList<>(); } + public Map vars() { + return interpreter.runtimeVariables(); + } + private Job getRunningJob(String paragraphId) { Job foundJob = null; Collection jobsRunning = getScheduler().getAllJobs(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 76e3c43f33e..b751f03c2a9 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -30,11 +30,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.lang.reflect.Field; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; +import kotlin.Pair; import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; @@ -121,6 +125,34 @@ public InterpreterResult eval(String code) { "unknown evaluation result: " + evalResult.toString()); } + public Map runtimeVariables() { + Object script = ((Pair)state.getHistory().peek().getItem().getSecond()).getSecond(); + Map vars = new HashMap<>(); + getVariablesFromScript(script, vars); + return vars; + } + + private void getVariablesFromScript(Object script, Map vars) { + Field[] fields = script.getClass().getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + if (vars.containsKey(fieldName)) { + continue; + } + field.setAccessible(true); + try { + Object value = field.get(script); + if (fieldName.contains("script$")) { + getVariablesFromScript(value, vars); + } else { + vars.put(fieldName, value); + } + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + } + private String prepareValueString(Object value) { if (value == null) { return "null"; diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 61df1aa3e78..aa2b89f0db6 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -140,6 +140,12 @@ public void testCancel() throws Exception { interpreter.cancel(context); } + @Test + public void testVariables() throws Exception { + interpreter.interpret("val x = 1", context); + System.out.println(interpreter.vars()); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 0d5316b5cb1418c19c533778f5b102c1e7271b2f Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 22 Aug 2019 10:47:38 +0300 Subject: [PATCH 057/117] Cleaned up getting variables in runtime --- .../zeppelin/kotlin/KotlinInterpreter.java | 4 +- .../apache/zeppelin/kotlin/KotlinRepl.java | 35 ++------- .../zeppelin/kotlin/KotlinReplBuilder.java | 1 + .../kotlin/{ => context}/KotlinReceiver.java | 6 +- .../kotlin/reflect/KotlinStateUtil.java | 72 +++++++++++++++++++ .../kotlin/reflect/KotlinVariableInfo.java | 44 ++++++++++++ .../kotlin/KotlinInterpreterTest.java | 20 +++++- .../spark/kotlin/SparkKotlinReceiver.java | 2 +- 8 files changed, 149 insertions(+), 35 deletions(-) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{ => context}/KotlinReceiver.java (92%) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 057057f7ddb..c20c74b80ec 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -32,6 +32,8 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -112,7 +114,7 @@ public List completion(String buf, int cursor, return new ArrayList<>(); } - public Map vars() { + public List vars() { return interpreter.runtimeVariables(); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index b751f03c2a9..44743b2896e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -30,19 +30,18 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.lang.reflect.Field; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.List; import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; -import kotlin.Pair; import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; +import org.apache.zeppelin.kotlin.reflect.KotlinStateUtil; public class KotlinRepl { private static Logger logger = LoggerFactory.getLogger(KotlinRepl.class); @@ -125,32 +124,8 @@ public InterpreterResult eval(String code) { "unknown evaluation result: " + evalResult.toString()); } - public Map runtimeVariables() { - Object script = ((Pair)state.getHistory().peek().getItem().getSecond()).getSecond(); - Map vars = new HashMap<>(); - getVariablesFromScript(script, vars); - return vars; - } - - private void getVariablesFromScript(Object script, Map vars) { - Field[] fields = script.getClass().getDeclaredFields(); - for (Field field : fields) { - String fieldName = field.getName(); - if (vars.containsKey(fieldName)) { - continue; - } - field.setAccessible(true); - try { - Object value = field.get(script); - if (fieldName.contains("script$")) { - getVariablesFromScript(value, vars); - } else { - vars.put(fieldName, value); - } - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } + public List runtimeVariables() { + return KotlinStateUtil.runtimeVariables(state); } private String prepareValueString(Object value) { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 5d4311f59df..507ca9e7ddb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -37,6 +37,7 @@ import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; public class KotlinReplBuilder { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java similarity index 92% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index b6b2c8e5b20..dc2de6204d0 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.zeppelin.kotlin; +package org.apache.zeppelin.kotlin.context; /** The execution context for lines in Kotlin REPL. @@ -24,4 +24,6 @@ ... } */ -public class KotlinReceiver {} +public class KotlinReceiver { + +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java new file mode 100644 index 00000000000..126935f6567 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.reflect; + +import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import kotlin.Pair; + +public class KotlinStateUtil { + private static Logger logger = LoggerFactory.getLogger(KotlinStateUtil.class); + + public static List runtimeVariables(AggregatedReplStageState state) { + Map vars = new HashMap<>(); + Object script; + try { + Object statePair = Objects.requireNonNull( + state.getHistory().peek()) + .getItem() + .getSecond(); + script = ((Pair) statePair).getSecond(); + } catch (NullPointerException e) { + return new ArrayList<>(); + } + + getVariablesFromScript(script, vars); + return new ArrayList<>(vars.values()); + } + + private static void getVariablesFromScript(Object script, Map vars) { + Field[] fields = script.getClass().getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + if (vars.containsKey(fieldName)) { + continue; + } + + field.setAccessible(true); + try { + Object value = field.get(script); + if (fieldName.contains("script$")) { + getVariablesFromScript(value, vars); + } else { + vars.put(fieldName, new KotlinVariableInfo(fieldName, value, field)); + } + } catch (IllegalAccessException | IllegalArgumentException e) { + logger.error("Exception in getVariablesFromScript", e); + } + } + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java new file mode 100644 index 00000000000..5c177c6368e --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.reflect; + +import java.lang.reflect.Field; + +public class KotlinVariableInfo { + private final String name; + private final Object value; + private final Field descriptor; + + public KotlinVariableInfo(String name, Object value, Field descriptor) { + this.name = name; + this.value = value; + this.descriptor = descriptor; + } + + public String getName() { + return name; + } + + public Object getValue() { + return value; + } + + public Field getDescriptor() { + return descriptor; + } +} diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index aa2b89f0db6..51584b8d797 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -20,6 +20,7 @@ import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -27,6 +28,8 @@ import java.io.File; import java.io.IOException; import java.util.Arrays; +import java.util.List; +import java.util.Optional; import java.util.Properties; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -34,6 +37,8 @@ import org.apache.zeppelin.interpreter.InterpreterOutputListener; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinInterpreterTest { @@ -143,7 +148,20 @@ public void testCancel() throws Exception { @Test public void testVariables() throws Exception { interpreter.interpret("val x = 1", context); - System.out.println(interpreter.vars()); + interpreter.interpret("val x = 2", context); + List vars = interpreter.vars(); + assertEquals(2, vars.size()); + + KotlinVariableInfo varX = vars.stream() + .filter(info -> info.getName().equals("x")) + .findFirst() + .orElseGet( () -> { + Assert.fail(); + return null; + }); + + assertEquals(2, varX.getValue()); + assertEquals(int.class, varX.getDescriptor().getType()); } private static InterpreterContext getInterpreterContext() { diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index eb56e38aa59..1eaea3ee0c7 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -21,7 +21,7 @@ import org.apache.spark.sql.SQLContext; import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.interpreter.BaseZeppelinContext; -import org.apache.zeppelin.kotlin.KotlinReceiver; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; public class SparkKotlinReceiver extends KotlinReceiver { public SparkSession spark; From 87c1e142bbe5e4a86d27225b0ffbd0dedfe7e227 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 22 Aug 2019 13:16:49 +0300 Subject: [PATCH 058/117] Passing variable list to implicit receiver --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../apache/zeppelin/kotlin/KotlinRepl.java | 15 +++--- .../zeppelin/kotlin/KotlinReplBuilder.java | 2 +- .../kotlin/context/KotlinReceiver.java | 17 ++++--- .../kotlin/reflect/KotlinStateUtil.java | 47 +++++++++++++------ .../kotlin/reflect/KotlinVariableInfo.java | 5 ++ .../kotlin/KotlinInterpreterTest.java | 11 ++++- 7 files changed, 70 insertions(+), 29 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index c20c74b80ec..ebae68c3c11 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -115,7 +115,7 @@ public List completion(String buf, int cursor, } public List vars() { - return interpreter.runtimeVariables(); + return interpreter.getRuntimeVariables(); } private Job getRunningJob(String paragraphId) { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 44743b2896e..d2a063560a7 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -40,6 +40,7 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.reflect.KotlinStateUtil; @@ -51,17 +52,14 @@ public class KotlinRepl { private AggregatedReplStageState state; private AtomicInteger counter; private String outputDir; + private KotlinReceiver ctx; private int maxResult; - public KotlinRepl(JvmReplCompiler compiler, - JvmReplEvaluator evaluator) { - this(compiler, evaluator, null, 0); - } - @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator, String outputDir, + KotlinReceiver ctx, int maxResult) { this.compiler = compiler; this.evaluator = evaluator; @@ -74,6 +72,8 @@ public KotlinRepl(JvmReplCompiler compiler, this.outputDir = outputDir; this.maxResult = maxResult; + + this.ctx = ctx; } public InterpreterResult eval(String code) { @@ -111,9 +111,12 @@ public InterpreterResult eval(String code) { InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); } if (evalResult instanceof ReplEvalResult.UnitResult) { + ctx.kotlinVars = getRuntimeVariables(); return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { + ctx.kotlinVars = getRuntimeVariables(); + ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; String valueString = prepareValueString(v.getValue()); return new InterpreterResult( @@ -124,7 +127,7 @@ public InterpreterResult eval(String code) { "unknown evaluation result: " + evalResult.toString()); } - public List runtimeVariables() { + public List getRuntimeVariables() { return KotlinStateUtil.runtimeVariables(state); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 507ca9e7ddb..c2ef7a2b80d 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -70,7 +70,7 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - KotlinRepl repl = new KotlinRepl(compiler, evaluator, outputDir, maxResult); + KotlinRepl repl = new KotlinRepl(compiler, evaluator, outputDir, ctx, maxResult); for (String line: codeOnLoad) { repl.eval(line); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index dc2de6204d0..f0a8dfd7abb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -17,13 +17,18 @@ package org.apache.zeppelin.kotlin.context; +import java.util.ArrayList; +import java.util.List; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; + /** - The execution context for lines in Kotlin REPL. - It is passed to the script as an implicit receiver, identical to: - with (context) { - ... - } + The execution context for lines in Kotlin REPL. + It is passed to the script as an implicit receiver, identical to: + with (context) { + ... + } */ public class KotlinReceiver { - + public List kotlinVars = new ArrayList<>(); } + diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java index 126935f6567..87e7ec49740 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java @@ -21,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -44,28 +45,46 @@ public static List runtimeVariables(AggregatedReplStageState return new ArrayList<>(); } - getVariablesFromScript(script, vars); + try { + getVariablesFromScript(script, vars); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } return new ArrayList<>(vars.values()); } - private static void getVariablesFromScript(Object script, Map vars) { - Field[] fields = script.getClass().getDeclaredFields(); - for (Field field : fields) { - String fieldName = field.getName(); - if (vars.containsKey(fieldName)) { - continue; - } + private static Object getImplicitReceiver(Object script) + throws ReflectiveOperationException { + Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); + return receiverField.get(script); + } + + private static void getVariablesFromScript(Object script, Map vars) + throws ReflectiveOperationException { + ArrayDeque valuesToVisit = new ArrayDeque<>(); + valuesToVisit.add(script); + valuesToVisit.add(getImplicitReceiver(script)); + + while (!valuesToVisit.isEmpty()) { + Object o = valuesToVisit.poll(); + Field[] fields = o.getClass().getDeclaredFields(); + + for (Field field : fields) { + String fieldName = field.getName(); + + if (vars.containsKey(fieldName) + || fieldName.contains("$$implicitReceiver") + || fieldName.contains("kotlinVars")) { + continue; + } + field.setAccessible(true); - field.setAccessible(true); - try { - Object value = field.get(script); + Object value = field.get(o); if (fieldName.contains("script$")) { - getVariablesFromScript(value, vars); + valuesToVisit.add(value); } else { vars.put(fieldName, new KotlinVariableInfo(fieldName, value, field)); } - } catch (IllegalAccessException | IllegalArgumentException e) { - logger.error("Exception in getVariablesFromScript", e); } } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index 5c177c6368e..601ad5bd63a 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -41,4 +41,9 @@ public Object getValue() { public Field getDescriptor() { return descriptor; } + + @Override + public String toString() { + return name + ": " + descriptor.getType().getCanonicalName() + " = " + getValue(); + } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 51584b8d797..7b9a8e2d452 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -29,7 +29,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; -import java.util.Optional; import java.util.Properties; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -164,6 +163,16 @@ public void testVariables() throws Exception { assertEquals(int.class, varX.getDescriptor().getType()); } + @Test + public void testGetVariablesFromCode() throws Exception { + interpreter.interpret("val x = 1", context); + interpreter.interpret("val y = 2", context); + interpreter.interpret("val x = 3", context); + InterpreterResult res = interpreter.interpret("kotlinVars", context); + System.out.println(res.message().get(0).getData()); + assertTrue(res.message().get(0).getData().contains("x: int = 3")); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 4565a9e9fb4f51487599653e8568b5378de2e77e Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 22 Aug 2019 16:14:46 +0300 Subject: [PATCH 059/117] Kotlin implicit receiver refactoring --- .../apache/zeppelin/kotlin/KotlinRepl.java | 26 ++++++++++++++----- .../zeppelin/kotlin/KotlinReplBuilder.java | 2 +- .../kotlin/context/KotlinReceiver.java | 6 ++--- .../kotlin/KotlinInterpreterTest.java | 4 ++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index d2a063560a7..d3d80fdb4b5 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -30,6 +30,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; @@ -41,8 +42,8 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.context.KotlinReceiver; -import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.reflect.KotlinStateUtil; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinRepl { private static Logger logger = LoggerFactory.getLogger(KotlinRepl.class); @@ -52,14 +53,14 @@ public class KotlinRepl { private AggregatedReplStageState state; private AtomicInteger counter; private String outputDir; - private KotlinReceiver ctx; + private KotlinContext ctx; private int maxResult; @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator, + KotlinReceiver receiver, String outputDir, - KotlinReceiver ctx, int maxResult) { this.compiler = compiler; this.evaluator = evaluator; @@ -73,7 +74,8 @@ public KotlinRepl(JvmReplCompiler compiler, this.outputDir = outputDir; this.maxResult = maxResult; - this.ctx = ctx; + ctx = new KotlinContext(); + receiver.kc = ctx; } public InterpreterResult eval(String code) { @@ -111,11 +113,11 @@ public InterpreterResult eval(String code) { InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); } if (evalResult instanceof ReplEvalResult.UnitResult) { - ctx.kotlinVars = getRuntimeVariables(); + ctx.setVars(getRuntimeVariables()); return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { - ctx.kotlinVars = getRuntimeVariables(); + ctx.setVars(getRuntimeVariables()); ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; String valueString = prepareValueString(v.getValue()); @@ -196,4 +198,16 @@ private void writeClass(byte[] classBytes, String path) { logger.error(e.getMessage()); } } + + public static class KotlinContext { + private List vars = new ArrayList<>(); + + public List getVars() { + return vars; + } + + private void setVars(List vars) { + this.vars = vars; + } + } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index c2ef7a2b80d..f10837fe409 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -70,7 +70,7 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - KotlinRepl repl = new KotlinRepl(compiler, evaluator, outputDir, ctx, maxResult); + KotlinRepl repl = new KotlinRepl(compiler, evaluator, ctx, outputDir, maxResult); for (String line: codeOnLoad) { repl.eval(line); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index f0a8dfd7abb..039bbf8ec94 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -17,9 +17,7 @@ package org.apache.zeppelin.kotlin.context; -import java.util.ArrayList; -import java.util.List; -import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; +import org.apache.zeppelin.kotlin.KotlinRepl; /** The execution context for lines in Kotlin REPL. @@ -29,6 +27,6 @@ } */ public class KotlinReceiver { - public List kotlinVars = new ArrayList<>(); + public KotlinRepl.KotlinContext kc; } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 7b9a8e2d452..0b0d84dc845 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -168,9 +168,11 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val x = 1", context); interpreter.interpret("val y = 2", context); interpreter.interpret("val x = 3", context); - InterpreterResult res = interpreter.interpret("kotlinVars", context); + InterpreterResult res = interpreter.interpret("kc.vars", context); System.out.println(res.message().get(0).getData()); assertTrue(res.message().get(0).getData().contains("x: int = 3")); + res = interpreter.interpret("kc.vars = null", context); + assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } private static InterpreterContext getInterpreterContext() { From 95f6a472bad654d5695413d4ee28fde707cc21b2 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 12:08:02 +0300 Subject: [PATCH 060/117] Added method retrieving and optimized variable retrieving --- .../zeppelin/kotlin/KotlinInterpreter.java | 13 ++- .../apache/zeppelin/kotlin/KotlinRepl.java | 34 +++++-- .../kotlin/completion/KotlinCompleter.java | 73 +++++++++++++++ .../kotlin/reflect/KotlinStateUtil.java | 91 ++++++++++++------- .../kotlin/KotlinInterpreterTest.java | 9 +- 5 files changed, 174 insertions(+), 46 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index ebae68c3c11..690bc086c58 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -20,7 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.PrintStream; -import java.util.ArrayList; +import java.lang.reflect.Method; import java.util.Collection; import java.util.List; import java.util.Map; @@ -32,6 +32,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; +import org.apache.zeppelin.kotlin.completion.KotlinCompleter; import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.scheduler.Job; @@ -43,6 +44,7 @@ public class KotlinInterpreter extends Interpreter { private InterpreterOutputStream out; private KotlinRepl interpreter; private KotlinReplBuilder builder; + private KotlinCompleter completer; public KotlinInterpreter(Properties properties) { super(properties); @@ -61,6 +63,7 @@ public KotlinReplBuilder getBuilder() { public void open() throws InterpreterException { interpreter = builder.build(); + completer = new KotlinCompleter(interpreter.getKotlinContext()); out = new InterpreterOutputStream(logger); } @@ -111,13 +114,17 @@ public int getProgress(InterpreterContext context) throws InterpreterException { @Override public List completion(String buf, int cursor, InterpreterContext interpreterContext) throws InterpreterException { - return new ArrayList<>(); + return completer.completion(buf, cursor, interpreterContext); } - public List vars() { + public List getVariables() { return interpreter.getRuntimeVariables(); } + public List getMethods() { + return interpreter.getMethods(); + } + private Job getRunningJob(String paragraphId) { Job foundJob = null; Collection jobsRunning = getScheduler().getAllJobs(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index d3d80fdb4b5..3d8b0d16215 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -30,10 +30,15 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; @@ -75,6 +80,7 @@ public KotlinRepl(JvmReplCompiler compiler, this.maxResult = maxResult; ctx = new KotlinContext(); + updateContext(); receiver.kc = ctx; } @@ -113,11 +119,11 @@ public InterpreterResult eval(String code) { InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); } if (evalResult instanceof ReplEvalResult.UnitResult) { - ctx.setVars(getRuntimeVariables()); + updateContext(); return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { - ctx.setVars(getRuntimeVariables()); + updateContext(); ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; String valueString = prepareValueString(v.getValue()); @@ -130,7 +136,15 @@ public InterpreterResult eval(String code) { } public List getRuntimeVariables() { - return KotlinStateUtil.runtimeVariables(state); + return ctx.getVars(); + } + + public List getMethods() { + return ctx.getMethods(); + } + + public KotlinContext getKotlinContext() { + return ctx; } private String prepareValueString(Object value) { @@ -199,15 +213,21 @@ private void writeClass(byte[] classBytes, String path) { } } + private void updateContext() { + KotlinStateUtil.updateVars(ctx.vars, state); + KotlinStateUtil.updateMethods(ctx.methods, state); + } + public static class KotlinContext { - private List vars = new ArrayList<>(); + private Map vars = new HashMap<>(); + private Set methods = new HashSet<>(); public List getVars() { - return vars; + return new ArrayList<>(vars.values()); } - private void setVars(List vars) { - this.vars = vars; + public List getMethods() { + return new ArrayList<>(methods); } } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java new file mode 100644 index 00000000000..b2b537b7f11 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.completion; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.Collectors; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; +import org.apache.zeppelin.kotlin.KotlinRepl; +import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; + +public class KotlinCompleter { + private KotlinRepl.KotlinContext ctx; + + public KotlinCompleter(KotlinRepl.KotlinContext ctx) { + this.ctx = ctx; + } + + public List completion(String buf, int cursor, + InterpreterContext interpreterContext) { + List vars = ctx.getVars(); + return vars.stream() + .flatMap(var -> getFieldsAndMethods(var).stream()) + .collect(Collectors.toList()); + } + + private List getFieldsAndMethods(KotlinVariableInfo var) { + Class varClass = var.getDescriptor().getType(); + List result = new ArrayList<>(); + + for (Field field : varClass.getFields()) { + String name = field.getName(); + String meta = field.getType().getSimpleName(); + result.add(new InterpreterCompletion(name, name, meta)); + } + for (Method method : varClass.getMethods()) { + String name = method.getName(); + String meta = getMethodSignature(method); + result.add(new InterpreterCompletion(name, name, meta)); + } + + return result; + } + + private String getMethodSignature(Method method) { + StringJoiner joiner = new StringJoiner(", "); + for (Class param : method.getParameterTypes()) { + joiner.add(param.getSimpleName()); + } + return method.getName() + + "(" + joiner.toString() + "): " + + method.getReturnType().getSimpleName(); + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java index 87e7ec49740..291637cef86 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java @@ -21,71 +21,92 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; -import java.util.ArrayDeque; +import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import kotlin.Pair; public class KotlinStateUtil { private static Logger logger = LoggerFactory.getLogger(KotlinStateUtil.class); + private static final Set objectMethods = + new HashSet<>(Arrays.asList(Object.class.getMethods())); - public static List runtimeVariables(AggregatedReplStageState state) { - Map vars = new HashMap<>(); - Object script; + public static void updateVars( + Map vars, + AggregatedReplStageState state) { try { - Object statePair = Objects.requireNonNull( - state.getHistory().peek()) - .getItem() - .getSecond(); - script = ((Pair) statePair).getSecond(); - } catch (NullPointerException e) { - return new ArrayList<>(); + Object script = getScript(state); + getNewFields(script, vars); + } catch (ReflectiveOperationException | NullPointerException e) { + logger.error("Exception updating current variables", e); } + } + public static void updateMethods( + Set methods, + AggregatedReplStageState state) { try { - getVariablesFromScript(script, vars); - } catch (ReflectiveOperationException e) { - e.printStackTrace(); + Object script = getScript(state); + getNewMethods(script, methods); + } catch (ReflectiveOperationException | NullPointerException e) { + logger.error("Exception updating current methods", e); } - return new ArrayList<>(vars.values()); } - private static Object getImplicitReceiver(Object script) - throws ReflectiveOperationException { - Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); - return receiverField.get(script); + private static Object getScript(AggregatedReplStageState state) + throws NullPointerException { + Object script; + Object statePair = Objects.requireNonNull(state.getHistory().peek()) + .getItem() + .getSecond(); + script = ((Pair) statePair).getSecond(); + return script; } - private static void getVariablesFromScript(Object script, Map vars) - throws ReflectiveOperationException { - ArrayDeque valuesToVisit = new ArrayDeque<>(); - valuesToVisit.add(script); - valuesToVisit.add(getImplicitReceiver(script)); + private static void getNewFields( + Object script, + Map vars) throws ReflectiveOperationException { + + List classesToVisit = new ArrayList<>(); + classesToVisit.add(script); + classesToVisit.add(getImplicitReceiver(script)); - while (!valuesToVisit.isEmpty()) { - Object o = valuesToVisit.poll(); + for (Object o : classesToVisit) { Field[] fields = o.getClass().getDeclaredFields(); for (Field field : fields) { String fieldName = field.getName(); - - if (vars.containsKey(fieldName) - || fieldName.contains("$$implicitReceiver") - || fieldName.contains("kotlinVars")) { + if (fieldName.contains("$$implicitReceiver") || fieldName.contains("kotlinVars")) { continue; } - field.setAccessible(true); + field.setAccessible(true); Object value = field.get(o); - if (fieldName.contains("script$")) { - valuesToVisit.add(value); - } else { + if (!fieldName.contains("script$")) { vars.put(fieldName, new KotlinVariableInfo(fieldName, value, field)); } } } } + + private static void getNewMethods( + Object script, + Set methods) throws ReflectiveOperationException { + Set newMethods = new HashSet<>(Arrays.asList( + script.getClass().getMethods())); + newMethods.removeAll(objectMethods); + methods.addAll(newMethods); + } + + + private static Object getImplicitReceiver(Object script) + throws ReflectiveOperationException { + Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); + return receiverField.get(script); + } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 0b0d84dc845..cd778be54fc 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -36,6 +36,7 @@ import org.apache.zeppelin.interpreter.InterpreterOutputListener; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; +import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; @@ -148,7 +149,7 @@ public void testCancel() throws Exception { public void testVariables() throws Exception { interpreter.interpret("val x = 1", context); interpreter.interpret("val x = 2", context); - List vars = interpreter.vars(); + List vars = interpreter.getVariables(); assertEquals(2, vars.size()); KotlinVariableInfo varX = vars.stream() @@ -175,6 +176,12 @@ public void testGetVariablesFromCode() throws Exception { assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } + @Test + public void testMethods() throws Exception { + interpreter.interpret("fun sq(x: Int): Int = x * x", context); + interpreter.getMethods().stream().anyMatch(method -> method.getName().equals("sq")); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 64fe5fea2b2dd5811d4fe690c841ccf4a83d75b1 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 12:32:47 +0300 Subject: [PATCH 061/117] Updated completion --- .../zeppelin/kotlin/KotlinInterpreter.java | 5 ++- .../kotlin/completion/KotlinCompleter.java | 45 ++++++++++++------- .../kotlin/reflect/KotlinStateUtil.java | 5 ++- .../kotlin/KotlinInterpreterTest.java | 7 +++ 4 files changed, 44 insertions(+), 18 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 690bc086c58..21eb4149329 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -52,7 +52,10 @@ public KotlinInterpreter(Properties properties) { int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); - builder.executionContext(new KotlinReceiver()).maxResult(maxResult); + builder + .executionContext(new KotlinReceiver()) + .maxResult(maxResult) + .codeOnLoad(""); } public KotlinReplBuilder getBuilder() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index b2b537b7f11..35b8fa3bfda 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -17,12 +17,10 @@ package org.apache.zeppelin.kotlin.completion; -import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; -import java.util.stream.Collectors; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinRepl; @@ -37,13 +35,38 @@ public KotlinCompleter(KotlinRepl.KotlinContext ctx) { public List completion(String buf, int cursor, InterpreterContext interpreterContext) { - List vars = ctx.getVars(); - return vars.stream() - .flatMap(var -> getFieldsAndMethods(var).stream()) - .collect(Collectors.toList()); + List result = new ArrayList<>(); + for (KotlinVariableInfo var : ctx.getVars()) { + result.add(new InterpreterCompletion( + var.getName(), + var.getName(), + var.getDescriptor().getType().getSimpleName() + )); + } + + List methods = ctx.getMethods(); + for (Method method : methods) { + result.add(new InterpreterCompletion( + method.getName(), + method.getName(), + methodSignature(method) + )); + } + return result; } + private String methodSignature(Method method) { + StringJoiner joiner = new StringJoiner(", "); + for (Class param : method.getParameterTypes()) { + joiner.add(param.getSimpleName()); + } + return method.getName() + + "(" + joiner.toString() + "): " + + method.getReturnType().getSimpleName(); + } + /* private List getFieldsAndMethods(KotlinVariableInfo var) { + Class varClass = var.getDescriptor().getType(); List result = new ArrayList<>(); @@ -61,13 +84,5 @@ private List getFieldsAndMethods(KotlinVariableInfo var) return result; } - private String getMethodSignature(Method method) { - StringJoiner joiner = new StringJoiner(", "); - for (Class param : method.getParameterTypes()) { - joiner.add(param.getSimpleName()); - } - return method.getName() + - "(" + joiner.toString() + "): " + - method.getReturnType().getSimpleName(); - } + */ } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java index 291637cef86..a9d72bb5a24 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java @@ -53,7 +53,7 @@ public static void updateMethods( try { Object script = getScript(state); getNewMethods(script, methods); - } catch (ReflectiveOperationException | NullPointerException e) { + } catch (NullPointerException e) { logger.error("Exception updating current methods", e); } } @@ -96,10 +96,11 @@ private static void getNewFields( private static void getNewMethods( Object script, - Set methods) throws ReflectiveOperationException { + Set methods) { Set newMethods = new HashSet<>(Arrays.asList( script.getClass().getMethods())); newMethods.removeAll(objectMethods); + newMethods.removeIf(method -> method.getName().equals("main")); methods.addAll(newMethods); } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index cd778be54fc..b6af2ea41e3 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -182,6 +182,13 @@ public void testMethods() throws Exception { interpreter.getMethods().stream().anyMatch(method -> method.getName().equals("sq")); } + @Test + public void testCompletion() throws Exception { + interpreter.interpret("val x = 1", context); + List completions = interpreter.completion("", 0, context); + System.out.println(completions); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 0bcdb08330e9c748c350cc2c330a20e9d196fc5e Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 13:13:59 +0300 Subject: [PATCH 062/117] Added Kotlin keywords to completion --- .../kotlin/completion/KotlinCompleter.java | 6 ++ .../kotlin/completion/KotlinKeywords.java | 101 ++++++++++++++++++ .../kotlin/KotlinInterpreterTest.java | 4 +- 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 35b8fa3bfda..0a4b0cfb671 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -21,12 +21,17 @@ import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; +import java.util.stream.Collectors; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinRepl; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinCompleter { + private static final List keywords = KotlinKeywords.KEYWORDS.stream() + .map(keyword -> new InterpreterCompletion(keyword, keyword, null)) + .collect(Collectors.toList()); + private KotlinRepl.KotlinContext ctx; public KotlinCompleter(KotlinRepl.KotlinContext ctx) { @@ -52,6 +57,7 @@ public List completion(String buf, int cursor, methodSignature(method) )); } + result.addAll(keywords); return result; } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java new file mode 100644 index 00000000000..35568f5a083 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.completion; + +import java.util.Arrays; +import java.util.List; + +public class KotlinKeywords { + public static final List KEYWORDS = Arrays.asList( + "as", + "as?", + "break", + "class", + "continue", + "do", + "else", + "false", + "for", + "fun", + "if", + "in", + "interface", + "is", + "null", + "object", + "package", + "return", + "super", + "this", + "throw", + "true", + "try", + "typealias", + "typeof", + "val", + "var", + "when", + "while", + "by", + "catch", + "constructor", + "delegate", + "dynamic", + "field", + "file", + "finally", + "get", + "import", + "init", + "param", + "property", + "receiver", + "set", + "setparam", + "where", + "actual", + "abstract", + "annotation", + "companion", + "const", + "crossinline", + "data", + "enum", + "expect", + "external", + "final", + "infix", + "inline", + "inner", + "internal", + "lateinit", + "noinline", + "open", + "operator", + "out", + "override", + "private", + "protected", + "public", + "reified", + "sealed", + "suspend", + "tailrec", + "vararg" + ); +} diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index b6af2ea41e3..a901cc8d7ed 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -185,8 +185,10 @@ public void testMethods() throws Exception { @Test public void testCompletion() throws Exception { interpreter.interpret("val x = 1", context); + interpreter.interpret("fun inc(n: Int): Int = n + 1", context); List completions = interpreter.completion("", 0, context); - System.out.println(completions); + assertTrue(completions.stream().anyMatch(c -> c.name.equals("x"))); + assertTrue(completions.stream().anyMatch(c -> c.name.equals("inc"))); } private static InterpreterContext getInterpreterContext() { From 6f59e4be0faee26956bd9f701dfe95216023dd94 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 14:34:09 +0300 Subject: [PATCH 063/117] Added Kotlin types to completion --- .../apache/zeppelin/kotlin/KotlinRepl.java | 6 +-- .../kotlin/completion/KotlinCompleter.java | 37 ++----------------- ...nStateUtil.java => KotlinReflectUtil.java} | 25 ++++++++++++- .../kotlin/reflect/KotlinVariableInfo.java | 6 ++- .../kotlin/KotlinInterpreterTest.java | 3 +- 5 files changed, 35 insertions(+), 42 deletions(-) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/{KotlinStateUtil.java => KotlinReflectUtil.java} (83%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 3d8b0d16215..96eeb360824 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -47,7 +47,7 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.context.KotlinReceiver; -import org.apache.zeppelin.kotlin.reflect.KotlinStateUtil; +import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinRepl { @@ -214,8 +214,8 @@ private void writeClass(byte[] classBytes, String path) { } private void updateContext() { - KotlinStateUtil.updateVars(ctx.vars, state); - KotlinStateUtil.updateMethods(ctx.methods, state); + KotlinReflectUtil.updateVars(ctx.vars, state); + KotlinReflectUtil.updateMethods(ctx.methods, state); } public static class KotlinContext { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 0a4b0cfb671..5f9d1111357 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -20,11 +20,11 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; -import java.util.StringJoiner; import java.util.stream.Collectors; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinRepl; +import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinCompleter { @@ -45,7 +45,7 @@ public List completion(String buf, int cursor, result.add(new InterpreterCompletion( var.getName(), var.getName(), - var.getDescriptor().getType().getSimpleName() + var.kotlinTypeName() )); } @@ -54,41 +54,10 @@ public List completion(String buf, int cursor, result.add(new InterpreterCompletion( method.getName(), method.getName(), - methodSignature(method) + KotlinReflectUtil.kotlinMethodSignature(method) )); } result.addAll(keywords); return result; } - - private String methodSignature(Method method) { - StringJoiner joiner = new StringJoiner(", "); - for (Class param : method.getParameterTypes()) { - joiner.add(param.getSimpleName()); - } - return method.getName() + - "(" + joiner.toString() + "): " + - method.getReturnType().getSimpleName(); - } - /* - private List getFieldsAndMethods(KotlinVariableInfo var) { - - Class varClass = var.getDescriptor().getType(); - List result = new ArrayList<>(); - - for (Field field : varClass.getFields()) { - String name = field.getName(); - String meta = field.getType().getSimpleName(); - result.add(new InterpreterCompletion(name, name, meta)); - } - for (Method method : varClass.getMethods()) { - String name = method.getName(); - String meta = getMethodSignature(method); - result.add(new InterpreterCompletion(name, name, meta)); - } - - return result; - } - - */ } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java similarity index 83% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index a9d72bb5a24..a1e7812f0e7 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinStateUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.kotlin.reflect; +import static kotlin.jvm.internal.Reflection.typeOf; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,10 +30,12 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.StringJoiner; import kotlin.Pair; +import kotlin.reflect.KType; -public class KotlinStateUtil { - private static Logger logger = LoggerFactory.getLogger(KotlinStateUtil.class); +public class KotlinReflectUtil { + private static Logger logger = LoggerFactory.getLogger(KotlinReflectUtil.class); private static final Set objectMethods = new HashSet<>(Arrays.asList(Object.class.getMethods())); @@ -58,6 +61,24 @@ public static void updateMethods( } } + public static KType kotlinTypeOf(Object o) { + return typeOf(o.getClass()); + } + + public static String kotlinTypeName(Object o) { + return kotlinTypeOf(o).toString(); + } + + public static String kotlinMethodSignature(Method method) { + StringJoiner joiner = new StringJoiner(", "); + for (Class param : method.getParameterTypes()) { + joiner.add(typeOf(param).toString()); + } + return method.getName() + + "(" + joiner.toString() + "): " + + typeOf(method.getReturnType()); + } + private static Object getScript(AggregatedReplStageState state) throws NullPointerException { Object script; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index 601ad5bd63a..b2228d730c4 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -42,8 +42,12 @@ public Field getDescriptor() { return descriptor; } + public String kotlinTypeName() { + return KotlinReflectUtil.kotlinTypeName(value); + } + @Override public String toString() { - return name + ": " + descriptor.getType().getCanonicalName() + " = " + getValue(); + return name + ": " + kotlinTypeName() + " = " + getValue(); } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index a901cc8d7ed..049e0dee4a6 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -74,7 +74,6 @@ private static void testCodeForResult(String code, String expected) throws Excep value = ""; } else { String message = result.message().get(0).getData().trim(); - System.out.println(message); // "res0 : kotlin.Int = 1" -> "kotlin.Int = 1" value = message.substring(message.indexOf(':') + 2); } @@ -171,7 +170,7 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val x = 3", context); InterpreterResult res = interpreter.interpret("kc.vars", context); System.out.println(res.message().get(0).getData()); - assertTrue(res.message().get(0).getData().contains("x: int = 3")); + assertTrue(res.message().get(0).getData().contains("x: kotlin.Int = 3")); res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } From 9f0eb828db0102ab5f4579eb46cf7392316d2052 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 17:15:54 +0300 Subject: [PATCH 064/117] Skipping conversion of types with type parameters --- .../kotlin/reflect/KotlinReflectUtil.java | 24 +++++++++++++------ .../kotlin/KotlinInterpreterTest.java | 4 ++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index a1e7812f0e7..eea60dbaaeb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -32,7 +33,6 @@ import java.util.Set; import java.util.StringJoiner; import kotlin.Pair; -import kotlin.reflect.KType; public class KotlinReflectUtil { private static Logger logger = LoggerFactory.getLogger(KotlinReflectUtil.class); @@ -61,22 +61,32 @@ public static void updateMethods( } } - public static KType kotlinTypeOf(Object o) { - return typeOf(o.getClass()); + public static String kotlinTypeName(Object o) { + Class oc = o.getClass(); + if (oc.getGenericSuperclass() instanceof ParameterizedType) { + return oc.getSimpleName(); + } + + String kotlinName = typeOf(oc).toString(); + if (kotlinName.startsWith("kotlin.")) { + String[] tokens = kotlinName.split("\\."); + return tokens[tokens.length - 1]; + } + return kotlinName; } - public static String kotlinTypeName(Object o) { - return kotlinTypeOf(o).toString(); + private static String kotlinTypeName(Class c) { + return typeOf(c).toString(); } public static String kotlinMethodSignature(Method method) { StringJoiner joiner = new StringJoiner(", "); for (Class param : method.getParameterTypes()) { - joiner.add(typeOf(param).toString()); + joiner.add(kotlinTypeName(param)); } return method.getName() + "(" + joiner.toString() + "): " + - typeOf(method.getReturnType()); + kotlinTypeName(method.getReturnType()); } private static Object getScript(AggregatedReplStageState state) diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 049e0dee4a6..491c2af1fd4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -168,9 +168,9 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val x = 1", context); interpreter.interpret("val y = 2", context); interpreter.interpret("val x = 3", context); + interpreter.interpret("val l = listOf(1,2,3)", context); InterpreterResult res = interpreter.interpret("kc.vars", context); - System.out.println(res.message().get(0).getData()); - assertTrue(res.message().get(0).getData().contains("x: kotlin.Int = 3")); + assertTrue(res.message().get(0).getData().contains("x: Int = 3")); res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } From 8d1d09e1013408cf11b4bd235ace51c1a7d2ce39 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 23 Aug 2019 17:49:34 +0300 Subject: [PATCH 065/117] Added tests for output classes --- .../kotlin/KotlinInterpreterTest.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 491c2af1fd4..d46f6d2c102 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -20,6 +20,7 @@ import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Assert; @@ -27,6 +28,8 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.List; import java.util.Properties; @@ -48,8 +51,7 @@ public class KotlinInterpreterTest { private static volatile String output = ""; - @Before - public void setUp() throws InterpreterException { + public void prepareInterpreter() { context = getInterpreterContext(); interpreter = new KotlinInterpreter(new Properties()); output = ""; @@ -58,6 +60,11 @@ public void setUp() throws InterpreterException { KotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); interpreter.getBuilder().compilerOptions(Arrays.asList("-classpath", cp)); + } + + @Before + public void setUp() throws InterpreterException { + prepareInterpreter(); interpreter.open(); } @@ -190,6 +197,26 @@ public void testCompletion() throws Exception { assertTrue(completions.stream().anyMatch(c -> c.name.equals("inc"))); } + @Test + public void testOutputClasses() throws Exception { + prepareInterpreter(); + Path tempPath = Files.createTempDirectory("tempKotlinClasses"); + interpreter.getBuilder().outputDir(tempPath.toAbsolutePath().toString()); + interpreter.open(); + interpreter.interpret("val x = 1\nx", context); + File[] dir = tempPath.toFile().listFiles(); + assertNotNull(dir); + assertTrue(dir.length > 0); + assertTrue(Arrays.stream(dir) + .anyMatch(file -> file.getName().matches("Line_\\d+\\.class"))); + + int oldLength = dir.length; + interpreter.interpret("x + 1", context); + dir = tempPath.toFile().listFiles(); + assertNotNull(dir); + assertTrue(dir.length > oldLength); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 26997ea341ff338774a9cbfa001f574e4fd050f5 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 26 Aug 2019 15:13:35 +0300 Subject: [PATCH 066/117] Added and updated Kotlin documentation --- docs/interpreter/kotlin.md | 58 ++++++++++++++++++++++++++++++++++++++ docs/interpreter/spark.md | 9 ++++-- 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 docs/interpreter/kotlin.md diff --git a/docs/interpreter/kotlin.md b/docs/interpreter/kotlin.md new file mode 100644 index 00000000000..10ca707f6a9 --- /dev/null +++ b/docs/interpreter/kotlin.md @@ -0,0 +1,58 @@ +--- +layout: page +title: "Kotlin interpreter in Apache Zeppelin" +description: "Kotlin is a cross-platform, statically typed, general-purpose programming language with type inference." +group: interpreter +--- + + +{% include JB/setup %} + +# Kotlin interpreter for Apache Zeppelin + +
+ +## Overview +Kotlin is a cross-platform, statically typed, general-purpose programming language with type inference. +It is designed to interoperate fully with Java, and the JVM version of its standard library depends on the Java Class Library, but type inference allows its syntax to be more concise. + +## Configuration + + + + + + + + + + + +
NameDefaultDescription
zeppelin.kotlin.maxResult1000Max number of collection elements to display
+ +## Using the Kotlin Interpreter +In a paragraph, use %kotlin to select the Kotlin interpreter and then write your script. + +## Example + +```kotlin +%kotlin + +fun square(n: Int): Int = n * n +``` + +## Kotlin Context +Kotlin context is accessible via `kc` object bound to the interpreter. +It holds `vars` and `methods` fields that return all user-defined variables and methods present in the interpreter. diff --git a/docs/interpreter/spark.md b/docs/interpreter/spark.md index 04e0675ab4a..be1ace6c2f2 100644 --- a/docs/interpreter/spark.md +++ b/docs/interpreter/spark.md @@ -26,7 +26,7 @@ limitations under the License. ## Overview [Apache Spark](http://spark.apache.org) is a fast and general-purpose cluster computing system. It provides high-level APIs in Java, Scala, Python and R, and an optimized engine that supports general execution graphs. -Apache Spark is supported in Zeppelin with Spark interpreter group which consists of below five interpreters. +Apache Spark is supported in Zeppelin with Spark interpreter group which consists of below six interpreters. @@ -39,6 +39,11 @@ Apache Spark is supported in Zeppelin with Spark interpreter group which consist + + + + + @@ -217,7 +222,7 @@ in interpreter setting page means you can use multiple versions of `spark` & `ha Starting from 0.9, we totally removed the old spark interpreter implementation, and make the new spark interpreter as the official spark interpreter. ## SparkContext, SQLContext, SparkSession, ZeppelinContext -SparkContext, SQLContext and ZeppelinContext are automatically created and exposed as variable names `sc`, `sqlContext` and `z`, respectively, in Scala, Python and R environments. +SparkContext, SQLContext and ZeppelinContext are automatically created and exposed as variable names `sc`, `sqlContext` and `z`, respectively, in Scala, Kotlin, Python and R environments. Staring from 0.6.1 SparkSession is available as variable `spark` when you are using Spark 2.x. > Note that Scala/Python/R environment shares the same SparkContext, SQLContext and ZeppelinContext instance. From e80f2137e433d6ce27cb6dc495f679b5edc9a8b8 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 10:46:58 +0300 Subject: [PATCH 067/117] Refactored classpath setting --- .../zeppelin/kotlin/KotlinInterpreter.java | 1 + .../zeppelin/kotlin/KotlinReplBuilder.java | 31 +++++++++++++++---- .../kotlin/reflect/KotlinReflectUtil.java | 6 ++++ .../kotlin/KotlinInterpreterTest.java | 8 ++--- .../spark/KotlinSparkInterpreter.java | 9 +++--- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 21eb4149329..04cd861b7e2 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -48,6 +48,7 @@ public class KotlinInterpreter extends Interpreter { public KotlinInterpreter(Properties properties) { super(properties); + properties.forEach((k, v) -> logger.info("PROPERTY " + k + ": " + v)); builder = new KotlinReplBuilder(); int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index f10837fe409..68f0921f0a9 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -21,9 +21,15 @@ import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.StringJoiner; import kotlin.Unit; import kotlin.script.experimental.api.KotlinType; import kotlin.script.experimental.api.ScriptCompilationConfiguration; @@ -46,14 +52,14 @@ public class KotlinReplBuilder { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); private KotlinReceiver ctx; - private List compilerOptions; + private Set classpath; private List codeOnLoad; private String outputDir; private int maxResult; public KotlinReplBuilder() { this.ctx = new KotlinReceiver(); - this.compilerOptions = new ArrayList<>(); + this.classpath = new HashSet<>(); this.codeOnLoad = new ArrayList<>(); } @@ -87,9 +93,13 @@ public KotlinReplBuilder executionContext(KotlinReceiver ctx) { return this; } - public KotlinReplBuilder compilerOptions(List options) { - options.forEach(logger::info); - this.compilerOptions = options; + public KotlinReplBuilder classPath(String path) { + this.classpath.add(path); + return this; + } + + public KotlinReplBuilder classPath(Collection paths) { + this.classpath.addAll(paths); return this; } @@ -98,7 +108,7 @@ public KotlinReplBuilder codeOnLoad(String code) { return this; } - public KotlinReplBuilder codeOnLoad(List code) { + public KotlinReplBuilder codeOnLoad(Collection code) { this.codeOnLoad.addAll(code); return this; } @@ -108,6 +118,14 @@ public KotlinReplBuilder outputDir(String outputDir) { return this; } + private String buildClassPath() { + StringJoiner joiner = new StringJoiner(File.pathSeparator); + for (String path : classpath) { + joiner.add(path); + } + return joiner.toString(); + } + private ScriptCompilationConfiguration buildCompilationConfiguration() { return new ScriptCompilationConfiguration((b) -> { b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); @@ -117,6 +135,7 @@ private ScriptCompilationConfiguration buildCompilationConfiguration() { JvmScriptCompilationKt.dependenciesFromCurrentContext( jvmBuilder, new String[0], true, false); + List compilerOptions = Arrays.asList("-classpath", buildClassPath()); b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index eea60dbaaeb..c832cab9662 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -43,6 +43,9 @@ public static void updateVars( Map vars, AggregatedReplStageState state) { try { + if (state.getHistory().isEmpty()) { + return; + } Object script = getScript(state); getNewFields(script, vars); } catch (ReflectiveOperationException | NullPointerException e) { @@ -54,6 +57,9 @@ public static void updateMethods( Set methods, AggregatedReplStageState state) { try { + if (state.getHistory().isEmpty()) { + return; + } Object script = getScript(state); getNewMethods(script, methods); } catch (NullPointerException e) { diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index d46f6d2c102..a8bc80781d4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -56,10 +56,10 @@ public void prepareInterpreter() { interpreter = new KotlinInterpreter(new Properties()); output = ""; - String cp = System.getProperty("java.class.path") + File.pathSeparator + - KotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath(); - - interpreter.getBuilder().compilerOptions(Arrays.asList("-classpath", cp)); + interpreter.getBuilder().classPath(Arrays.asList( + System.getProperty("java.class.path"), + KotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath() + )); } @Before diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 97f132f8327..b65b774ec6e 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -72,8 +72,7 @@ public void open() throws InterpreterException { sparkInterpreter.getSQLContext(), z); - String cp = sparkClasspath(); - List compilerOptions = Arrays.asList("-classpath", cp); + List classpath = sparkClasspath(); // TODO(dk) fix NPE in tests String outputDir; @@ -85,7 +84,7 @@ public void open() throws InterpreterException { interpreter.getBuilder() .executionContext(ctx) - .compilerOptions(compilerOptions) + .classPath(classpath) .outputDir(outputDir) .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX) .codeOnLoad(KotlinZeppelinBindings.SPARK_UDF_IMPORTS); @@ -143,7 +142,7 @@ public List completion(String buf, int cursor, return interpreter.completion(buf, cursor, interpreterContext); } - private String sparkClasspath() { + private List sparkClasspath() { String sparkJars = System.getProperty("spark.jars"); Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); @@ -167,6 +166,6 @@ private String sparkClasspath() { return ""; } }) - .collect(Collectors.joining(File.pathSeparator)); + .collect(Collectors.toList()); } } From 3a89c9041d452a2caf6cf70b188545ca56aeee52 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 11:47:07 +0300 Subject: [PATCH 068/117] Fixed imports loading --- .../zeppelin/kotlin/KotlinInterpreter.java | 27 +++++++++++++++++-- .../zeppelin/kotlin/KotlinReplBuilder.java | 5 +++- .../kotlin/reflect/KotlinReflectUtil.java | 2 +- .../kotlin/KotlinInterpreterTest.java | 6 ++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 04cd861b7e2..7bf6c822df0 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -19,8 +19,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.io.PrintStream; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -48,15 +50,17 @@ public class KotlinInterpreter extends Interpreter { public KotlinInterpreter(Properties properties) { super(properties); - properties.forEach((k, v) -> logger.info("PROPERTY " + k + ": " + v)); builder = new KotlinReplBuilder(); + int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); + String imports = properties.getProperty("zeppelin.interpreter.localRepo", ""); builder .executionContext(new KotlinReceiver()) .maxResult(maxResult) - .codeOnLoad(""); + .codeOnLoad("") + .classPath(getImportClasspath(imports)); } public KotlinReplBuilder getBuilder() { @@ -151,4 +155,23 @@ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { return res; } + + private List getImportClasspath(String localRepo) { + List classpath = new ArrayList<>(); + if (localRepo.equals("")) { + return classpath; + } + + File repo = new File(localRepo); + File[] files = repo.listFiles(); + if (files == null) { + return classpath; + } + for (File file : files) { + if (!file.isDirectory()) { + classpath.add(file.getAbsolutePath()); + } + } + return classpath; + } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 68f0921f0a9..9f713f4831a 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -121,7 +121,9 @@ public KotlinReplBuilder outputDir(String outputDir) { private String buildClassPath() { StringJoiner joiner = new StringJoiner(File.pathSeparator); for (String path : classpath) { - joiner.add(path); + if (path != null && !path.equals("")) { + joiner.add(path); + } } return joiner.toString(); } @@ -136,6 +138,7 @@ private ScriptCompilationConfiguration buildCompilationConfiguration() { jvmBuilder, new String[0], true, false); List compilerOptions = Arrays.asList("-classpath", buildClassPath()); + System.out.println(compilerOptions); b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index c832cab9662..a602d59a16e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -118,7 +118,7 @@ private static void getNewFields( for (Field field : fields) { String fieldName = field.getName(); - if (fieldName.contains("$$implicitReceiver") || fieldName.contains("kotlinVars")) { + if (fieldName.contains("$$implicitReceiver")) { continue; } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index a8bc80781d4..19451272a8d 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -52,8 +52,12 @@ public class KotlinInterpreterTest { private static volatile String output = ""; public void prepareInterpreter() { + prepareInterpreter(new Properties()); + } + + public void prepareInterpreter(Properties properties) { context = getInterpreterContext(); - interpreter = new KotlinInterpreter(new Properties()); + interpreter = new KotlinInterpreter(properties); output = ""; interpreter.getBuilder().classPath(Arrays.asList( From d3f705d87ff246ae70a9598d888da66ac4d3b894 Mon Sep 17 00:00:00 2001 From: "vitaly.khudobakhshov" Date: Tue, 27 Aug 2019 12:09:57 +0300 Subject: [PATCH 069/117] InvokeWrapper problem --- .../apache/zeppelin/kotlin/KotlinRepl.java | 14 +- .../kotlin/KotlinInterpreterTest.java | 21 + pom.xml | 2 +- zeppelin-web/package-lock.json | 11578 ++++++++-------- .../zeppelin/storage/LocalConfigStorage.java | 3 +- 5 files changed, 5920 insertions(+), 5698 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 96eeb360824..8dd3a6d44a0 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; +import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,6 +60,7 @@ public class KotlinRepl { private AtomicInteger counter; private String outputDir; private KotlinContext ctx; + private InvokeWrapper wrapper; private int maxResult; @SuppressWarnings("unchecked") @@ -104,7 +106,7 @@ public InterpreterResult eval(String code) { (ReplCompileResult.CompiledClasses) compileResult; writeClasses(classes); - ReplEvalResult evalResult = evaluator.eval(state, classes, null, null); + ReplEvalResult evalResult = evaluator.eval(state, classes, null, wrapper); if (evalResult instanceof ReplEvalResult.Error) { ReplEvalResult.Error e = (ReplEvalResult.Error) evalResult; @@ -218,7 +220,7 @@ private void updateContext() { KotlinReflectUtil.updateMethods(ctx.methods, state); } - public static class KotlinContext { + public class KotlinContext { private Map vars = new HashMap<>(); private Set methods = new HashSet<>(); @@ -226,6 +228,14 @@ public List getVars() { return new ArrayList<>(vars.values()); } + public void setWrapper(InvokeWrapper wrapper) { + KotlinRepl.this.wrapper = wrapper; + } + + public InvokeWrapper getWrapper() { + return KotlinRepl.this.wrapper; + } + public List getMethods() { return new ArrayList<>(methods); } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 19451272a8d..798f2012660 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -221,6 +221,27 @@ public void testOutputClasses() throws Exception { assertTrue(dir.length > oldLength); } + @Test + public void testWrapper() throws Exception { + String code = "import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper\n" + + "var k = 0\n" + + "val wrapper = object : InvokeWrapper {\n" + + " override operator fun invoke(body: () -> T): T {\n" + + " println(\"START\")\n" + + " val result = body()\n" + + " println(\"END\")\n" + + " k = k + 1\n" + + " return result\n" + + " }\n" + + "}\n" + + "kc.setWrapper(wrapper)\n"; + interpreter.interpret(code, context); + interpreter.interpret("println(\"hello!\")", context); + List vars = interpreter.getVariables(); + for (KotlinVariableInfo v: vars) + if (v.getName().equals("k")) System.out.println(v); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() diff --git a/pom.xml b/pom.xml index ab65cfbf808..6b5b5598d63 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ sap scalding java - beam + hazelcastjet geode zeppelin-web diff --git a/zeppelin-web/package-lock.json b/zeppelin-web/package-lock.json index dc32d68bee3..a2b2537581c 100644 --- a/zeppelin-web/package-lock.json +++ b/zeppelin-web/package-lock.json @@ -96,7 +96,7 @@ "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { - "@xtuc/ieee754": "^1.2.0" + "@xtuc/ieee754": "1.2.0" } }, "@webassemblyjs/leb128": { @@ -211,10 +211,10 @@ "resolved": "https://registry.npmjs.org/CSSselect/-/CSSselect-0.7.0.tgz", "integrity": "sha1-5AVMZ7RnRl88lQDA2gqnh4xLq9I=", "requires": { - "CSSwhat": "0.4", - "boolbase": "~1.0.0", - "domutils": "1.4", - "nth-check": "~1.0.0" + "CSSwhat": "0.4.7", + "boolbase": "1.0.0", + "domutils": "1.4.3", + "nth-check": "1.0.2" } }, "CSSwhat": { @@ -234,7 +234,7 @@ "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", "dev": true, "requires": { - "mime-types": "~2.1.18", + "mime-types": "2.1.21", "negotiator": "0.6.1" } }, @@ -250,7 +250,7 @@ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "acorn": "^5.0.0" + "acorn": "5.7.3" } }, "acorn-jsx": { @@ -259,7 +259,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -276,19 +276,13 @@ "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", "dev": true }, - "after": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", - "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", - "dev": true - }, "agent-base": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" } }, "ajv": { @@ -297,8 +291,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ajv-errors": { @@ -325,7 +319,7 @@ "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", "dev": true, "requires": { - "stable": "~0.1.3" + "stable": "0.1.8" } }, "amdefine": { @@ -343,12 +337,11 @@ "resolved": "https://registry.npmjs.org/angular-ui-grid/-/angular-ui-grid-4.4.6.tgz", "integrity": "sha512-0d14HDY4XeqFHI508thxeufiR0AlFoZQ8ihk0x8TRCQc+b9CCk1/F63W2zihirxF0cdOAqBCY2pVSM7vfZvXBQ==", "requires": { - "angular": ">=1.4.0 1.6.x" + "angular": "1.6.10" } }, "angular-viewport-watch": { - "version": "github:wix/angular-viewport-watch#182923b3934e63817b6fc7b640ecb5c4a011f74c", - "from": "github:wix/angular-viewport-watch" + "version": "github:wix/angular-viewport-watch#182923b3934e63817b6fc7b640ecb5c4a011f74c" }, "ansi-colors": { "version": "3.2.1", @@ -390,9 +383,10 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, + "optional": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" } }, "applause": { @@ -401,9 +395,9 @@ "integrity": "sha1-qEaFeegfZzl7tWNMKZU77c0PVsA=", "dev": true, "requires": { - "cson-parser": "^1.1.0", - "js-yaml": "^3.3.0", - "lodash": "^3.10.0" + "cson-parser": "1.3.5", + "js-yaml": "3.7.0", + "lodash": "3.10.1" }, "dependencies": { "lodash": { @@ -426,7 +420,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -434,8 +428,9 @@ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, + "optional": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "arr-flatten": { @@ -492,7 +487,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -507,12 +502,6 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -525,7 +514,7 @@ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "asn1.js": { @@ -534,9 +523,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.3", + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -588,6 +577,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -606,12 +601,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.30000906", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "aws-sign2": { @@ -632,21 +627,21 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "chokidar": "^1.6.1", - "commander": "^2.11.0", - "convert-source-map": "^1.5.0", - "fs-readdir-recursive": "^1.0.0", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "output-file-sync": "^1.1.2", - "path-is-absolute": "^1.0.1", - "slash": "^1.0.0", - "source-map": "^0.5.6", - "v8flags": "^2.1.1" + "babel-core": "6.26.3", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.19.0", + "convert-source-map": "1.6.0", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.3", + "lodash": "4.17.11", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" }, "dependencies": { "commander": { @@ -661,12 +656,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -675,7 +670,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "source-map": { @@ -692,9 +687,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.2", + "js-tokens": "3.0.2" } }, "babel-core": { @@ -703,25 +698,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.6.0", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" }, "dependencies": { "minimatch": { @@ -730,7 +725,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "source-map": { @@ -747,14 +742,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.11", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "source-map": { @@ -771,9 +766,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-call-delegate": { @@ -782,10 +777,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-define-map": { @@ -794,10 +789,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" } }, "babel-helper-explode-assignable-expression": { @@ -806,9 +801,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-function-name": { @@ -817,11 +812,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-get-function-arity": { @@ -830,8 +825,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-hoist-variables": { @@ -840,8 +835,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-optimise-call-expression": { @@ -850,8 +845,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-regex": { @@ -860,9 +855,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" } }, "babel-helper-remap-async-to-generator": { @@ -871,11 +866,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helper-replace-supers": { @@ -884,12 +879,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-helpers": { @@ -898,8 +893,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-loader": { @@ -908,9 +903,9 @@ "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", "dev": true, "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" } }, "babel-messages": { @@ -919,7 +914,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-check-es2015-constants": { @@ -928,7 +923,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-syntax-async-functions": { @@ -955,9 +950,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -966,7 +961,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -975,7 +970,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -984,11 +979,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.11" } }, "babel-plugin-transform-es2015-classes": { @@ -997,15 +992,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -1014,8 +1009,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-destructuring": { @@ -1024,7 +1019,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -1033,8 +1028,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-for-of": { @@ -1043,7 +1038,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -1052,9 +1047,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-literals": { @@ -1063,7 +1058,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -1072,9 +1067,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -1083,10 +1078,10 @@ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -1095,9 +1090,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -1106,9 +1101,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" } }, "babel-plugin-transform-es2015-object-super": { @@ -1117,8 +1112,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -1127,12 +1122,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -1141,8 +1136,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-spread": { @@ -1151,7 +1146,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -1160,9 +1155,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-plugin-transform-es2015-template-literals": { @@ -1171,7 +1166,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -1180,7 +1175,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "^6.22.0" + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -1189,9 +1184,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1200,9 +1195,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -1211,7 +1206,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "^0.10.0" + "regenerator-transform": "0.10.1" } }, "babel-plugin-transform-strict-mode": { @@ -1220,8 +1215,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" } }, "babel-polyfill": { @@ -1230,9 +1225,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "regenerator-runtime": "0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -1249,36 +1244,36 @@ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "3.2.8", + "invariant": "2.2.4", + "semver": "5.6.0" }, "dependencies": { "browserslist": { @@ -1287,8 +1282,8 @@ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" + "caniuse-lite": "1.0.30000906", + "electron-to-chromium": "1.3.83" } } } @@ -1299,13 +1294,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.11", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" } }, "babel-runtime": { @@ -1314,8 +1309,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -1324,11 +1319,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.11" } }, "babel-traverse": { @@ -1337,15 +1332,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.11" } }, "babel-types": { @@ -1354,10 +1349,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.11", + "to-fast-properties": "1.0.3" } }, "babylon": { @@ -1384,13 +1379,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.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -1399,7 +1394,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -1408,7 +1403,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1417,7 +1412,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1426,9 +1421,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" } }, "isobject": { @@ -1445,24 +1440,12 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", - "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=", - "dev": true - }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "base64id": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", - "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", - "dev": true - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1475,15 +1458,9 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, - "benchmark": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", - "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", - "dev": true - }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -1505,19 +1482,13 @@ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", - "dev": true - }, "blocking-proxy": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "1.2.0" }, "dependencies": { "minimist": { @@ -1547,15 +1518,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", + "depd": "1.1.2", + "http-errors": "1.6.3", "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.5.2", "raw-body": "2.3.3", - "type-is": "~1.6.16" + "type-is": "1.6.16" } }, "bonjour": { @@ -1564,12 +1535,12 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" }, "dependencies": { "array-flatten": { @@ -1603,9 +1574,9 @@ "integrity": "sha1-mPxbQah4cO+cu5KXY1z4H1UF/bE=", "dev": true, "requires": { - "graceful-fs": "~2.0.0", - "mout": "~0.9.0", - "optimist": "~0.6.0", + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", "osenv": "0.0.3" }, "dependencies": { @@ -1623,7 +1594,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1632,10 +1603,11 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, + "optional": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.3" } }, "brorand": { @@ -1650,12 +1622,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.3", + "safe-buffer": "5.1.2" } }, "browserify-cipher": { @@ -1664,9 +1636,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": { @@ -1675,10 +1647,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.3", + "safe-buffer": "5.1.2" } }, "browserify-rsa": { @@ -1687,8 +1659,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.0.6" } }, "browserify-sign": { @@ -1697,13 +1669,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.4.1", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -1712,7 +1684,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "~1.0.5" + "pako": "1.0.6" } }, "browserslist": { @@ -1721,8 +1693,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000906", + "electron-to-chromium": "1.3.83" } }, "browserstack": { @@ -1731,7 +1703,7 @@ "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "https-proxy-agent": "2.2.1" } }, "buffer": { @@ -1740,9 +1712,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" }, "dependencies": { "isarray": { @@ -1759,8 +1731,8 @@ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" } }, "buffer-alloc-unsafe": { @@ -1817,19 +1789,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.2", + "chownr": "1.1.1", + "glob": "7.1.3", + "graceful-fs": "4.1.15", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.1", + "y18n": "4.0.0" }, "dependencies": { "glob": { @@ -1838,12 +1810,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "lru-cache": { @@ -1852,8 +1824,8 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "minimatch": { @@ -1862,7 +1834,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -1873,15 +1845,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.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" }, "dependencies": { "isobject": { @@ -1898,7 +1870,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsite": { @@ -1918,8 +1890,8 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", "integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=", "requires": { - "sentence-case": "^1.1.1", - "upper-case": "^1.1.1" + "sentence-case": "1.1.3", + "upper-case": "1.1.3" } }, "camelcase": { @@ -1933,8 +1905,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "2.1.1", + "map-obj": "1.0.1" }, "dependencies": { "camelcase": { @@ -1951,10 +1923,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.30000906", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" } }, "caniuse-db": { @@ -1981,11 +1953,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" }, "dependencies": { "supports-color": { @@ -2001,21 +1973,21 @@ "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.1.6.tgz", "integrity": "sha1-UUryBRMVimj+fwDf9MMy1sKY0vk=", "requires": { - "camel-case": "^1.0.0", - "constant-case": "^1.0.0", - "dot-case": "^1.0.0", - "is-lower-case": "^1.0.0", - "is-upper-case": "^1.0.0", - "lower-case": "^1.0.0", - "param-case": "^1.0.0", - "pascal-case": "^1.0.0", - "path-case": "^1.0.0", - "sentence-case": "^1.0.0", - "snake-case": "^1.0.0", - "swap-case": "^1.0.0", - "title-case": "^1.0.0", - "upper-case": "^1.0.0", - "upper-case-first": "^1.0.0" + "camel-case": "1.2.2", + "constant-case": "1.1.2", + "dot-case": "1.1.2", + "is-lower-case": "1.1.3", + "is-upper-case": "1.1.2", + "lower-case": "1.1.4", + "param-case": "1.1.2", + "pascal-case": "1.1.2", + "path-case": "1.1.2", + "sentence-case": "1.1.3", + "snake-case": "1.1.2", + "swap-case": "1.1.2", + "title-case": "1.1.2", + "upper-case": "1.1.3", + "upper-case-first": "1.1.2" } }, "cheerio": { @@ -2023,10 +1995,10 @@ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.12.4.tgz", "integrity": "sha1-wZlibp4esNQjOpGkeT5/iqppoYs=", "requires": { - "cheerio-select": "*", - "entities": "0.x", + "cheerio-select": "0.0.3", + "entities": "0.5.0", "htmlparser2": "3.1.4", - "underscore": "~1.4" + "underscore": "1.4.4" } }, "cheerio-select": { @@ -2034,7 +2006,7 @@ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-0.0.3.tgz", "integrity": "sha1-PyQgEU88ywsbB1wkXM+q5dYXo4g=", "requires": { - "CSSselect": "0.x" + "CSSselect": "0.7.0" } }, "chokidar": { @@ -2042,16 +2014,16 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, + "optional": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" } }, "chownr": { @@ -2066,7 +2038,7 @@ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", "dev": true, "requires": { - "tslib": "^1.9.0" + "tslib": "1.9.3" } }, "cipher-base": { @@ -2075,8 +2047,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "circular-json": { @@ -2091,7 +2063,7 @@ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { - "chalk": "^1.1.3" + "chalk": "1.1.3" } }, "class-utils": { @@ -2100,10 +2072,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": { @@ -2112,7 +2084,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "isobject": { @@ -2128,7 +2100,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.2.23.tgz", "integrity": "sha1-BZC1R4tRbEkD7cLYm9P9vdKGMow=", "requires": { - "commander": "2.2.x" + "commander": "2.2.0" } }, "cli": { @@ -2137,7 +2109,7 @@ "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", "requires": { "exit": "0.1.2", - "glob": "~ 3.2.1" + "glob": "3.2.11" } }, "cli-cursor": { @@ -2146,7 +2118,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "cli-width": { @@ -2161,9 +2133,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "ansi-regex": { @@ -2184,8 +2156,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" } }, "strip-ansi": { @@ -2194,7 +2166,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -2217,7 +2189,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "^1.1.2" + "q": "1.5.1" } }, "code-point-at": { @@ -2238,8 +2210,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": { @@ -2248,9 +2220,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": { @@ -2274,7 +2246,7 @@ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { - "color-name": "^1.0.0" + "color-name": "1.1.3" } }, "colormin": { @@ -2283,9 +2255,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": { @@ -2300,7 +2272,7 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "^4.5.0" + "lodash": "4.17.11" } }, "combined-stream": { @@ -2309,7 +2281,7 @@ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -2347,7 +2319,7 @@ "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "dev": true, "requires": { - "mime-db": ">= 1.36.0 < 2" + "mime-db": "1.37.0" } }, "compression": { @@ -2356,13 +2328,13 @@ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "dev": true, "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "bytes": "3.0.0", - "compressible": "~2.0.14", + "compressible": "2.0.15", "debug": "2.6.9", - "on-headers": "~1.0.1", + "on-headers": "1.0.1", "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "vary": "1.1.2" } }, "concat-map": { @@ -2377,10 +2349,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.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "isarray": { @@ -2395,13 +2367,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.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" } }, "string_decoder": { @@ -2410,7 +2382,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -2423,7 +2395,7 @@ "requires": { "debug": "2.6.9", "finalhandler": "1.1.0", - "parseurl": "~1.3.2", + "parseurl": "1.3.2", "utils-merge": "1.0.1" }, "dependencies": { @@ -2434,12 +2406,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" } }, "statuses": { @@ -2462,7 +2434,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constant-case": { @@ -2470,8 +2442,8 @@ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz", "integrity": "sha1-jsLKW6ND4Aqjjb9OIA/VrJB+/WM=", "requires": { - "snake-case": "^1.1.0", - "upper-case": "^1.1.1" + "snake-case": "1.1.2", + "upper-case": "1.1.3" } }, "constants-browserify": { @@ -2504,7 +2476,7 @@ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "safe-buffer": "5.1.2" } }, "cookie": { @@ -2525,12 +2497,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.6.2", + "run-queue": "1.0.3" } }, "copy-descriptor": { @@ -2545,14 +2517,14 @@ "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", "dev": true, "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "globby": "^7.1.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "minimatch": "^3.0.4", - "p-limit": "^1.0.0", - "serialize-javascript": "^1.4.0" + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.0", + "loader-utils": "1.1.0", + "minimatch": "3.0.4", + "p-limit": "1.3.0", + "serialize-javascript": "1.5.0" }, "dependencies": { "is-extglob": { @@ -2567,7 +2539,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "minimatch": { @@ -2576,7 +2548,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -2598,10 +2570,10 @@ "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" + "is-directory": "0.3.1", + "js-yaml": "3.12.0", + "parse-json": "4.0.0", + "require-from-string": "2.0.2" }, "dependencies": { "esprima": { @@ -2616,8 +2588,8 @@ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "parse-json": { @@ -2626,8 +2598,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" } } } @@ -2638,8 +2610,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "bn.js": "4.11.8", + "elliptic": "6.4.1" } }, "create-hash": { @@ -2648,11 +2620,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.3", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { @@ -2661,12 +2633,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.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -2675,11 +2647,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", + "shebang-command": "1.2.0", + "which": "1.3.1" }, "dependencies": { "which": { @@ -2688,7 +2660,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } } } @@ -2699,17 +2671,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.3", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.0.6", + "randomfill": "1.0.4" } }, "cson-parser": { @@ -2718,7 +2690,7 @@ "integrity": "sha1-fsZ14DkUVTO/KmqFYHPxWZ2cLSQ=", "dev": true, "requires": { - "coffee-script": "^1.10.0" + "coffee-script": "1.12.7" }, "dependencies": { "coffee-script": { @@ -2741,18 +2713,18 @@ "integrity": "sha1-th6eMNuUMD5v/IkvEOzQmtAlof0=", "dev": true, "requires": { - "babel-code-frame": "^6.11.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": ">=2.6.1 <4", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "source-list-map": "^0.1.7" + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.1", + "cssnano": "3.10.0", + "loader-utils": "1.1.0", + "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", + "source-list-map": "0.1.8" } }, "css-select": { @@ -2761,10 +2733,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", + "boolbase": "1.0.0", + "css-what": "2.1.2", "domutils": "1.5.1", - "nth-check": "~1.0.1" + "nth-check": "1.0.2" }, "dependencies": { "domutils": { @@ -2773,8 +2745,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.0", + "domelementtype": "1.2.1" } } } @@ -2785,9 +2757,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" }, "dependencies": { "regexpu-core": { @@ -2796,9 +2768,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" } } } @@ -2821,7 +2793,7 @@ "integrity": "sha1-OmoE51Zcjp0ZvrSXZ8fslug2WAU=", "dev": true, "requires": { - "parserlib": "~0.2.2" + "parserlib": "0.2.5" } }, "cssnano": { @@ -2830,38 +2802,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" } }, "csso": { @@ -2870,8 +2842,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" }, "dependencies": { "source-map": { @@ -2888,7 +2860,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "array-find-index": "1.0.2" } }, "custom-event": { @@ -2909,7 +2881,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "0.10.46" } }, "dashdash": { @@ -2918,9 +2890,15 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2977,8 +2955,8 @@ "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", "dev": true, "requires": { - "execa": "^0.10.0", - "ip-regex": "^2.1.0" + "execa": "0.10.0", + "ip-regex": "2.1.0" } }, "define-properties": { @@ -2987,7 +2965,7 @@ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.0.12" } }, "define-property": { @@ -2996,8 +2974,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": { @@ -3006,7 +2984,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -3015,7 +2993,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -3024,9 +3002,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" } }, "isobject": { @@ -3055,13 +3033,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" }, "dependencies": { "glob": { @@ -3070,12 +3048,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "globby": { @@ -3084,12 +3062,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.3", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "minimatch": { @@ -3098,7 +3076,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "pify": { @@ -3127,8 +3105,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -3143,7 +3121,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "detect-node": { @@ -3175,9 +3153,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.0.6" } }, "dir-glob": { @@ -3186,8 +3164,8 @@ "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "arrify": "1.0.1", + "path-type": "3.0.0" } }, "dns-equal": { @@ -3202,8 +3180,8 @@ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" + "ip": "1.1.5", + "safe-buffer": "5.1.2" } }, "dns-txt": { @@ -3212,7 +3190,7 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "^1.0.0" + "buffer-indexof": "1.1.1" } }, "doctrine": { @@ -3221,7 +3199,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "esutils": "2.0.2" } }, "dom-converter": { @@ -3230,7 +3208,7 @@ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "~0.4" + "utila": "0.4.0" } }, "dom-serialize": { @@ -3239,10 +3217,10 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.2", + "void-elements": "2.0.1" } }, "dom-serializer": { @@ -3251,8 +3229,8 @@ "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" + "domelementtype": "1.1.3", + "entities": "1.1.2" }, "dependencies": { "domelementtype": { @@ -3285,7 +3263,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.0.3.tgz", "integrity": "sha1-iJ+N9iZAOvB4jinWbV1cb36/D9Y=", "requires": { - "domelementtype": "1" + "domelementtype": "1.2.1" } }, "domutils": { @@ -3293,7 +3271,7 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", "requires": { - "domelementtype": "1" + "domelementtype": "1.2.1" } }, "dot-case": { @@ -3301,7 +3279,7 @@ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz", "integrity": "sha1-HnOCaQDeKNbeVIC8HeMdCEKwa+w=", "requires": { - "sentence-case": "^1.1.2" + "sentence-case": "1.1.3" } }, "duplexify": { @@ -3310,10 +3288,10 @@ "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", "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.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "isarray": { @@ -3328,13 +3306,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.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" } }, "string_decoder": { @@ -3343,7 +3321,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -3360,8 +3338,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "ee-first": { @@ -3382,13 +3360,13 @@ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "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.5", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emojis-list": { @@ -3409,136 +3387,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.10.tgz", - "integrity": "sha1-+H2E4b0h0aLsf43u8MYgVKzfsno=", - "dev": true, - "requires": { - "accepts": "1.1.4", - "base64id": "0.1.0", - "debug": "2.2.0", - "engine.io-parser": "1.2.4", - "ws": "1.0.1" - }, - "dependencies": { - "accepts": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", - "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=", - "dev": true, - "requires": { - "mime-types": "~2.0.4", - "negotiator": "0.4.9" - } - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "~1.12.0" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "negotiator": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", - "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz", - "integrity": "sha1-HWrUgEilCDyVCWlDsp0279shJAE=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "component-inherit": "0.0.3", - "debug": "2.2.0", - "engine.io-parser": "1.2.4", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.1", - "parseqs": "0.0.2", - "parseuri": "0.0.4", - "ws": "1.0.1", - "xmlhttprequest-ssl": "1.5.1", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", - "integrity": "sha1-4Il7C/FOeS1M0qWVBVORnFaUjEI=", - "dev": true, - "requires": { - "after": "0.8.1", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.2", - "blob": "0.0.4", - "has-binary": "0.1.6", - "utf8": "2.1.0" - }, - "dependencies": { - "has-binary": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", - "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } + "once": "1.4.0" } }, "enhanced-resolve": { @@ -3547,9 +3396,9 @@ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "graceful-fs": "4.1.15", + "memory-fs": "0.4.1", + "tapable": "1.1.0" } }, "ent": { @@ -3569,7 +3418,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error-ex": { @@ -3578,7 +3427,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -3587,11 +3436,11 @@ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4" } }, "es-to-primitive": { @@ -3600,9 +3449,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": { @@ -3611,9 +3460,9 @@ "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -3622,9 +3471,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-symbol": "3.1.1" } }, "es6-map": { @@ -3633,12 +3482,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.0", + "es5-ext": "0.10.46", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -3653,7 +3502,7 @@ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.5" }, "dependencies": { "es6-promise": { @@ -3670,11 +3519,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" } }, "es6-symbol": { @@ -3683,8 +3532,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.46" } }, "es6-weak-map": { @@ -3693,10 +3542,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" } }, "escape-html": { @@ -3717,11 +3566,11 @@ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" }, "dependencies": { "estraverse": { @@ -3737,7 +3586,7 @@ "dev": true, "optional": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -3748,10 +3597,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.2", + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint": { @@ -3760,41 +3609,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "^6.16.0", - "chalk": "^1.1.3", - "concat-stream": "^1.5.2", - "debug": "^2.1.1", - "doctrine": "^2.0.0", - "escope": "^3.6.0", - "espree": "^3.4.0", - "esquery": "^1.0.0", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.14.0", - "ignore": "^3.2.0", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.7.5", - "strip-bom": "^3.0.0", - "strip-json-comments": "~2.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "2.1.0", + "escope": "3.6.0", + "espree": "3.5.4", + "esquery": "1.0.1", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.3", + "globals": "9.18.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.19.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.7.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.11", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { "glob": { @@ -3803,12 +3652,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -3817,7 +3666,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "user-home": { @@ -3826,7 +3675,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "os-homedir": "1.0.2" } } } @@ -3849,8 +3698,8 @@ "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" + "debug": "2.6.9", + "resolve": "1.8.1" } }, "eslint-module-utils": { @@ -3859,8 +3708,8 @@ "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", "dev": true, "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" + "debug": "2.6.9", + "pkg-dir": "1.0.0" }, "dependencies": { "find-up": { @@ -3869,8 +3718,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "path-exists": { @@ -3879,7 +3728,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "pkg-dir": { @@ -3888,7 +3737,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "1.1.2" } } } @@ -3899,16 +3748,16 @@ "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", "dev": true, "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", + "contains-path": "0.1.0", + "debug": "2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "eslint-import-resolver-node": "0.3.2", + "eslint-module-utils": "2.2.0", + "has": "1.0.3", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0", + "resolve": "1.8.1" }, "dependencies": { "doctrine": { @@ -3917,8 +3766,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "2.0.2", + "isarray": "1.0.0" } }, "isarray": { @@ -3933,7 +3782,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -3944,10 +3793,10 @@ "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", "dev": true, "requires": { - "ignore": "^3.0.11", - "minimatch": "^3.0.2", - "object-assign": "^4.0.1", - "resolve": "^1.1.7", + "ignore": "3.3.10", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "resolve": "1.8.1", "semver": "5.3.0" }, "dependencies": { @@ -3957,7 +3806,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "semver": { @@ -3986,8 +3835,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "esrecurse": "4.2.1", + "estraverse": "4.2.0" } }, "eslint-watch": { @@ -3996,17 +3845,17 @@ "integrity": "sha512-6iEMRwo6RUpSaYyU7547qWQbgUKSYtkn4eGId/hZJvi+gMnRVeNfIzv/HAOPUmH6y53p1Ks9oNvWm/xZh4RPGQ==", "dev": true, "requires": { - "babel-polyfill": "^6.20.0", - "bluebird": "^3.5.1", - "chalk": "^2.1.0", - "chokidar": "^2.0.0", - "debug": "^3.0.1", - "keypress": "^0.2.1", - "lodash": "^4.17.4", - "optionator": "^0.8.2", - "source-map-support": "^0.5.3", - "strip-ansi": "^4.0.0", - "text-table": "^0.2.0", + "babel-polyfill": "6.26.0", + "bluebird": "3.5.2", + "chalk": "2.4.1", + "chokidar": "2.0.4", + "debug": "3.2.6", + "keypress": "0.2.1", + "lodash": "4.17.11", + "optionator": "0.8.2", + "source-map-support": "0.5.9", + "strip-ansi": "4.0.0", + "text-table": "0.2.0", "unicons": "0.0.3" }, "dependencies": { @@ -4022,7 +3871,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "anymatch": { @@ -4031,8 +3880,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" } }, "arr-diff": { @@ -4053,16 +3902,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": { @@ -4071,7 +3920,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4082,9 +3931,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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" } }, "chokidar": { @@ -4093,19 +3942,18 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.0" } }, "debug": { @@ -4114,7 +3962,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -4131,13 +3979,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": { "debug": { @@ -4155,7 +4003,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -4164,7 +4012,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -4173,7 +4021,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4182,7 +4030,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4193,7 +4041,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4202,7 +4050,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4213,9 +4061,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" } }, "kind-of": { @@ -4232,14 +4080,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": { @@ -4248,7 +4096,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -4257,7 +4105,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4268,10 +4116,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": { @@ -4280,7 +4128,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4291,8 +4139,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": { @@ -4301,7 +4149,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -4318,7 +4166,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -4327,7 +4175,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -4336,9 +4184,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" } }, "is-extglob": { @@ -4353,7 +4201,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-number": { @@ -4362,7 +4210,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4371,7 +4219,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4394,19 +4242,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" } }, "source-map": { @@ -4421,8 +4269,8 @@ "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "buffer-from": "1.1.1", + "source-map": "0.6.1" } }, "strip-ansi": { @@ -4431,7 +4279,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "supports-color": { @@ -4440,7 +4288,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -4451,8 +4299,8 @@ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "5.7.3", + "acorn-jsx": "3.0.1" } }, "esprima": { @@ -4467,7 +4315,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "4.2.0" } }, "esrecurse": { @@ -4476,7 +4324,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.2.0" } }, "estraverse": { @@ -4503,8 +4351,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.0", + "es5-ext": "0.10.46" } }, "eventemitter2": { @@ -4531,7 +4379,7 @@ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { - "original": "^1.0.0" + "original": "1.0.2" } }, "evp_bytestokey": { @@ -4540,8 +4388,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.1.2" } }, "execa": { @@ -4550,13 +4398,13 @@ "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "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": "6.0.5", + "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" }, "dependencies": { "cross-spawn": { @@ -4565,11 +4413,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "which": { @@ -4578,7 +4426,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } } } @@ -4600,9 +4448,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "^0.2.3", - "array-unique": "^0.2.1", - "braces": "^0.1.2" + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" }, "dependencies": { "braces": { @@ -4611,7 +4459,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "^0.1.0" + "expand-range": "0.1.1" } }, "expand-range": { @@ -4620,8 +4468,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "^0.1.1", - "repeat-string": "^0.2.2" + "is-number": "0.1.1", + "repeat-string": "0.2.2" } }, "is-number": { @@ -4643,8 +4491,9 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, + "optional": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "expand-range": { @@ -4652,8 +4501,9 @@ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, + "optional": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" } }, "express": { @@ -4662,36 +4512,36 @@ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "dev": true, "requires": { - "accepts": "~1.3.5", + "accepts": "1.3.5", "array-flatten": "1.1.1", "body-parser": "1.18.3", "content-disposition": "0.5.2", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "finalhandler": "1.1.1", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", + "proxy-addr": "2.0.4", "qs": "6.5.2", - "range-parser": "~1.2.0", + "range-parser": "1.2.0", "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "statuses": "1.4.0", + "type-is": "1.6.16", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" } }, "extend": { @@ -4706,8 +4556,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": { @@ -4716,7 +4566,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -4726,8 +4576,9 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, + "optional": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "extract-zip": { @@ -4784,7 +4635,7 @@ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "~1.2.0" + "pend": "1.2.0" } }, "figures": { @@ -4793,8 +4644,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" } }, "file-entry-cache": { @@ -4803,8 +4654,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.0", + "object-assign": "4.1.1" } }, "file-loader": { @@ -4813,8 +4664,8 @@ "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "loader-utils": "1.1.0", + "schema-utils": "1.0.0" } }, "file-sync-cmp": { @@ -4827,19 +4678,21 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "dev": true, + "optional": true }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, + "optional": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.3", + "repeat-string": "1.6.1" } }, "finalhandler": { @@ -4849,12 +4702,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" } }, "find-cache-dir": { @@ -4863,9 +4716,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": { @@ -4874,7 +4727,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "findup-sync": { @@ -4883,8 +4736,8 @@ "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", "dev": true, "requires": { - "glob": "~3.2.9", - "lodash": "~2.4.1" + "glob": "3.2.11", + "lodash": "2.4.2" }, "dependencies": { "lodash": { @@ -4901,12 +4754,18 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.15", + "write": "0.2.1" } }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, "flatten": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", @@ -4919,8 +4778,8 @@ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "isarray": { @@ -4935,13 +4794,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.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" } }, "string_decoder": { @@ -4950,7 +4809,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -4961,7 +4820,7 @@ "integrity": "sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==", "dev": true, "requires": { - "debug": "=3.1.0" + "debug": "3.1.0" }, "dependencies": { "debug": { @@ -4986,8 +4845,9 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, + "optional": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "forever-agent": { @@ -5002,9 +4862,9 @@ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.7", + "mime-types": "2.1.21" } }, "forwarded": { @@ -5019,7 +4879,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fresh": { @@ -5034,8 +4894,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "isarray": { @@ -5050,13 +4910,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.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" } }, "string_decoder": { @@ -5065,7 +4925,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -5076,9 +4936,9 @@ "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0" + "graceful-fs": "4.1.15", + "jsonfile": "2.4.0", + "klaw": "1.3.1" } }, "fs-readdir-recursive": { @@ -5093,10 +4953,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.1.15", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "1.0.34" } }, "fs.realpath": { @@ -5105,2115 +4965,1580 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "github-markdown-css": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-2.6.0.tgz", + "integrity": "sha1-zcdLq1ZrA51/u3RgH3ghsQnPWRg=" + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "global-modules-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, - "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.3", + "ignore": "3.3.10", + "pify": "3.0.0", + "slash": "1.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": 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" + } }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "brace-expansion": "1.1.11" } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, + } + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" } }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true }, - "core-util-is": { + "lodash": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true }, - "debug": { - "version": "2.6.9", - "bundled": true, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, - "optional": true, "requires": { - "ms": "2.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "dev": true, + "requires": { + "async": "0.1.22", + "coffee-script": "1.3.3", + "colors": "0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.1.3", + "getobject": "0.1.0", + "glob": "3.1.21", + "grunt-legacy-log": "0.1.3", + "grunt-legacy-util": "0.2.0", + "hooker": "0.2.3", + "iconv-lite": "0.2.11", + "js-yaml": "2.0.5", + "lodash": "0.9.2", + "minimatch": "0.2.14", + "nopt": "1.0.10", + "rimraf": "2.2.8", + "underscore.string": "2.2.1", + "which": "1.0.9" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "underscore": "1.7.0", + "underscore.string": "2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } } }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", + "dev": true }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "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" - } + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true }, "glob": { - "version": "7.1.2", - "bundled": true, + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "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" + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" } }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true }, "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", + "dev": true }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", "dev": true, - "optional": true, "requires": { - "minimatch": "^3.0.4" + "argparse": "0.1.16", + "esprima": "1.0.4" } }, - "inflight": { - "version": "1.0.6", - "bundled": true, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, - "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true }, - "is-fullwidth-code-point": { + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + } + } + }, + "grunt-angular-templates": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/grunt-angular-templates/-/grunt-angular-templates-0.5.9.tgz", + "integrity": "sha1-KJm+INlDitGbDQqAaqjseiOyWyo=", + "requires": { + "html-minifier": "0.6.9" + } + }, + "grunt-cache-bust": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt-cache-bust/-/grunt-cache-bust-1.3.0.tgz", + "integrity": "sha1-YtkgjiMV8cIMFgg6kHzkq8JJv1Q=", + "dev": true + }, + "grunt-cli": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-0.1.13.tgz", + "integrity": "sha1-6evEBHYx9QEtkidww5N4EzytEPQ=", + "dev": true, + "requires": { + "findup-sync": "0.1.3", + "nopt": "1.0.10", + "resolve": "0.3.1" + }, + "dependencies": { + "resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", + "dev": true + } + } + }, + "grunt-concurrent": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-0.5.0.tgz", + "integrity": "sha1-SlGaTCh4JfDeBxX3O4XRUMdQ2fc=", + "dev": true, + "requires": { + "async": "0.2.10", + "pad-stdio": "0.1.1" + } + }, + "grunt-contrib-concat": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.4.0.tgz", + "integrity": "sha1-uH988VO/ZGiBQvlHFhFWAT+8fHQ=", + "dev": true, + "requires": { + "chalk": "0.4.0" + }, + "dependencies": { + "ansi-styles": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-contrib-copy": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.5.0.tgz", + "integrity": "sha1-QQB1rEWlhWuhkbHMclclRQ1KAhU=", + "dev": true + }, + "grunt-contrib-cssmin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.9.0.tgz", + "integrity": "sha1-JyQfAWCohmZZ2rQNyMJ3bAHsfOI=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "clean-css": "2.1.8", + "maxmin": "0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true }, - "minipass": { - "version": "2.2.4", - "bundled": true, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "minizlib": { - "version": "1.1.0", - "bundled": true, + "clean-css": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.1.8.tgz", + "integrity": "sha1-K0sv1g8yRBCWIWriWiH6p0WA3IM=", "dev": true, - "optional": true, "requires": { - "minipass": "^2.2.1" + "commander": "2.1.0" } }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } + "commander": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", + "dev": true }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-contrib-htmlmin": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-htmlmin/-/grunt-contrib-htmlmin-0.3.0.tgz", + "integrity": "sha1-yWCAIEj2CZJenQ7xsGcJBLTFo/0=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "html-minifier": "0.6.9", + "pretty-bytes": "0.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true }, - "needle": { - "version": "2.2.0", - "bundled": true, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, - "optional": true, "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-contrib-uglify": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.4.1.tgz", + "integrity": "sha1-1D87xuAsM1Vj+MT58IE/tLD/ebE=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "maxmin": "0.1.0", + "uglify-js": "2.4.24" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true }, - "nopt": { - "version": "4.0.1", - "bundled": true, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, - "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", + "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "dev": true, + "requires": { + "async": "0.2.10", + "gaze": "0.5.2", + "lodash": "2.4.2", + "tiny-lr-fork": "0.0.5" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "grunt-dom-munger": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/grunt-dom-munger/-/grunt-dom-munger-3.4.0.tgz", + "integrity": "sha1-LQ2Plk9amVEekUrR1T8fccWrbYk=", + "requires": { + "cheerio": "0.12.4" + } + }, + "grunt-filerev": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/grunt-filerev/-/grunt-filerev-0.2.1.tgz", + "integrity": "sha1-Svngz+2nuwFnB2VpeREimBH29NM=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "each-async": "0.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true }, - "npmlog": { - "version": "4.1.2", - "bundled": true, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "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" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true + } + } + }, + "grunt-htmlhint": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/grunt-htmlhint/-/grunt-htmlhint-0.9.13.tgz", + "integrity": "sha1-cXACPzDi5wUnkjQrSNW7+RK512w=", + "dev": true, + "requires": { + "htmlhint": "0.9.13" + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", + "dev": true, + "requires": { + "colors": "0.6.2", + "grunt-legacy-log-utils": "0.1.1", + "hooker": "0.2.3", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "dev": true, + "requires": { + "colors": "0.6.2", + "lodash": "2.4.2", + "underscore.string": "2.3.3" + }, + "dependencies": { + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", + "dev": true }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "dev": true, + "requires": { + "async": "0.1.22", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "0.9.2", + "underscore.string": "2.2.1", + "which": "1.0.9" + }, + "dependencies": { + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", + "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", + "dev": true + } + } + }, + "grunt-newer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-0.7.0.tgz", + "integrity": "sha1-N22dm2TOXGSLa/ob2pj3vCGT5B4=", + "dev": true, + "requires": { + "async": "0.2.10", + "rimraf": "2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", + "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=", + "dev": true + } + } + }, + "grunt-ng-annotate": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/grunt-ng-annotate/-/grunt-ng-annotate-0.10.0.tgz", + "integrity": "sha1-9dw7TDOlZlgkEzELeJhVZuCoS24=", + "dev": true, + "requires": { + "lodash.clonedeep": "3.0.2", + "ng-annotate": "0.15.4" + } + }, + "grunt-postcss": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.7.2.tgz", + "integrity": "sha1-V7dke4d9Qq0yz51M0RAID/+0OKs=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "diff": "2.2.3", + "es6-promise": "3.3.1", + "postcss": "5.2.18" + } + }, + "grunt-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-replace/-/grunt-replace-1.0.1.tgz", + "integrity": "sha1-kKeVMvuJBB/kJ8h9QlI4sPiGZRo=", + "dev": true, + "requires": { + "applause": "1.2.2", + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1", + "lodash": "4.17.11" + } + }, + "grunt-svgmin": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/grunt-svgmin/-/grunt-svgmin-0.4.0.tgz", + "integrity": "sha1-8Z0RkwIq4AgOD65dMT4S73yuCq4=", + "dev": true, + "requires": { + "chalk": "0.4.0", + "each-async": "0.1.3", + "pretty-bytes": "0.1.2", + "svgo": "0.4.5" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "dev": true }, - "rc": { - "version": "1.2.7", - "bundled": true, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", "dev": true, - "optional": true, "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "underscore": "1.7.0", + "underscore.string": "2.4.0" } }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "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" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, - "rimraf": { - "version": "2.6.2", - "bundled": true, + "coa": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/coa/-/coa-0.4.1.tgz", + "integrity": "sha1-uvb0nHrZ8gxZevObP8HlCQ/og4s=", "dev": true, - "optional": true, "requires": { - "glob": "^7.0.5" + "q": "0.9.7" } }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true }, - "sax": { - "version": "1.2.4", - "bundled": true, + "js-yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", + "integrity": "sha1-D/tWF75VUlh4Bj16Fq7n/dKC6Ew=", "dev": true, - "optional": true + "requires": { + "argparse": "0.1.16", + "esprima": "1.0.4" + } }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true + "q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=", + "dev": true }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "dev": true }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "svgo": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.4.5.tgz", + "integrity": "sha1-ulYVX7FzNyiVbAG0BSIe5+eJoqQ=", "dev": true, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "coa": "0.4.1", + "colors": "0.6.2", + "js-yaml": "2.1.3", + "sax": "0.6.1", + "whet.extend": "0.9.9" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "grunt-usemin": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-2.6.2.tgz", + "integrity": "sha1-KxNroCJkqakdlNQkyNNya9iNt9o=", + "dev": true, + "requires": { + "chalk": "0.5.1", + "debug": "2.1.3", + "lodash": "2.4.2" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true }, - "tar": { - "version": "4.4.1", - "bundled": true, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, - "optional": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, + "debug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", + "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", "dev": true, - "optional": true + "requires": { + "ms": "0.7.0" + } }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, - "optional": true, "requires": { - "string-width": "^1.0.2" + "ansi-regex": "0.2.1" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", "dev": true }, - "yallist": { - "version": "3.0.2", - "bundled": true, + "ms": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", + "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", "dev": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "grunt-wiredep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-wiredep/-/grunt-wiredep-2.0.0.tgz", + "integrity": "sha1-ID9vYT95nW3XLOBE0NzvZNrx8uU=", "dev": true, "requires": { - "globule": "~0.1.0" + "wiredep": "2.2.2" } }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "gzip-size": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-0.1.1.tgz", + "integrity": "sha1-rjNIO2/IIk6DQilt4Qjvk3V/duA=", "dev": true, "requires": { - "is-property": "^1.0.2" + "concat-stream": "1.6.2", + "zlib-browserify": "0.0.3" } }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { - "is-property": "^1.0.0" + "async": "2.6.1", + "optimist": "0.6.1", + "source-map": "0.6.1", + "uglify-js": "3.4.9" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "4.17.11" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "2.17.1", + "source-map": "0.6.1" + } + } } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "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" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + } } }, - "github-markdown-css": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-2.6.0.tgz", - "integrity": "sha1-zcdLq1ZrA51/u3RgH3ghsQnPWRg=" - }, - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "requires": { - "inherits": "2", - "minimatch": "0.3" + "function-bind": "1.1.1" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "ansi-regex": "2.1.1" } }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", "dev": true, "requires": { - "is-glob": "^2.0.0" + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } } }, - "global-modules-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", - "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", "dev": true }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", "dev": true }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "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" + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "is-buffer": "1.1.6" } } } }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "headroom.js": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/headroom.js/-/headroom.js-0.9.4.tgz", + "integrity": "sha1-DE5rRWO7ad9Vrs3vq6MidWby31o=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.5", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" }, "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" + "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" } }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "safe-buffer": "5.1.2" } } } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true }, - "grunt": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-0.6.9.tgz", + "integrity": "sha1-UQXcI29efhqLplHUq5gThvx6vlM=", + "requires": { + "change-case": "2.1.6", + "clean-css": "2.2.23", + "cli": "0.6.6", + "relateurl": "0.2.7", + "uglify-js": "2.4.24" + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "async": "~0.1.22", - "coffee-script": "~1.3.3", - "colors": "~0.6.2", - "dateformat": "1.0.2-1.2.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.1.2", - "getobject": "~0.1.0", - "glob": "~3.1.21", - "grunt-legacy-log": "~0.1.0", - "grunt-legacy-util": "~0.2.0", - "hooker": "~0.2.3", - "iconv-lite": "~0.2.11", - "js-yaml": "~2.0.5", - "lodash": "~0.9.2", - "minimatch": "~0.2.12", - "nopt": "~1.0.10", - "rimraf": "~2.2.8", - "underscore.string": "~2.2.1", - "which": "~1.0.5" + "html-minifier": "3.5.21", + "loader-utils": "0.2.17", + "lodash": "4.17.11", + "pretty-error": "2.1.1", + "tapable": "1.1.0", + "toposort": "1.0.7", + "util.promisify": "1.0.0" }, "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - }, - "dependencies": { - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - } + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" + "source-map": "0.6.1" } }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, - "js-yaml": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" + "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.9" } }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "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" + } }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "no-case": "2.3.2" } }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "2.17.1", + "source-map": "0.6.1" + } } } }, - "grunt-angular-templates": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/grunt-angular-templates/-/grunt-angular-templates-0.5.9.tgz", - "integrity": "sha1-KJm+INlDitGbDQqAaqjseiOyWyo=", - "requires": { - "html-minifier": "~0.6.3" - } - }, - "grunt-cache-bust": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/grunt-cache-bust/-/grunt-cache-bust-1.3.0.tgz", - "integrity": "sha1-YtkgjiMV8cIMFgg6kHzkq8JJv1Q=", - "dev": true - }, - "grunt-cli": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-0.1.13.tgz", - "integrity": "sha1-6evEBHYx9QEtkidww5N4EzytEPQ=", - "dev": true, - "requires": { - "findup-sync": "~0.1.0", - "nopt": "~1.0.10", - "resolve": "~0.3.1" - }, - "dependencies": { - "resolve": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", - "integrity": "sha1-NMY0R8ZkxwWY0cmxJvxDsqJDEKQ=", - "dev": true - } - } - }, - "grunt-concurrent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-0.5.0.tgz", - "integrity": "sha1-SlGaTCh4JfDeBxX3O4XRUMdQ2fc=", - "dev": true, - "requires": { - "async": "~0.2.9", - "pad-stdio": "^0.1.0" - } - }, - "grunt-contrib-concat": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.4.0.tgz", - "integrity": "sha1-uH988VO/ZGiBQvlHFhFWAT+8fHQ=", + "htmlhint": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.9.13.tgz", + "integrity": "sha1-CBY8seaqUFBI67C0EGOnygfcbIg=", "dev": true, "requires": { - "chalk": "~0.4.0" + "async": "1.4.2", + "colors": "1.0.3", + "commander": "2.6.0", + "csslint": "0.10.0", + "glob": "5.0.15", + "jshint": "2.8.0", + "parse-glob": "3.0.4", + "strip-json-comments": "1.0.4", + "xml": "1.0.0" }, "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + "async": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz", + "integrity": "sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs=", "dev": true }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true - } - } - }, - "grunt-contrib-copy": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.5.0.tgz", - "integrity": "sha1-QQB1rEWlhWuhkbHMclclRQ1KAhU=", - "dev": true - }, - "grunt-contrib-cssmin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-0.9.0.tgz", - "integrity": "sha1-JyQfAWCohmZZ2rQNyMJ3bAHsfOI=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "clean-css": "~2.1.0", - "maxmin": "~0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", "dev": true }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, - "clean-css": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-2.1.8.tgz", - "integrity": "sha1-K0sv1g8yRBCWIWriWiH6p0WA3IM=", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "commander": "2.1.x" + "brace-expansion": "1.1.11" } }, - "commander": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", - "integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=", - "dev": true - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true } } }, - "grunt-contrib-htmlmin": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-htmlmin/-/grunt-contrib-htmlmin-0.3.0.tgz", - "integrity": "sha1-yWCAIEj2CZJenQ7xsGcJBLTFo/0=", - "dev": true, + "htmlparser2": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.1.4.tgz", + "integrity": "sha1-csvn1dVsAaz2H897kzMx9ORbNvA=", "requires": { - "chalk": "~0.4.0", - "html-minifier": "~0.6.0", - "pretty-bytes": "~0.1.0" + "domelementtype": "1.2.1", + "domhandler": "2.0.3", + "domutils": "1.1.6", + "readable-stream": "1.0.34" }, "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "domelementtype": "1.2.1" } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true } } }, - "grunt-contrib-uglify": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.4.1.tgz", - "integrity": "sha1-1D87xuAsM1Vj+MT58IE/tLD/ebE=", - "dev": true, - "requires": { - "chalk": "^0.4.0", - "maxmin": "^0.1.0", - "uglify-js": "^2.4.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true }, - "grunt-contrib-watch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", - "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { - "async": "~0.2.9", - "gaze": "~0.5.1", - "lodash": "~2.4.1", - "tiny-lr-fork": "0.0.5" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - } + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" } }, - "grunt-dom-munger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/grunt-dom-munger/-/grunt-dom-munger-3.4.0.tgz", - "integrity": "sha1-LQ2Plk9amVEekUrR1T8fccWrbYk=", + "http-parser-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, "requires": { - "cheerio": "~0.12.3" + "eventemitter3": "3.1.0", + "follow-redirects": "1.5.9", + "requires-port": "1.0.0" } }, - "grunt-filerev": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/grunt-filerev/-/grunt-filerev-0.2.1.tgz", - "integrity": "sha1-Svngz+2nuwFnB2VpeREimBH29NM=", + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", "dev": true, "requires": { - "chalk": "~0.4.0", - "each-async": "~0.1.0" + "http-proxy": "1.17.0", + "is-glob": "4.0.0", + "lodash": "4.17.11", + "micromatch": "3.1.10" }, "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - } - } - }, - "grunt-htmlhint": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/grunt-htmlhint/-/grunt-htmlhint-0.9.13.tgz", - "integrity": "sha1-cXACPzDi5wUnkjQrSNW7+RK512w=", - "dev": true, - "requires": { - "htmlhint": "~0.9.13" - } - }, - "grunt-legacy-log": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "grunt-legacy-log-utils": "~0.1.1", - "hooker": "~0.2.3", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", - "dev": true, - "requires": { - "async": "~0.1.22", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~0.9.2", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - } - } - }, - "grunt-newer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-0.7.0.tgz", - "integrity": "sha1-N22dm2TOXGSLa/ob2pj3vCGT5B4=", - "dev": true, - "requires": { - "async": "0.2.10", - "rimraf": "2.2.6" - }, - "dependencies": { - "rimraf": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=", - "dev": true - } - } - }, - "grunt-ng-annotate": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/grunt-ng-annotate/-/grunt-ng-annotate-0.10.0.tgz", - "integrity": "sha1-9dw7TDOlZlgkEzELeJhVZuCoS24=", - "dev": true, - "requires": { - "lodash.clonedeep": "~3.0.0", - "ng-annotate": "~0.15.4" - } - }, - "grunt-postcss": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.7.2.tgz", - "integrity": "sha1-V7dke4d9Qq0yz51M0RAID/+0OKs=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "diff": "^2.0.2", - "es6-promise": "^3.0.2", - "postcss": "^5.0.0" - } - }, - "grunt-replace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-replace/-/grunt-replace-1.0.1.tgz", - "integrity": "sha1-kKeVMvuJBB/kJ8h9QlI4sPiGZRo=", - "dev": true, - "requires": { - "applause": "1.2.2", - "chalk": "^1.1.0", - "file-sync-cmp": "^0.1.0", - "lodash": "^4.11.0" - } - }, - "grunt-svgmin": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-svgmin/-/grunt-svgmin-0.4.0.tgz", - "integrity": "sha1-8Z0RkwIq4AgOD65dMT4S73yuCq4=", - "dev": true, - "requires": { - "chalk": "~0.4.0", - "each-async": "~0.1.2", - "pretty-bytes": "~0.1.0", - "svgo": "~0.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", - "dev": true - }, - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - } - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "dev": true, - "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" - } - }, - "coa": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/coa/-/coa-0.4.1.tgz", - "integrity": "sha1-uvb0nHrZ8gxZevObP8HlCQ/og4s=", - "dev": true, - "requires": { - "q": "~0.9.6" - } - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "js-yaml": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.1.3.tgz", - "integrity": "sha1-D/tWF75VUlh4Bj16Fq7n/dKC6Ew=", - "dev": true, - "requires": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" - } - }, - "q": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", - "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=", - "dev": true - }, - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", - "dev": true - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", - "dev": true - }, - "svgo": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.4.5.tgz", - "integrity": "sha1-ulYVX7FzNyiVbAG0BSIe5+eJoqQ=", - "dev": true, - "requires": { - "coa": "~0.4.0", - "colors": "~0.6.0", - "js-yaml": "~2.1.0", - "sax": "~0.6.0", - "whet.extend": "~0.9.9" - } - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - } - } - }, - "grunt-usemin": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-2.6.2.tgz", - "integrity": "sha1-KxNroCJkqakdlNQkyNNya9iNt9o=", - "dev": true, - "requires": { - "chalk": "~0.5.1", - "debug": "~2.1.0", - "lodash": "~2.4.1" - }, - "dependencies": { - "ansi-regex": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", - "dev": true - }, - "ansi-styles": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", - "dev": true - }, - "chalk": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", - "dev": true, - "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" - } - }, - "debug": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.3.tgz", - "integrity": "sha1-zoqxte6PvuK/o7Yzyrk9NmtjQY4=", - "dev": true, - "requires": { - "ms": "0.7.0" - } - }, - "has-ansi": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", - "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.0" - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "ms": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.0.tgz", - "integrity": "sha1-hlvpTC5zl62KV9pqYzpuLzB5i4M=", - "dev": true - }, - "strip-ansi": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", - "dev": true, - "requires": { - "ansi-regex": "^0.2.1" - } - }, - "supports-color": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", - "dev": true - } - } - }, - "grunt-wiredep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-wiredep/-/grunt-wiredep-2.0.0.tgz", - "integrity": "sha1-ID9vYT95nW3XLOBE0NzvZNrx8uU=", - "dev": true, - "requires": { - "wiredep": "^2.1.0" - } - }, - "gzip-size": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-0.1.1.tgz", - "integrity": "sha1-rjNIO2/IIk6DQilt4Qjvk3V/duA=", - "dev": true, - "requires": { - "concat-stream": "^1.4.1", - "zlib-browserify": "^0.0.3" - } - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, - "handlebars": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", - "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "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" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", - "dev": true - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "headroom.js": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/headroom.js/-/headroom.js-0.9.4.tgz", - "integrity": "sha1-DE5rRWO7ad9Vrs3vq6MidWby31o=" - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "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" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "html-minifier": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-0.6.9.tgz", - "integrity": "sha1-UQXcI29efhqLplHUq5gThvx6vlM=", - "requires": { - "change-case": "2.1.x", - "clean-css": "2.2.x", - "cli": "0.6.x", - "relateurl": "0.2.x", - "uglify-js": "2.4.x" - } - }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "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", - "util.promisify": "1.0.0" - }, - "dependencies": { - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "clean-css": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", - "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "html-minifier": { - "version": "3.5.21", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", - "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" - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "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" - } - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - } - } - } - }, - "htmlhint": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.9.13.tgz", - "integrity": "sha1-CBY8seaqUFBI67C0EGOnygfcbIg=", - "dev": true, - "requires": { - "async": "1.4.2", - "colors": "1.0.3", - "commander": "2.6.0", - "csslint": "0.10.0", - "glob": "5.0.15", - "jshint": "2.8.0", - "parse-glob": "3.0.4", - "strip-json-comments": "1.0.4", - "xml": "1.0.0" - }, - "dependencies": { - "async": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz", - "integrity": "sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "htmlparser2": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.1.4.tgz", - "integrity": "sha1-csvn1dVsAaz2H897kzMx9ORbNvA=", - "requires": { - "domelementtype": "1", - "domhandler": "2.0", - "domutils": "1.1", - "readable-stream": "1.0" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "requires": { - "domelementtype": "1" - } - } - } - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", - "dev": true - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "dev": true, - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true }, "array-unique": { @@ -7228,16 +6553,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": { @@ -7246,7 +6571,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7257,13 +6582,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": { @@ -7272,7 +6597,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -7281,7 +6606,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -7290,7 +6615,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7299,7 +6624,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7310,7 +6635,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7319,7 +6644,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7330,9 +6655,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" } }, "kind-of": { @@ -7349,14 +6674,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": { @@ -7365,7 +6690,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -7374,7 +6699,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7385,1279 +6710,2050 @@ "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.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": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "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" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.15.2" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "4.2.1", + "debug": "3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "2.1.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "3.0.0", + "resolve-cwd": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "3.0.0" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "p-locate": "3.0.0", + "path-exists": "3.0.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "p-try": "2.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "p-limit": "2.0.0" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { + "pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "find-up": "3.0.0" } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + } + } + }, + "imports-loader": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz", + "integrity": "sha1-8gS180cCoywdt9SNidXoZ6BEElM=", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "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" - } } } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.11", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "internal-ip": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", + "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "dev": true, + "requires": { + "default-gateway": "2.7.2", + "ipaddr.js": "1.8.0" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.4.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "binary-extensions": "1.12.0" } }, - "https-browserify": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true } } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, + "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "is-primitive": "2.0.0" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", + "requires": { + "lower-case": "1.1.4" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", "dev": true }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "is-my-json-valid": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", + "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", "dev": true, "requires": { - "import-from": "^2.1.0" + "generate-function": "2.3.1", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" } }, - "import-from": { + "is-number": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, + "optional": true, "requires": { - "resolve-from": "^3.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - } + "kind-of": "3.2.2" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - } + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" } }, - "imports-loader": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz", - "integrity": "sha1-8gS180cCoywdt9SNidXoZ6BEElM=", + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "source-map": "^0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "path-is-inside": "1.0.2" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "repeating": "^2.0.0" + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "has": "1.0.3" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "is-svg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" + "html-comment-regex": "1.1.2" } }, - "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" + "has-symbols": "1.0.0" } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", "requires": { - "loose-envify": "^1.0.0" + "upper-case": "1.1.3" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "dev": true + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "buffer-alloc": "1.2.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + } } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.12", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.1", + "wordwrap": "1.0.0" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "istanbul-instrumenter-loader": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.2.0.tgz", + "integrity": "sha1-ZD5OXk6PlGaGOimpd9KDqzcsAZw=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "istanbul": "0.4.5", + "loader-utils": "0.2.17", + "object-assign": "4.1.1" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "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" + } + } } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "exit": "0.1.2", + "glob": "7.1.3", + "jasmine-core": "2.8.0" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": 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" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "jasmine-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "colors": "1.1.2" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", "dev": true }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "js-base64": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", + "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", - "requires": { - "lower-case": "^1.1.0" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "is-my-json-valid": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", - "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "js-yaml": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "argparse": "1.0.10", + "esprima": "2.7.3" } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" - } - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "jshint": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", + "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=", "dev": true, "requires": { - "isobject": "^3.0.1" + "cli": "0.6.6", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "2.0.10", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" }, "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.2.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.2.1" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.2.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true } } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "has": "^1.0.1" + "jsonify": "0.0.0" } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "has-symbols": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", - "requires": { - "upper-case": "^1.1.0" + "graceful-fs": "4.1.15" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "buffer-alloc": "^1.2.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", "dev": true, "requires": { - "isarray": "1.0.0" + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.6", + "readable-stream": "2.0.6" }, "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } } } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "karma": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz", + "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==", "dev": true, "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "bluebird": "3.5.2", + "body-parser": "1.18.3", + "chokidar": "2.1.6", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.6", + "core-js": "2.5.7", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "flatted": "2.0.1", + "glob": "7.1.4", + "graceful-fs": "4.1.15", + "http-proxy": "1.17.0", + "isbinaryfile": "3.0.3", + "lodash": "4.17.11", + "log4js": "3.0.6", + "mime": "2.4.4", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "socket.io": "2.1.1", + "source-map": "0.6.1", + "tmp": "0.0.33", + "useragent": "2.3.0" }, "dependencies": { - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + } } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "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": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", "dev": true, "requires": { - "abbrev": "1" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "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.1.2" } }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", "dev": true }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { - "isexe": "^2.0.0" + "accepts": "1.3.5", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.3", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } - } - }, - "istanbul-instrumenter-loader": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-0.2.0.tgz", - "integrity": "sha1-ZD5OXk6PlGaGOimpd9KDqzcsAZw=", - "dev": true, - "requires": { - "istanbul": "0.x.x", - "loader-utils": "0.x.x", - "object-assign": "4.x.x" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "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" + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } - } - } - }, - "jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dev": true, - "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "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" + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "1.0.3" } }, - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "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": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "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" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } } - } - } - }, - "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "dev": true - }, - "js-base64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", - "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "jshint": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", - "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=", - "dev": true, - "requires": { - "cli": "0.6.x", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "3.7.x", - "minimatch": "2.0.x", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "domelementtype": "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": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } } }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true + }, + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "debug": { + "version": "4.1.1", + "bundled": true + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true + }, + "glob": { + "version": "7.1.3", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true + }, + "minizlib": { + "version": "1.2.1", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true + }, + "ms": { + "version": "2.1.1", + "bundled": true + }, + "needle": { + "version": "2.3.0", + "bundled": true + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true + }, + "nopt": { + "version": "4.0.1", + "bundled": true + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "sax": { + "version": "1.2.4", + "bundled": true + }, + "semver": { + "version": "5.7.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "4.4.8", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "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" } }, - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } } }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "kind-of": "6.0.2" } }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - } - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json3": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", - "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", - "dev": true, - "requires": { - "core-js": "~2.3.0", - "es6-promise": "~3.0.2", - "lie": "~3.1.0", - "pako": "~1.0.2", - "readable-stream": "~2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "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" + } }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" + "circular-json": "0.5.9", + "date-format": "1.2.0", + "debug": "3.2.6", + "rfdc": "1.1.4", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } - } - } - }, - "karma": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.3.0.tgz", - "integrity": "sha1-srlOj0mfrdAGnVT5rvSk1I7FzB8=", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.12.4", - "chokidar": "^1.4.1", - "colors": "^1.1.0", - "combine-lists": "^1.0.0", - "connect": "^3.3.5", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^3.8.0", - "log4js": "^0.6.31", - "mime": "^1.3.4", - "minimatch": "^3.0.0", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.3.3", - "socket.io": "1.4.7", - "source-map": "^0.5.3", - "tmp": "0.0.28", - "useragent": "^2.1.9" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "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" + "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" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, "minimatch": { @@ -8666,13 +8762,190 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "dev": true, + "requires": { + "debug": "3.1.0", + "engine.io": "3.2.1", + "has-binary2": "1.0.3", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.1.1", + "socket.io-parser": "3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "3.1.0", + "engine.io-client": "3.2.1", + "has-binary2": "1.0.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2", + "ultron": "1.1.1" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true } } @@ -8683,11 +8956,11 @@ "integrity": "sha512-eQawj4Cl3z/CjxslYy9ariU4uDh7cCNFZHNWXWRpl0pNeblY/4wHR7M7boTYXWrn9bY0z2pZmr11eKje/S/hIw==", "dev": true, "requires": { - "dateformat": "^1.0.6", - "istanbul": "^0.4.0", - "lodash": "^4.17.0", - "minimatch": "^3.0.0", - "source-map": "^0.5.1" + "dateformat": "1.0.12", + "istanbul": "0.4.5", + "lodash": "4.17.11", + "minimatch": "3.0.4", + "source-map": "0.5.7" }, "dependencies": { "dateformat": { @@ -8696,8 +8969,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "get-stdin": "4.0.1", + "meow": "3.7.0" } }, "minimatch": { @@ -8706,7 +8979,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "source-map": { @@ -8718,10 +8991,13 @@ } }, "karma-jasmine": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.0.2.tgz", - "integrity": "sha1-wLOrMnvyB9tg4X+ifbN8/e9djmw=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "3.4.0" + } }, "karma-phantomjs-launcher": { "version": "1.0.4", @@ -8729,8 +9005,8 @@ "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", "dev": true, "requires": { - "lodash": "^4.0.1", - "phantomjs-prebuilt": "^2.1.7" + "lodash": "4.17.11", + "phantomjs-prebuilt": "2.1.16" } }, "karma-sourcemap-loader": { @@ -8739,7 +9015,7 @@ "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2" + "graceful-fs": "4.1.15" } }, "karma-spec-reporter": { @@ -8748,53 +9024,104 @@ "integrity": "sha1-SDDccUihVcfXoYbmMjOaDYD63sM=", "dev": true, "requires": { - "colors": "^1.1.2" + "colors": "1.1.2" } }, "karma-webpack": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-1.8.1.tgz", - "integrity": "sha1-OdX9Lt7qPMPvW0BZibN9Ww5qO04=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-3.0.5.tgz", + "integrity": "sha512-nRudGJWstvVuA6Tbju9tyGUfXTtI1UXMXoRHVmM2/78D0q6s/Ye2IC157PKNDC15PWFGR0mVIRtWLAdcfsRJoA==", "dev": true, "requires": { - "async": "~0.9.0", - "loader-utils": "^0.2.5", - "lodash": "^3.8.0", - "source-map": "^0.1.41", - "webpack-dev-middleware": "^1.0.11" + "async": "2.6.2", + "babel-runtime": "6.26.0", + "loader-utils": "1.1.0", + "lodash": "4.17.11", + "source-map": "0.5.7", + "webpack-dev-middleware": "2.0.6" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "4.17.11" + } }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", "dev": true }, "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "webpack-dev-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-2.0.6.tgz", + "integrity": "sha512-tj5LLD9r4tDuRIDa5Mu9lnY2qBBehAITv6A9irqXhw/HQquZgTx3BCd57zYbU2gMDnncA49ufK2qVQSbaKJwOw==", + "dev": true, + "requires": { + "loud-rejection": "1.6.0", + "memory-fs": "0.4.1", + "mime": "2.4.4", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "url-join": "2.0.5", + "webpack-log": "1.2.0" + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "chalk": "2.4.2", + "log-symbols": "2.2.0", + "loglevelnext": "1.0.5", + "uuid": "3.3.2" } } } @@ -8823,7 +9150,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "klaw": { @@ -8832,7 +9159,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "graceful-fs": "4.1.15" } }, "lcid": { @@ -8841,7 +9168,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "2.0.0" } }, "levn": { @@ -8850,8 +9177,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "lie": { @@ -8860,7 +9187,7 @@ "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dev": true, "requires": { - "immediate": "~3.0.5" + "immediate": "3.0.6" } }, "load-grunt-tasks": { @@ -8869,8 +9196,8 @@ "integrity": "sha1-+CRmP/uiUbV079pak1r6zv4KlfQ=", "dev": true, "requires": { - "findup-sync": "^0.1.2", - "multimatch": "^0.1.0" + "findup-sync": "0.1.3", + "multimatch": "0.1.0" } }, "load-json-file": { @@ -8879,10 +9206,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.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" }, "dependencies": { "pify": { @@ -8905,9 +9232,9 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" } }, "locate-path": { @@ -8916,8 +9243,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": { @@ -8944,8 +9271,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" } }, "lodash._baseclone": { @@ -8954,12 +9281,12 @@ "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", "dev": true, "requires": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" } }, "lodash._basecopy": { @@ -8998,8 +9325,8 @@ "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", "dev": true, "requires": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0" + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" } }, "lodash.debounce": { @@ -9026,9 +9353,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.memoize": { @@ -9043,21 +9370,49 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "readable-stream": "~1.0.2", - "semver": "~4.3.3" + "chalk": "2.4.2" }, "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } } } }, @@ -9067,13 +9422,23 @@ "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", "dev": true }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "3.1.1", + "object.assign": "4.1.0" + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "js-tokens": "3.0.2" } }, "loud-rejection": { @@ -9082,8 +9447,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" } }, "lower-case": { @@ -9108,7 +9473,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "map-age-cleaner": { @@ -9117,7 +9482,7 @@ "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "p-defer": "1.0.0" } }, "map-cache": { @@ -9138,7 +9503,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-expression-evaluator": { @@ -9151,7 +9516,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true + "dev": true, + "optional": true }, "maxmin": { "version": "0.1.0", @@ -9159,9 +9525,9 @@ "integrity": "sha1-ldgcUonjqdMPf8fcVZwCTlAwydA=", "dev": true, "requires": { - "chalk": "^0.4.0", - "gzip-size": "^0.1.0", - "pretty-bytes": "^0.1.0" + "chalk": "0.4.0", + "gzip-size": "0.1.1", + "pretty-bytes": "0.1.2" }, "dependencies": { "ansi-styles": { @@ -9176,9 +9542,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, "strip-ansi": { @@ -9195,9 +9561,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.3", + "safe-buffer": "5.1.2" } }, "media-typer": { @@ -9212,9 +9578,9 @@ "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "map-age-cleaner": "0.1.2", + "mimic-fn": "1.2.0", + "p-is-promise": "1.1.0" } }, "memory-fs": { @@ -9223,8 +9589,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": { "isarray": { @@ -9239,13 +9605,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.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" } }, "string_decoder": { @@ -9254,7 +9620,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -9271,16 +9637,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "find-up": { @@ -9289,8 +9655,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "load-json-file": { @@ -9299,11 +9665,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.1.15", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" } }, "minimist": { @@ -9318,7 +9684,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-type": { @@ -9327,9 +9693,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.1.15", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" } }, "pify": { @@ -9344,9 +9710,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -9355,8 +9721,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" } }, "strip-bom": { @@ -9365,7 +9731,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } } } @@ -9387,20 +9753,21 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, + "optional": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } }, "miller-rabin": { @@ -9409,8 +9776,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" } }, "mime": { @@ -9431,7 +9798,7 @@ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.37.0" } }, "mimic-fn": { @@ -9446,9 +9813,9 @@ "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" + "loader-utils": "1.1.0", + "schema-utils": "1.0.0", + "webpack-sources": "1.3.0" } }, "minimalistic-assert": { @@ -9468,8 +9835,8 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } }, "minimist": { @@ -9484,16 +9851,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.6.1", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.4" } }, "mixin-deep": { @@ -9502,8 +9869,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "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": { @@ -9512,7 +9879,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -9548,12 +9915,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.6.2", + "run-queue": "1.0.3" } }, "ms": { @@ -9568,8 +9935,8 @@ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" + "dns-packet": "1.3.1", + "thunky": "1.0.3" } }, "multicast-dns-service-types": { @@ -9584,8 +9951,8 @@ "integrity": "sha1-CZ2fj4RjrDbPv6JzYLwWzuh97WQ=", "dev": true, "requires": { - "lodash": "~2.4.1", - "minimatch": "~0.2.14" + "lodash": "2.4.2", + "minimatch": "0.2.14" }, "dependencies": { "lodash": { @@ -9600,8 +9967,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } } } @@ -9612,30 +9979,23 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "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": { "arr-diff": { @@ -9688,18 +10048,18 @@ "integrity": "sha1-ZQdSXI8vKPh4e824mPVtmzEGbpM=", "dev": true, "requires": { - "acorn": "~0.11.0", - "alter": "~0.2.0", - "convert-source-map": "~0.4.1", - "optimist": "~0.6.1", - "ordered-ast-traverse": "~1.1.1", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "source-map": "~0.1.43", - "stable": "~0.1.5", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2" + "acorn": "0.11.0", + "alter": "0.2.0", + "convert-source-map": "0.4.1", + "optimist": "0.6.1", + "ordered-ast-traverse": "1.1.1", + "simple-fmt": "0.1.0", + "simple-is": "0.2.0", + "source-map": "0.1.43", + "stable": "0.1.8", + "stringmap": "0.2.2", + "stringset": "0.2.1", + "tryor": "0.1.2" }, "dependencies": { "acorn": { @@ -9720,7 +10080,7 @@ "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -9731,10 +10091,10 @@ "integrity": "sha1-1GLcBj3WnSzdcaoEpGxu0KAG5SM=", "dev": true, "requires": { - "loader-utils": "^0.2.6", + "loader-utils": "0.2.17", "ng-annotate": "1.2.1", - "normalize-path": "^2.0.1", - "source-map": "^0.5.6" + "normalize-path": "2.1.1", + "source-map": "0.5.7" }, "dependencies": { "acorn": { @@ -9755,10 +10115,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" } }, "ng-annotate": { @@ -9767,18 +10127,18 @@ "integrity": "sha1-64vBpnMccNCK9rAsPq8abj+55rs=", "dev": true, "requires": { - "acorn": "~2.6.4", - "alter": "~0.2.0", - "convert-source-map": "~1.1.2", - "optimist": "~0.6.1", - "ordered-ast-traverse": "~1.1.1", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "source-map": "~0.5.3", - "stable": "~0.1.5", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2" + "acorn": "2.6.4", + "alter": "0.2.0", + "convert-source-map": "1.1.3", + "optimist": "0.6.1", + "ordered-ast-traverse": "1.1.1", + "simple-fmt": "0.1.0", + "simple-is": "0.2.0", + "source-map": "0.5.7", + "stable": "0.1.8", + "stringmap": "0.2.2", + "stringset": "0.2.1", + "tryor": "0.1.2" } }, "source-map": { @@ -9801,7 +10161,7 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-forge": { @@ -9816,28 +10176,28 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "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": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", + "assert": "1.4.1", + "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": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.0", - "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.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.4", "vm-browserify": "0.0.4" }, "dependencies": { @@ -9859,13 +10219,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.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" } }, "string_decoder": { @@ -9874,7 +10234,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -9885,7 +10245,7 @@ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, "requires": { - "abbrev": "1" + "abbrev": "1.1.1" } }, "noptify": { @@ -9894,7 +10254,7 @@ "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", "dev": true, "requires": { - "nopt": "~2.0.0" + "nopt": "2.0.0" }, "dependencies": { "nopt": { @@ -9903,7 +10263,7 @@ "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", "dev": true, "requires": { - "abbrev": "1" + "abbrev": "1.1.1" } } } @@ -9914,10 +10274,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.6.0", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -9926,7 +10286,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "normalize-range": { @@ -9941,10 +10301,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-all": { @@ -9953,15 +10313,15 @@ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" + "ansi-styles": "3.2.1", + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "memorystream": "0.3.1", + "minimatch": "3.0.4", + "pidtree": "0.3.0", + "read-pkg": "3.0.0", + "shell-quote": "1.6.1", + "string.prototype.padend": "3.0.0" }, "dependencies": { "ansi-styles": { @@ -9970,7 +10330,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -9979,9 +10339,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -9996,10 +10356,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.1.15", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" } }, "minimatch": { @@ -10008,7 +10368,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "parse-json": { @@ -10017,8 +10377,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" } }, "read-pkg": { @@ -10027,9 +10387,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" } }, "supports-color": { @@ -10038,7 +10398,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -10049,7 +10409,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "nth-check": { @@ -10057,7 +10417,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "num2fraction": { @@ -10096,9 +10456,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": { @@ -10107,7 +10467,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -10124,7 +10484,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -10135,14 +10495,26 @@ } } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.12" + } + }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "1.1.3", + "es-abstract": "1.12.0" } }, "object.omit": { @@ -10150,9 +10522,10 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, + "optional": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -10161,7 +10534,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -10199,7 +10572,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -10214,7 +10587,7 @@ "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "is-wsl": "1.1.0" } }, "optimist": { @@ -10223,8 +10596,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.8", + "wordwrap": "0.0.2" } }, "optionator": { @@ -10233,12 +10606,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" }, "dependencies": { "wordwrap": { @@ -10249,19 +10622,13 @@ } } }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, "ordered-ast-traverse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ordered-ast-traverse/-/ordered-ast-traverse-1.1.1.tgz", "integrity": "sha1-aEOhcLwO7otSDMjdwd3TqjD6BXw=", "dev": true, "requires": { - "ordered-esprima-props": "~1.1.0" + "ordered-esprima-props": "1.1.0" } }, "ordered-esprima-props": { @@ -10276,7 +10643,7 @@ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "url-parse": "^1.4.3" + "url-parse": "1.4.4" } }, "os-browserify": { @@ -10297,9 +10664,9 @@ "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", "dev": true, "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "execa": "0.10.0", + "lcid": "2.0.0", + "mem": "4.0.0" } }, "os-tmpdir": { @@ -10320,9 +10687,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" + "graceful-fs": "4.1.15", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" } }, "p-defer": { @@ -10349,7 +10716,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -10358,7 +10725,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.3.0" } }, "p-map": { @@ -10379,7 +10746,7 @@ "integrity": "sha1-fC+ZxNlpYzxgxbVRJZwHVQeK6yo=", "dev": true, "requires": { - "lpad": "^0.2.0" + "lpad": "0.2.1" } }, "pako": { @@ -10394,9 +10761,9 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "isarray": { @@ -10411,13 +10778,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.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" } }, "string_decoder": { @@ -10426,7 +10793,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -10436,7 +10803,7 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz", "integrity": "sha1-3LCRpDwlm5Io8cNB57akTqC/l0M=", "requires": { - "sentence-case": "^1.1.2" + "sentence-case": "1.1.3" } }, "parse-asn1": { @@ -10445,11 +10812,11 @@ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "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" + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17" } }, "parse-glob": { @@ -10458,10 +10825,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" } }, "parse-json": { @@ -10470,25 +10837,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" - } - }, - "parsejson": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", - "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, - "parseqs": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", - "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" + "error-ex": "1.3.2" } }, "parserlib": { @@ -10497,15 +10846,6 @@ "integrity": "sha1-hZB92GBaoGq7PdKV1QuyuPpN0Rc=", "dev": true }, - "parseuri": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", - "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -10517,8 +10857,8 @@ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz", "integrity": "sha1-Pl1kogBDgwp8STRMLXS0G+DJyZs=", "requires": { - "camel-case": "^1.1.1", - "upper-case-first": "^1.1.0" + "camel-case": "1.2.2", + "upper-case-first": "1.1.2" } }, "pascalcase": { @@ -10538,7 +10878,7 @@ "resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz", "integrity": "sha1-UM5roNO+090LXCqcRVNpdDRAlRQ=", "requires": { - "sentence-case": "^1.1.2" + "sentence-case": "1.1.3" } }, "path-dirname": { @@ -10589,7 +10929,7 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "pbkdf2": { @@ -10598,11 +10938,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.1.2", + "sha.js": "2.4.11" } }, "pend": { @@ -10623,15 +10963,15 @@ "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", "dev": true, "requires": { - "es6-promise": "^4.0.3", - "extract-zip": "^1.6.5", - "fs-extra": "^1.0.0", - "hasha": "^2.2.0", - "kew": "^0.7.0", - "progress": "^1.1.8", - "request": "^2.81.0", - "request-progress": "^2.0.1", - "which": "^1.2.10" + "es6-promise": "4.2.5", + "extract-zip": "1.6.7", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.88.0", + "request-progress": "2.0.1", + "which": "1.3.1" }, "dependencies": { "es6-promise": { @@ -10646,7 +10986,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } } } @@ -10675,7 +11015,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pkg-dir": { @@ -10684,7 +11024,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" } }, "pluralize": { @@ -10699,9 +11039,9 @@ "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", "dev": true, "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" }, "dependencies": { "async": { @@ -10724,10 +11064,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.4.9", + "source-map": "0.5.7", + "supports-color": "3.2.3" }, "dependencies": { "source-map": { @@ -10744,9 +11084,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": { @@ -10755,9 +11095,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": { @@ -10766,8 +11106,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": { @@ -10776,7 +11116,7 @@ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" } }, "postcss-discard-duplicates": { @@ -10785,7 +11125,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-discard-empty": { @@ -10794,7 +11134,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" } }, "postcss-discard-overridden": { @@ -10803,7 +11143,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "^5.0.16" + "postcss": "5.2.18" } }, "postcss-discard-unused": { @@ -10812,8 +11152,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": { @@ -10822,7 +11162,7 @@ "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-load-config": { @@ -10831,8 +11171,8 @@ "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", "dev": true, "requires": { - "cosmiconfig": "^4.0.0", - "import-cwd": "^2.0.0" + "cosmiconfig": "4.0.0", + "import-cwd": "2.1.0" } }, "postcss-loader": { @@ -10841,10 +11181,10 @@ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" + "loader-utils": "1.1.0", + "postcss": "7.0.5", + "postcss-load-config": "2.0.0", + "schema-utils": "1.0.0" }, "dependencies": { "ansi-styles": { @@ -10853,7 +11193,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -10862,9 +11202,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -10879,9 +11219,9 @@ "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.5.0" + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -10896,7 +11236,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -10907,9 +11247,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": { @@ -10918,7 +11258,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-merge-rules": { @@ -10927,11 +11267,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.2" } }, "postcss-message-helpers": { @@ -10946,9 +11286,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": { @@ -10957,8 +11297,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": { @@ -10967,10 +11307,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": { @@ -10979,10 +11319,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": { @@ -10991,7 +11331,7 @@ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "dev": true, "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -11000,7 +11340,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -11009,9 +11349,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -11026,9 +11366,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.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -11043,7 +11383,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -11054,8 +11394,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": { @@ -11064,7 +11404,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -11073,9 +11413,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -11090,9 +11430,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.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -11107,7 +11447,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -11118,8 +11458,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": { @@ -11128,7 +11468,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -11137,9 +11477,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -11154,9 +11494,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.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -11171,7 +11511,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -11182,8 +11522,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": { @@ -11192,7 +11532,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -11201,9 +11541,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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": { @@ -11218,9 +11558,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.1", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -11235,7 +11575,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -11246,7 +11586,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "^5.0.5" + "postcss": "5.2.18" } }, "postcss-normalize-url": { @@ -11255,10 +11595,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-ordered-values": { @@ -11267,8 +11607,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": { @@ -11277,8 +11617,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": { @@ -11287,7 +11627,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-reduce-transforms": { @@ -11296,9 +11636,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": { @@ -11307,9 +11647,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": { @@ -11318,10 +11658,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": { @@ -11330,9 +11670,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": { @@ -11347,9 +11687,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" } }, "prelude-ls": { @@ -11368,7 +11708,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true + "dev": true, + "optional": true }, "pretty-bytes": { "version": "0.1.2", @@ -11382,8 +11723,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "renderkid": "2.0.2", + "utila": "0.4.0" } }, "pretty-ms": { @@ -11434,22 +11775,22 @@ "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", "dev": true, "requires": { - "@types/node": "^6.0.46", - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", + "@types/node": "6.14.1", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "3.0.12", + "blocking-proxy": "1.0.1", + "browserstack": "1.5.1", + "chalk": "1.1.3", + "glob": "7.1.3", "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "optimist": "~0.6.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", "q": "1.4.1", - "saucelabs": "^1.5.0", + "saucelabs": "1.5.0", "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", + "source-map-support": "0.4.18", "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6" + "webdriver-manager": "12.1.0" }, "dependencies": { "glob": { @@ -11458,12 +11799,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -11472,7 +11813,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -11493,17 +11834,17 @@ "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", "dev": true, "requires": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" + "adm-zip": "0.4.11", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.3", + "ini": "1.3.5", + "minimist": "1.2.0", + "q": "1.4.1", + "request": "2.88.0", + "rimraf": "2.6.2", + "semver": "5.6.0", + "xml2js": "0.4.19" } } } @@ -11514,7 +11855,7 @@ "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.8.0" } }, @@ -11542,12 +11883,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.1", + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, "pump": { @@ -11556,8 +11897,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": { @@ -11566,9 +11907,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.6.1", + "inherits": "2.0.3", + "pump": "2.0.1" } }, "punycode": { @@ -11601,8 +11942,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": { @@ -11628,23 +11969,26 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, + "optional": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true + "dev": true, + "optional": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "optional": true } } }, @@ -11654,7 +11998,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "^5.1.0" + "safe-buffer": "5.1.2" } }, "randomfill": { @@ -11663,8 +12007,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" } }, "range-parser": { @@ -11697,9 +12041,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.4.0", + "path-type": "2.0.0" }, "dependencies": { "path-type": { @@ -11708,7 +12052,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" } }, "pify": { @@ -11725,8 +12069,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": { @@ -11734,10 +12078,10 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "readdirp": { @@ -11746,9 +12090,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.1.15", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" }, "dependencies": { "arr-diff": { @@ -11769,16 +12113,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": { @@ -11787,7 +12131,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -11798,13 +12142,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": { @@ -11813,7 +12157,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -11822,7 +12166,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -11831,7 +12175,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -11840,7 +12184,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -11851,7 +12195,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -11860,7 +12204,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -11871,9 +12215,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" } }, "kind-of": { @@ -11890,14 +12234,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": { @@ -11906,7 +12250,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -11915,7 +12259,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -11926,10 +12270,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": { @@ -11938,7 +12282,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -11949,7 +12293,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -11958,7 +12302,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -11967,9 +12311,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" } }, "is-number": { @@ -11978,7 +12322,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -11987,7 +12331,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -12016,19 +12360,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" } }, "readable-stream": { @@ -12037,13 +12381,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.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" } }, "string_decoder": { @@ -12052,7 +12396,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -12063,8 +12407,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", "mute-stream": "0.0.5" } }, @@ -12074,7 +12418,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.8.1" } }, "redent": { @@ -12083,8 +12427,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" } }, "reduce-css-calc": { @@ -12093,9 +12437,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" }, "dependencies": { "balanced-match": { @@ -12112,7 +12456,7 @@ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, "requires": { - "balanced-match": "^0.4.2" + "balanced-match": "0.4.2" }, "dependencies": { "balanced-match": { @@ -12141,9 +12485,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" } }, "regex-cache": { @@ -12151,8 +12495,9 @@ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, + "optional": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -12161,8 +12506,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": { @@ -12171,9 +12516,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "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": { @@ -12188,7 +12533,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" }, "dependencies": { "jsesc": { @@ -12216,11 +12561,11 @@ "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", "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.3.0", + "strip-ansi": "3.0.1", + "utila": "0.4.0" }, "dependencies": { "domhandler": { @@ -12229,7 +12574,7 @@ "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.2.1" } }, "domutils": { @@ -12238,7 +12583,7 @@ "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.2.1" } }, "htmlparser2": { @@ -12247,10 +12592,10 @@ "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.1", - "domutils": "1.1", - "readable-stream": "1.0" + "domelementtype": "1.2.1", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" } } } @@ -12273,7 +12618,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.0.2" } }, "request": { @@ -12282,26 +12627,26 @@ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.7", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.0", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.21", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" } }, "request-progress": { @@ -12310,7 +12655,7 @@ "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", "dev": true, "requires": { - "throttleit": "^1.0.0" + "throttleit": "1.0.0" } }, "require-directory": { @@ -12337,8 +12682,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "requires-port": { @@ -12353,7 +12698,7 @@ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.6" } }, "resolve-cwd": { @@ -12362,7 +12707,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" }, "dependencies": { "resolve-from": { @@ -12391,8 +12736,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "ret": { @@ -12401,13 +12746,19 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.3" }, "dependencies": { "glob": { @@ -12416,12 +12767,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -12430,7 +12781,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -12441,8 +12792,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.3" } }, "run-async": { @@ -12451,7 +12802,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "^1.3.0" + "once": "1.4.0" } }, "run-queue": { @@ -12460,7 +12811,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "^1.1.1" + "aproba": "1.2.0" } }, "rx-lite": { @@ -12481,7 +12832,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -12496,7 +12847,7 @@ "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "https-proxy-agent": "2.2.1" } }, "sax": { @@ -12511,9 +12862,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "ajv": "6.5.5", + "ajv-errors": "1.0.0", + "ajv-keywords": "3.2.0" }, "dependencies": { "ajv": { @@ -12522,10 +12873,10 @@ "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "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": { @@ -12553,10 +12904,10 @@ "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", + "jszip": "3.1.5", + "rimraf": "2.6.2", "tmp": "0.0.30", - "xml2js": "^0.4.17" + "xml2js": "0.4.19" }, "dependencies": { "tmp": { @@ -12565,7 +12916,7 @@ "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "1.0.2" } } } @@ -12592,18 +12943,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", + "http-errors": "1.6.3", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" } }, "sentence-case": { @@ -12611,7 +12962,7 @@ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", "integrity": "sha1-gDSq/CFFdy06vhUJqkLJ4QQtwTk=", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "serialize-javascript": { @@ -12626,13 +12977,13 @@ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { - "accepts": "~1.3.4", + "accepts": "1.3.5", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.21", + "parseurl": "1.3.2" } }, "serve-static": { @@ -12641,9 +12992,9 @@ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", "send": "0.16.2" } }, @@ -12659,10 +13010,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "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": { @@ -12671,7 +13022,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -12694,8 +13045,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.3", + "safe-buffer": "5.1.2" } }, "shebang-command": { @@ -12704,7 +13055,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -12719,10 +13070,10 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" } }, "shelljs": { @@ -12731,9 +13082,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "glob": "7.1.3", + "interpret": "1.1.0", + "rechoir": "0.6.2" }, "dependencies": { "glob": { @@ -12742,12 +13093,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -12756,7 +13107,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -12801,7 +13152,7 @@ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz", "integrity": "sha1-DC8l4wUVjZoY09l3BmGH/vilpmo=", "requires": { - "sentence-case": "^1.1.2" + "sentence-case": "1.1.3" } }, "snapdragon": { @@ -12810,14 +13161,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": { @@ -12826,7 +13177,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -12835,7 +13186,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -12852,9 +13203,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": { @@ -12863,7 +13214,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -12872,7 +13223,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -12881,7 +13232,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -12890,9 +13241,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" } }, "isobject": { @@ -12915,176 +13266,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" - } - }, - "socket.io": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.4.7.tgz", - "integrity": "sha1-krf3y4jFeX1NruJ5/oB12+bT+hw=", - "dev": true, - "requires": { - "debug": "2.2.0", - "engine.io": "1.6.10", - "has-binary": "0.1.7", - "socket.io-adapter": "0.4.0", - "socket.io-client": "1.4.6", - "socket.io-parser": "2.2.6" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz", - "integrity": "sha1-+5+CqxqmUpC/csNleVW5MKmRok8=", - "dev": true, - "requires": { - "debug": "2.2.0", - "socket.io-parser": "2.2.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "socket.io-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", - "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", - "dev": true, - "requires": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "0.7.4", - "isarray": "0.0.1", - "json3": "3.2.6" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - } - } - } - } - }, - "socket.io-client": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.4.6.tgz", - "integrity": "sha1-SbC6U379FbgpfIQBbmQuHHx1LD0=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.0", - "debug": "2.2.0", - "engine.io-client": "1.6.9", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.4", - "socket.io-parser": "2.2.6", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz", - "integrity": "sha1-zNETqGOI0GSC0D3j/H35hSa6jv4=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.6.tgz", - "integrity": "sha1-ON/WHfUNz4qx2eIJEyK/kCuii5k=", - "dev": true, - "requires": { - "benchmark": "1.0.0", - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", - "dev": true - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } + "kind-of": "3.2.2" } }, "sockjs": { @@ -13093,8 +13275,8 @@ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "faye-websocket": "0.10.0", + "uuid": "3.3.2" }, "dependencies": { "faye-websocket": { @@ -13103,7 +13285,7 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } } } @@ -13114,12 +13296,12 @@ "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "dev": true, "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" + "debug": "3.2.6", + "eventsource": "1.0.7", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.4" }, "dependencies": { "debug": { @@ -13128,7 +13310,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" } }, "faye-websocket": { @@ -13137,7 +13319,7 @@ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "dev": true, "requires": { - "websocket-driver": ">=0.5.1" + "websocket-driver": "0.7.0" } }, "json3": { @@ -13160,7 +13342,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "is-plain-obj": "1.1.0" } }, "source-list-map": { @@ -13174,7 +13356,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } }, "source-map-resolve": { @@ -13183,11 +13365,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-support": { @@ -13196,7 +13378,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" }, "dependencies": { "source-map": { @@ -13219,8 +13401,8 @@ "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", "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.2" } }, "spdx-exceptions": { @@ -13235,8 +13417,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.2" } }, "spdx-license-ids": { @@ -13251,12 +13433,12 @@ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.1" } }, "spdy-transport": { @@ -13265,13 +13447,13 @@ "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "debug": "2.6.9", + "detect-node": "2.0.4", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" }, "dependencies": { "isarray": { @@ -13286,13 +13468,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.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" } }, "string_decoder": { @@ -13301,7 +13483,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -13312,7 +13494,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": { @@ -13327,15 +13509,15 @@ "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "ssri": { @@ -13344,7 +13526,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.1.2" } }, "stable": { @@ -13359,8 +13541,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": { @@ -13369,7 +13551,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -13386,8 +13568,8 @@ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.3", + "readable-stream": "2.3.6" }, "dependencies": { "isarray": { @@ -13402,13 +13584,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.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" } }, "string_decoder": { @@ -13417,7 +13599,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -13428,8 +13610,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": { @@ -13438,11 +13620,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.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" }, "dependencies": { "isarray": { @@ -13457,13 +13639,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.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" } }, "string_decoder": { @@ -13472,7 +13654,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -13483,6 +13665,65 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "1.2.0", + "debug": "3.2.6", + "mkdirp": "0.5.1", + "readable-stream": "2.3.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": 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" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } + } + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -13495,11 +13736,11 @@ "integrity": "sha1-c8ZX51nWbP6Arh4M8JGqJW0OcVw=", "dev": true, "requires": { - "async": "~0.2.10", - "css-loader": "^0.9.1", - "file-loader": "^0.8.1", - "loader-utils": "~0.2.3", - "style-loader": "^0.8.3" + "async": "0.2.10", + "css-loader": "0.9.1", + "file-loader": "0.8.5", + "loader-utils": "0.2.17", + "style-loader": "0.8.3" }, "dependencies": { "css-loader": { @@ -13509,9 +13750,9 @@ "dev": true, "optional": true, "requires": { - "csso": "1.3.x", - "loader-utils": "~0.2.2", - "source-map": "~0.1.38" + "csso": "1.3.12", + "loader-utils": "0.2.17", + "source-map": "0.1.43" } }, "csso": { @@ -13528,7 +13769,7 @@ "dev": true, "optional": true, "requires": { - "loader-utils": "~0.2.5" + "loader-utils": "0.2.17" } }, "loader-utils": { @@ -13537,10 +13778,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" } }, "source-map": { @@ -13550,7 +13791,7 @@ "dev": true, "optional": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } }, "style-loader": { @@ -13560,7 +13801,7 @@ "dev": true, "optional": true, "requires": { - "loader-utils": "^0.2.5" + "loader-utils": "0.2.17" } } } @@ -13571,9 +13812,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" } }, "string.prototype.padend": { @@ -13582,9 +13823,9 @@ "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" + "define-properties": "1.1.3", + "es-abstract": "1.12.0", + "function-bind": "1.1.1" } }, "string_decoder": { @@ -13610,7 +13851,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -13631,7 +13872,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "4.0.1" } }, "strip-json-comments": { @@ -13646,7 +13887,7 @@ "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", "dev": true, "requires": { - "loader-utils": "^1.0.2" + "loader-utils": "1.1.0" } }, "supports-color": { @@ -13655,7 +13896,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } }, "svgo": { @@ -13664,13 +13905,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" } }, "swap-case": { @@ -13678,8 +13919,8 @@ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", "requires": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" + "lower-case": "1.1.4", + "upper-case": "1.1.3" } }, "table": { @@ -13688,12 +13929,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.11", "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "string-width": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -13714,8 +13955,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" } }, "strip-ansi": { @@ -13724,7 +13965,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -13741,9 +13982,9 @@ "integrity": "sha1-ZMz6S37PSgBgAH5hcW1CR4FnFjc=", "dev": true, "requires": { - "deep-equal": "~0.0.0", - "defined": "~0.0.0", - "jsonify": "~0.0.0" + "deep-equal": "0.0.0", + "defined": "0.0.0", + "jsonify": "0.0.0" }, "dependencies": { "defined": { @@ -13778,8 +14019,8 @@ "integrity": "sha512-q030OX7royN1Bo549nYMOpKwiGJIzUppv10IgB6ALN6DiJ/XgsRIehiz18x5RWCA3+s4G6ovKqtzgU+pYhjvvg==", "dev": true, "requires": { - "readable-stream": "2 || 3", - "xtend": "~4.0.1" + "readable-stream": "3.0.6", + "xtend": "4.0.1" }, "dependencies": { "readable-stream": { @@ -13788,9 +14029,9 @@ "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "2.0.3", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -13799,7 +14040,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -13816,11 +14057,11 @@ "integrity": "sha1-8wE2RbAeaOJ4AqPkxHAs7KC9/68=", "dev": true, "requires": { - "chalk": "^0.4.0", - "date-time": "^0.1.0", - "hooker": "^0.2.3", - "pretty-ms": "^0.1.0", - "text-table": "^0.2.0" + "chalk": "0.4.0", + "date-time": "0.1.1", + "hooker": "0.2.3", + "pretty-ms": "0.1.0", + "text-table": "0.2.0" }, "dependencies": { "ansi-styles": { @@ -13835,9 +14076,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, "strip-ansi": { @@ -13848,19 +14089,13 @@ } } }, - "time-stamp": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", - "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", - "dev": true - }, "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, "tiny-lr-fork": { @@ -13869,10 +14104,10 @@ "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", "dev": true, "requires": { - "debug": "~0.7.0", - "faye-websocket": "~0.4.3", - "noptify": "~0.0.3", - "qs": "~0.5.2" + "debug": "0.7.4", + "faye-websocket": "0.4.4", + "noptify": "0.0.3", + "qs": "0.5.6" }, "dependencies": { "debug": { @@ -13894,8 +14129,8 @@ "resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz", "integrity": "sha1-+uSmrlRr+iLQg6DuqRCkDRLtT1o=", "requires": { - "sentence-case": "^1.1.1", - "upper-case": "^1.0.3" + "sentence-case": "1.1.3", + "upper-case": "1.1.3" } }, "tmp": { @@ -13904,7 +14139,7 @@ "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", "dev": true, "requires": { - "os-tmpdir": "~1.0.1" + "os-tmpdir": "1.0.2" } }, "to-array": { @@ -13931,7 +14166,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -13940,10 +14175,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": { @@ -13952,8 +14187,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" }, "dependencies": { "is-number": { @@ -13962,7 +14197,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } } } @@ -13979,8 +14214,8 @@ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.29", + "punycode": "1.4.1" }, "dependencies": { "punycode": { @@ -14027,7 +14262,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -14042,7 +14277,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "type-is": { @@ -14052,7 +14287,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "2.1.21" } }, "typedarray": { @@ -14066,10 +14301,10 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", "requires": { - "async": "~0.2.6", + "async": "0.2.10", "source-map": "0.1.34", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.5.4" + "uglify-to-browserify": "1.0.2", + "yargs": "3.5.4" } }, "uglify-to-browserify": { @@ -14083,14 +14318,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.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.3.0", + "worker-farm": "1.6.0" }, "dependencies": { "ajv": { @@ -14099,10 +14334,10 @@ "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "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": { @@ -14123,8 +14358,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "ajv": "6.5.5", + "ajv-keywords": "3.2.0" } }, "source-map": { @@ -14139,18 +14374,12 @@ "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" } } } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", @@ -14174,10 +14403,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "extend-shallow": { @@ -14186,7 +14415,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -14195,10 +14424,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -14221,7 +14450,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "2.0.1" } }, "unique-slug": { @@ -14230,7 +14459,7 @@ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "imurmurhash": "0.1.4" } }, "unpipe": { @@ -14245,8 +14474,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": { @@ -14255,9 +14484,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": { @@ -14307,7 +14536,7 @@ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", "requires": { - "upper-case": "^1.1.1" + "upper-case": "1.1.3" } }, "uri-js": { @@ -14316,7 +14545,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urix": { @@ -14343,14 +14572,20 @@ } } }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", + "dev": true + }, "url-parse": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "querystringify": "2.1.0", + "requires-port": "1.0.0" } }, "use": { @@ -14371,8 +14606,8 @@ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" + "lru-cache": "4.1.3", + "tmp": "0.0.28" }, "dependencies": { "lru-cache": { @@ -14381,18 +14616,12 @@ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } } } }, - "utf8": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", - "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=", - "dev": true - }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -14414,8 +14643,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": { @@ -14448,7 +14677,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "^1.1.1" + "user-home": "1.1.1" } }, "validate-npm-package-license": { @@ -14457,8 +14686,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.0.2", + "spdx-expression-parse": "3.0.0" } }, "vary": { @@ -14479,9 +14708,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "vm-browserify": { @@ -14505,9 +14734,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.0.4", + "graceful-fs": "4.1.15", + "neo-async": "2.6.0" }, "dependencies": { "anymatch": { @@ -14516,8 +14745,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" } }, "arr-diff": { @@ -14538,16 +14767,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": { @@ -14556,7 +14785,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14567,19 +14796,18 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.0" } }, "expand-brackets": { @@ -14588,13 +14816,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": { @@ -14603,7 +14831,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -14612,7 +14840,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -14621,7 +14849,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14630,7 +14858,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14641,7 +14869,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14650,7 +14878,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14661,9 +14889,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" } }, "kind-of": { @@ -14680,14 +14908,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": { @@ -14696,7 +14924,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -14705,7 +14933,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14716,10 +14944,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": { @@ -14728,7 +14956,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14739,8 +14967,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": { @@ -14749,7 +14977,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -14760,7 +14988,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -14769,7 +14997,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -14778,9 +15006,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" } }, "is-extglob": { @@ -14795,7 +15023,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-number": { @@ -14804,7 +15032,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -14813,7 +15041,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -14836,19 +15064,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" } } } @@ -14859,7 +15087,7 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "1.0.1" } }, "webdriver-js-extender": { @@ -14868,8 +15096,8 @@ "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "requires": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" + "@types/selenium-webdriver": "3.0.12", + "selenium-webdriver": "3.6.0" } }, "webpack": { @@ -14882,26 +15110,26 @@ "@webassemblyjs/helper-module-context": "1.7.11", "@webassemblyjs/wasm-edit": "1.7.11", "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "uglifyjs-webpack-plugin": "^1.2.4", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "acorn": "5.7.3", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.5.5", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "1.0.0", + "enhanced-resolve": "4.1.0", + "eslint-scope": "4.0.0", + "json-parse-better-errors": "1.0.2", + "loader-runner": "2.3.1", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.6.0", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.7", + "tapable": "1.1.0", + "uglifyjs-webpack-plugin": "1.3.0", + "watchpack": "1.6.0", + "webpack-sources": "1.3.0" }, "dependencies": { "ajv": { @@ -14910,10 +15138,10 @@ "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", "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": { @@ -14940,16 +15168,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": { @@ -14958,7 +15186,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -14969,13 +15197,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": { @@ -14984,7 +15212,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -14993,7 +15221,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -15002,7 +15230,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15011,7 +15239,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15022,7 +15250,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15031,7 +15259,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15042,9 +15270,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" } }, "kind-of": { @@ -15061,14 +15289,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": { @@ -15077,7 +15305,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -15086,7 +15314,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -15097,10 +15325,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": { @@ -15109,7 +15337,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -15120,7 +15348,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -15129,7 +15357,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -15138,9 +15366,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" } }, "is-number": { @@ -15149,7 +15377,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15158,7 +15386,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15181,19 +15409,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" } }, "schema-utils": { @@ -15202,8 +15430,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "ajv": "6.5.5", + "ajv-keywords": "3.2.0" } } } @@ -15214,16 +15442,16 @@ "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", "dev": true, "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "global-modules-path": "^2.3.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.2" + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "global-modules-path": "2.3.0", + "import-local": "2.0.0", + "interpret": "1.1.0", + "loader-utils": "1.1.0", + "supports-color": "5.5.0", + "v8-compile-cache": "2.0.2", + "yargs": "12.0.2" }, "dependencies": { "ansi-regex": { @@ -15238,7 +15466,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -15247,9 +15475,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "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" } }, "cross-spawn": { @@ -15258,11 +15486,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "decamelize": { @@ -15280,7 +15508,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "3.0.0" } }, "has-flag": { @@ -15301,8 +15529,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "3.0.0", + "path-exists": "3.0.0" } }, "p-limit": { @@ -15311,7 +15539,7 @@ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "2.0.0" } }, "p-locate": { @@ -15320,7 +15548,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "2.0.0" } }, "p-try": { @@ -15335,8 +15563,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" } }, "strip-ansi": { @@ -15345,7 +15573,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } }, "supports-color": { @@ -15354,7 +15582,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "which": { @@ -15363,7 +15591,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "yargs": { @@ -15372,43 +15600,22 @@ "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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 || ^4.0.0", - "yargs-parser": "^10.1.0" + "cliui": "4.1.0", + "decamelize": "2.0.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "3.0.1", + "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": "4.0.0", + "yargs-parser": "10.1.0" } } } }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "dev": true, - "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - } - } - }, "webpack-dev-server": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", @@ -15416,32 +15623,32 @@ "dev": true, "requires": { "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", - "import-local": "^2.0.0", - "internal-ip": "^3.0.1", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", + "bonjour": "3.5.0", + "chokidar": "2.0.4", + "compression": "1.7.3", + "connect-history-api-fallback": "1.5.0", + "debug": "3.2.6", + "del": "3.0.0", + "express": "4.16.4", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.18.0", + "import-local": "2.0.0", + "internal-ip": "3.0.1", + "ip": "1.1.5", + "killable": "1.0.1", + "loglevel": "1.6.1", + "opn": "5.4.0", + "portfinder": "1.0.19", + "schema-utils": "1.0.0", + "selfsigned": "1.10.4", + "serve-index": "1.9.1", "sockjs": "0.3.19", "sockjs-client": "1.3.0", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "5.5.0", "webpack-dev-middleware": "3.4.0", - "webpack-log": "^2.0.0", + "webpack-log": "2.0.0", "yargs": "12.0.2" }, "dependencies": { @@ -15457,8 +15664,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" } }, "arr-diff": { @@ -15479,16 +15686,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": { @@ -15497,7 +15704,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -15508,19 +15715,18 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.0" } }, "debug": { @@ -15529,7 +15735,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" }, "dependencies": { "ms": { @@ -15555,12 +15761,12 @@ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "dev": true, "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" } }, "expand-brackets": { @@ -15569,13 +15775,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": { "debug": { @@ -15593,7 +15799,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -15602,7 +15808,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -15611,7 +15817,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15620,7 +15826,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15631,7 +15837,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15640,7 +15846,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15651,9 +15857,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" } }, "kind-of": { @@ -15670,14 +15876,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": { @@ -15686,7 +15892,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -15695,7 +15901,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -15706,10 +15912,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": { @@ -15718,7 +15924,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -15729,7 +15935,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "3.0.0" } }, "glob": { @@ -15738,12 +15944,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-parent": { @@ -15752,8 +15958,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": { @@ -15762,7 +15968,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -15773,11 +15979,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "array-union": "1.0.2", + "glob": "7.1.3", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "pify": { @@ -15800,7 +16006,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -15809,7 +16015,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -15818,9 +16024,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" } }, "is-extglob": { @@ -15841,7 +16047,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-number": { @@ -15850,7 +16056,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -15859,7 +16065,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -15882,8 +16088,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "3.0.0", + "path-exists": "3.0.0" } }, "micromatch": { @@ -15892,19 +16098,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" } }, "mime": { @@ -15919,7 +16125,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "p-limit": { @@ -15928,7 +16134,7 @@ "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "2.0.0" } }, "p-locate": { @@ -15937,7 +16143,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "2.0.0" } }, "p-try": { @@ -15952,8 +16158,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": { "strip-ansi": { @@ -15962,7 +16168,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -15973,7 +16179,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "webpack-dev-middleware": { @@ -15982,10 +16188,10 @@ "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "dev": true, "requires": { - "memory-fs": "~0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", - "webpack-log": "^2.0.0" + "memory-fs": "0.4.1", + "mime": "2.3.1", + "range-parser": "1.2.0", + "webpack-log": "2.0.0" } }, "yargs": { @@ -15994,18 +16200,18 @@ "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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 || ^4.0.0", - "yargs-parser": "^10.1.0" + "cliui": "4.1.0", + "decamelize": "2.0.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "3.0.1", + "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": "4.0.0", + "yargs-parser": "10.1.0" } } } @@ -16016,8 +16222,8 @@ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" + "ansi-colors": "3.2.1", + "uuid": "3.3.2" } }, "webpack-sources": { @@ -16026,8 +16232,8 @@ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "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-list-map": { @@ -16050,8 +16256,8 @@ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "http-parser-js": "0.5.0", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { @@ -16089,13 +16295,13 @@ "integrity": "sha1-FETRirLkk3UEEJP+3d3Rto97ZrM=", "dev": true, "requires": { - "bower-config": "^0.5.0", - "chalk": "^0.5.1", - "glob": "^4.0.5", - "lodash": "^2.4.1", - "minimist": "^1.1.0", - "propprop": "^0.3.0", - "through2": "^0.6.1" + "bower-config": "0.5.3", + "chalk": "0.5.1", + "glob": "4.5.3", + "lodash": "2.4.2", + "minimist": "1.2.0", + "propprop": "0.3.1", + "through2": "0.6.5" }, "dependencies": { "ansi-regex": { @@ -16116,11 +16322,11 @@ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" } }, "glob": { @@ -16129,10 +16335,10 @@ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" } }, "has-ansi": { @@ -16141,7 +16347,7 @@ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, "requires": { - "ansi-regex": "^0.2.0" + "ansi-regex": "0.2.1" } }, "lodash": { @@ -16156,7 +16362,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -16171,7 +16377,7 @@ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", "dev": true, "requires": { - "ansi-regex": "^0.2.1" + "ansi-regex": "0.2.1" } }, "supports-color": { @@ -16186,8 +16392,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.1" } } } @@ -16203,7 +16409,7 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" } }, "wrap-ansi": { @@ -16212,8 +16418,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" } }, "wrappy": { @@ -16228,17 +16434,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "^0.5.1" - } - }, - "ws": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", - "integrity": "sha1-fQsqLljN3YGQOcKcneZQReGzEOk=", - "dev": true, - "requires": { - "options": ">=0.0.5", - "ultron": "1.0.x" + "mkdirp": "0.5.1" } }, "xml": { @@ -16253,8 +16449,8 @@ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "sax": "1.2.4", + "xmlbuilder": "9.0.7" } }, "xmlbuilder": { @@ -16263,12 +16459,6 @@ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz", - "integrity": "sha1-O3dB/qSoZnWXbpCNKW1ERZYfqmc=", - "dev": true - }, "xregexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", @@ -16298,8 +16488,8 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", "requires": { - "camelcase": "^1.0.2", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "decamelize": "1.2.0", "window-size": "0.1.0", "wordwrap": "0.0.2" } @@ -16310,7 +16500,7 @@ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": { @@ -16327,7 +16517,7 @@ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "dev": true, "requires": { - "fd-slicer": "~1.0.1" + "fd-slicer": "1.0.1" } }, "yeast": { @@ -16342,7 +16532,7 @@ "integrity": "sha1-JAzNv9AgP6hCsTDe77FBQSLIzFA=", "dev": true, "requires": { - "tape": "~0.2.2" + "tape": "0.2.2" } } } diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/storage/LocalConfigStorage.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/storage/LocalConfigStorage.java index 0f5999da21a..7cb3ba66e9c 100644 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/storage/LocalConfigStorage.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/storage/LocalConfigStorage.java @@ -128,7 +128,8 @@ static void atomicWriteToFile(String content, File file) throws IOException { } try { file.getParentFile().mkdirs(); - Files.move(tempFile.toPath(), destinationFilePath, StandardCopyOption.ATOMIC_MOVE); + Files.move(tempFile.toPath(), destinationFilePath, + StandardCopyOption.REPLACE_EXISTING); //StandardCopyOption.ATOMIC_MOVE); } catch (IOException iox) { if (!tempFile.delete()) { tempFile.deleteOnExit(); From b3a09e5800f884cd09c8a48f2e4ef6a27f4d0c4e Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 15:23:24 +0300 Subject: [PATCH 070/117] Fixed variable updating and invoking wrapper from JvmReplEvaluator --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../apache/zeppelin/kotlin/KotlinRepl.java | 24 +++++- .../zeppelin/kotlin/KotlinReplBuilder.java | 2 +- .../kotlin/reflect/KotlinReflectUtil.java | 74 ++++++++++--------- .../kotlin/KotlinInterpreterTest.java | 8 +- 5 files changed, 69 insertions(+), 41 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 7bf6c822df0..04b239cacfc 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -126,7 +126,7 @@ public List completion(String buf, int cursor, } public List getVariables() { - return interpreter.getRuntimeVariables(); + return interpreter.getVariables(); } public List getMethods() { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 8dd3a6d44a0..152aeb15d69 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -17,12 +17,13 @@ package org.apache.zeppelin.kotlin; +import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; +import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; -import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,6 +44,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; +import kotlin.jvm.functions.Function0; import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; @@ -106,7 +108,23 @@ public InterpreterResult eval(String code) { (ReplCompileResult.CompiledClasses) compileResult; writeClasses(classes); - ReplEvalResult evalResult = evaluator.eval(state, classes, null, wrapper); + InvokeWrapper iw = new InvokeWrapper() { + @Override + public T invoke(@NotNull Function0 function0) { + System.out.println("Before"); + T res = function0.invoke(); + System.out.println("After"); + return res; + } + }; + + ReplEvalResult evalResult; + Function0 runEvaluator = () -> evaluator.eval(state, classes, null, null); + if (wrapper != null) { + evalResult = wrapper.invoke(runEvaluator); + } else { + evalResult = runEvaluator.invoke(); + } if (evalResult instanceof ReplEvalResult.Error) { ReplEvalResult.Error e = (ReplEvalResult.Error) evalResult; @@ -137,7 +155,7 @@ public InterpreterResult eval(String code) { "unknown evaluation result: " + evalResult.toString()); } - public List getRuntimeVariables() { + public List getVariables() { return ctx.getVars(); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 9f713f4831a..9a572319fab 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -138,7 +138,7 @@ private ScriptCompilationConfiguration buildCompilationConfiguration() { jvmBuilder, new String[0], true, false); List compilerOptions = Arrays.asList("-classpath", buildClassPath()); - System.out.println(compilerOptions); + b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index a602d59a16e..ea7a24e80bc 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -19,19 +19,20 @@ import static kotlin.jvm.internal.Reflection.typeOf; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; +import org.jetbrains.kotlin.cli.common.repl.ReplHistoryRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.StringJoiner; +import java.util.stream.Collectors; import kotlin.Pair; public class KotlinReflectUtil { @@ -43,11 +44,8 @@ public static void updateVars( Map vars, AggregatedReplStageState state) { try { - if (state.getHistory().isEmpty()) { - return; - } - Object script = getScript(state); - getNewFields(script, vars); + List lines = getLines(state); + refreshVariables(lines, vars); } catch (ReflectiveOperationException | NullPointerException e) { logger.error("Exception updating current variables", e); } @@ -60,7 +58,7 @@ public static void updateMethods( if (state.getHistory().isEmpty()) { return; } - Object script = getScript(state); + Object script = getLineFromRecord(state.getHistory().peek()); getNewMethods(script, methods); } catch (NullPointerException e) { logger.error("Exception updating current methods", e); @@ -95,38 +93,46 @@ public static String kotlinMethodSignature(Method method) { kotlinTypeName(method.getReturnType()); } - private static Object getScript(AggregatedReplStageState state) - throws NullPointerException { - Object script; - Object statePair = Objects.requireNonNull(state.getHistory().peek()) - .getItem() - .getSecond(); - script = ((Pair) statePair).getSecond(); - return script; + private static List getLines(AggregatedReplStageState state) { + List lines = state.getHistory().stream() + .map(KotlinReflectUtil::getLineFromRecord) + .collect(Collectors.toList()); + Collections.reverse(lines); + return lines; } - private static void getNewFields( - Object script, - Map vars) throws ReflectiveOperationException { + private static Object getLineFromRecord(ReplHistoryRecord> record) { + Object statePair = record.getItem().getSecond(); + return ((Pair) statePair).getSecond(); + } - List classesToVisit = new ArrayList<>(); - classesToVisit.add(script); - classesToVisit.add(getImplicitReceiver(script)); + private static void refreshVariables( + List lines, + Map vars) throws ReflectiveOperationException { - for (Object o : classesToVisit) { - Field[] fields = o.getClass().getDeclaredFields(); + vars.clear(); + if (!lines.isEmpty()) { + Object receiver = getImplicitReceiver(lines.get(0)); + findVariables(vars, receiver); + } + for (Object line : lines) { + findVariables(vars, line); + } + } - for (Field field : fields) { - String fieldName = field.getName(); - if (fieldName.contains("$$implicitReceiver")) { - continue; - } + private static void findVariables(Map vars, Object line) + throws IllegalAccessException { + Field[] fields = line.getClass().getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + if (fieldName.contains("$$implicitReceiver")) { + continue; + } - field.setAccessible(true); - Object value = field.get(o); - if (!fieldName.contains("script$")) { - vars.put(fieldName, new KotlinVariableInfo(fieldName, value, field)); - } + field.setAccessible(true); + Object value = field.get(line); + if (!fieldName.contains("script$")) { + vars.putIfAbsent(fieldName, new KotlinVariableInfo(fieldName, value, field)); } } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 798f2012660..250862bf655 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -181,6 +181,7 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val x = 3", context); interpreter.interpret("val l = listOf(1,2,3)", context); InterpreterResult res = interpreter.interpret("kc.vars", context); + System.out.println(res.message().get(0).getData()); assertTrue(res.message().get(0).getData().contains("x: Int = 3")); res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); @@ -238,8 +239,11 @@ public void testWrapper() throws Exception { interpreter.interpret(code, context); interpreter.interpret("println(\"hello!\")", context); List vars = interpreter.getVariables(); - for (KotlinVariableInfo v: vars) - if (v.getName().equals("k")) System.out.println(v); + for (KotlinVariableInfo v: vars) { + if (v.getName().equals("k")) { + assertEquals(1, v.getValue()); + } + } } private static InterpreterContext getInterpreterContext() { From a7ee65c82d05721d0f24dcac782cf2bcc6f15b06 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 15:54:08 +0300 Subject: [PATCH 071/117] Fixed failing on getting wrapper type --- .../kotlin/reflect/KotlinReflectUtil.java | 9 +- .../kotlin/KotlinInterpreterTest.java | 3 + zeppelin-web/package-lock.json | 391 +++++++++++++++--- 3 files changed, 335 insertions(+), 68 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index ea7a24e80bc..f7261c7b765 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -71,7 +71,7 @@ public static String kotlinTypeName(Object o) { return oc.getSimpleName(); } - String kotlinName = typeOf(oc).toString(); + String kotlinName = kotlinTypeName(oc); if (kotlinName.startsWith("kotlin.")) { String[] tokens = kotlinName.split("\\."); return tokens[tokens.length - 1]; @@ -80,7 +80,12 @@ public static String kotlinTypeName(Object o) { } private static String kotlinTypeName(Class c) { - return typeOf(c).toString(); + try { + return typeOf(c).toString(); + } catch (Throwable e) { + logger.info(e.getMessage()); + return c.getSimpleName(); + } } public static String kotlinMethodSignature(Method method) { diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 250862bf655..ea6f5a6dbd3 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -244,6 +244,9 @@ public void testWrapper() throws Exception { assertEquals(1, v.getValue()); } } + + InterpreterResult result = interpreter.interpret("kc.vars", context); + assertTrue(result.message().get(0).getData().contains("k: Int = 1")); } private static InterpreterContext getInterpreterContext() { diff --git a/zeppelin-web/package-lock.json b/zeppelin-web/package-lock.json index a2b2537581c..6897dca2595 100644 --- a/zeppelin-web/package-lock.json +++ b/zeppelin-web/package-lock.json @@ -8068,6 +8068,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", + "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -8319,272 +8320,528 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" + }, "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true }, "aproba": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } }, "chownr": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "dev": true }, "core-util-is": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "debug": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.1" + } }, "deep-extend": { "version": "0.6.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true + "bundled": true, + "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" + } }, "glob": { "version": "7.1.3", - "bundled": true + "bundled": true, + "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" + } }, "has-unicode": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } }, "ignore-walk": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } }, "inflight": { "version": "1.0.6", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { "version": "1.3.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "isarray": { "version": "1.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true }, "minipass": { "version": "2.3.5", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } }, "minizlib": { "version": "1.2.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } }, "mkdirp": { "version": "0.5.1", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } }, "ms": { "version": "2.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "needle": { "version": "2.3.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } }, "node-pre-gyp": { "version": "0.12.0", - "bundled": true + "bundled": true, + "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" + } }, "nopt": { "version": "4.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } }, "npm-bundled": { "version": "1.0.6", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "npm-packlist": { "version": "1.4.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" + } }, "npmlog": { "version": "4.1.2", - "bundled": true + "bundled": true, + "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" + } }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "once": { "version": "1.4.0", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } }, "os-homedir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "rc": { "version": "1.2.8", "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true + "bundled": true, + "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" + } }, "rimraf": { "version": "2.6.3", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.3" + } }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "bundled": true, + "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "sax": { "version": "1.2.4", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "semver": { "version": "5.7.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } }, "string_decoder": { "version": "1.1.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } }, "strip-ansi": { "version": "3.0.1", - "bundled": true + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "tar": { "version": "4.4.8", - "bundled": true + "bundled": true, + "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" + } }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.3", - "bundled": true + "bundled": true, + "dev": true } } }, @@ -8774,7 +9031,9 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true }, "normalize-path": { "version": "3.0.0", From 85727cdaf55bd36a776084d2262a2e59659307e1 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 17:25:10 +0300 Subject: [PATCH 072/117] Syncing with old kotlin-spark-interpreter branch --- .../java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 1 + .../scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index b65b774ec6e..161d581c376 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -123,6 +123,7 @@ public InterpreterResult interpret(String st, InterpreterContext context) @Override public void cancel(InterpreterContext context) throws InterpreterException { jsc.cancelJobGroup(buildJobGroupId(context)); + interpreter.cancel(context); } diff --git a/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala b/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala index ec3c88026c2..40391ad930a 100644 --- a/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala +++ b/spark/spark-scala-parent/src/main/scala/org/apache/zeppelin/spark/SparkZeppelinContext.scala @@ -39,7 +39,6 @@ class SparkZeppelinContext(val sc: SparkContext, private val interpreterClassMap = Map( "spark" -> "org.apache.zeppelin.spark.SparkInterpreter", "sql" -> "org.apache.zeppelin.spark.SparkSqlInterpreter", - "dep" -> "org.apache.zeppelin.spark.DepInterpreter", "pyspark" -> "org.apache.zeppelin.spark.PySparkInterpreter", "ipyspark" -> "org.apache.zeppelin.spark.IPySparkInterpreter", "r" -> "org.apache.zeppelin.spark.SparkRInterpreter", From b9584de6358b64d1792d67ef4ca0a614f2905409 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 18:00:39 +0300 Subject: [PATCH 073/117] Fixed competion on first cell in kotlin --- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 4 +++- .../zeppelin/kotlin/completion/KotlinCompleter.java | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 04b239cacfc..5bd3ec08976 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -56,6 +56,8 @@ public KotlinInterpreter(Properties properties) { properties.getProperty("zeppelin.kotlin.maxResult", "1000")); String imports = properties.getProperty("zeppelin.interpreter.localRepo", ""); + completer = new KotlinCompleter(); + builder .executionContext(new KotlinReceiver()) .maxResult(maxResult) @@ -71,7 +73,7 @@ public KotlinReplBuilder getBuilder() { public void open() throws InterpreterException { interpreter = builder.build(); - completer = new KotlinCompleter(interpreter.getKotlinContext()); + completer.setCtx(interpreter.getKotlinContext()); out = new InterpreterOutputStream(logger); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 5f9d1111357..74fe62cdf42 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -34,13 +34,17 @@ public class KotlinCompleter { private KotlinRepl.KotlinContext ctx; - public KotlinCompleter(KotlinRepl.KotlinContext ctx) { + public void setCtx(KotlinRepl.KotlinContext ctx) { this.ctx = ctx; } public List completion(String buf, int cursor, InterpreterContext interpreterContext) { - List result = new ArrayList<>(); + List result = new ArrayList<>(keywords); + if (ctx == null) { + return result; + } + for (KotlinVariableInfo var : ctx.getVars()) { result.add(new InterpreterCompletion( var.getName(), @@ -57,7 +61,6 @@ public List completion(String buf, int cursor, KotlinReflectUtil.kotlinMethodSignature(method) )); } - result.addAll(keywords); return result; } } From 9914ed61abebfbb02ff8deef6b9c25dc49b74b26 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 27 Aug 2019 18:14:31 +0300 Subject: [PATCH 074/117] Fixed completion order --- .../apache/zeppelin/kotlin/completion/KotlinCompleter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 74fe62cdf42..1abb7e42a61 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -40,11 +40,12 @@ public void setCtx(KotlinRepl.KotlinContext ctx) { public List completion(String buf, int cursor, InterpreterContext interpreterContext) { - List result = new ArrayList<>(keywords); if (ctx == null) { - return result; + return new ArrayList<>(keywords); } + List result = new ArrayList<>(); + for (KotlinVariableInfo var : ctx.getVars()) { result.add(new InterpreterCompletion( var.getName(), @@ -61,6 +62,8 @@ public List completion(String buf, int cursor, KotlinReflectUtil.kotlinMethodSignature(method) )); } + + result.addAll(keywords); return result; } } From 163a11f16f8cb0dac06fb73a4e17202b26e59e9a Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 29 Aug 2019 13:00:55 +0300 Subject: [PATCH 075/117] Fixed retrieving variables from receivers and their child classes --- .../kotlin/reflect/KotlinReflectUtil.java | 28 +- zeppelin-web/package-lock.json | 540 ++++++++++++++++++ 2 files changed, 564 insertions(+), 4 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index f7261c7b765..a20854eb6e1 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -25,6 +25,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -66,6 +67,9 @@ public static void updateMethods( } public static String kotlinTypeName(Object o) { + if (o == null) { + return "null"; + } Class oc = o.getClass(); if (oc.getGenericSuperclass() instanceof ParameterizedType) { return oc.getSimpleName(); @@ -118,16 +122,32 @@ private static void refreshVariables( vars.clear(); if (!lines.isEmpty()) { Object receiver = getImplicitReceiver(lines.get(0)); - findVariables(vars, receiver); + findReceiverVariables(vars, receiver); } for (Object line : lines) { - findVariables(vars, line); + findLineVariables(vars, line); } } - private static void findVariables(Map vars, Object line) + // For lines, we only want fields from top level class + private static void findLineVariables(Map vars, Object line) throws IllegalAccessException { Field[] fields = line.getClass().getDeclaredFields(); + findVariables(vars, fields, line); + } + + // For implicit receiver, we want to also get fields in parent classes + private static void findReceiverVariables(Map vars, Object receiver) + throws IllegalAccessException { + List fieldsList = new ArrayList<>(); + for (Class cl = receiver.getClass(); cl != null; cl = cl.getSuperclass()) { + fieldsList.addAll(Arrays.asList(cl.getDeclaredFields())); + } + findVariables(vars, fieldsList.toArray(new Field[0]), receiver); + } + + private static void findVariables(Map vars, Field[] fields, Object o) + throws IllegalAccessException { for (Field field : fields) { String fieldName = field.getName(); if (fieldName.contains("$$implicitReceiver")) { @@ -135,7 +155,7 @@ private static void findVariables(Map vars, Object l } field.setAccessible(true); - Object value = field.get(line); + Object value = field.get(o); if (!fieldName.contains("script$")) { vars.putIfAbsent(fieldName, new KotlinVariableInfo(fieldName, value, field)); } diff --git a/zeppelin-web/package-lock.json b/zeppelin-web/package-lock.json index 6897dca2595..82a8c7859b0 100644 --- a/zeppelin-web/package-lock.json +++ b/zeppelin-web/package-lock.json @@ -2018,6 +2018,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.2.9", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3945,6 +3946,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", + "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -4965,6 +4967,535 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "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" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.2", + "yallist": "3.0.3" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.3.5" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "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" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "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" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "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" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "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" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -10238,6 +10769,13 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -15058,6 +15596,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", + "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -15977,6 +16516,7 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", + "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", From 60ed6be21e56152d4c8d558ba97f2f22aa328746 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 29 Aug 2019 13:07:15 +0300 Subject: [PATCH 076/117] Fixed tests in KotlinSparkInterpreter --- .../apache/zeppelin/spark/KotlinSparkInterpreter.java | 11 +++++------ .../zeppelin/spark/KotlinSparkInterpreterTest.java | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 161d581c376..9e25f650ad7 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -19,6 +19,7 @@ import static org.apache.zeppelin.spark.Utils.buildJobDesc; import static org.apache.zeppelin.spark.Utils.buildJobGroupId; +import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SparkSession; import org.apache.spark.util.Utils; @@ -74,12 +75,10 @@ public void open() throws InterpreterException { List classpath = sparkClasspath(); - // TODO(dk) fix NPE in tests - String outputDir; - try { - outputDir = jsc.getConf().getOption("spark.repl.class.outputDir").getOrElse(null); - } catch (NullPointerException e) { - outputDir = null; + String outputDir = null; + SparkConf conf = jsc.getConf(); + if (conf != null) { + outputDir = conf.getOption("spark.repl.class.outputDir").getOrElse(null); } interpreter.getBuilder() diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 5eab36c67ee..22cbe94b447 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -178,7 +178,7 @@ public void sparkPropertiesTest() throws Exception { InterpreterResult result = interpreter.interpret( "sc.conf.all.map{ it.toString() }", context); String message = result.message().get(0).getData().trim(); - assertTrue(message.contains("(property_1,value_1)")); + assertTrue(message.contains("(zeppelin.spark.property_1,value_1)")); } @Test From 9a359020c6330ddcdddb444df6086485b41e6ba3 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 29 Aug 2019 14:50:30 +0300 Subject: [PATCH 077/117] Migrated to kotlin 1.3.50 from maven-central: updated tests --- kotlin/pom.xml | 9 +-------- .../java/org/apache/zeppelin/kotlin/KotlinRepl.java | 11 ----------- .../apache/zeppelin/kotlin/KotlinInterpreterTest.java | 5 ++--- spark/interpreter/pom.xml | 7 ------- 4 files changed, 3 insertions(+), 29 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 7fda90b41bf..a76288b636f 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,16 +34,9 @@ kotlin - 1.3.50-eap-86 + 1.3.50 - - - bintray-kotlin - https://dl.bintray.com/kotlin/kotlin-eap - - - org.jetbrains.kotlin diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 152aeb15d69..a941ef17f60 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -17,7 +17,6 @@ package org.apache.zeppelin.kotlin; -import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; @@ -108,16 +107,6 @@ public InterpreterResult eval(String code) { (ReplCompileResult.CompiledClasses) compileResult; writeClasses(classes); - InvokeWrapper iw = new InvokeWrapper() { - @Override - public T invoke(@NotNull Function0 function0) { - System.out.println("Before"); - T res = function0.invoke(); - System.out.println("After"); - return res; - } - }; - ReplEvalResult evalResult; Function0 runEvaluator = () -> evaluator.eval(state, classes, null, null); if (wrapper != null) { diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index ea6f5a6dbd3..cfb6185f42e 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -110,11 +110,10 @@ public void testFunction() throws Exception { "kotlin.Int = 100"); } - // TODO(dkaznacheev): work out why it's not incomplete + @Test public void testIncomplete() throws Exception { - InterpreterResult result = interpreter.interpret("if (10 > 2) {\n", context); + InterpreterResult result = interpreter.interpret("val x =", context); assertEquals(ERROR, result.code()); - assertEquals("incomplete code", result.message().get(0).getData().trim()); } @Test diff --git a/spark/interpreter/pom.xml b/spark/interpreter/pom.xml index 17902ce0aec..b58486ce402 100644 --- a/spark/interpreter/pom.xml +++ b/spark/interpreter/pom.xml @@ -55,13 +55,6 @@ **/*Test.* - - - bintray-kotlin - https://dl.bintray.com/kotlin/kotlin-eap - - - org.apache.zeppelin From 0f95b1f312b8d2d10090f62926336004081c32fd Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 30 Aug 2019 17:07:55 +0300 Subject: [PATCH 078/117] Added default classpath and maxResult to ReplBuilder --- .../apache/zeppelin/kotlin/KotlinReplBuilder.java | 14 +++++++++----- .../zeppelin/kotlin/KotlinInterpreterTest.java | 6 ------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 9a572319fab..863b0bb9bcc 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -19,8 +19,6 @@ import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -47,23 +45,29 @@ public class KotlinReplBuilder { - private static Logger logger = LoggerFactory.getLogger(KotlinReplBuilder.class); - private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); private KotlinReceiver ctx; private Set classpath; private List codeOnLoad; private String outputDir; - private int maxResult; + private int maxResult = 1000; public KotlinReplBuilder() { this.ctx = new KotlinReceiver(); + this.classpath = new HashSet<>(); + String[] javaClasspath = System.getProperty("java.class.path").split(File.pathSeparator); + Collections.addAll(classpath, javaClasspath); + this.codeOnLoad = new ArrayList<>(); } public KotlinRepl build() { + String receiverClassPath = ctx.getClass() + .getProtectionDomain().getCodeSource().getLocation().getPath(); + this.classPath(receiverClassPath); + KJvmReplCompilerImpl compilerImpl = new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index cfb6185f42e..d099c1d4f9f 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -40,7 +40,6 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; -import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; @@ -59,11 +58,6 @@ public void prepareInterpreter(Properties properties) { context = getInterpreterContext(); interpreter = new KotlinInterpreter(properties); output = ""; - - interpreter.getBuilder().classPath(Arrays.asList( - System.getProperty("java.class.path"), - KotlinReceiver.class.getProtectionDomain().getCodeSource().getLocation().getPath() - )); } @Before From cf488ca07a3040e9ff8fc198d48d094032f679b3 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 30 Aug 2019 18:35:44 +0300 Subject: [PATCH 079/117] (WIP) moved KotlinReflectUtil to actual Kotlin types --- kotlin/pom.xml | 7 ++ .../zeppelin/kotlin/KotlinInterpreter.java | 3 +- .../apache/zeppelin/kotlin/KotlinRepl.java | 7 +- .../kotlin/completion/KotlinCompleter.java | 13 ++-- .../kotlin/reflect/KotlinReflectUtil.java | 67 +++++++------------ .../kotlin/reflect/KotlinVariableInfo.java | 24 +++---- .../kotlin/KotlinInterpreterTest.java | 12 +++- 7 files changed, 67 insertions(+), 66 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index a76288b636f..8b13ef50589 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -91,6 +91,13 @@ kotlin-stdlib ${kotlin-version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin-version} + + org.scala-lang scala-library diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 5bd3ec08976..52c3b5dca94 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -131,7 +132,7 @@ public List getVariables() { return interpreter.getVariables(); } - public List getMethods() { + public List> getMethods() { return interpreter.getMethods(); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index a941ef17f60..5c93304a63f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -44,6 +44,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import kotlin.jvm.functions.Function0; +import kotlin.reflect.KFunction; import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; @@ -148,7 +149,7 @@ public List getVariables() { return ctx.getVars(); } - public List getMethods() { + public List> getMethods() { return ctx.getMethods(); } @@ -229,7 +230,7 @@ private void updateContext() { public class KotlinContext { private Map vars = new HashMap<>(); - private Set methods = new HashSet<>(); + private Set> methods = new HashSet<>(); public List getVars() { return new ArrayList<>(vars.values()); @@ -243,7 +244,7 @@ public InvokeWrapper getWrapper() { return KotlinRepl.this.wrapper; } - public List getMethods() { + public List> getMethods() { return new ArrayList<>(methods); } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 1abb7e42a61..7769117bb50 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinRepl; @@ -50,16 +51,16 @@ public List completion(String buf, int cursor, result.add(new InterpreterCompletion( var.getName(), var.getName(), - var.kotlinTypeName() + var.getType() )); } - List methods = ctx.getMethods(); - for (Method method : methods) { + List> functions = ctx.getMethods(); + for (KFunction function : functions) { result.add(new InterpreterCompletion( - method.getName(), - method.getName(), - KotlinReflectUtil.kotlinMethodSignature(method) + function.getName(), + function.getName(), + function.toString() )); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index a20854eb6e1..ab41d4b4861 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -17,14 +17,12 @@ package org.apache.zeppelin.kotlin.reflect; -import static kotlin.jvm.internal.Reflection.typeOf; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.ReplHistoryRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -32,9 +30,11 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.StringJoiner; import java.util.stream.Collectors; import kotlin.Pair; +import kotlin.reflect.KFunction; +import kotlin.reflect.KProperty; +import kotlin.reflect.jvm.ReflectJvmMapping; public class KotlinReflectUtil { private static Logger logger = LoggerFactory.getLogger(KotlinReflectUtil.class); @@ -53,7 +53,7 @@ public static void updateVars( } public static void updateMethods( - Set methods, + Set> methods, AggregatedReplStageState state) { try { if (state.getHistory().isEmpty()) { @@ -66,42 +66,15 @@ public static void updateMethods( } } - public static String kotlinTypeName(Object o) { - if (o == null) { - return "null"; - } - Class oc = o.getClass(); - if (oc.getGenericSuperclass() instanceof ParameterizedType) { - return oc.getSimpleName(); - } - - String kotlinName = kotlinTypeName(oc); - if (kotlinName.startsWith("kotlin.")) { - String[] tokens = kotlinName.split("\\."); - return tokens[tokens.length - 1]; - } - return kotlinName; - } - - private static String kotlinTypeName(Class c) { - try { - return typeOf(c).toString(); - } catch (Throwable e) { - logger.info(e.getMessage()); - return c.getSimpleName(); - } - } - public static String kotlinMethodSignature(Method method) { - StringJoiner joiner = new StringJoiner(", "); - for (Class param : method.getParameterTypes()) { - joiner.add(kotlinTypeName(param)); + KFunction kFunction = ReflectJvmMapping.getKotlinFunction(method); + if (kFunction == null) { + return method.toString(); } - return method.getName() + - "(" + joiner.toString() + "): " + - kotlinTypeName(method.getReturnType()); + return kFunction.toString(); } + private static List getLines(AggregatedReplStageState state) { List lines = state.getHistory().stream() .map(KotlinReflectUtil::getLineFromRecord) @@ -157,18 +130,28 @@ private static void findVariables(Map vars, Field[] field.setAccessible(true); Object value = field.get(o); if (!fieldName.contains("script$")) { - vars.putIfAbsent(fieldName, new KotlinVariableInfo(fieldName, value, field)); + KProperty descriptor = ReflectJvmMapping.getKotlinProperty(field); + if (descriptor != null) { + vars.putIfAbsent(fieldName, new KotlinVariableInfo(value, descriptor)); + } } } } private static void getNewMethods( Object script, - Set methods) { - Set newMethods = new HashSet<>(Arrays.asList( - script.getClass().getMethods())); - newMethods.removeAll(objectMethods); - newMethods.removeIf(method -> method.getName().equals("main")); + Set> methods) { + Set> newMethods = new HashSet<>(); + Method[] scriptMethods = script.getClass().getMethods(); + for (Method method : scriptMethods) { + if (objectMethods.contains(method) || method.getName().equals("main")) { + continue; + } + KFunction function = ReflectJvmMapping.getKotlinFunction(method); + if (function != null) { + newMethods.add(function); + } + } methods.addAll(newMethods); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index b2228d730c4..48b8d1c1429 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -17,37 +17,35 @@ package org.apache.zeppelin.kotlin.reflect; -import java.lang.reflect.Field; +import kotlin.reflect.KProperty; public class KotlinVariableInfo { - private final String name; private final Object value; - private final Field descriptor; + private final KProperty descriptor; - public KotlinVariableInfo(String name, Object value, Field descriptor) { - this.name = name; + public KotlinVariableInfo(Object value, KProperty descriptor) { this.value = value; this.descriptor = descriptor; } - public String getName() { - return name; - } - public Object getValue() { return value; } - public Field getDescriptor() { + public KProperty getDescriptor() { return descriptor; } - public String kotlinTypeName() { - return KotlinReflectUtil.kotlinTypeName(value); + public String getName() { + return descriptor.getName(); + } + + public String getType() { + return descriptor.getReturnType().toString(); } @Override public String toString() { - return name + ": " + kotlinTypeName() + " = " + getValue(); + return getName() + ": " + getType() + " = " + getValue(); } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index d099c1d4f9f..ac41e4329f4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -164,7 +164,7 @@ public void testVariables() throws Exception { }); assertEquals(2, varX.getValue()); - assertEquals(int.class, varX.getDescriptor().getType()); + assertEquals("kotlin.Int", varX.getType()); } @Test @@ -175,14 +175,24 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val l = listOf(1,2,3)", context); InterpreterResult res = interpreter.interpret("kc.vars", context); System.out.println(res.message().get(0).getData()); + for (KotlinVariableInfo info : interpreter.getVariables()) { + System.out.println(info); + } assertTrue(res.message().get(0).getData().contains("x: Int = 3")); res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } + @Test + public void testFunctionsAsValues() throws Exception { + System.out.println(interpreter.interpret("val f = { x: Int -> x + 1 }", context)); + System.out.println(interpreter.getVariables()); + } + @Test public void testMethods() throws Exception { interpreter.interpret("fun sq(x: Int): Int = x * x", context); + System.out.println(interpreter.getMethods()); interpreter.getMethods().stream().anyMatch(method -> method.getName().equals("sq")); } From 7c48cfacd19931d1423356ad70d37ac30a374cdc Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 11:52:04 +0300 Subject: [PATCH 080/117] Moved KotlinReflectUtil to actual Kotlin types, updated tests --- .../zeppelin/kotlin/KotlinInterpreter.java | 1 - .../apache/zeppelin/kotlin/KotlinRepl.java | 1 - .../kotlin/completion/KotlinCompleter.java | 3 +-- .../kotlin/reflect/KotlinReflectUtil.java | 9 ++------- .../kotlin/KotlinInterpreterTest.java | 19 +++++++++++-------- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 52c3b5dca94..7a7c317b51e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -21,7 +21,6 @@ import org.slf4j.LoggerFactory; import java.io.File; import java.io.PrintStream; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 5c93304a63f..253faf6f356 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -31,7 +31,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 7769117bb50..5ce851c926d 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -17,7 +17,6 @@ package org.apache.zeppelin.kotlin.completion; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -60,7 +59,7 @@ public List completion(String buf, int cursor, result.add(new InterpreterCompletion( function.getName(), function.getName(), - function.toString() + KotlinReflectUtil.functionSignature(function) )); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index ab41d4b4861..4f780dc71cc 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -66,12 +66,8 @@ public static void updateMethods( } } - public static String kotlinMethodSignature(Method method) { - KFunction kFunction = ReflectJvmMapping.getKotlinFunction(method); - if (kFunction == null) { - return method.toString(); - } - return kFunction.toString(); + public static String functionSignature(KFunction function) { + return function.toString().replaceAll("Line_\\d+\\.", ""); } @@ -155,7 +151,6 @@ private static void getNewMethods( methods.addAll(newMethods); } - private static Object getImplicitReceiver(Object script) throws ReflectiveOperationException { Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index ac41e4329f4..b8404e39d35 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -33,6 +33,7 @@ import java.util.Arrays; import java.util.List; import java.util.Properties; +import java.util.stream.Collectors; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterOutput; @@ -40,6 +41,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; +import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; @@ -174,11 +176,7 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val x = 3", context); interpreter.interpret("val l = listOf(1,2,3)", context); InterpreterResult res = interpreter.interpret("kc.vars", context); - System.out.println(res.message().get(0).getData()); - for (KotlinVariableInfo info : interpreter.getVariables()) { - System.out.println(info); - } - assertTrue(res.message().get(0).getData().contains("x: Int = 3")); + assertTrue(res.message().get(0).getData().contains("x: kotlin.Int = 3")); res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } @@ -192,8 +190,13 @@ public void testFunctionsAsValues() throws Exception { @Test public void testMethods() throws Exception { interpreter.interpret("fun sq(x: Int): Int = x * x", context); - System.out.println(interpreter.getMethods()); - interpreter.getMethods().stream().anyMatch(method -> method.getName().equals("sq")); + interpreter.interpret("fun singletonListOf(elem: T): List = listOf(elem)", context); + List signatures = interpreter.getMethods().stream() + .map(KotlinReflectUtil::functionSignature).collect(Collectors.toList()); + assertTrue(signatures.stream().anyMatch(signature -> + signature.equals("fun sq(kotlin.Int): kotlin.Int"))); + assertTrue(signatures.stream().anyMatch(signature -> + signature.equals("fun singletonListOf(T): kotlin.collections.List"))); } @Test @@ -249,7 +252,7 @@ public void testWrapper() throws Exception { } InterpreterResult result = interpreter.interpret("kc.vars", context); - assertTrue(result.message().get(0).getData().contains("k: Int = 1")); + assertTrue(result.message().get(0).getData().contains("k: kotlin.Int = 1")); } private static InterpreterContext getInterpreterContext() { From 38bb29f334a068dbe63d9252f18ef1e46d3a2893 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 13:22:33 +0300 Subject: [PATCH 081/117] Added test for class writing in kotlin spark interpreter --- .../spark/KotlinSparkInterpreterTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 22cbe94b447..c2dd5eb27f3 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -29,6 +29,9 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.LinkedList; import java.util.Properties; import org.apache.zeppelin.display.AngularObjectRegistry; @@ -178,9 +181,33 @@ public void sparkPropertiesTest() throws Exception { InterpreterResult result = interpreter.interpret( "sc.conf.all.map{ it.toString() }", context); String message = result.message().get(0).getData().trim(); + System.out.println("PROPS_1 = " + message); assertTrue(message.contains("(zeppelin.spark.property_1,value_1)")); } + @Test + public void classWriteTest() throws Exception { + interpreter.interpret("val f = { x: Any -> println(x) }", context); + output = ""; + InterpreterResult result = interpreter.interpret("spark.range(5).foreach(f)", context); + assertEquals(SUCCESS, result.code()); + assertTrue(output.contains("0")); + assertTrue(output.contains("1")); + assertTrue(output.contains("2")); + assertTrue(output.contains("3")); + assertTrue(output.contains("4")); + + String classOutputDir = repl.getSparkContext().getConf().get("spark.repl.class.outputDir"); + System.out.println(classOutputDir); + + Path outPath = Paths.get(classOutputDir); + Files.walk(outPath).forEach(System.out::println); + assertTrue(Files.walk(outPath).anyMatch(path -> path.toString().matches( + ".*Line_\\d+\\$f\\$1\\.class"))); + assertTrue(Files.walk(outPath).anyMatch(path -> path.toString().matches( + ".*Line_\\d+\\$sam\\$org_apache_spark_api_java_function_ForeachFunction\\$0\\.class"))); + } + @Test public void zeppelinContextTest() throws Exception { InterpreterResult result = interpreter.interpret("z.input(\"name\", \"default_name\")", context); From 9979d032b9ad7a5eb03eb125471adf5465035437 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 17:38:04 +0300 Subject: [PATCH 082/117] Refactored variables and methods search to separate class --- .../apache/zeppelin/kotlin/KotlinRepl.java | 15 +- .../kotlin/reflect/ContextUpdater.java | 160 ++++++++++++++++++ .../kotlin/reflect/KotlinReflectUtil.java | 132 --------------- .../kotlin/KotlinInterpreterTest.java | 2 +- 4 files changed, 167 insertions(+), 142 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 253faf6f356..83c4af36fe6 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -49,7 +49,7 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.context.KotlinReceiver; -import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; +import org.apache.zeppelin.kotlin.reflect.ContextUpdater; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinRepl { @@ -63,6 +63,7 @@ public class KotlinRepl { private KotlinContext ctx; private InvokeWrapper wrapper; private int maxResult; + private ContextUpdater contextUpdater; @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, @@ -83,8 +84,9 @@ public KotlinRepl(JvmReplCompiler compiler, this.maxResult = maxResult; ctx = new KotlinContext(); - updateContext(); receiver.kc = ctx; + + contextUpdater = new ContextUpdater(state, ctx.vars, ctx.methods); } public InterpreterResult eval(String code) { @@ -128,11 +130,11 @@ public InterpreterResult eval(String code) { InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); } if (evalResult instanceof ReplEvalResult.UnitResult) { - updateContext(); + contextUpdater.update(); return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { - updateContext(); + contextUpdater.update(); ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; String valueString = prepareValueString(v.getValue()); @@ -222,11 +224,6 @@ private void writeClass(byte[] classBytes, String path) { } } - private void updateContext() { - KotlinReflectUtil.updateVars(ctx.vars, state); - KotlinReflectUtil.updateMethods(ctx.methods, state); - } - public class KotlinContext { private Map vars = new HashMap<>(); private Set> methods = new HashSet<>(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java new file mode 100644 index 00000000000..0cfefbb294a --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.reflect; + +import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; +import org.jetbrains.kotlin.cli.common.repl.ReplHistoryRecord; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import kotlin.Pair; +import kotlin.reflect.KFunction; +import kotlin.reflect.KProperty; +import kotlin.reflect.jvm.ReflectJvmMapping; + +public class ContextUpdater { + private final Logger logger = LoggerFactory.getLogger(ContextUpdater.class); + private final Set objectMethods = + new HashSet<>(Arrays.asList(Object.class.getMethods())); + + private AggregatedReplStageState state; + private Map vars; + private Set> methods; + + public ContextUpdater(AggregatedReplStageState state, + Map vars, + Set> methods) { + this.state = state; + this.vars = vars; + this.methods = methods; + } + + public void update() { + updateVars(); + updateMethods(); + } + + private void updateVars() { + try { + List lines = getLines(); + refreshVariables(lines); + } catch (ReflectiveOperationException | NullPointerException e) { + logger.error("Exception updating current variables", e); + } + } + + private void updateMethods() { + try { + if (state.getHistory().isEmpty()) { + return; + } + Object script = getLineFromRecord(state.getHistory().peek()); + getNewMethods(script); + } catch (NullPointerException e) { + logger.error("Exception updating current methods", e); + } + } + + private List getLines() { + List lines = state.getHistory().stream() + .map(this::getLineFromRecord) + .collect(Collectors.toList()); + + Collections.reverse(lines); + return lines; + } + + private Object getLineFromRecord(ReplHistoryRecord> record) { + Object statePair = record.getItem().getSecond(); + return ((Pair) statePair).getSecond(); + } + + private Object getImplicitReceiver(Object script) + throws ReflectiveOperationException { + Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); + return receiverField.get(script); + } + + private void refreshVariables(List lines) throws ReflectiveOperationException { + vars.clear(); + if (!lines.isEmpty()) { + Object receiver = getImplicitReceiver(lines.get(0)); + findReceiverVariables(receiver); + } + for (Object line : lines) { + findLineVariables(line); + } + } + + // For lines, we only want fields from top level class + private void findLineVariables(Object line) throws IllegalAccessException { + Field[] fields = line.getClass().getDeclaredFields(); + findVariables(fields, line); + } + + // For implicit receiver, we want to also get fields in parent classes + private void findReceiverVariables(Object receiver) throws IllegalAccessException { + List fieldsList = new ArrayList<>(); + for (Class cl = receiver.getClass(); cl != null; cl = cl.getSuperclass()) { + fieldsList.addAll(Arrays.asList(cl.getDeclaredFields())); + } + findVariables(fieldsList.toArray(new Field[0]), receiver); + } + + private void findVariables(Field[] fields, Object o) throws IllegalAccessException { + for (Field field : fields) { + String fieldName = field.getName(); + if (fieldName.contains("$$implicitReceiver")) { + continue; + } + + field.setAccessible(true); + Object value = field.get(o); + if (!fieldName.contains("script$")) { + KProperty descriptor = ReflectJvmMapping.getKotlinProperty(field); + if (descriptor != null) { + vars.putIfAbsent(fieldName, new KotlinVariableInfo(value, descriptor)); + } + } + } + } + + private void getNewMethods(Object script) { + Set> newMethods = new HashSet<>(); + Method[] scriptMethods = script.getClass().getMethods(); + for (Method method : scriptMethods) { + if (objectMethods.contains(method) || method.getName().equals("main")) { + continue; + } + KFunction function = ReflectJvmMapping.getKotlinFunction(method); + if (function != null) { + newMethods.add(function); + } + } + methods.addAll(newMethods); + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index 4f780dc71cc..bf11b5bf792 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -17,143 +17,11 @@ package org.apache.zeppelin.kotlin.reflect; -import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; -import org.jetbrains.kotlin.cli.common.repl.ReplHistoryRecord; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import kotlin.Pair; import kotlin.reflect.KFunction; -import kotlin.reflect.KProperty; -import kotlin.reflect.jvm.ReflectJvmMapping; public class KotlinReflectUtil { - private static Logger logger = LoggerFactory.getLogger(KotlinReflectUtil.class); - private static final Set objectMethods = - new HashSet<>(Arrays.asList(Object.class.getMethods())); - - public static void updateVars( - Map vars, - AggregatedReplStageState state) { - try { - List lines = getLines(state); - refreshVariables(lines, vars); - } catch (ReflectiveOperationException | NullPointerException e) { - logger.error("Exception updating current variables", e); - } - } - - public static void updateMethods( - Set> methods, - AggregatedReplStageState state) { - try { - if (state.getHistory().isEmpty()) { - return; - } - Object script = getLineFromRecord(state.getHistory().peek()); - getNewMethods(script, methods); - } catch (NullPointerException e) { - logger.error("Exception updating current methods", e); - } - } public static String functionSignature(KFunction function) { return function.toString().replaceAll("Line_\\d+\\.", ""); } - - - private static List getLines(AggregatedReplStageState state) { - List lines = state.getHistory().stream() - .map(KotlinReflectUtil::getLineFromRecord) - .collect(Collectors.toList()); - Collections.reverse(lines); - return lines; - } - - private static Object getLineFromRecord(ReplHistoryRecord> record) { - Object statePair = record.getItem().getSecond(); - return ((Pair) statePair).getSecond(); - } - - private static void refreshVariables( - List lines, - Map vars) throws ReflectiveOperationException { - - vars.clear(); - if (!lines.isEmpty()) { - Object receiver = getImplicitReceiver(lines.get(0)); - findReceiverVariables(vars, receiver); - } - for (Object line : lines) { - findLineVariables(vars, line); - } - } - - // For lines, we only want fields from top level class - private static void findLineVariables(Map vars, Object line) - throws IllegalAccessException { - Field[] fields = line.getClass().getDeclaredFields(); - findVariables(vars, fields, line); - } - - // For implicit receiver, we want to also get fields in parent classes - private static void findReceiverVariables(Map vars, Object receiver) - throws IllegalAccessException { - List fieldsList = new ArrayList<>(); - for (Class cl = receiver.getClass(); cl != null; cl = cl.getSuperclass()) { - fieldsList.addAll(Arrays.asList(cl.getDeclaredFields())); - } - findVariables(vars, fieldsList.toArray(new Field[0]), receiver); - } - - private static void findVariables(Map vars, Field[] fields, Object o) - throws IllegalAccessException { - for (Field field : fields) { - String fieldName = field.getName(); - if (fieldName.contains("$$implicitReceiver")) { - continue; - } - - field.setAccessible(true); - Object value = field.get(o); - if (!fieldName.contains("script$")) { - KProperty descriptor = ReflectJvmMapping.getKotlinProperty(field); - if (descriptor != null) { - vars.putIfAbsent(fieldName, new KotlinVariableInfo(value, descriptor)); - } - } - } - } - - private static void getNewMethods( - Object script, - Set> methods) { - Set> newMethods = new HashSet<>(); - Method[] scriptMethods = script.getClass().getMethods(); - for (Method method : scriptMethods) { - if (objectMethods.contains(method) || method.getName().equals("main")) { - continue; - } - KFunction function = ReflectJvmMapping.getKotlinFunction(method); - if (function != null) { - newMethods.add(function); - } - } - methods.addAll(newMethods); - } - - private static Object getImplicitReceiver(Object script) - throws ReflectiveOperationException { - Field receiverField = script.getClass().getDeclaredField("$$implicitReceiver0"); - return receiverField.get(script); - } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index b8404e39d35..7d327d1c547 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -218,9 +218,9 @@ public void testOutputClasses() throws Exception { File[] dir = tempPath.toFile().listFiles(); assertNotNull(dir); assertTrue(dir.length > 0); + System.out.println(tempPath); assertTrue(Arrays.stream(dir) .anyMatch(file -> file.getName().matches("Line_\\d+\\.class"))); - int oldLength = dir.length; interpreter.interpret("x + 1", context); dir = tempPath.toFile().listFiles(); From ad91bcce910ceff9157d09c1e47fe1d0aee77410 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 17:58:43 +0300 Subject: [PATCH 083/117] Implemented type shortening --- .../kotlin/reflect/KotlinReflectUtil.java | 6 +++++- .../kotlin/KotlinInterpreterTest.java | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index bf11b5bf792..2031783ab95 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -20,8 +20,12 @@ import kotlin.reflect.KFunction; public class KotlinReflectUtil { - public static String functionSignature(KFunction function) { return function.toString().replaceAll("Line_\\d+\\.", ""); } + + public static String shorten(String name) { + // kotlin.collections.List -> List + return name.replaceAll("(\\b[_a-zA-Z$][_a-zA-Z0-9$]*\\b\\.)+", ""); + } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 7d327d1c547..6b15589e346 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -19,6 +19,8 @@ import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -34,6 +36,7 @@ import java.util.List; import java.util.Properties; import java.util.stream.Collectors; +import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterOutput; @@ -255,6 +258,22 @@ public void testWrapper() throws Exception { assertTrue(result.message().get(0).getData().contains("k: kotlin.Int = 1")); } + @Test + public void testReflectUtil() throws Exception { + String message = interpreter.interpret("1", context) + .message().get(0).getData(); + assertTrue(shorten(message).contains("Int = 1")); + + interpreter.interpret("val f = { l: List -> l[0] }", context); + message = interpreter.interpret("f", context) + .message().get(0).getData(); + assertTrue(shorten(message).contains("(List) -> Int")); + + interpreter.interpret("fun first(s: String): Char = s[0]", context); + KFunction first = interpreter.getMethods().get(0); + assertEquals("fun first(String): Char", shorten(functionSignature(first))); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() From 251ea5af6b7e1f43b02287adc755dfce309db060 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 18:40:17 +0300 Subject: [PATCH 084/117] Moved type shortening to an interpreter property --- .../zeppelin/kotlin/KotlinInterpreter.java | 10 ++++-- .../apache/zeppelin/kotlin/KotlinRepl.java | 35 ++++++++++++++----- .../zeppelin/kotlin/KotlinReplBuilder.java | 8 ++++- .../kotlin/completion/KotlinCompleter.java | 7 ++-- .../kotlin/reflect/KotlinReflectUtil.java | 3 ++ .../kotlin/reflect/KotlinVariableInfo.java | 8 +++++ .../main/resources/interpreter-setting.json | 7 ++++ .../kotlin/KotlinInterpreterTest.java | 35 ++++++++++++++----- .../spark/KotlinSparkInterpreterTest.java | 2 +- 9 files changed, 91 insertions(+), 24 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 7a7c317b51e..136a8a43330 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -54,6 +54,9 @@ public KotlinInterpreter(Properties properties) { int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); + + boolean shortenTypes = Boolean.parseBoolean( + properties.getProperty("zeppelin.kotlin.shortenTypes", "true")); String imports = properties.getProperty("zeppelin.interpreter.localRepo", ""); completer = new KotlinCompleter(); @@ -62,7 +65,8 @@ public KotlinInterpreter(Properties properties) { .executionContext(new KotlinReceiver()) .maxResult(maxResult) .codeOnLoad("") - .classPath(getImportClasspath(imports)); + .classPath(getImportClasspath(imports)) + .shortenTypes(shortenTypes); } public KotlinReplBuilder getBuilder() { @@ -131,8 +135,8 @@ public List getVariables() { return interpreter.getVariables(); } - public List> getMethods() { - return interpreter.getMethods(); + public List> getFunctions() { + return interpreter.getFunctions(); } private Job getRunningJob(String paragraphId) { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 83c4af36fe6..94ac37c4b46 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -17,6 +17,8 @@ package org.apache.zeppelin.kotlin; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; @@ -64,13 +66,15 @@ public class KotlinRepl { private InvokeWrapper wrapper; private int maxResult; private ContextUpdater contextUpdater; + boolean shortenTypes; @SuppressWarnings("unchecked") public KotlinRepl(JvmReplCompiler compiler, JvmReplEvaluator evaluator, KotlinReceiver receiver, String outputDir, - int maxResult) { + int maxResult, + boolean shortenTypes) { this.compiler = compiler; this.evaluator = evaluator; ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); @@ -82,11 +86,12 @@ public KotlinRepl(JvmReplCompiler compiler, this.outputDir = outputDir; this.maxResult = maxResult; + this.shortenTypes = shortenTypes; ctx = new KotlinContext(); receiver.kc = ctx; - contextUpdater = new ContextUpdater(state, ctx.vars, ctx.methods); + contextUpdater = new ContextUpdater(state, ctx.vars, ctx.functions); } public InterpreterResult eval(String code) { @@ -137,10 +142,12 @@ public InterpreterResult eval(String code) { contextUpdater.update(); ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; + String typeString = shortenTypes ? shorten(v.getType()) : v.getType(); String valueString = prepareValueString(v.getValue()); + return new InterpreterResult( InterpreterResult.Code.SUCCESS, - v.getName() + ": " + v.getType() + " = " + valueString); + v.getName() + ": " + typeString + " = " + valueString); } return new InterpreterResult(InterpreterResult.Code.ERROR, "unknown evaluation result: " + evalResult.toString()); @@ -150,8 +157,8 @@ public List getVariables() { return ctx.getVars(); } - public List> getMethods() { - return ctx.getMethods(); + public List> getFunctions() { + return ctx.getFunctions(); } public KotlinContext getKotlinContext() { @@ -226,7 +233,7 @@ private void writeClass(byte[] classBytes, String path) { public class KotlinContext { private Map vars = new HashMap<>(); - private Set> methods = new HashSet<>(); + private Set> functions = new HashSet<>(); public List getVars() { return new ArrayList<>(vars.values()); @@ -240,8 +247,20 @@ public InvokeWrapper getWrapper() { return KotlinRepl.this.wrapper; } - public List> getMethods() { - return new ArrayList<>(methods); + public List> getFunctions() { + return new ArrayList<>(functions); + } + + public void showVars() { + for (KotlinVariableInfo var : vars.values()) { + System.out.println(var.toString(shortenTypes)); + } + } + + public void showFunctions() { + for (KFunction fun : functions) { + System.out.println(functionSignature(fun)); + } } } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java index 863b0bb9bcc..b04dcf67445 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java @@ -52,6 +52,7 @@ public class KotlinReplBuilder { private List codeOnLoad; private String outputDir; private int maxResult = 1000; + private boolean shortenTypes = true; public KotlinReplBuilder() { this.ctx = new KotlinReceiver(); @@ -80,7 +81,7 @@ public KotlinRepl build() { buildEvaluationConfiguration(), new BasicJvmScriptEvaluator()); - KotlinRepl repl = new KotlinRepl(compiler, evaluator, ctx, outputDir, maxResult); + KotlinRepl repl = new KotlinRepl(compiler, evaluator, ctx, outputDir, maxResult, shortenTypes); for (String line: codeOnLoad) { repl.eval(line); } @@ -122,6 +123,11 @@ public KotlinReplBuilder outputDir(String outputDir) { return this; } + public KotlinReplBuilder shortenTypes(boolean shortenTypes) { + this.shortenTypes = shortenTypes; + return this; + } + private String buildClassPath() { StringJoiner joiner = new StringJoiner(File.pathSeparator); for (String path : classpath) { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 5ce851c926d..ca8d8ee17db 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -17,6 +17,8 @@ package org.apache.zeppelin.kotlin.completion; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -24,7 +26,6 @@ import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.KotlinRepl; -import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; public class KotlinCompleter { @@ -54,12 +55,12 @@ public List completion(String buf, int cursor, )); } - List> functions = ctx.getMethods(); + List> functions = ctx.getFunctions(); for (KFunction function : functions) { result.add(new InterpreterCompletion( function.getName(), function.getName(), - KotlinReflectUtil.functionSignature(function) + shorten(functionSignature(function)) )); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index 2031783ab95..2a902e207e1 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -25,6 +25,9 @@ public static String functionSignature(KFunction function) { } public static String shorten(String name) { + if (name == null) { + return null; + } // kotlin.collections.List -> List return name.replaceAll("(\\b[_a-zA-Z$][_a-zA-Z0-9$]*\\b\\.)+", ""); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index 48b8d1c1429..97e01ecb5ff 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -17,6 +17,7 @@ package org.apache.zeppelin.kotlin.reflect; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import kotlin.reflect.KProperty; public class KotlinVariableInfo { @@ -44,6 +45,13 @@ public String getType() { return descriptor.getReturnType().toString(); } + public String toString(boolean shortenTypes) { + if (shortenTypes) { + return getName() + ": " + shorten(getType()) + " = " + getValue(); + } + return toString(); + } + @Override public String toString() { return getName() + ": " + getType() + " = " + getValue(); diff --git a/kotlin/src/main/resources/interpreter-setting.json b/kotlin/src/main/resources/interpreter-setting.json index ffd296d1991..584dba07ea3 100644 --- a/kotlin/src/main/resources/interpreter-setting.json +++ b/kotlin/src/main/resources/interpreter-setting.json @@ -11,6 +11,13 @@ "defaultValue": "1000", "description": "Max number of dataframe rows to display.", "type": "number" + }, + "zeppelin.kotlin.shortenTypes": { + "envName": null, + "propertyName": "zeppelin.kotlin.shortenTypes", + "defaultValue": false, + "description": "Show short types instead of full, e.g. List or kotlin.collections.List", + "type": "checkbox" } }, "editor": { diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 6b15589e346..289b20a01a4 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -94,19 +94,19 @@ private static void testCodeForResult(String code, String expected) throws Excep @Test public void testLiteral() throws Exception { - testCodeForResult("1", "kotlin.Int = 1"); + testCodeForResult("1", "Int = 1"); } @Test public void testOperation() throws Exception { - testCodeForResult("\"foo\" + \"bar\"", "kotlin.String = foobar"); + testCodeForResult("\"foo\" + \"bar\"", "String = foobar"); } @Test public void testFunction() throws Exception { testCodeForResult( "fun square(x: Int): Int = x * x\nsquare(10)", - "kotlin.Int = 100"); + "Int = 100"); } @Test @@ -178,9 +178,12 @@ public void testGetVariablesFromCode() throws Exception { interpreter.interpret("val y = 2", context); interpreter.interpret("val x = 3", context); interpreter.interpret("val l = listOf(1,2,3)", context); - InterpreterResult res = interpreter.interpret("kc.vars", context); - assertTrue(res.message().get(0).getData().contains("x: kotlin.Int = 3")); - res = interpreter.interpret("kc.vars = null", context); + interpreter.interpret("kc.showVars()", context); + System.out.println(output); + assertTrue(output.contains("x: Int = 3")); + assertTrue(output.contains("y: Int = 2")); + assertTrue(output.contains("l: List = [1, 2, 3]")); + InterpreterResult res = interpreter.interpret("kc.vars = null", context); assertTrue(res.message().get(0).getData().contains("Val cannot be reassigned")); } @@ -194,7 +197,7 @@ public void testFunctionsAsValues() throws Exception { public void testMethods() throws Exception { interpreter.interpret("fun sq(x: Int): Int = x * x", context); interpreter.interpret("fun singletonListOf(elem: T): List = listOf(elem)", context); - List signatures = interpreter.getMethods().stream() + List signatures = interpreter.getFunctions().stream() .map(KotlinReflectUtil::functionSignature).collect(Collectors.toList()); assertTrue(signatures.stream().anyMatch(signature -> signature.equals("fun sq(kotlin.Int): kotlin.Int"))); @@ -270,10 +273,26 @@ public void testReflectUtil() throws Exception { assertTrue(shorten(message).contains("(List) -> Int")); interpreter.interpret("fun first(s: String): Char = s[0]", context); - KFunction first = interpreter.getMethods().get(0); + KFunction first = interpreter.getFunctions().get(0); assertEquals("fun first(String): Char", shorten(functionSignature(first))); } + @Test + public void fullTypeNamesTest() throws Exception { + prepareInterpreter(); + interpreter.getBuilder().shortenTypes(false); + interpreter.open(); + + interpreter.interpret("val s = \"abc\"", context); + interpreter.interpret("fun f(l: List) { }", context); + interpreter.interpret("kc.showFunctions()", context); + assertEquals("fun f(kotlin.collections.List): kotlin.Unit\n", output); + output = ""; + interpreter.interpret("kc.showVars()", context); + System.out.println(output); + assertTrue(output.contains("s: kotlin.String = abc")); + } + private static InterpreterContext getInterpreterContext() { output = ""; InterpreterContext context = InterpreterContext.builder() diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index c2dd5eb27f3..44495c98f7e 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -144,7 +144,7 @@ public static void tearDown() throws InterpreterException { @Test public void simpleKotlinTest() throws Exception { - testCodeForResult("1 + 1", "kotlin.Int = 2"); + testCodeForResult("1 + 1", "Int = 2"); } @Test From 78426cb41b42e20151ce427c33f41bbf091a5eb4 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 18:54:22 +0300 Subject: [PATCH 085/117] Fixed interpreter settings --- kotlin/src/main/resources/interpreter-setting.json | 2 +- .../src/main/resources/interpreter-setting.json | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/resources/interpreter-setting.json b/kotlin/src/main/resources/interpreter-setting.json index 584dba07ea3..1277b597f71 100644 --- a/kotlin/src/main/resources/interpreter-setting.json +++ b/kotlin/src/main/resources/interpreter-setting.json @@ -15,7 +15,7 @@ "zeppelin.kotlin.shortenTypes": { "envName": null, "propertyName": "zeppelin.kotlin.shortenTypes", - "defaultValue": false, + "defaultValue": true, "description": "Show short types instead of full, e.g. List or kotlin.collections.List", "type": "checkbox" } diff --git a/spark/interpreter/src/main/resources/interpreter-setting.json b/spark/interpreter/src/main/resources/interpreter-setting.json index eed41f323ed..e4554ddea6b 100644 --- a/spark/interpreter/src/main/resources/interpreter-setting.json +++ b/spark/interpreter/src/main/resources/interpreter-setting.json @@ -262,6 +262,13 @@ "defaultValue": "1000", "description": "Max number of result to display.", "type": "number" + }, + "zeppelin.kotlin.shortenTypes": { + "envName": null, + "propertyName": "zeppelin.kotlin.shortenTypes", + "defaultValue": true, + "description": "Show short types instead of full, e.g. List or kotlin.collections.List", + "type": "checkbox" } }, "editor": { From 26fac22a3355249789ea205db245d91ad01ef50d Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 2 Sep 2019 18:57:20 +0300 Subject: [PATCH 086/117] Fixed completion shortening --- .../org/apache/zeppelin/kotlin/completion/KotlinCompleter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index ca8d8ee17db..dbcbbd16eeb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -51,7 +51,7 @@ public List completion(String buf, int cursor, result.add(new InterpreterCompletion( var.getName(), var.getName(), - var.getType() + shorten(var.getType()) )); } From a08aa6bee392888fb593b9cbde0ec18405a5d049 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 11:06:14 +0300 Subject: [PATCH 087/117] Moved class output to separate class --- .../apache/zeppelin/kotlin/ClassWriter.java | 86 +++++++++++++++++++ .../apache/zeppelin/kotlin/KotlinRepl.java | 59 +------------ 2 files changed, 89 insertions(+), 56 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java new file mode 100644 index 00000000000..944979a7d71 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin; + +import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; +import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Objects; +import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; + +public class ClassWriter { + private static Logger logger = LoggerFactory.getLogger(ClassWriter.class); + + private String outputDir; + + public ClassWriter(String outputDir) { + this.outputDir = outputDir; + } + + public void writeClasses(ReplCompileResult.CompiledClasses classes) { + if (outputDir == null) { + return; + } + + for (CompiledClassData compiledClass: classes.getClasses()) { + String filePath = compiledClass.getPath(); + if (filePath.contains("/")) { + continue; + } + String classWritePath = outputDir + File.separator + filePath; + writeClass(compiledClass.getBytes(), classWritePath); + } + + writeModuleInMemory(classes); + } + + private void writeModuleInMemory(ReplCompileResult.CompiledClasses classes) { + try { + KJvmCompiledScript compiledScript = Objects.requireNonNull( + (KJvmCompiledScript) classes.getData()); + + KJvmCompiledModuleInMemory moduleInMemory = Objects.requireNonNull( + (KJvmCompiledModuleInMemory) compiledScript.getCompiledModule()); + + moduleInMemory.getCompilerOutputFiles().forEach((name, bytes) -> { + if (name.contains("class")) { + writeClass(bytes, outputDir + File.separator + name); + } + }); + } catch (ClassCastException | NullPointerException e) { + logger.info("Compiled line #" + classes.getLineId().getNo() + "has no in-memory modules"); + } + } + + private void writeClass(byte[] classBytes, String path) { + try (FileOutputStream fos = new FileOutputStream(path); + OutputStream out = new BufferedOutputStream(fos)) { + out.write(classBytes); + out.flush(); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 94ac37c4b46..313ce5bfb89 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -20,33 +20,24 @@ import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; -import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult; -import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmCompiledModuleInMemory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import kotlin.jvm.functions.Function0; import kotlin.reflect.KFunction; -import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; @@ -61,7 +52,7 @@ public class KotlinRepl { private JvmReplEvaluator evaluator; private AggregatedReplStageState state; private AtomicInteger counter; - private String outputDir; + private ClassWriter writer; private KotlinContext ctx; private InvokeWrapper wrapper; private int maxResult; @@ -84,7 +75,7 @@ public KotlinRepl(JvmReplCompiler compiler, stateLock); counter = new AtomicInteger(0); - this.outputDir = outputDir; + writer = new ClassWriter(outputDir); this.maxResult = maxResult; this.shortenTypes = shortenTypes; @@ -112,7 +103,7 @@ public InterpreterResult eval(String code) { ReplCompileResult.CompiledClasses classes = (ReplCompileResult.CompiledClasses) compileResult; - writeClasses(classes); + writer.writeClasses(classes); ReplEvalResult evalResult; Function0 runEvaluator = () -> evaluator.eval(state, classes, null, null); @@ -186,50 +177,6 @@ private String prepareValueString(Object value) { + " ... " + (collection.size() - maxResult) + " more]"; } - private void writeClasses(ReplCompileResult.CompiledClasses classes) { - if (outputDir == null) { - return; - } - - for (CompiledClassData compiledClass: classes.getClasses()) { - String filePath = compiledClass.getPath(); - if (filePath.contains("/")) { - continue; - } - String classWritePath = outputDir + File.separator + filePath; - writeClass(compiledClass.getBytes(), classWritePath); - } - - writeModuleInMemory(classes); - } - - private void writeModuleInMemory(ReplCompileResult.CompiledClasses classes) { - try { - KJvmCompiledScript compiledScript = Objects.requireNonNull( - (KJvmCompiledScript) classes.getData()); - - KJvmCompiledModuleInMemory moduleInMemory = Objects.requireNonNull( - (KJvmCompiledModuleInMemory) compiledScript.getCompiledModule()); - - moduleInMemory.getCompilerOutputFiles().forEach((name, bytes) -> { - if (name.contains("class")) { - writeClass(bytes, outputDir + File.separator + name); - } - }); - } catch (ClassCastException | NullPointerException e) { - logger.info("Compiled line #" + classes.getLineId().getNo() + "has no in-memory modules"); - } - } - - private void writeClass(byte[] classBytes, String path) { - try (FileOutputStream fos = new FileOutputStream(path); - OutputStream out = new BufferedOutputStream(fos)) { - out.write(classBytes); - out.flush(); - } catch (IOException e) { - logger.error(e.getMessage()); - } - } public class KotlinContext { private Map vars = new HashMap<>(); From 8d9e9352a3332c620dd6ce9b97808fcfcf277111 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 11:18:16 +0300 Subject: [PATCH 088/117] Refactored REPL evaluation --- .../apache/zeppelin/kotlin/KotlinRepl.java | 106 +++++++++++------- 1 file changed, 68 insertions(+), 38 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java index 313ce5bfb89..c4afb57870b 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java @@ -32,6 +32,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; @@ -85,53 +86,46 @@ public KotlinRepl(JvmReplCompiler compiler, contextUpdater = new ContextUpdater(state, ctx.vars, ctx.functions); } + + public List getVariables() { + return ctx.getVars(); + } + + public List> getFunctions() { + return ctx.getFunctions(); + } + + public KotlinContext getKotlinContext() { + return ctx; + } + + public InterpreterResult eval(String code) { ReplCompileResult compileResult = compiler.compile(state, new ReplCodeLine(counter.getAndIncrement(), 0, code)); - if (compileResult instanceof ReplCompileResult.Incomplete) { - return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); - } - if (compileResult instanceof ReplCompileResult.Error) { - ReplCompileResult.Error e = (ReplCompileResult.Error) compileResult; - return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()); - } - if (!(compileResult instanceof ReplCompileResult.CompiledClasses)) { - return new InterpreterResult(InterpreterResult.Code.ERROR, - "unknown compilation result:" + compileResult.toString()); + Optional compileError = checkCompileError(compileResult); + if (compileError.isPresent()) { + return compileError.get(); } ReplCompileResult.CompiledClasses classes = (ReplCompileResult.CompiledClasses) compileResult; writer.writeClasses(classes); - ReplEvalResult evalResult; - Function0 runEvaluator = () -> evaluator.eval(state, classes, null, null); - if (wrapper != null) { - evalResult = wrapper.invoke(runEvaluator); - } else { - evalResult = runEvaluator.invoke(); - } + ReplEvalResult evalResult = evalInWrapper(classes); - if (evalResult instanceof ReplEvalResult.Error) { - ReplEvalResult.Error e = (ReplEvalResult.Error) evalResult; - return new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage()); - } - if (evalResult instanceof ReplEvalResult.Incomplete) { - return new InterpreterResult(InterpreterResult.Code.INCOMPLETE); - } - if (evalResult instanceof ReplEvalResult.HistoryMismatch) { - ReplEvalResult.HistoryMismatch e = (ReplEvalResult.HistoryMismatch) evalResult; - return new InterpreterResult( - InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo()); + Optional evalError = checkEvalError(evalResult); + if (evalError.isPresent()) { + return evalError.get(); } + + contextUpdater.update(); + if (evalResult instanceof ReplEvalResult.UnitResult) { - contextUpdater.update(); return new InterpreterResult(InterpreterResult.Code.SUCCESS); } if (evalResult instanceof ReplEvalResult.ValueResult) { - contextUpdater.update(); - ReplEvalResult.ValueResult v = (ReplEvalResult.ValueResult) evalResult; String typeString = shortenTypes ? shorten(v.getType()) : v.getType(); String valueString = prepareValueString(v.getValue()); @@ -144,16 +138,53 @@ public InterpreterResult eval(String code) { "unknown evaluation result: " + evalResult.toString()); } - public List getVariables() { - return ctx.getVars(); + private ReplEvalResult evalInWrapper(ReplCompileResult.CompiledClasses classes) { + ReplEvalResult evalResult; + // For now, invokeWrapper parameter in evaluator.eval does not work, so wrapping happens here + Function0 runEvaluator = () -> evaluator.eval(state, classes, null, null); + if (wrapper != null) { + evalResult = wrapper.invoke(runEvaluator); + } else { + evalResult = runEvaluator.invoke(); + } + return evalResult; } - public List> getFunctions() { - return ctx.getFunctions(); + private Optional checkCompileError(ReplCompileResult compileResult) { + if (compileResult instanceof ReplCompileResult.Incomplete) { + return Optional.of(new InterpreterResult(InterpreterResult.Code.INCOMPLETE)); + } + + if (compileResult instanceof ReplCompileResult.Error) { + ReplCompileResult.Error e = (ReplCompileResult.Error) compileResult; + return Optional.of(new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage())); + } + + if (!(compileResult instanceof ReplCompileResult.CompiledClasses)) { + return Optional.of(new InterpreterResult(InterpreterResult.Code.ERROR, + "unknown compilation result:" + compileResult.toString())); + } + + return Optional.empty(); } - public KotlinContext getKotlinContext() { - return ctx; + private Optional checkEvalError(ReplEvalResult evalResult) { + if (evalResult instanceof ReplEvalResult.Error) { + ReplEvalResult.Error e = (ReplEvalResult.Error) evalResult; + return Optional.of(new InterpreterResult(InterpreterResult.Code.ERROR, e.getMessage())); + } + + if (evalResult instanceof ReplEvalResult.Incomplete) { + return Optional.of(new InterpreterResult(InterpreterResult.Code.INCOMPLETE)); + } + + if (evalResult instanceof ReplEvalResult.HistoryMismatch) { + ReplEvalResult.HistoryMismatch e = (ReplEvalResult.HistoryMismatch) evalResult; + return Optional.of(new InterpreterResult( + InterpreterResult.Code.ERROR, "history mismatch at " + e.getLineNo())); + } + + return Optional.empty(); } private String prepareValueString(Object value) { @@ -177,7 +208,6 @@ private String prepareValueString(Object value) { + " ... " + (collection.size() - maxResult) + " more]"; } - public class KotlinContext { private Map vars = new HashMap<>(); private Set> functions = new HashSet<>(); From c6c400df9d6f13da872c891bc7eb5aa00e2737e3 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 11:21:28 +0300 Subject: [PATCH 089/117] Moved kotlin REPL to separate package --- .../main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java | 2 ++ .../org/apache/zeppelin/kotlin/completion/KotlinCompleter.java | 2 +- .../java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java | 2 +- .../java/org/apache/zeppelin/kotlin/{ => repl}/ClassWriter.java | 2 +- .../java/org/apache/zeppelin/kotlin/{ => repl}/KotlinRepl.java | 2 +- .../apache/zeppelin/kotlin/{ => repl}/KotlinReplBuilder.java | 2 +- 6 files changed, 7 insertions(+), 5 deletions(-) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{ => repl}/ClassWriter.java (98%) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{ => repl}/KotlinRepl.java (99%) rename kotlin/src/main/java/org/apache/zeppelin/kotlin/{ => repl}/KotlinReplBuilder.java (99%) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 136a8a43330..5d87a200ffc 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -37,6 +37,8 @@ import org.apache.zeppelin.kotlin.completion.KotlinCompleter; import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; +import org.apache.zeppelin.kotlin.repl.KotlinRepl; +import org.apache.zeppelin.kotlin.repl.KotlinReplBuilder; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index dbcbbd16eeb..9dfbd6ae3a0 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -25,8 +25,8 @@ import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; -import org.apache.zeppelin.kotlin.KotlinRepl; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; +import org.apache.zeppelin.kotlin.repl.KotlinRepl; public class KotlinCompleter { private static final List keywords = KotlinKeywords.KEYWORDS.stream() diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index 039bbf8ec94..0ed08d5591c 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -17,7 +17,7 @@ package org.apache.zeppelin.kotlin.context; -import org.apache.zeppelin.kotlin.KotlinRepl; +import org.apache.zeppelin.kotlin.repl.KotlinRepl; /** The execution context for lines in Kotlin REPL. diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java similarity index 98% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java index 944979a7d71..f7270ac69ac 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/ClassWriter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.zeppelin.kotlin; +package org.apache.zeppelin.kotlin.repl; import org.jetbrains.kotlin.cli.common.repl.CompiledClassData; import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java similarity index 99% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index c4afb57870b..0c5daa2dd47 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.zeppelin.kotlin; +package org.apache.zeppelin.kotlin.repl; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java similarity index 99% rename from kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java rename to kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java index b04dcf67445..f9a60264a66 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinReplBuilder.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.zeppelin.kotlin; +package org.apache.zeppelin.kotlin.repl; import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; From 1206df394669b7a85e0b3b5ce914e1f886947a36 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 12:32:00 +0300 Subject: [PATCH 090/117] Refactored REPL creation and properties setting --- .../zeppelin/kotlin/KotlinInterpreter.java | 16 +- .../zeppelin/kotlin/repl/KotlinRepl.java | 43 +++-- .../kotlin/repl/KotlinReplBuilder.java | 174 ------------------ .../repl/building/KotlinReplProperties.java | 119 ++++++++++++ .../kotlin/repl/building/ReplBuilding.java | 105 +++++++++++ .../kotlin/KotlinInterpreterTest.java | 4 +- .../spark/KotlinSparkInterpreter.java | 4 +- 7 files changed, 259 insertions(+), 206 deletions(-) delete mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 5d87a200ffc..93d08d631cb 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -38,7 +38,7 @@ import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.repl.KotlinRepl; -import org.apache.zeppelin.kotlin.repl.KotlinReplBuilder; +import org.apache.zeppelin.kotlin.repl.building.KotlinReplProperties; import org.apache.zeppelin.scheduler.Job; public class KotlinInterpreter extends Interpreter { @@ -47,12 +47,12 @@ public class KotlinInterpreter extends Interpreter { private InterpreterOutputStream out; private KotlinRepl interpreter; - private KotlinReplBuilder builder; + private KotlinReplProperties replProperties; private KotlinCompleter completer; public KotlinInterpreter(Properties properties) { super(properties); - builder = new KotlinReplBuilder(); + replProperties = new KotlinReplProperties(); int maxResult = Integer.parseInt( properties.getProperty("zeppelin.kotlin.maxResult", "1000")); @@ -63,21 +63,21 @@ public KotlinInterpreter(Properties properties) { completer = new KotlinCompleter(); - builder - .executionContext(new KotlinReceiver()) + replProperties + .receiver(new KotlinReceiver()) .maxResult(maxResult) .codeOnLoad("") .classPath(getImportClasspath(imports)) .shortenTypes(shortenTypes); } - public KotlinReplBuilder getBuilder() { - return builder; + public KotlinReplProperties properties() { + return replProperties; } @Override public void open() throws InterpreterException { - interpreter = builder.build(); + interpreter = KotlinRepl.build(replProperties); completer.setCtx(interpreter.getKotlinContext()); out = new InterpreterOutputStream(logger); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index 0c5daa2dd47..f68421683c6 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -42,9 +42,10 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; -import org.apache.zeppelin.kotlin.context.KotlinReceiver; import org.apache.zeppelin.kotlin.reflect.ContextUpdater; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; +import org.apache.zeppelin.kotlin.repl.building.KotlinReplProperties; +import org.apache.zeppelin.kotlin.repl.building.ReplBuilding; public class KotlinRepl { private static Logger logger = LoggerFactory.getLogger(KotlinRepl.class); @@ -61,31 +62,33 @@ public class KotlinRepl { boolean shortenTypes; @SuppressWarnings("unchecked") - public KotlinRepl(JvmReplCompiler compiler, - JvmReplEvaluator evaluator, - KotlinReceiver receiver, - String outputDir, - int maxResult, - boolean shortenTypes) { - this.compiler = compiler; - this.evaluator = evaluator; + public static KotlinRepl build(KotlinReplProperties properties) { + KotlinRepl repl = new KotlinRepl(); + repl.compiler = ReplBuilding.buildCompiler(properties); + repl.evaluator = ReplBuilding.buildEvaluator(properties); ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); - state = new AggregatedReplStageState( - compiler.createState(stateLock), - evaluator.createState(stateLock), + repl.state = new AggregatedReplStageState( + repl.compiler.createState(stateLock), + repl.evaluator.createState(stateLock), stateLock); - counter = new AtomicInteger(0); + repl.counter = new AtomicInteger(0); - writer = new ClassWriter(outputDir); - this.maxResult = maxResult; - this.shortenTypes = shortenTypes; + repl.writer = new ClassWriter(properties.getOutputDir()); + repl.maxResult = properties.getMaxResult(); + repl.shortenTypes = properties.getShortenTypes(); - ctx = new KotlinContext(); - receiver.kc = ctx; + repl.ctx = repl.new KotlinContext(); + properties.getReceiver().kc = repl.ctx; - contextUpdater = new ContextUpdater(state, ctx.vars, ctx.functions); - } + repl.contextUpdater = new ContextUpdater( + repl.state, repl.ctx.vars, repl.ctx.functions); + + for (String line: properties.getCodeOnLoad()) { + repl.eval(line); + } + return repl; + } public List getVariables() { return ctx.getVars(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java deleted file mode 100644 index f9a60264a66..00000000000 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinReplBuilder.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.repl; - -import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; -import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringJoiner; -import kotlin.Unit; -import kotlin.script.experimental.api.KotlinType; -import kotlin.script.experimental.api.ScriptCompilationConfiguration; -import kotlin.script.experimental.api.ScriptCompilationKt; -import kotlin.script.experimental.api.ScriptEvaluationConfiguration; -import kotlin.script.experimental.api.ScriptEvaluationKt; -import kotlin.script.experimental.host.ScriptingHostConfiguration; -import kotlin.script.experimental.jvm.BasicJvmScriptEvaluator; -import kotlin.script.experimental.jvm.JvmScriptCompilationConfigurationBuilder; -import kotlin.script.experimental.jvm.JvmScriptCompilationKt; -import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; -import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; -import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; -import org.apache.zeppelin.kotlin.context.KotlinReceiver; - -public class KotlinReplBuilder { - - private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); - - private KotlinReceiver ctx; - private Set classpath; - private List codeOnLoad; - private String outputDir; - private int maxResult = 1000; - private boolean shortenTypes = true; - - public KotlinReplBuilder() { - this.ctx = new KotlinReceiver(); - - this.classpath = new HashSet<>(); - String[] javaClasspath = System.getProperty("java.class.path").split(File.pathSeparator); - Collections.addAll(classpath, javaClasspath); - - this.codeOnLoad = new ArrayList<>(); - } - - public KotlinRepl build() { - String receiverClassPath = ctx.getClass() - .getProtectionDomain().getCodeSource().getLocation().getPath(); - this.classPath(receiverClassPath); - - KJvmReplCompilerImpl compilerImpl = - new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(hostConf)); - - JvmReplCompiler compiler = new JvmReplCompiler( - buildCompilationConfiguration(), - hostConf, - compilerImpl); - - JvmReplEvaluator evaluator = new JvmReplEvaluator( - buildEvaluationConfiguration(), - new BasicJvmScriptEvaluator()); - - KotlinRepl repl = new KotlinRepl(compiler, evaluator, ctx, outputDir, maxResult, shortenTypes); - for (String line: codeOnLoad) { - repl.eval(line); - } - return repl; - } - - public KotlinReplBuilder maxResult(int maxResult) { - this.maxResult = maxResult; - return this; - } - - public KotlinReplBuilder executionContext(KotlinReceiver ctx) { - this.ctx = ctx; - return this; - } - - public KotlinReplBuilder classPath(String path) { - this.classpath.add(path); - return this; - } - - public KotlinReplBuilder classPath(Collection paths) { - this.classpath.addAll(paths); - return this; - } - - public KotlinReplBuilder codeOnLoad(String code) { - this.codeOnLoad.add(code); - return this; - } - - public KotlinReplBuilder codeOnLoad(Collection code) { - this.codeOnLoad.addAll(code); - return this; - } - - public KotlinReplBuilder outputDir(String outputDir) { - this.outputDir = outputDir; - return this; - } - - public KotlinReplBuilder shortenTypes(boolean shortenTypes) { - this.shortenTypes = shortenTypes; - return this; - } - - private String buildClassPath() { - StringJoiner joiner = new StringJoiner(File.pathSeparator); - for (String path : classpath) { - if (path != null && !path.equals("")) { - joiner.add(path); - } - } - return joiner.toString(); - } - - private ScriptCompilationConfiguration buildCompilationConfiguration() { - return new ScriptCompilationConfiguration((b) -> { - b.invoke(ScriptCompilationKt.getHostConfiguration(b), hostConf); - - JvmScriptCompilationConfigurationBuilder jvmBuilder = - JvmScriptCompilationKt.getJvm(b); - JvmScriptCompilationKt.dependenciesFromCurrentContext( - jvmBuilder, new String[0], true, false); - - List compilerOptions = Arrays.asList("-classpath", buildClassPath()); - - b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); - - KotlinType kt = new KotlinType(ctx.getClass().getCanonicalName()); - List receivers = - Collections.singletonList(kt); - b.invoke(ScriptCompilationKt.getImplicitReceivers(b), receivers); - - return Unit.INSTANCE; - }); - } - - private ScriptEvaluationConfiguration buildEvaluationConfiguration() { - return new ScriptEvaluationConfiguration((b) -> { - b.invoke(ScriptEvaluationKt.getHostConfiguration(b), hostConf); - - List receivers = - Collections.singletonList(ctx); - b.invoke(ScriptEvaluationKt.getImplicitReceivers(b), receivers); - - return Unit.INSTANCE; - }); - } -} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java new file mode 100644 index 00000000000..17683f2e6d3 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java @@ -0,0 +1,119 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.repl.building; + +import static kotlin.script.experimental.jvm.JvmScriptingHostConfigurationKt.getDefaultJvmScriptingHostConfiguration; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import kotlin.script.experimental.host.ScriptingHostConfiguration; +import org.apache.zeppelin.kotlin.context.KotlinReceiver; + +public class KotlinReplProperties { + + private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); + + private KotlinReceiver receiver; + private Set classpath; + private List codeOnLoad; + private String outputDir; + private int maxResult = 1000; + private boolean shortenTypes = true; + + public KotlinReplProperties() { + this.receiver = new KotlinReceiver(); + + this.classpath = new HashSet<>(); + String[] javaClasspath = System.getProperty("java.class.path").split(File.pathSeparator); + Collections.addAll(classpath, javaClasspath); + + this.codeOnLoad = new ArrayList<>(); + } + + public KotlinReplProperties receiver(KotlinReceiver receiver) { + this.receiver = receiver; + return this; + } + + public KotlinReplProperties classPath(String path) { + this.classpath.add(path); + return this; + } + + public KotlinReplProperties classPath(Collection paths) { + this.classpath.addAll(paths); + return this; + } + + public KotlinReplProperties codeOnLoad(String code) { + this.codeOnLoad.add(code); + return this; + } + + public KotlinReplProperties codeOnLoad(Collection code) { + this.codeOnLoad.addAll(code); + return this; + } + + public KotlinReplProperties outputDir(String outputDir) { + this.outputDir = outputDir; + return this; + } + + public KotlinReplProperties maxResult(int maxResult) { + this.maxResult = maxResult; + return this; + } + + public KotlinReplProperties shortenTypes(boolean shortenTypes) { + this.shortenTypes = shortenTypes; + return this; + } + + public ScriptingHostConfiguration getHostConf() { + return hostConf; + } + + public KotlinReceiver getReceiver() { + return receiver; + } + + public Set getClasspath() { + return classpath; + } + + public List getCodeOnLoad() { + return codeOnLoad; + } + + public String getOutputDir() { + return outputDir; + } + + public int getMaxResult() { + return maxResult; + } + + public boolean getShortenTypes() { + return shortenTypes; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java new file mode 100644 index 00000000000..6820dfc6e95 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java @@ -0,0 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.repl.building; + +import org.jetbrains.kotlin.scripting.compiler.plugin.impl.KJvmReplCompilerImpl; +import java.io.File; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.StringJoiner; +import kotlin.Unit; +import kotlin.script.experimental.api.KotlinType; +import kotlin.script.experimental.api.ScriptCompilationConfiguration; +import kotlin.script.experimental.api.ScriptCompilationKt; +import kotlin.script.experimental.api.ScriptEvaluationConfiguration; +import kotlin.script.experimental.api.ScriptEvaluationKt; +import kotlin.script.experimental.jvm.BasicJvmScriptEvaluator; +import kotlin.script.experimental.jvm.JvmScriptCompilationConfigurationBuilder; +import kotlin.script.experimental.jvm.JvmScriptCompilationKt; +import kotlin.script.experimental.jvmhost.impl.JvmHostUtilKt; +import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; +import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; + +public class ReplBuilding { + public static JvmReplCompiler buildCompiler(KotlinReplProperties properties) { + String receiverClassPath = properties.getReceiver().getClass() + .getProtectionDomain().getCodeSource().getLocation().getPath(); + properties.classPath(receiverClassPath); + + KJvmReplCompilerImpl compilerImpl = + new KJvmReplCompilerImpl(JvmHostUtilKt.withDefaults(properties.getHostConf())); + + return new JvmReplCompiler( + buildCompilationConfiguration(properties), + properties.getHostConf(), + compilerImpl); + } + + public static JvmReplEvaluator buildEvaluator(KotlinReplProperties properties) { + return new JvmReplEvaluator( + buildEvaluationConfiguration(properties), + new BasicJvmScriptEvaluator()); + } + + private static String buildClassPath(KotlinReplProperties p) { + StringJoiner joiner = new StringJoiner(File.pathSeparator); + for (String path : p.getClasspath()) { + if (path != null && !path.equals("")) { + joiner.add(path); + } + } + return joiner.toString(); + } + + private static ScriptCompilationConfiguration buildCompilationConfiguration( + KotlinReplProperties p) { + return new ScriptCompilationConfiguration((b) -> { + b.invoke(ScriptCompilationKt.getHostConfiguration(b), p.getHostConf()); + + JvmScriptCompilationConfigurationBuilder jvmBuilder = + JvmScriptCompilationKt.getJvm(b); + JvmScriptCompilationKt.dependenciesFromCurrentContext( + jvmBuilder, new String[0], true, false); + + List compilerOptions = Arrays.asList("-classpath", buildClassPath(p)); + + b.invoke(ScriptCompilationKt.getCompilerOptions(b), compilerOptions); + + KotlinType kt = new KotlinType(p.getReceiver().getClass().getCanonicalName()); + List receivers = + Collections.singletonList(kt); + b.invoke(ScriptCompilationKt.getImplicitReceivers(b), receivers); + + return Unit.INSTANCE; + }); + } + + private static ScriptEvaluationConfiguration buildEvaluationConfiguration( + KotlinReplProperties p) { + return new ScriptEvaluationConfiguration((b) -> { + b.invoke(ScriptEvaluationKt.getHostConfiguration(b), p.getHostConf()); + + List receivers = + Collections.singletonList(p.getReceiver()); + b.invoke(ScriptEvaluationKt.getImplicitReceivers(b), receivers); + + return Unit.INSTANCE; + }); + } +} diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 289b20a01a4..a3010061911 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -218,7 +218,7 @@ public void testCompletion() throws Exception { public void testOutputClasses() throws Exception { prepareInterpreter(); Path tempPath = Files.createTempDirectory("tempKotlinClasses"); - interpreter.getBuilder().outputDir(tempPath.toAbsolutePath().toString()); + interpreter.properties().outputDir(tempPath.toAbsolutePath().toString()); interpreter.open(); interpreter.interpret("val x = 1\nx", context); File[] dir = tempPath.toFile().listFiles(); @@ -280,7 +280,7 @@ public void testReflectUtil() throws Exception { @Test public void fullTypeNamesTest() throws Exception { prepareInterpreter(); - interpreter.getBuilder().shortenTypes(false); + interpreter.properties().shortenTypes(false); interpreter.open(); interpreter.interpret("val s = \"abc\"", context); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 9e25f650ad7..620b2bbd805 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -81,8 +81,8 @@ public void open() throws InterpreterException { outputDir = conf.getOption("spark.repl.class.outputDir").getOrElse(null); } - interpreter.getBuilder() - .executionContext(ctx) + interpreter.properties() + .receiver(ctx) .classPath(classpath) .outputDir(outputDir) .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX) From 5c170f0fdbb420cb2e759673872a084a01906d8b Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 13:29:20 +0300 Subject: [PATCH 091/117] Added comments for Kotlin REPL --- .../zeppelin/kotlin/KotlinInterpreter.java | 4 +++ .../kotlin/completion/KotlinKeywords.java | 3 ++ .../kotlin/context/KotlinReceiver.java | 15 ++++++--- .../kotlin/reflect/ContextUpdater.java | 4 +++ .../kotlin/reflect/KotlinReflectUtil.java | 3 ++ .../zeppelin/kotlin/repl/ClassWriter.java | 6 ++++ .../zeppelin/kotlin/repl/KotlinRepl.java | 31 ++++++++++++++++++- .../repl/building/KotlinReplProperties.java | 10 ++++++ .../kotlin/repl/building/ReplBuilding.java | 3 ++ .../spark/kotlin/KotlinZeppelinBindings.java | 10 ++++++ .../spark/kotlin/SparkKotlinReceiver.java | 11 ++++--- 11 files changed, 90 insertions(+), 10 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 93d08d631cb..b8bd7915114 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -152,6 +152,10 @@ private Job getRunningJob(String paragraphId) { return foundJob; } + /** + * Kotlin interpreter uses System.out for printing, so it is redirected to InterpreterOutput. + * Note that Scala's Console class needs separate output redirection + */ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { this.out.setInterpreterOutput(out); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java index 35568f5a083..2c75d8cd8f5 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinKeywords.java @@ -21,6 +21,9 @@ import java.util.List; public class KotlinKeywords { + /** + * List of Kotlin keywords for completion. + */ public static final List KEYWORDS = Arrays.asList( "as", "as?", diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java index 0ed08d5591c..2b5ac8fccde 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/context/KotlinReceiver.java @@ -20,11 +20,16 @@ import org.apache.zeppelin.kotlin.repl.KotlinRepl; /** - The execution context for lines in Kotlin REPL. - It is passed to the script as an implicit receiver, identical to: - with (context) { - ... - } + * The implicit receiver for lines in Kotlin REPL. + * It is passed to the script as an implicit receiver, identical to: + * with (context) { + * ... + * } + * + * KotlinReceiver can be inherited from and passed to REPL building properties, + * so other variables and functions can be accessed inside REPL. + * By default, it only has KotlinContext. + * Inherited KotlinReceivers should be in separate java file, they can't be inner or nested. */ public class KotlinReceiver { public KotlinRepl.KotlinContext kc; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index 0cfefbb294a..dd42f0016b5 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -36,6 +36,10 @@ import kotlin.reflect.KProperty; import kotlin.reflect.jvm.ReflectJvmMapping; +/** + * ContextUpdater updates current user-defined functions and variables + * to use in completion and KotlinContext. + */ public class ContextUpdater { private final Logger logger = LoggerFactory.getLogger(ContextUpdater.class); private final Set objectMethods = diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java index 2a902e207e1..9a3d2837700 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinReflectUtil.java @@ -19,6 +19,9 @@ import kotlin.reflect.KFunction; +/** + * Util class for pretty-printing Kotlin variables and functions. + */ public class KotlinReflectUtil { public static String functionSignature(KFunction function) { return function.toString().replaceAll("Line_\\d+\\.", ""); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java index f7270ac69ac..9ba8c3c140a 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java @@ -30,6 +30,12 @@ import java.util.Objects; import kotlin.script.experimental.jvm.impl.KJvmCompiledScript; +/** + * Kotlin REPL compiler generates compiled classes consisting of + * compiled in-memory module and some other classes. + * Spark may need saving them somewhere to send them to the executors, + * so this class provides writing classes on disk. + */ public class ClassWriter { private static Logger logger = LoggerFactory.getLogger(ClassWriter.class); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index f68421683c6..3d8c36f1f57 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -47,6 +47,19 @@ import org.apache.zeppelin.kotlin.repl.building.KotlinReplProperties; import org.apache.zeppelin.kotlin.repl.building.ReplBuilding; +/** + * Read-evaluate-print loop for Kotlin code. + * Each code snippet is compiled into Line_N class and evaluated. + * + * Outside variables and functions can be bound to REPL + * by inheriting KotlinReceiver class and passing it to REPL properties on creation. + * After that, all fields and methods of receiver are seen inside the snippet scope + * as if the code was run in Kotlin's `with` block. + * + * By default, KotlinReceiver has KotlinContext bound by the name `kc`. + * It can be used to show user-defined variables and functions + * and setting invokeWrapper to add effects to snippet evaluation. + */ public class KotlinRepl { private static Logger logger = LoggerFactory.getLogger(KotlinRepl.class); @@ -61,6 +74,8 @@ public class KotlinRepl { private ContextUpdater contextUpdater; boolean shortenTypes; + private KotlinRepl() { } + @SuppressWarnings("unchecked") public static KotlinRepl build(KotlinReplProperties properties) { KotlinRepl repl = new KotlinRepl(); @@ -102,7 +117,16 @@ public KotlinContext getKotlinContext() { return ctx; } - + /** + * REPL evaluation consists of: + * - Compiling code in JvmReplCompiler + * - Writing compiled classes to disk + * - Evaluating compiled classes inside InvokeWrapper + * - Updating list of user-defined functions and variables + * - Formatting result + * @param code Kotlin code to execute + * @return result of interpretation + */ public InterpreterResult eval(String code) { ReplCompileResult compileResult = compiler.compile(state, new ReplCodeLine(counter.getAndIncrement(), 0, code)); @@ -211,6 +235,11 @@ private String prepareValueString(Object value) { + " ... " + (collection.size() - maxResult) + " more]"; } + /** + * Kotlin REPL has built-in context for getting user-declared functions and variables + * and setting invokeWrapper for additional side effects in evaluation. + * It can accessed inside REPL by name `kc`, e.g. kc.showVars() + */ public class KotlinContext { private Map vars = new HashMap<>(); private Set> functions = new HashSet<>(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java index 17683f2e6d3..a3e1b74189e 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/KotlinReplProperties.java @@ -28,6 +28,16 @@ import kotlin.script.experimental.host.ScriptingHostConfiguration; import org.apache.zeppelin.kotlin.context.KotlinReceiver; +/** + * Class that holds properties for Kotlin REPL creation, + * namely implicit receiver, classpath, preloaded code, directory for class bytecode output, + * max result limit and shortening types flag. + * + * Set its parameters by chaining corresponding methods, e.g. + * properties.outputDir(dir).shortenTypes(false) + * + * Get its parameters via getters. + */ public class KotlinReplProperties { private ScriptingHostConfiguration hostConf = getDefaultJvmScriptingHostConfiguration(); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java index 6820dfc6e95..af50a7dcd71 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/building/ReplBuilding.java @@ -36,6 +36,9 @@ import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; +/** + * Util class for building REPL components. + */ public class ReplBuilding { public static JvmReplCompiler buildCompiler(KotlinReplProperties properties) { String receiverClassPath = properties.getReceiver().getClass() diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java index b9655efd94a..20f299a491f 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -17,7 +17,14 @@ package org.apache.zeppelin.spark.kotlin; +/** + * Pre-executed code on KotlinSparkInterpreter opening. + */ public class KotlinZeppelinBindings { + + /** + * Simpler Kotlin syntax for z.select + */ public static final String Z_SELECT_KOTLIN_SYNTAX = "import org.apache.zeppelin.display.ui.OptionInput.ParamOption\n" + "import org.apache.zeppelin.interpreter.BaseZeppelinContext\n" + @@ -32,6 +39,9 @@ public class KotlinZeppelinBindings { " return select(name, \"\", options)\n" + "}"; + /** + * Automatic imports for Spark SQL UDFs. + */ public static final String SPARK_UDF_IMPORTS = "import org.apache.spark.sql.types.DataTypes\n" + "import org.apache.spark.sql.functions.*\n" + diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index 1eaea3ee0c7..1ed4799bbd3 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -23,11 +23,14 @@ import org.apache.zeppelin.interpreter.BaseZeppelinContext; import org.apache.zeppelin.kotlin.context.KotlinReceiver; +/** + * Implicit receiver for Kotlin REPL with Spark's context (see KotlinReceiver for more details) + */ public class SparkKotlinReceiver extends KotlinReceiver { - public SparkSession spark; - public JavaSparkContext sc; - public SQLContext sqlContext; - public BaseZeppelinContext z; + public final SparkSession spark; + public final JavaSparkContext sc; + public final SQLContext sqlContext; + public final BaseZeppelinContext z; public SparkKotlinReceiver(SparkSession spark, JavaSparkContext sc, From 1269ee6f7f7176d62248ae186de0008ad0e7807a Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 13:34:55 +0300 Subject: [PATCH 092/117] refactored KotlinRepl constructor --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../zeppelin/kotlin/repl/KotlinRepl.java | 33 +++++++++---------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index b8bd7915114..892eda2bed1 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -77,7 +77,7 @@ public KotlinReplProperties properties() { @Override public void open() throws InterpreterException { - interpreter = KotlinRepl.build(replProperties); + interpreter = new KotlinRepl(replProperties); completer.setCtx(interpreter.getKotlinContext()); out = new InterpreterOutputStream(logger); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index 3d8c36f1f57..990f89ce0fe 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -77,32 +77,29 @@ public class KotlinRepl { private KotlinRepl() { } @SuppressWarnings("unchecked") - public static KotlinRepl build(KotlinReplProperties properties) { - KotlinRepl repl = new KotlinRepl(); - repl.compiler = ReplBuilding.buildCompiler(properties); - repl.evaluator = ReplBuilding.buildEvaluator(properties); + public KotlinRepl(KotlinReplProperties properties) { + compiler = ReplBuilding.buildCompiler(properties); + evaluator = ReplBuilding.buildEvaluator(properties); ReentrantReadWriteLock stateLock = new ReentrantReadWriteLock(); - repl.state = new AggregatedReplStageState( - repl.compiler.createState(stateLock), - repl.evaluator.createState(stateLock), + state = new AggregatedReplStageState( + compiler.createState(stateLock), + evaluator.createState(stateLock), stateLock); - repl.counter = new AtomicInteger(0); + counter = new AtomicInteger(0); - repl.writer = new ClassWriter(properties.getOutputDir()); - repl.maxResult = properties.getMaxResult(); - repl.shortenTypes = properties.getShortenTypes(); + writer = new ClassWriter(properties.getOutputDir()); + maxResult = properties.getMaxResult(); + shortenTypes = properties.getShortenTypes(); - repl.ctx = repl.new KotlinContext(); - properties.getReceiver().kc = repl.ctx; + ctx = new KotlinContext(); + properties.getReceiver().kc = ctx; - repl.contextUpdater = new ContextUpdater( - repl.state, repl.ctx.vars, repl.ctx.functions); + contextUpdater = new ContextUpdater( + state, ctx.vars, ctx.functions); for (String line: properties.getCodeOnLoad()) { - repl.eval(line); + eval(line); } - - return repl; } public List getVariables() { From 79e203686b3df3e6067296776535f11e6e74866e Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 14:11:10 +0300 Subject: [PATCH 093/117] Fixed type shortening in showFunctions() --- .../java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index 990f89ce0fe..14e4d0a6924 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -265,7 +265,11 @@ public void showVars() { public void showFunctions() { for (KFunction fun : functions) { - System.out.println(functionSignature(fun)); + String signature = functionSignature(fun); + if (shortenTypes) { + signature = shorten(signature); + } + System.out.println(signature); } } } From 2b42a6f3651d4d7eb9f90b97667b7dc27ceada41 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 14:29:38 +0300 Subject: [PATCH 094/117] Fixed beam module not working --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6b5b5598d63..ab65cfbf808 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ sap scalding java - + beam hazelcastjet geode zeppelin-web From 3120f1ada52993a44ffece9cec4751ad5c639b32 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 15:17:25 +0300 Subject: [PATCH 095/117] Updated Zeppelin documentation --- conf/interpreter-list | 2 +- .../themes/zeppelin/_navigation.html | 1 + docs/index.md | 1 + docs/interpreter/kotlin.md | 29 +++++++++++++++++-- docs/usage/interpreter/installation.md | 5 ++++ 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/conf/interpreter-list b/conf/interpreter-list index dd70f781182..8c2388b443a 100644 --- a/conf/interpreter-list +++ b/conf/interpreter-list @@ -29,6 +29,7 @@ hazelcastjet org.apache.zeppelin:zeppelin-hazelcastjet:0.9.0 Hazelcas hbase org.apache.zeppelin:zeppelin-hbase:0.9.0 Hbase interpreter ignite org.apache.zeppelin:zeppelin-ignite_2.11:0.9.0 Ignite interpreter built with Scala 2.11 jdbc org.apache.zeppelin:zeppelin-jdbc:0.9.0 Jdbc interpreter +kotlin org.apache.zeppelin:zeppelin-kotlin:0.9.0 Kotlin interpreter kylin org.apache.zeppelin:zeppelin-kylin:0.9.0 Kylin interpreter java org.apache.zeppelin:zeppelin-java:0.9.0 Java interpreter lens org.apache.zeppelin:zeppelin-lens:0.9.0 Lens interpreter @@ -38,4 +39,3 @@ pig org.apache.zeppelin:zeppelin-pig:0.9.0 Pig inte python org.apache.zeppelin:zeppelin-python:0.9.0 Python interpreter scio org.apache.zeppelin:zeppelin-scio_2.11:0.9.0 Scio interpreter shell org.apache.zeppelin:zeppelin-shell:0.9.0 Shell command -kotlin org.apache.zeppelin:zeppelin-kotlin:0.9.0 Kotlin interpreter diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 48586916881..79edc05a186 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -142,6 +142,7 @@
  • Hive
  • Ignite
  • Java
  • +
  • Kotlin
  • Kylin
  • Lens
  • Livy
  • diff --git a/docs/index.md b/docs/index.md index 5481fb46f81..a2568ceb1ca 100644 --- a/docs/index.md +++ b/docs/index.md @@ -144,6 +144,7 @@ limitations under the License. * [Ignite](./interpreter/ignite.html) * [JDBC](./interpreter/jdbc.html) * [Kylin](./interpreter/kylin.html) + * [Kotlin](./interpreter/kotlin.html) * [Lens](./interpreter/lens.html) * [Livy](./interpreter/livy.html) * [Mahout](./interpreter/mahout.html) diff --git a/docs/interpreter/kotlin.md b/docs/interpreter/kotlin.md index 10ca707f6a9..af13d2c9c0c 100644 --- a/docs/interpreter/kotlin.md +++ b/docs/interpreter/kotlin.md @@ -38,7 +38,11 @@ It is designed to interoperate fully with Java, and the JVM version of its stand
    - + + + +
    SparkInterpreter Creates a SparkContext and provides a Scala environment
    %spark.kotlinKotlinSparkInterpreterProvides a Kotlin environment
    %spark.pyspark PySparkInterpreter
    zeppelin.kotlin.maxResult 1000Max number of collection elements to displayMax n +
    zeppelin.kotlin.shortenTypestrueDisplay shortened types instead of full, e.g. Int vs kotlin.Int
    @@ -55,4 +59,25 @@ fun square(n: Int): Int = n * n ## Kotlin Context Kotlin context is accessible via `kc` object bound to the interpreter. -It holds `vars` and `methods` fields that return all user-defined variables and methods present in the interpreter. +It holds `vars` and `functions` fields that return all user-defined variables and functions present in the interpreter. +You can also print variables or functions by calling `kc.showVars()` or `kc.showFunctions()`. + +### Example + + +```kotlin +%kotlin +fun square(n: Int): Int = n * n + +val greeter = { s: String -> println("Hello $s!") } +val l = listOf("Drive", "to", "develop") + +kc.showVars() +kc.showFunctions() +``` +Output: +``` +l: List = [Drive, to, develop] +greeter: (String) -> Unit = (kotlin.String) -> kotlin.Unit +fun square(Int): Int +``` diff --git a/docs/usage/interpreter/installation.md b/docs/usage/interpreter/installation.md index a267373021a..af0a2f1491a 100644 --- a/docs/usage/interpreter/installation.md +++ b/docs/usage/interpreter/installation.md @@ -187,6 +187,11 @@ You can also find the below community managed interpreter list in `conf/interpre org.apache.zeppelin:zeppelin-jdbc:0.7.0 Jdbc interpreter + + kotlin + org.apache.zeppelin:zeppelin-kotlin:0.7.0 + Kotlin interpreter + kylin org.apache.zeppelin:zeppelin-kylin:0.7.0 From cc12fe8cb61806cdffdcaa01562f005e498137ea Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 15:51:14 +0300 Subject: [PATCH 096/117] Fixed bug with duplicate functions --- .../zeppelin/kotlin/KotlinInterpreter.java | 4 +- .../kotlin/completion/KotlinCompleter.java | 12 ++-- .../kotlin/reflect/ContextUpdater.java | 48 +++++-------- .../kotlin/reflect/KotlinFunctionInfo.java | 69 +++++++++++++++++++ .../zeppelin/kotlin/repl/KotlinRepl.java | 20 +++--- .../kotlin/KotlinInterpreterTest.java | 11 ++- 6 files changed, 109 insertions(+), 55 deletions(-) create mode 100644 kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 892eda2bed1..997f265bd89 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; @@ -36,6 +35,7 @@ import org.apache.zeppelin.interpreter.util.InterpreterOutputStream; import org.apache.zeppelin.kotlin.completion.KotlinCompleter; import org.apache.zeppelin.kotlin.context.KotlinReceiver; +import org.apache.zeppelin.kotlin.reflect.KotlinFunctionInfo; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.repl.KotlinRepl; import org.apache.zeppelin.kotlin.repl.building.KotlinReplProperties; @@ -137,7 +137,7 @@ public List getVariables() { return interpreter.getVariables(); } - public List> getFunctions() { + public List getFunctions() { return interpreter.getFunctions(); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java index 9dfbd6ae3a0..4b3789f4121 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/completion/KotlinCompleter.java @@ -17,14 +17,13 @@ package org.apache.zeppelin.kotlin.completion; -import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; -import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; +import org.apache.zeppelin.kotlin.reflect.KotlinFunctionInfo; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.repl.KotlinRepl; @@ -55,12 +54,11 @@ public List completion(String buf, int cursor, )); } - List> functions = ctx.getFunctions(); - for (KFunction function : functions) { + for (KotlinFunctionInfo fun : ctx.getFunctions()) { result.add(new InterpreterCompletion( - function.getName(), - function.getName(), - shorten(functionSignature(function)) + fun.getName(), + fun.getName(), + fun.toString(true) )); } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index dd42f0016b5..372de18b8c4 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -47,39 +47,40 @@ public class ContextUpdater { private AggregatedReplStageState state; private Map vars; - private Set> methods; + private Set functions; public ContextUpdater(AggregatedReplStageState state, Map vars, - Set> methods) { + Set functions) { this.state = state; this.vars = vars; - this.methods = methods; + this.functions = functions; } public void update() { - updateVars(); - updateMethods(); - } - - private void updateVars() { try { List lines = getLines(); refreshVariables(lines); + refreshMethods(lines); } catch (ReflectiveOperationException | NullPointerException e) { logger.error("Exception updating current variables", e); } } - private void updateMethods() { - try { - if (state.getHistory().isEmpty()) { - return; + private void refreshMethods(List lines) { + functions.clear(); + for (Object line : lines) { + Method[] methods = line.getClass().getMethods(); + for (Method method : methods) { + if (objectMethods.contains(method) || method.getName().equals("main")) { + continue; + } + KFunction function = ReflectJvmMapping.getKotlinFunction(method); + if (function == null) { + continue; + } + functions.add(new KotlinFunctionInfo(function)); } - Object script = getLineFromRecord(state.getHistory().peek()); - getNewMethods(script); - } catch (NullPointerException e) { - logger.error("Exception updating current methods", e); } } @@ -146,19 +147,4 @@ private void findVariables(Field[] fields, Object o) throws IllegalAccessExcepti } } } - - private void getNewMethods(Object script) { - Set> newMethods = new HashSet<>(); - Method[] scriptMethods = script.getClass().getMethods(); - for (Method method : scriptMethods) { - if (objectMethods.contains(method) || method.getName().equals("main")) { - continue; - } - KFunction function = ReflectJvmMapping.getKotlinFunction(method); - if (function != null) { - newMethods.add(function); - } - } - methods.addAll(newMethods); - } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java new file mode 100644 index 00000000000..b2ba500af90 --- /dev/null +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.zeppelin.kotlin.reflect; + +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; +import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; +import org.jetbrains.annotations.NotNull; +import kotlin.reflect.KFunction; + +public class KotlinFunctionInfo implements Comparable { + private final KFunction function; + + public KotlinFunctionInfo(KFunction function) { + this.function = function; + } + + public KFunction getFunction() { + return function; + } + + public String getName() { + return function.getName(); + } + + public String toString(boolean shortenTypes) { + if (shortenTypes) { + return shorten(toString()); + } + return toString(); + } + + @Override + public String toString() { + return functionSignature(function); + } + + @Override + public int compareTo(@NotNull KotlinFunctionInfo f) { + return this.toString().hashCode() - f.toString().hashCode(); + } + + @Override + public int hashCode() { + return this.toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof KotlinFunctionInfo) { + return this.toString().equals(obj.toString()); + } + return false; + } +} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index 14e4d0a6924..c4b0b5ffa35 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -17,7 +17,6 @@ package org.apache.zeppelin.kotlin.repl; -import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import org.jetbrains.kotlin.cli.common.repl.AggregatedReplStageState; import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper; @@ -29,20 +28,20 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.stream.Collectors; import kotlin.jvm.functions.Function0; -import kotlin.reflect.KFunction; import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler; import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator; import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.kotlin.reflect.ContextUpdater; +import org.apache.zeppelin.kotlin.reflect.KotlinFunctionInfo; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; import org.apache.zeppelin.kotlin.repl.building.KotlinReplProperties; import org.apache.zeppelin.kotlin.repl.building.ReplBuilding; @@ -106,7 +105,7 @@ public List getVariables() { return ctx.getVars(); } - public List> getFunctions() { + public List getFunctions() { return ctx.getFunctions(); } @@ -115,6 +114,7 @@ public KotlinContext getKotlinContext() { } /** + * Evaluates code snippet and returns interpreter result. * REPL evaluation consists of: * - Compiling code in JvmReplCompiler * - Writing compiled classes to disk @@ -239,7 +239,7 @@ private String prepareValueString(Object value) { */ public class KotlinContext { private Map vars = new HashMap<>(); - private Set> functions = new HashSet<>(); + private Set functions = new TreeSet<>(); public List getVars() { return new ArrayList<>(vars.values()); @@ -253,7 +253,7 @@ public InvokeWrapper getWrapper() { return KotlinRepl.this.wrapper; } - public List> getFunctions() { + public List getFunctions() { return new ArrayList<>(functions); } @@ -264,12 +264,8 @@ public void showVars() { } public void showFunctions() { - for (KFunction fun : functions) { - String signature = functionSignature(fun); - if (shortenTypes) { - signature = shorten(signature); - } - System.out.println(signature); + for (KotlinFunctionInfo fun : functions) { + System.out.println(fun.toString(shortenTypes)); } } } diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index a3010061911..6e6ae341e59 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -44,6 +44,7 @@ import org.apache.zeppelin.interpreter.InterpreterResult; import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; +import org.apache.zeppelin.kotlin.reflect.KotlinFunctionInfo; import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; @@ -196,9 +197,13 @@ public void testFunctionsAsValues() throws Exception { @Test public void testMethods() throws Exception { interpreter.interpret("fun sq(x: Int): Int = x * x", context); + interpreter.interpret("fun sq(x: Int): Int = x * x", context); + assertEquals(1, interpreter.getFunctions().size()); + interpreter.interpret("fun singletonListOf(elem: T): List = listOf(elem)", context); List signatures = interpreter.getFunctions().stream() - .map(KotlinReflectUtil::functionSignature).collect(Collectors.toList()); + .map(KotlinFunctionInfo::toString).collect(Collectors.toList()); + System.out.println(signatures); assertTrue(signatures.stream().anyMatch(signature -> signature.equals("fun sq(kotlin.Int): kotlin.Int"))); assertTrue(signatures.stream().anyMatch(signature -> @@ -273,8 +278,8 @@ public void testReflectUtil() throws Exception { assertTrue(shorten(message).contains("(List) -> Int")); interpreter.interpret("fun first(s: String): Char = s[0]", context); - KFunction first = interpreter.getFunctions().get(0); - assertEquals("fun first(String): Char", shorten(functionSignature(first))); + KotlinFunctionInfo first = interpreter.getFunctions().get(0); + assertEquals("fun first(String): Char", first.toString(true)); } @Test From 8fc1be8b67c252fc65b6c49579b5144a33502dce Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 15:51:49 +0300 Subject: [PATCH 097/117] Added Kotlin interpreter to Travis testing --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ef2193a4a4a..bf9e69ddcbd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,7 @@ services: env: global: # Interpreters does not required by zeppelin-server integration tests - - INTERPRETERS='!beam,!hbase,!pig,!jdbc,!file,!ignite,!kylin,!lens,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine' + - INTERPRETERS='!beam,!hbase,!pig,!jdbc,!file,!ignite,!kotlin,!kylin,!lens,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine' matrix: include: From 140265c84d68778e2d11993b54ba5f5736a861ec Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Tue, 3 Sep 2019 15:58:46 +0300 Subject: [PATCH 098/117] Fixing checkstyle violations --- .../org/apache/zeppelin/kotlin/KotlinInterpreterTest.java | 3 --- .../apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 6e6ae341e59..5d7c4221701 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -19,7 +19,6 @@ import static org.apache.zeppelin.interpreter.InterpreterResult.Code.ERROR; import static org.apache.zeppelin.interpreter.InterpreterResult.Code.SUCCESS; -import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.functionSignature; import static org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil.shorten; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -36,7 +35,6 @@ import java.util.List; import java.util.Properties; import java.util.stream.Collectors; -import kotlin.reflect.KFunction; import org.apache.zeppelin.interpreter.InterpreterContext; import org.apache.zeppelin.interpreter.InterpreterException; import org.apache.zeppelin.interpreter.InterpreterOutput; @@ -45,7 +43,6 @@ import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput; import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion; import org.apache.zeppelin.kotlin.reflect.KotlinFunctionInfo; -import org.apache.zeppelin.kotlin.reflect.KotlinReflectUtil; import org.apache.zeppelin.kotlin.reflect.KotlinVariableInfo; diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java index 20f299a491f..a733662251e 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -22,9 +22,7 @@ */ public class KotlinZeppelinBindings { - /** - * Simpler Kotlin syntax for z.select - */ + //Simpler Kotlin syntax for z.select public static final String Z_SELECT_KOTLIN_SYNTAX = "import org.apache.zeppelin.display.ui.OptionInput.ParamOption\n" + "import org.apache.zeppelin.interpreter.BaseZeppelinContext\n" + From ecd1f5d84ae2832f7a95587415eea9d80c81899b Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 5 Sep 2019 11:58:17 +0300 Subject: [PATCH 099/117] Disabled Spark versions older than 2.4 to avoid build issues --- .../spark/KotlinSparkInterpreter.java | 36 ++++++++++++++++--- .../spark/kotlin/KotlinZeppelinBindings.java | 4 +++ .../spark/kotlin/SparkKotlinReceiver.java | 7 ++-- .../spark/KotlinSparkInterpreterTest.java | 25 ++++++++++++- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 620b2bbd805..44067d2d0be 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -21,7 +21,6 @@ import static org.apache.zeppelin.spark.Utils.buildJobGroupId; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; -import org.apache.spark.sql.SparkSession; import org.apache.spark.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,6 +28,7 @@ import java.io.IOException; import java.io.PrintStream; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.regex.Pattern; @@ -48,11 +48,13 @@ public class KotlinSparkInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(KotlinSparkInterpreter.class); + private static final SparkVersion KOTLIN_SPARK_SUPPORTED_VERSION = SparkVersion.SPARK_2_4_0; private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; private BaseZeppelinContext z; private JavaSparkContext jsc; + private SparkVersion sparkVersion; public KotlinSparkInterpreter(Properties properties) { super(properties); @@ -65,10 +67,14 @@ public void open() throws InterpreterException { sparkInterpreter = getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); jsc = sparkInterpreter.getJavaSparkContext(); + + sparkVersion = SparkVersion.fromVersionString(jsc.version()); + assertVersion(); + z = sparkInterpreter.getZeppelinContext(); SparkKotlinReceiver ctx = new SparkKotlinReceiver( - (SparkSession) sparkInterpreter.getSparkSession(), + sparkInterpreter.getSparkSession(), jsc, sparkInterpreter.getSQLContext(), z); @@ -86,8 +92,8 @@ public void open() throws InterpreterException { .classPath(classpath) .outputDir(outputDir) .codeOnLoad(KotlinZeppelinBindings.Z_SELECT_KOTLIN_SYNTAX) - .codeOnLoad(KotlinZeppelinBindings.SPARK_UDF_IMPORTS); - + .codeOnLoad(KotlinZeppelinBindings.SPARK_UDF_IMPORTS) + .codeOnLoad(KotlinZeppelinBindings.CAST_SPARK_SESSION); interpreter.open(); } @@ -99,6 +105,7 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { + assertVersion(); z.setInterpreterContext(context); z.setGui(context.getGui()); @@ -121,8 +128,9 @@ public InterpreterResult interpret(String st, InterpreterContext context) @Override public void cancel(InterpreterContext context) throws InterpreterException { - jsc.cancelJobGroup(buildJobGroupId(context)); + assertVersion(); + jsc.cancelJobGroup(buildJobGroupId(context)); interpreter.cancel(context); } @@ -133,15 +141,33 @@ public FormType getFormType() throws InterpreterException { @Override public int getProgress(InterpreterContext context) throws InterpreterException { + if (unsupportedVersion()) { + return 0; + } return sparkInterpreter.getProgress(context); } @Override public List completion(String buf, int cursor, InterpreterContext interpreterContext) throws InterpreterException { + if (unsupportedVersion()) { + return Collections.emptyList(); + } return interpreter.completion(buf, cursor, interpreterContext); } + public boolean unsupportedVersion() { + return sparkVersion.olderThan(KOTLIN_SPARK_SUPPORTED_VERSION); + } + + private void assertVersion() throws UnsupportedClassVersionError { + if (unsupportedVersion()) { + throw new UnsupportedClassVersionError( + "Spark version is " + sparkVersion + ", only " + + KOTLIN_SPARK_SUPPORTED_VERSION + " and newer are supported"); + } + } + private List sparkClasspath() { String sparkJars = System.getProperty("spark.jars"); Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java index a733662251e..252a9369176 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/KotlinZeppelinBindings.java @@ -45,4 +45,8 @@ public class KotlinZeppelinBindings { "import org.apache.spark.sql.functions.*\n" + "import org.apache.spark.sql.expressions.UserDefinedFunction\n" + "import org.apache.spark.sql.api.java.*"; + + public static final String CAST_SPARK_SESSION = "" + + "import org.apache.spark.sql.SparkSession\n" + + "val spark = _sparkObject as SparkSession"; } diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java index 1ed4799bbd3..8d5c10b1fc6 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/kotlin/SparkKotlinReceiver.java @@ -19,7 +19,6 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.sql.SQLContext; -import org.apache.spark.sql.SparkSession; import org.apache.zeppelin.interpreter.BaseZeppelinContext; import org.apache.zeppelin.kotlin.context.KotlinReceiver; @@ -27,16 +26,16 @@ * Implicit receiver for Kotlin REPL with Spark's context (see KotlinReceiver for more details) */ public class SparkKotlinReceiver extends KotlinReceiver { - public final SparkSession spark; + public final Object _sparkObject; public final JavaSparkContext sc; public final SQLContext sqlContext; public final BaseZeppelinContext z; - public SparkKotlinReceiver(SparkSession spark, + public SparkKotlinReceiver(Object spark, JavaSparkContext sc, SQLContext sqlContext, BaseZeppelinContext z) { - this.spark = spark; + this._sparkObject = spark; this.sc = sc; this.sqlContext = sqlContext; this.z = z; diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index 44495c98f7e..bede68f7806 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -24,9 +24,12 @@ import static org.mockito.Mockito.mock; import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import java.io.IOException; import java.nio.file.Files; @@ -52,11 +55,15 @@ public class KotlinSparkInterpreterTest { @ClassRule public static TemporaryFolder tmpDir = new TemporaryFolder(); + @Rule + public ExpectedException exceptionRule = ExpectedException.none(); + private static SparkInterpreter repl; private static InterpreterGroup intpGroup; private static InterpreterContext context; private static KotlinSparkInterpreter interpreter; private static String output; + private static boolean sparkSupported; public static Properties getSparkTestProperties(TemporaryFolder tmpDir) throws IOException { Properties p = new Properties(); @@ -134,7 +141,12 @@ public void onUpdate(int index, InterpreterResultMessageOutput out) { interpreter = new KotlinSparkInterpreter(properties); interpreter.setInterpreterGroup(intpGroup); intpGroup.get("note").add(interpreter); - interpreter.open(); + try { + interpreter.open(); + sparkSupported = true; + } catch (UnsupportedClassVersionError e) { + sparkSupported = false; + } } @AfterClass @@ -142,6 +154,13 @@ public static void tearDown() throws InterpreterException { repl.close(); } + @Before + public void expectUnsupportedError() { + if (!sparkSupported) { + exceptionRule.expect(UnsupportedClassVersionError.class); + } + } + @Test public void simpleKotlinTest() throws Exception { testCodeForResult("1 + 1", "Int = 2"); @@ -167,6 +186,10 @@ public void testCancel() throws Exception { "spark.range(10).foreach { Thread.sleep(1000) }", context); assertEquals(ERROR, result.code()); assertTrue(result.message().get(0).getData().trim().contains("cancelled")); + } catch (UnsupportedClassVersionError e) { + if (sparkSupported) { + Assert.fail(e.getMessage()); + } } catch (InterpreterException e) { Assert.fail(e.getMessage()); } From b444001f7ffe8ba0f6716ed7a4a579a88b15cf66 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 6 Sep 2019 19:05:24 +0300 Subject: [PATCH 100/117] updated LICENSE --- LICENSE | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSE b/LICENSE index f75c453bb25..3088cf88f66 100644 --- a/LICENSE +++ b/LICENSE @@ -261,6 +261,7 @@ The text of each license is also included at licenses/LICENSE-[project]-[version (Apache 2.0) jarchivelib (https://github.com/thrau/jarchivelib) (Apache 2.0) Google Cloud Client Library for Java (https://github.com/GoogleCloudPlatform/google-cloud-java) (Apache 2.0) concurrentunit (https://github.com/jhalterman/concurrentunit) + (Apache 2.0) Kotlin (https://github.com/JetBrains/kotlin) ======================================================================== BSD 3-Clause licenses From db495e8732c80cf6a25ac6fff92c3179766adb9c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 6 Sep 2019 19:07:05 +0300 Subject: [PATCH 101/117] Removed unneccessary scala dependency --- kotlin/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 8b13ef50589..94ee1a73942 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -97,13 +97,6 @@ kotlin-reflect ${kotlin-version} - - - org.scala-lang - scala-library - ${scala.version} - provided - From deb152e18d00a968782e4853dd5bb769d200873c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 6 Sep 2019 20:27:34 +0300 Subject: [PATCH 102/117] Wrapped output redirection in try/finally --- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 997f265bd89..b40b999df3f 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -161,10 +161,12 @@ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { PrintStream oldOut = System.out; PrintStream newOut = (out != null) ? new PrintStream(out) : null; - System.setOut(newOut); - InterpreterResult res = interpreter.eval(code); - System.setOut(oldOut); - + try { + System.setOut(newOut); + InterpreterResult res = interpreter.eval(code); + } finally { + System.setOut(oldOut); + } return res; } From 065f0e25120427c5c85f35a6e366ccf9128ce8ea Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 30 Sep 2019 17:03:50 +0300 Subject: [PATCH 103/117] Various PR fixes --- docs/interpreter/kotlin.md | 4 -- kotlin/pom.xml | 14 +++---- .../zeppelin/kotlin/KotlinInterpreter.java | 5 +-- .../kotlin/KotlinInterpreterTest.java | 4 +- .../spark/KotlinSparkInterpreter.java | 39 ++++++++++--------- 5 files changed, 31 insertions(+), 35 deletions(-) diff --git a/docs/interpreter/kotlin.md b/docs/interpreter/kotlin.md index af13d2c9c0c..bba08179360 100644 --- a/docs/interpreter/kotlin.md +++ b/docs/interpreter/kotlin.md @@ -46,9 +46,6 @@ It is designed to interoperate fully with Java, and the JVM version of its stand -## Using the Kotlin Interpreter -In a paragraph, use %kotlin to select the Kotlin interpreter and then write your script. - ## Example ```kotlin @@ -66,7 +63,6 @@ You can also print variables or functions by calling `kc.showVars()` or `kc.show ```kotlin -%kotlin fun square(n: Int): Int = n * n val greeter = { s: String -> println("Hello $s!") } diff --git a/kotlin/pom.xml b/kotlin/pom.xml index 94ee1a73942..6ab34f6178f 100644 --- a/kotlin/pom.xml +++ b/kotlin/pom.xml @@ -34,14 +34,14 @@ kotlin - 1.3.50 + 1.3.50 org.jetbrains.kotlin kotlin-scripting-jvm-host-embeddable - ${kotlin-version} + ${kotlin.version} org.jetbrains.kotlin @@ -56,7 +56,7 @@ org.jetbrains.kotlin kotlin-compiler-embeddable - ${kotlin-version} + ${kotlin.version} org.jetbrains.kotlin @@ -67,7 +67,7 @@ org.jetbrains.kotlin kotlin-scripting-jvm - ${kotlin-version} + ${kotlin.version} org.jetbrains.kotlin @@ -78,7 +78,7 @@ org.jetbrains.kotlin kotlin-scripting-compiler-embeddable - ${kotlin-version} + ${kotlin.version} org.jetbrains.kotlin @@ -89,13 +89,13 @@ org.jetbrains.kotlin kotlin-stdlib - ${kotlin-version} + ${kotlin.version} org.jetbrains.kotlin kotlin-reflect - ${kotlin-version} + ${kotlin.version} diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index b40b999df3f..948f79e40c6 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -71,7 +71,7 @@ public KotlinInterpreter(Properties properties) { .shortenTypes(shortenTypes); } - public KotlinReplProperties properties() { + public KotlinReplProperties getKotlinReplProperties() { return replProperties; } @@ -163,11 +163,10 @@ private InterpreterResult runWithOutput(String code, InterpreterOutput out) { PrintStream newOut = (out != null) ? new PrintStream(out) : null; try { System.setOut(newOut); - InterpreterResult res = interpreter.eval(code); + return interpreter.eval(code); } finally { System.setOut(oldOut); } - return res; } private List getImportClasspath(String localRepo) { diff --git a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java index 5d7c4221701..a474b3a801a 100644 --- a/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java +++ b/kotlin/src/test/java/org/apache/zeppelin/kotlin/KotlinInterpreterTest.java @@ -220,7 +220,7 @@ public void testCompletion() throws Exception { public void testOutputClasses() throws Exception { prepareInterpreter(); Path tempPath = Files.createTempDirectory("tempKotlinClasses"); - interpreter.properties().outputDir(tempPath.toAbsolutePath().toString()); + interpreter.getKotlinReplProperties().outputDir(tempPath.toAbsolutePath().toString()); interpreter.open(); interpreter.interpret("val x = 1\nx", context); File[] dir = tempPath.toFile().listFiles(); @@ -282,7 +282,7 @@ public void testReflectUtil() throws Exception { @Test public void fullTypeNamesTest() throws Exception { prepareInterpreter(); - interpreter.properties().shortenTypes(false); + interpreter.getKotlinReplProperties().shortenTypes(false); interpreter.open(); interpreter.interpret("val s = \"abc\"", context); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 44067d2d0be..ca176f9b8d8 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -50,11 +50,11 @@ public class KotlinSparkInterpreter extends Interpreter { private static Logger logger = LoggerFactory.getLogger(KotlinSparkInterpreter.class); private static final SparkVersion KOTLIN_SPARK_SUPPORTED_VERSION = SparkVersion.SPARK_2_4_0; + private InterpreterResult unsupportedMessage; private KotlinInterpreter interpreter; private SparkInterpreter sparkInterpreter; private BaseZeppelinContext z; private JavaSparkContext jsc; - private SparkVersion sparkVersion; public KotlinSparkInterpreter(Properties properties) { super(properties); @@ -68,8 +68,13 @@ public void open() throws InterpreterException { getInterpreterInTheSameSessionByClassName(SparkInterpreter.class); jsc = sparkInterpreter.getJavaSparkContext(); - sparkVersion = SparkVersion.fromVersionString(jsc.version()); - assertVersion(); + SparkVersion sparkVersion = SparkVersion.fromVersionString(jsc.version()); + if (sparkVersion.olderThan(KOTLIN_SPARK_SUPPORTED_VERSION)) { + unsupportedMessage = new InterpreterResult( + InterpreterResult.Code.ERROR, + "Spark version is " + sparkVersion + ", only " + + KOTLIN_SPARK_SUPPORTED_VERSION + " and newer are supported"); + } z = sparkInterpreter.getZeppelinContext(); @@ -87,7 +92,7 @@ public void open() throws InterpreterException { outputDir = conf.getOption("spark.repl.class.outputDir").getOrElse(null); } - interpreter.properties() + interpreter.getKotlinReplProperties() .receiver(ctx) .classPath(classpath) .outputDir(outputDir) @@ -105,7 +110,10 @@ public void close() throws InterpreterException { @Override public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { - assertVersion(); + + if (isUnsupported()) { + return unsupportedMessage; + } z.setInterpreterContext(context); z.setGui(context.getGui()); @@ -128,8 +136,9 @@ public InterpreterResult interpret(String st, InterpreterContext context) @Override public void cancel(InterpreterContext context) throws InterpreterException { - assertVersion(); - + if (isUnsupported()) { + return; + } jsc.cancelJobGroup(buildJobGroupId(context)); interpreter.cancel(context); } @@ -141,7 +150,7 @@ public FormType getFormType() throws InterpreterException { @Override public int getProgress(InterpreterContext context) throws InterpreterException { - if (unsupportedVersion()) { + if (isUnsupported()) { return 0; } return sparkInterpreter.getProgress(context); @@ -150,22 +159,14 @@ public int getProgress(InterpreterContext context) throws InterpreterException { @Override public List completion(String buf, int cursor, InterpreterContext interpreterContext) throws InterpreterException { - if (unsupportedVersion()) { + if (isUnsupported()) { return Collections.emptyList(); } return interpreter.completion(buf, cursor, interpreterContext); } - public boolean unsupportedVersion() { - return sparkVersion.olderThan(KOTLIN_SPARK_SUPPORTED_VERSION); - } - - private void assertVersion() throws UnsupportedClassVersionError { - if (unsupportedVersion()) { - throw new UnsupportedClassVersionError( - "Spark version is " + sparkVersion + ", only " + - KOTLIN_SPARK_SUPPORTED_VERSION + " and newer are supported"); - } + private boolean isUnsupported() { + return unsupportedMessage == null; } private List sparkClasspath() { From 54eebe359d03845fd3c7bba6951485feb77b6455 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 17 Oct 2019 02:14:51 +0300 Subject: [PATCH 104/117] Added README.md for Kotlin interpreter --- kotlin/README.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 kotlin/README.md diff --git a/kotlin/README.md b/kotlin/README.md new file mode 100644 index 00000000000..0f835656d8a --- /dev/null +++ b/kotlin/README.md @@ -0,0 +1,43 @@ +# Developer guide to Kotlin interpreter + +The following module adds Kotlin language support to Apache Zeppelin. +Here is the guide to its implementation and how it can be improved and tested. + +## Implementation details +### Kotlin Repl +For interactive Kotlin execution, an instance of `KotlinRepl` is created. +To set REPL properties (such as classpath, generated classes output directory, max result, etc.), +pass `KotlinReplProperties` to its constructor. For example: +```$java +KotlinReplProperties replProperties = new KotlinReplProperties() + .maxResult(1000) + .shortenTypes(true); +KotlinRepl repl = new KotlinRepl(replProperties); +``` + +### Variable/function binding +You can also bind variables and functions on REPL creation using implicit receiver language feature. +This means that all code run in REPL will be executed in Kotlin's `with` block with the receiver, +making the receiver's fields and methods accessible. + +To add your variables/functions, extend `KotlinReceiver` class (in separate file), declare your fields and methods, and pass an instance of it to +`KotlinReplProperties`. Example: +```$java +// In separate file: +class CustomReceiver extends KotlinReceiver { + public int myValue = 1 // will be converted to Kotlin "var myValue: Int" + public final String messageTemplate = "Value = %VALUE%" // "val messageTemplate: String" + + public String getMessage() { + return messageTemplate.replace("%VALUE%", String.valueOf(myValue)); + } +} + +// In intepreter creation: +replProperties.receiver(new CustomReceiver); +KotlinRepl repl = new KotlinRepl(replProperties); +repl.eval("getMessage()"); // will return interpreterResult with "Value = 1" string +``` + +In `KotlinInterpreter` REPL properties are created on construction, are accessible via `getKotlinReplProperties` method, +and are used in REPL creation on `open()`. From 61f666b33bec5ccfcc0d5bbe10427e0f93074f30 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 17 Oct 2019 16:27:19 +0300 Subject: [PATCH 105/117] Added guide to testing and possible improvements --- kotlin/README.md | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/kotlin/README.md b/kotlin/README.md index 0f835656d8a..0b71c240c1e 100644 --- a/kotlin/README.md +++ b/kotlin/README.md @@ -4,7 +4,7 @@ The following module adds Kotlin language support to Apache Zeppelin. Here is the guide to its implementation and how it can be improved and tested. ## Implementation details -### Kotlin Repl +### Kotlin REPL For interactive Kotlin execution, an instance of `KotlinRepl` is created. To set REPL properties (such as classpath, generated classes output directory, max result, etc.), pass `KotlinReplProperties` to its constructor. For example: @@ -41,3 +41,43 @@ repl.eval("getMessage()"); // will return interpreterResult with "Value = 1" str In `KotlinInterpreter` REPL properties are created on construction, are accessible via `getKotlinReplProperties` method, and are used in REPL creation on `open()`. + +### Generated class files +Each code snippet run in REPL is registered as a separate class and saved in location +specified by `outputDir` REPL property. Anonymous classes and lambdas also get saved there under specific names. + +This is needed for Spark to send classes to remote executors, and in Spark Kotlin interpreter this directory is the same +as in `sparkContext` option `spark.repl.class.outputDir`. + +### Kotlin Spark Interpreter +Kotlin interpreter in Spark intepreter group takes `SparkSession`, `JavaSparkContext`, `SQLContext` +and `BaseZeppelinContext` from `SparkInterpreter` in the same session and binds them in its scope. + +## Testing +Kotlin Interpreter and Spark Kotlin Interpreter come with unit tests. +They can be run with \ +`mvn clean test` \ +in `$ZEPPELIN_HOME/kotlin` for base Kotlin Interpreter and \ +`mvn -Dtest=KotlinSparkInterpreterTest test` \ +in `$ZEPPELIN_HOME/spark/interpreter` for Spark Kotlin Interpreter. + +To test manually, build Zeppelin with \ +`mvn clean package -DskipTests` \ +and create a note with `kotlin` interpreter for base or `spark` for Spark. +In Spark interpreter, add `%spark.kotlin` in the start of paragraph to use Kotlin Spark Interpreter. + +Example: +```$kotlin +%spark.kotlin +val df = spark.range(10) +df.show() +``` +## Possible Improvements +* It would be great to bind `ZeppelinContext` to base Kotlin interpreter, but for now I had trouble instantiating it +inside KotlinInterpreter. +* When Kotlin has its own Spark API, it will be good to move to it. Currently in Java Spark API Kotlin +can not use things like `forEach` because of ambiguity between `Iterable.forEach` and `Map.forEach` +(`foreach` from Spark's API does work, though). +* The scoped mode for Kotlin Spark Interpreter currently has issues with having the same class output directory +for different intepreters, leading to overwriting classes. Adding prefixes to generated classes or putting them + in separate directories leads to `ClassNotFoundException` on Spark executors. \ No newline at end of file From 476fa376bec9356cff6ca9fa598aa7806abcbce1 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Thu, 17 Oct 2019 16:27:34 +0300 Subject: [PATCH 106/117] Fixed spark version checking --- .../org/apache/zeppelin/kotlin/KotlinInterpreter.java | 1 - .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 948f79e40c6..0a5a5928aa9 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -62,7 +62,6 @@ public KotlinInterpreter(Properties properties) { String imports = properties.getProperty("zeppelin.interpreter.localRepo", ""); completer = new KotlinCompleter(); - replProperties .receiver(new KotlinReceiver()) .maxResult(maxResult) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index ca176f9b8d8..4615461c424 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -71,9 +71,9 @@ public void open() throws InterpreterException { SparkVersion sparkVersion = SparkVersion.fromVersionString(jsc.version()); if (sparkVersion.olderThan(KOTLIN_SPARK_SUPPORTED_VERSION)) { unsupportedMessage = new InterpreterResult( - InterpreterResult.Code.ERROR, - "Spark version is " + sparkVersion + ", only " + - KOTLIN_SPARK_SUPPORTED_VERSION + " and newer are supported"); + InterpreterResult.Code.ERROR, + "Spark version is " + sparkVersion + ", only " + + KOTLIN_SPARK_SUPPORTED_VERSION + " and newer are supported"); } z = sparkInterpreter.getZeppelinContext(); @@ -166,7 +166,7 @@ public List completion(String buf, int cursor, } private boolean isUnsupported() { - return unsupportedMessage == null; + return unsupportedMessage != null; } private List sparkClasspath() { From 2c25a7d805de6684ec7743525a3e456640b814ab Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 8 Nov 2019 20:15:56 +0300 Subject: [PATCH 107/117] Minor PR fixes --- .../java/org/apache/zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../org/apache/zeppelin/kotlin/reflect/ContextUpdater.java | 4 ++-- .../apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java | 2 +- .../apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java | 2 +- .../java/org/apache/zeppelin/kotlin/repl/ClassWriter.java | 7 +++---- .../java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java | 2 +- .../org/apache/zeppelin/spark/KotlinSparkInterpreter.java | 4 ++-- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 0a5a5928aa9..df90c95ed85 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -180,7 +180,7 @@ private List getImportClasspath(String localRepo) { return classpath; } for (File file : files) { - if (!file.isDirectory()) { + if (file.isDirectory) { classpath.add(file.getAbsolutePath()); } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index 372de18b8c4..30db9eab960 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -41,8 +41,8 @@ * to use in completion and KotlinContext. */ public class ContextUpdater { - private final Logger logger = LoggerFactory.getLogger(ContextUpdater.class); - private final Set objectMethods = + private static final Logger logger = LoggerFactory.getLogger(ContextUpdater.class); + private static final Set objectMethods = new HashSet<>(Arrays.asList(Object.class.getMethods())); private AggregatedReplStageState state; diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java index b2ba500af90..c4c4579728b 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinFunctionInfo.java @@ -51,7 +51,7 @@ public String toString() { @Override public int compareTo(@NotNull KotlinFunctionInfo f) { - return this.toString().hashCode() - f.toString().hashCode(); + return this.toString().compareTo(f.toString()); } @Override diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index 97e01ecb5ff..e9cea206017 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -54,6 +54,6 @@ public String toString(boolean shortenTypes) { @Override public String toString() { - return getName() + ": " + getType() + " = " + getValue(); + return toString(false); } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java index 9ba8c3c140a..e7de34c7fba 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/ClassWriter.java @@ -52,11 +52,10 @@ public void writeClasses(ReplCompileResult.CompiledClasses classes) { for (CompiledClassData compiledClass: classes.getClasses()) { String filePath = compiledClass.getPath(); - if (filePath.contains("/")) { - continue; + if (!filePath.contains(File.separator)) { + String classWritePath = outputDir + File.separator + filePath; + writeClass(compiledClass.getBytes(), classWritePath); } - String classWritePath = outputDir + File.separator + filePath; - writeClass(compiledClass.getBytes(), classWritePath); } writeModuleInMemory(classes); diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java index c4b0b5ffa35..38fdba39b8c 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/repl/KotlinRepl.java @@ -235,7 +235,7 @@ private String prepareValueString(Object value) { /** * Kotlin REPL has built-in context for getting user-declared functions and variables * and setting invokeWrapper for additional side effects in evaluation. - * It can accessed inside REPL by name `kc`, e.g. kc.showVars() + * It can be accessed inside REPL by name `kc`, e.g. kc.showVars() */ public class KotlinContext { private Map vars = new HashMap<>(); diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 4615461c424..51c2d86fd39 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -169,9 +169,9 @@ private boolean isUnsupported() { return unsupportedMessage != null; } - private List sparkClasspath() { + private static List sparkClasspath() { String sparkJars = System.getProperty("spark.jars"); - Pattern isKotlinJar = Pattern.compile("/kotlin-(runtime|stdlib|compiler|reflect)(-.*)?\\.jar"); + Pattern isKotlinJar = Pattern.compile("/kotlin-[a-z]*(-.*)?\\.jar"); Stream addedJars = Arrays.stream(Utils.resolveURIs(sparkJars).split(",")) .filter(s -> !s.trim().equals("")) From 171a35be3ffdffc5939bd94284cf15156bb1ac76 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 8 Nov 2019 20:17:22 +0300 Subject: [PATCH 108/117] Minor PR fixes --- .../main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index df90c95ed85..86495930b39 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -180,7 +180,7 @@ private List getImportClasspath(String localRepo) { return classpath; } for (File file : files) { - if (file.isDirectory) { + if (file.isDirectory()) { classpath.add(file.getAbsolutePath()); } } From 29845771562e0e42ec59c97e67b5dd6762bfbc32 Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Fri, 8 Nov 2019 21:22:55 +0300 Subject: [PATCH 109/117] Error fixes in classpath and type printing --- .../zeppelin/kotlin/KotlinInterpreter.java | 2 +- .../kotlin/reflect/KotlinVariableInfo.java | 5 +- zeppelin-web/package-lock.json | 931 ++---------------- 3 files changed, 70 insertions(+), 868 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java index 86495930b39..8276f5fbbfd 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/KotlinInterpreter.java @@ -180,7 +180,7 @@ private List getImportClasspath(String localRepo) { return classpath; } for (File file : files) { - if (file.isDirectory()) { + if (file.isFile()) { classpath.add(file.getAbsolutePath()); } } diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java index e9cea206017..a90dacc6643 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/KotlinVariableInfo.java @@ -46,10 +46,11 @@ public String getType() { } public String toString(boolean shortenTypes) { + String type = getType(); if (shortenTypes) { - return getName() + ": " + shorten(getType()) + " = " + getValue(); + type = shorten(type); } - return toString(); + return getName() + ": " + type + " = " + getValue(); } @Override diff --git a/zeppelin-web/package-lock.json b/zeppelin-web/package-lock.json index 82a8c7859b0..a2b2537581c 100644 --- a/zeppelin-web/package-lock.json +++ b/zeppelin-web/package-lock.json @@ -2018,7 +2018,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.2.9", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -3946,7 +3945,6 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -4967,535 +4965,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "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" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "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" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "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" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "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" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -8599,7 +8068,6 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -8851,528 +8319,272 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" - }, "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, "aproba": { "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } + "bundled": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } + "bundled": true }, "chownr": { "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "dev": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "dev": true + "bundled": true }, "core-util-is": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "debug": { "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.1.1" - } + "bundled": true }, "deep-extend": { "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "delegates": { "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.3.5" - } + "bundled": true }, "fs.realpath": { "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "gauge": { "version": "2.7.4", - "bundled": true, - "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" - } + "bundled": true }, "glob": { "version": "7.1.3", - "bundled": true, - "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" - } + "bundled": true }, "has-unicode": { "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "2.1.2" - } + "bundled": true }, "ignore-walk": { "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } + "bundled": true }, "inflight": { "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } + "bundled": true }, "inherits": { "version": "2.0.3", - "bundled": true, - "dev": true + "bundled": true }, "ini": { "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "bundled": true }, "isarray": { "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "minimatch": { "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } + "bundled": true }, "minimist": { "version": "0.0.8", - "bundled": true, - "dev": true + "bundled": true }, "minipass": { "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } + "bundled": true }, "minizlib": { "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "2.3.5" - } + "bundled": true }, "mkdirp": { "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } + "bundled": true }, "ms": { "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "needle": { "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" - } + "bundled": true }, "node-pre-gyp": { "version": "0.12.0", - "bundled": true, - "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" - } + "bundled": true }, "nopt": { "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" - } + "bundled": true }, "npm-bundled": { "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "npm-packlist": { "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" - } + "bundled": true }, "npmlog": { "version": "4.1.2", - "bundled": true, - "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" - } + "bundled": true }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "dev": true + "bundled": true }, "object-assign": { "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "once": { "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } + "bundled": true }, "os-homedir": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "osenv": { "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } + "bundled": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "rc": { "version": "1.2.8", "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true, - "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" - } + "bundled": true }, "rimraf": { "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "7.1.3" - } + "bundled": true }, "safe-buffer": { "version": "5.1.2", - "bundled": true, - "dev": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "sax": { "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "semver": { "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "string-width": { "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } + "bundled": true }, "string_decoder": { "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } + "bundled": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } + "bundled": true }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "tar": { "version": "4.4.8", - "bundled": true, - "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" - } + "bundled": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true + "bundled": true }, "wide-align": { "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } + "bundled": true }, "wrappy": { "version": "1.0.2", - "bundled": true, - "dev": true + "bundled": true }, "yallist": { "version": "3.0.3", - "bundled": true, - "dev": true + "bundled": true } } }, @@ -9562,9 +8774,7 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "normalize-path": { "version": "3.0.0", @@ -10769,13 +9979,6 @@ "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -15596,7 +14799,6 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -16516,7 +15718,6 @@ "anymatch": "2.0.0", "async-each": "1.0.1", "braces": "2.3.2", - "fsevents": "1.2.9", "glob-parent": "3.1.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", From eacb964e15f8be4040733c9d94b26bfe5a5e040c Mon Sep 17 00:00:00 2001 From: dkaznacheev Date: Mon, 11 Nov 2019 19:24:17 +0300 Subject: [PATCH 110/117] Added a comment about repl history records --- .../apache/zeppelin/kotlin/reflect/ContextUpdater.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index 30db9eab960..f7247d32956 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -93,6 +93,15 @@ private List getLines() { return lines; } + /* + ReplHistoryRecord class holds a pair of line ID and a compiled Line_N class. + This Line class is generated by Kotlin REPL compiler, its base class is Object + and it contains the functions and variables declared in the paragraph as its methods and fields. + For example, line "val i = 1" can be compiled to Line_0.class with field "public final int i" set to 1. + Note that when a new value is reassigned to variable in a separate paragraph, + REPL compiler does not change the value in a previously created field, + instead it creates a field with the same name in the new Line_(N+1) class. + */ private Object getLineFromRecord(ReplHistoryRecord> record) { Object statePair = record.getItem().getSecond(); return ((Pair) statePair).getSecond(); From 92f00af1d33b888b55696970c1e1d46b596a0760 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Tue, 12 Nov 2019 13:00:25 +0300 Subject: [PATCH 111/117] Fix comment --- .../zeppelin/kotlin/reflect/ContextUpdater.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index f7247d32956..e0a504c7c84 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -94,13 +94,14 @@ private List getLines() { } /* - ReplHistoryRecord class holds a pair of line ID and a compiled Line_N class. - This Line class is generated by Kotlin REPL compiler, its base class is Object - and it contains the functions and variables declared in the paragraph as its methods and fields. - For example, line "val i = 1" can be compiled to Line_0.class with field "public final int i" set to 1. - Note that when a new value is reassigned to variable in a separate paragraph, - REPL compiler does not change the value in a previously created field, - instead it creates a field with the same name in the new Line_(N+1) class. + ReplHistoryRecord class holds a pair of line ID and a compiled Line_N class. + This Line class is generated by Kotlin REPL compiler, its base class is Object + and it contains the functions and variables declared in the paragraph as its + methods and fields. For example, line "val i = 1" can be compiled to Line_0.class + with field "public final int i" set to 1. + Note that when a new value is reassigned to variable in a separate paragraph, + REPL compiler does not change the value in a previously created field, + instead it creates a field with the same name in the new Line_(N+1) class. */ private Object getLineFromRecord(ReplHistoryRecord> record) { Object statePair = record.getItem().getSecond(); From 7a5252d1374502a1a7b77ee2b9dbeb895147fd51 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Tue, 12 Nov 2019 13:03:43 +0300 Subject: [PATCH 112/117] Fix comment indentation --- .../kotlin/reflect/ContextUpdater.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java index e0a504c7c84..33c81d61caf 100644 --- a/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java +++ b/kotlin/src/main/java/org/apache/zeppelin/kotlin/reflect/ContextUpdater.java @@ -93,16 +93,16 @@ private List getLines() { return lines; } - /* - ReplHistoryRecord class holds a pair of line ID and a compiled Line_N class. - This Line class is generated by Kotlin REPL compiler, its base class is Object - and it contains the functions and variables declared in the paragraph as its - methods and fields. For example, line "val i = 1" can be compiled to Line_0.class - with field "public final int i" set to 1. - Note that when a new value is reassigned to variable in a separate paragraph, - REPL compiler does not change the value in a previously created field, - instead it creates a field with the same name in the new Line_(N+1) class. - */ + /* + ReplHistoryRecord class holds a pair of line ID and a compiled Line_N class. + This Line class is generated by Kotlin REPL compiler, its base class is Object + and it contains the functions and variables declared in the paragraph as its + methods and fields. For example, line "val i = 1" can be compiled to Line_0.class + with field "public final int i" set to 1. + Note that when a new value is reassigned to variable in a separate paragraph, + REPL compiler does not change the value in a previously created field, + instead it creates a field with the same name in the new Line_(N+1) class. + */ private Object getLineFromRecord(ReplHistoryRecord> record) { Object statePair = record.getItem().getSecond(); return ((Pair) statePair).getSecond(); From 347c9ebfd837693a5afd1101a900d0ceea58f063 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Wed, 13 Nov 2019 15:08:02 +0300 Subject: [PATCH 113/117] Fix KotlinSpark interpreter test for old versions of spark. --- .../apache/zeppelin/spark/KotlinSparkInterpreter.java | 10 +++++----- .../zeppelin/spark/KotlinSparkInterpreterTest.java | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java index 51c2d86fd39..45921803b88 100644 --- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java +++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/KotlinSparkInterpreter.java @@ -111,7 +111,7 @@ public void close() throws InterpreterException { public InterpreterResult interpret(String st, InterpreterContext context) throws InterpreterException { - if (isUnsupported()) { + if (isSparkVersionUnsupported()) { return unsupportedMessage; } @@ -136,7 +136,7 @@ public InterpreterResult interpret(String st, InterpreterContext context) @Override public void cancel(InterpreterContext context) throws InterpreterException { - if (isUnsupported()) { + if (isSparkVersionUnsupported()) { return; } jsc.cancelJobGroup(buildJobGroupId(context)); @@ -150,7 +150,7 @@ public FormType getFormType() throws InterpreterException { @Override public int getProgress(InterpreterContext context) throws InterpreterException { - if (isUnsupported()) { + if (isSparkVersionUnsupported()) { return 0; } return sparkInterpreter.getProgress(context); @@ -159,13 +159,13 @@ public int getProgress(InterpreterContext context) throws InterpreterException { @Override public List completion(String buf, int cursor, InterpreterContext interpreterContext) throws InterpreterException { - if (isUnsupported()) { + if (isSparkVersionUnsupported()) { return Collections.emptyList(); } return interpreter.completion(buf, cursor, interpreterContext); } - private boolean isUnsupported() { + boolean isSparkVersionUnsupported() { return unsupportedMessage != null; } diff --git a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java index bede68f7806..464c8f2df3a 100644 --- a/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java +++ b/spark/interpreter/src/test/java/org/apache/zeppelin/spark/KotlinSparkInterpreterTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock; import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Assume; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -159,6 +160,7 @@ public void expectUnsupportedError() { if (!sparkSupported) { exceptionRule.expect(UnsupportedClassVersionError.class); } + Assume.assumeFalse("Spark version should be >= 2.4.", interpreter.isSparkVersionUnsupported()); } @Test From 4358084895c1ca120daf5e06942bf2c457de0f63 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Thu, 14 Nov 2019 12:00:14 +0300 Subject: [PATCH 114/117] Include kotlin interpreter in zeppelin_server builds --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8b1a2a59904..ca2fce4a214 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,7 @@ services: env: global: # Interpreters does not required by zeppelin-server integration tests - - INTERPRETERS='!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!kotlin,!kylin,!lens,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql' + - INTERPRETERS='!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!kylin,!lens,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql' matrix: include: From ad2c1a916d75b254b48e569d507e5d3c7d55d75b Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Fri, 15 Nov 2019 16:46:46 +0300 Subject: [PATCH 115/117] Increased memory limits --- bin/common.sh | 2 +- spark/interpreter/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/common.sh b/bin/common.sh index 6447ec8daf9..0ebae660907 100644 --- a/bin/common.sh +++ b/bin/common.sh @@ -114,7 +114,7 @@ if [[ -z "${ZEPPELIN_MEM}" ]]; then fi if [[ -z "${ZEPPELIN_INTP_MEM}" ]]; then - export ZEPPELIN_INTP_MEM="-Xms1024m -Xmx1024m -XX:MaxPermSize=512m" + export ZEPPELIN_INTP_MEM="-Xms1024m -Xmx2048m -XX:MaxPermSize=512m" fi JAVA_OPTS+=" ${ZEPPELIN_JAVA_OPTS} -Dfile.encoding=${ZEPPELIN_ENCODING} ${ZEPPELIN_MEM}" diff --git a/spark/interpreter/pom.xml b/spark/interpreter/pom.xml index b58486ce402..6e5c67ab2b3 100644 --- a/spark/interpreter/pom.xml +++ b/spark/interpreter/pom.xml @@ -352,7 +352,7 @@ 1 false - -Xmx2048m -XX:MaxPermSize=256m + -Xmx3072m -XX:MaxPermSize=256m **/SparkRInterpreterTest.java ${pyspark.test.exclude} From 9d5b6a3d796722b18748cec95afb6265afc8dbc0 Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Sat, 16 Nov 2019 02:16:31 +0300 Subject: [PATCH 116/117] Temporary fix for hadoop_lzo --- scalding/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scalding/pom.xml b/scalding/pom.xml index 663ad581b3e..4120d31ebc8 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -55,6 +55,13 @@ Twitter Maven Repo https://maven.twttr.com + + + + bintray-ileasile-artifacts-missing_jars + bintray + https://ileasile-artifacts.bintray.com/missing_jars + From ad0380f3f653f3c528b012c695bfd50ec1947c5b Mon Sep 17 00:00:00 2001 From: Ilya Muradyan Date: Mon, 18 Nov 2019 16:22:37 +0300 Subject: [PATCH 117/117] Changed hadoop-lzo repo and added Kotlin test --- .travis.yml | 4 ++-- scalding/pom.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ca2fce4a214..6956c4a7ee2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -106,13 +106,13 @@ matrix: - sudo: required jdk: "openjdk8" dist: xenial - env: BUILD_PLUGINS="true" PYTHON="3" SCALA_VER="2.11" PROFILE="-Pspark-2.4 -Pspark-scala-2.11 -Phadoop2 -Pintegration" SPARKR="true" BUILD_FLAG="install -DskipTests -DskipRat -am" TEST_FLAG="test -DskipRat -am" MODULES="-pl zeppelin-interpreter-integration,jdbc,zeppelin-web,spark/spark-dependencies,markdown" TEST_PROJECTS="-Dtest=ZeppelinSparkClusterTest24,SparkIntegrationTest24,JdbcIntegrationTest,org.apache.zeppelin.spark.* -DfailIfNoTests=false" + env: BUILD_PLUGINS="true" PYTHON="3" SCALA_VER="2.11" PROFILE="-Pspark-2.4 -Pspark-scala-2.11 -Phadoop2 -Pintegration" SPARKR="true" BUILD_FLAG="install -DskipTests -DskipRat -am" TEST_FLAG="test -DskipRat -am" MODULES="-pl zeppelin-interpreter-integration,jdbc,zeppelin-web,spark/spark-dependencies,markdown" TEST_PROJECTS="-Dtest=ZeppelinSparkClusterTest24,SparkIntegrationTest24,JdbcIntegrationTest,org.apache.zeppelin.spark.*,org.apache.zeppelin.kotlin.* -DfailIfNoTests=false" # ZeppelinSparkClusterTest24, SparkIntegrationTest24, JdbcIntegrationTest, Unit test of Spark 2.4 (Scala-2.12) - sudo: required jdk: "openjdk8" dist: xenial - env: BUILD_PLUGINS="true" PYTHON="3" SCALA_VER="2.12" PROFILE="-Pspark-2.4 -Pspark-scala-2.12 -Phadoop2 -Pintegration" SPARKR="true" BUILD_FLAG="install -DskipTests -DskipRat -am" TEST_FLAG="test -DskipRat -am" MODULES="-pl zeppelin-interpreter-integration,jdbc,zeppelin-web,spark/spark-dependencies,markdown" TEST_PROJECTS="-Dtest=ZeppelinSparkClusterTest24,SparkIntegrationTest24,JdbcIntegrationTest,org.apache.zeppelin.spark.* -DfailIfNoTests=false" + env: BUILD_PLUGINS="true" PYTHON="3" SCALA_VER="2.12" PROFILE="-Pspark-2.4 -Pspark-scala-2.12 -Phadoop2 -Pintegration" SPARKR="true" BUILD_FLAG="install -DskipTests -DskipRat -am" TEST_FLAG="test -DskipRat -am" MODULES="-pl zeppelin-interpreter-integration,jdbc,zeppelin-web,spark/spark-dependencies,markdown" TEST_PROJECTS="-Dtest=ZeppelinSparkClusterTest24,SparkIntegrationTest24,JdbcIntegrationTest,org.apache.zeppelin.spark.*,org.apache.zeppelin.kotlin.* -DfailIfNoTests=false" # ZeppelinSparkClusterTest23, SparkIntegrationTest23, Unit test of Spark 2.3 (Scala-2.11) and Unit test PythonInterpreter under python2 - sudo: required diff --git a/scalding/pom.xml b/scalding/pom.xml index 4120d31ebc8..e361810fe9d 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -58,9 +58,9 @@ - bintray-ileasile-artifacts-missing_jars + zeppelin-dependencies bintray - https://ileasile-artifacts.bintray.com/missing_jars + https://jetbrains.bintray.com/zeppelin-dependencies