From 3fb4f79610b6b7baf8ab2ca516543e5d48496751 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Mon, 8 Feb 2021 18:49:57 +0100 Subject: [PATCH 01/11] replace dottydoc with scaladoc --- build.sbt | 4 +- project/Build.scala | 344 ++++++++++++++++++-------------------------- 2 files changed, 143 insertions(+), 205 deletions(-) diff --git a/build.sbt b/build.sbt index f4701a1034bf..bb38cd7418cb 100644 --- a/build.sbt +++ b/build.sbt @@ -1,8 +1,6 @@ val scala3 = Build.scala3 val `scala3-bootstrapped` = Build.`scala3-bootstrapped` val `scala3-interfaces` = Build.`scala3-interfaces` -val `scala3-doc` = Build.`scala3-doc` -val `scala3-doc-bootstrapped` = Build.`scala3-doc-bootstrapped` val `scala3-compiler` = Build.`scala3-compiler` val `scala3-compiler-bootstrapped` = Build.`scala3-compiler-bootstrapped` val `scala3-library` = Build.`scala3-library` @@ -12,6 +10,7 @@ val `scala3-sbt-bridge` = Build.`scala3-sbt-bridge` val `scala3-sbt-bridge-tests` = Build.`scala3-sbt-bridge-tests` val `scala3-staging` = Build.`scala3-staging` val `scala3-tasty-inspector` = Build.`scala3-tasty-inspector` +val `scala3-tasty-inspector-nonbootstrapped` = Build.`scala3-tasty-inspector-nonbootstrapped` val `scala3-language-server` = Build.`scala3-language-server` val `scala3-bench` = Build.`scala3-bench` val `scala3-bench-bootstrapped` = Build.`scala3-bench-bootstrapped` @@ -21,6 +20,7 @@ val `tasty-core` = Build.`tasty-core` val `tasty-core-bootstrapped` = Build.`tasty-core-bootstrapped` val `tasty-core-scala2` = Build.`tasty-core-scala2` val scaladoc = Build.scaladoc +val `scaladoc-nonBootstrapped` = Build.`scaladoc-nonBootstrapped` val `scaladoc-testcases` = Build.`scaladoc-testcases` val `scaladoc-js` = Build.`scaladoc-js` val `scala3-bench-run` = Build.`scala3-bench-run` diff --git a/project/Build.scala b/project/Build.scala index 79c9f1500f60..199c84e2618d 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -124,10 +124,7 @@ object Build { val scala = inputKey[Unit]("run compiled binary using the correct classpath, or the user supplied classpath") // Compiles the documentation and static site - val genDocs = inputKey[Unit]("run dottydoc to generate static documentation site") - - // Shorthand for compiling a docs site - val dottydoc = inputKey[Unit]("run dottydoc") + val genDocs = inputKey[Unit]("run scaladoc to generate static documentation site") // Only available in vscode-dotty val unpublish = taskKey[Unit]("Unpublish a package") @@ -224,9 +221,7 @@ object Build { ) lazy val disableDocSetting = - // Disable scaladoc generation, it's way too slow and we'll replace it - // by dottydoc anyway. We still publish an empty -javadoc.jar to make - // sonatype happy. + // This is a legacy settings, we should reevalute generating javadocs sources in (Compile, doc) := Seq() lazy val commonSettings = publishSettings ++ Seq( @@ -317,7 +312,7 @@ object Build { // Compile using the non-bootstrapped and non-published dotty managedScalaInstance := false, scalaInstance := { - val externalNonBootstrappedDeps = externalDependencyClasspath.in(`scala3-doc`, Compile).value + val externalNonBootstrappedDeps = externalDependencyClasspath.in(`scaladoc-nonBootstrapped`, Compile).value val scalaLibrary = findArtifact(externalNonBootstrappedDeps, "scala-library") // IMPORTANT: We need to use actual jars to form the ScalaInstance and not @@ -329,9 +324,9 @@ object Build { val dottyLibrary = packageBin.in(`scala3-library`, Compile).value val dottyInterfaces = packageBin.in(`scala3-interfaces`, Compile).value val dottyCompiler = packageBin.in(`scala3-compiler`, Compile).value - val dottyDoc = packageBin.in(`scala3-doc`, Compile).value + val scaladoc = packageBin.in(`scaladoc-nonBootstrapped`, Compile).value - val allJars = Seq(tastyCore, dottyLibrary, dottyInterfaces, dottyCompiler, dottyDoc) ++ externalNonBootstrappedDeps.map(_.data) + val allJars = Seq(tastyCore, dottyLibrary, dottyInterfaces, dottyCompiler, scaladoc) ++ externalNonBootstrappedDeps.map(_.data) makeScalaInstance( state.value, @@ -376,83 +371,6 @@ object Build { lazy val `scala3-interfaces` = project.in(file("interfaces")). settings(commonJavaSettings) - private lazy val dottydocClasspath = Def.task { - val jars = (packageAll in `scala3-compiler`).value - val dottyLib = jars("scala3-library") - val otherDeps = (dependencyClasspath in Compile).value.map(_.data).mkString(File.pathSeparator) - val externalDeps = externalCompilerClasspathTask.value - dottyLib + File.pathSeparator + findArtifactPath(externalDeps, "scala-library") - } - - lazy val commonDocSettings = Seq( - baseDirectory in (Compile, run) := baseDirectory.value / "..", - baseDirectory in Test := baseDirectory.value / "..", - libraryDependencies ++= { - val flexmarkVersion = "0.42.12" - Seq( - "com.vladsch.flexmark" % "flexmark" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-gfm-tasklist" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-gfm-tables" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-autolink" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-anchorlink" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-emoji" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-gfm-strikethrough" % flexmarkVersion, - "com.vladsch.flexmark" % "flexmark-ext-yaml-front-matter" % flexmarkVersion, - Dependencies.`jackson-dataformat-yaml`, - "nl.big-o" % "liqp" % "0.6.7" - ) - } - ) - - def dottyDocSettings(implicit mode: Mode) = Seq( - connectInput in run := true, - - javaOptions ++= (javaOptions in `scala3-compiler`).value, - - javaOptions += "-Xss3m", - - genDocs := Def.inputTaskDyn { - val dottydocExtraArgs = spaceDelimited("").parsed - - // Make majorVersion available at dotty.epfl.ch/versions/latest-nightly-base - // Used by sbt-dotty to resolve the latest nightly - val majorVersion = (scalaBinaryVersion in LocalProject("scala3-library-bootstrapped")).value - IO.write(file("./docs/_site/versions/latest-nightly-base"), majorVersion) - - // This file is used by GitHub Pages when the page is available in a custom domain - IO.write(file("./docs/_site/CNAME"), "dotty.epfl.ch") - - val sources = unmanagedSources.in(dottyLibrary, Compile).value - val args = Seq( - "-siteroot", "docs", - "-project", "Dotty", - "-project-version", dottyVersion, - "-project-url", dottyGithubUrl, - "-project-logo", "scala3-logo.svg", - "-classpath", dottydocClasspath.value, - "-Yerased-terms" - ) ++ dottydocExtraArgs - (runMain in Compile).toTask( - s""" dotty.tools.dottydoc.Main ${args.mkString(" ")} ${sources.mkString(" ")}""" - ) - }.evaluated, - - dottydoc := Def.inputTaskDyn { - val args = spaceDelimited("").parsed - val cp = dottydocClasspath.value - - (runMain in Compile).toTask(s" dotty.tools.dottydoc.Main -classpath $cp " + args.mkString(" ")) - }.evaluated, - ) - - lazy val `scala3-doc` = project.in(file("doc-tool")).asDottyDoc(NonBootstrapped) - lazy val `scala3-doc-bootstrapped` = project.in(file("doc-tool")).asDottyDoc(Bootstrapped) - - def dottyDoc(implicit mode: Mode): Project = mode match { - case NonBootstrapped => `scala3-doc` - case Bootstrapped => `scala3-doc-bootstrapped` - } - /** Find an artifact with the given `name` in `classpath` */ def findArtifact(classpath: Def.Classpath, name: String): File = classpath .find(_.get(artifact.key).exists(_.name == name)) @@ -835,6 +753,17 @@ object Build { javaOptions := (javaOptions in `scala3-compiler-bootstrapped`).value ) + lazy val `scala3-tasty-inspector-nonbootstrapped` = project.in(file("tasty-inspector")). + withCommonSettings(NonBootstrapped). + // We want the compiler to be present in the compiler classpath when compiling this project but not + // when compiling a project that depends on scala3-tasty-inspector (see sbt-dotty/sbt-test/sbt-dotty/tasty-inspector-example-project), + // but we always need it to be present on the JVM classpath at runtime. + dependsOn(dottyCompiler(NonBootstrapped) % "provided; compile->runtime; test->test"). + settings(commonNonBootstrappedSettings). + settings( + javaOptions := (javaOptions in `scala3-compiler`).value + ) + /** Scala library compiled by dotty using the latest published sources of the library */ lazy val `stdlib-bootstrapped` = project.in(file("stdlib-bootstrapped")). withCommonSettings(Bootstrapped). @@ -947,7 +876,7 @@ object Build { lazy val `scala3-sbt-bridge` = project.in(file("sbt-bridge/src")). // We cannot depend on any bootstrapped project to compile the bridge, since the // bridge is needed to compile these projects. - dependsOn(dottyDoc(NonBootstrapped) % Provided). + dependsOn(`scaladoc-nonBootstrapped` % Provided). settings(commonJavaSettings). settings( description := "sbt compiler bridge for Dotty", @@ -1230,6 +1159,10 @@ object Build { val generateScalaDocumentation = inputKey[Unit]("Generate documentation for dotty lib") val generateTestcasesDocumentation = taskKey[Unit]("Generate documentation for testcases, usefull for debugging tests") lazy val `scaladoc` = project.in(file("scaladoc")).asScaladoc + lazy val `scaladoc-nonBootstrapped` = project.in(file("scaladoc")).scaladocBasic(NonBootstrapped).settings( + sources.in(Test) := Nil + ) + lazy val `scaladoc-testcases` = project.in(file("scaladoc-testcases")).asScaladocTestcases lazy val `scaladoc-js` = project.in(file("scaladoc-js")).asScaladocJs @@ -1279,7 +1212,6 @@ object Build { publishLocal in `tasty-core-bootstrapped`, publishLocal in `scala3-staging`, publishLocal in `scala3-tasty-inspector`, - publishLocal in `scala3-doc-bootstrapped`, publishLocal in `scaladoc`, publishLocal in `scala3-bootstrapped` // Needed because sbt currently hardcodes the dotty artifact ).evaluated @@ -1349,7 +1281,6 @@ object Build { (publishLocal in `scala3-interfaces`).value (publishLocal in `tasty-core-bootstrapped`).value (publishLocal in `scala3-library-bootstrapped`).value - (publishLocal in `scala3-doc-bootstrapped`).value (publishLocal in `scala3-tasty-inspector`).value (publishLocal in `scaladoc`).value (publishLocal in `scala3-compiler-bootstrapped`).value @@ -1482,7 +1413,7 @@ object Build { // FIXME: we do not aggregate `bin` because its tests delete jars, thus breaking other tests def asDottyRoot(implicit mode: Mode): Project = project.withCommonSettings. - aggregate(`scala3-interfaces`, dottyLibrary, dottyCompiler, tastyCore, dottyDoc, `scala3-sbt-bridge`). + aggregate(`scala3-interfaces`, dottyLibrary, dottyCompiler, tastyCore, scaladoc, `scala3-sbt-bridge`). bootstrappedAggregate(`scala3-language-server`, `scala3-staging`, `scala3-tasty-inspector`, `scala3-library-bootstrappedJS`, scaladoc). dependsOn(tastyCore). @@ -1521,38 +1452,24 @@ object Build { def asTastyCoreScala2: Project = project.settings(commonScala2Settings) - def asDottyDoc(implicit mode: Mode): Project = project.withCommonSettings. - dependsOn(dottyCompiler, dottyCompiler % "test->test"). - settings(commonDocSettings). - settings(dottyDocSettings) - def asDottyBench(implicit mode: Mode): Project = project.withCommonSettings. dependsOn(dottyCompiler). settings(commonBenchmarkSettings). enablePlugins(JmhPlugin) - def asScaladoc: Project = { - def generateDocumentation(targets: String, name: String, outDir: String, ref: String, params: String = "") = Def.taskDyn { - val projectVersion = version.value - IO.createDirectory(file(outDir)) - val scala3version = stdlibVersion(Bootstrapped) - // TODO add versions etc. - val srcManaged = s"out/bootstrap/stdlib-bootstrapped/scala-$baseVersion/src_managed/main/scala-library-src" - val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library -source-links:github://lampepfl/dotty" - val revision = s"-revision $ref -project-version $projectVersion" - val cmd = s""" -d $outDir -project "$name" $sourceLinks $revision $params $targets""" - run.in(Compile).toTask(cmd) - } - - def joinProducts(products: Seq[java.io.File]): String = - products.iterator.map(_.getAbsolutePath.toString).mkString(" ") - + def scaladocBasic(mode: Mode): Project = { val flexmarkVersion = "0.42.12" - project.settings(commonBootstrappedSettings). - dependsOn(`scala3-compiler-bootstrapped`). - dependsOn(`scala3-tasty-inspector`). - settings( + val base = if(mode == Bootstrapped) + project.settings(commonBootstrappedSettings). + dependsOn(`scala3-compiler-bootstrapped`). + dependsOn(`scala3-tasty-inspector`) + else + project.settings(commonNonBootstrappedSettings). + dependsOn(`scala3-compiler`). + dependsOn(`scala3-tasty-inspector-nonbootstrapped`) + + base.settings( libraryDependencies ++= Seq( "com.vladsch.flexmark" % "flexmark" % flexmarkVersion, "com.vladsch.flexmark" % "flexmark-html-parser" % flexmarkVersion, @@ -1570,100 +1487,121 @@ object Build { "com.novocode" % "junit-interface" % "0.11" % "test", ), - Test / test := (Test / test).dependsOn(compile.in(Compile).in(`scaladoc-testcases`)).value, - testcasesOutputDir.in(Test) := joinProducts((`scaladoc-testcases`/Compile/products).value), - testcasesSourceRoot.in(Test) := (baseDirectory.in(`scaladoc-testcases`).value / "src").getAbsolutePath.toString, Compile / mainClass := Some("dotty.tools.scaladoc.Main"), - baseDirectory.in(run) := baseDirectory.in(ThisBuild).value, - generateSelfDocumentation := Def.taskDyn { - generateDocumentation( - classDirectory.in(Compile).value.getAbsolutePath, - "scaladoc", "scaladoc/output/self", VersionUtil.gitHash, - "-siteroot scaladoc/documentation -project-logo scaladoc/documentation/logo.svg " + - "-external-mappings:" + - ".*scala.*::scaladoc3::http://dotty.epfl.ch/api/," + - ".*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/" - ) - }.value, - - generateScalaDocumentation := Def.inputTaskDyn { - val dottydocExtraArgs = spaceDelimited("[output]").parsed - val dest = file(dottydocExtraArgs.headOption.getOrElse("scaladoc/output/scala3")).getAbsoluteFile - val majorVersion = (scalaBinaryVersion in LocalProject("scala3-library-bootstrapped")).value - - val dottyJars: Seq[java.io.File] = Seq( - (`stdlib-bootstrapped`/Compile/products).value, - (`scala3-interfaces`/Compile/products).value, - (`tasty-core-bootstrapped`/Compile/products).value, - ).flatten - - val roots = joinProducts(dottyJars) - - val managedSources = - (`stdlib-bootstrapped`/Compile/sourceManaged).value / "scala-library-src" - val projectRoot = (ThisBuild/baseDirectory).value.toPath - val stdLibRoot = projectRoot.relativize(managedSources.toPath.normalize()) - val docRootFile = stdLibRoot.resolve("rootdoc.txt") - - if (dottyJars.isEmpty) Def.task { streams.value.log.error("Dotty lib wasn't found") } - else Def.task{ - IO.write(dest / "versions" / "latest-nightly-base", majorVersion) - - // This file is used by GitHub Pages when the page is available in a custom domain - IO.write(dest / "CNAME", "dotty.epfl.ch") - }.dependsOn(generateDocumentation( - roots, "Scala 3", dest.getAbsolutePath, "master", - // contains special definitions which are "transplanted" elsewhere - // and which therefore confuse Scaladoc when accessed from this pkg - "-skip-by-id:scala.runtime.stdLibPatches " + - // MatchCase is a special type that represents match type cases, - // Reflect doesn't expect to see it as a standalone definition - // and therefore it's easier just not to document it - "-skip-by-id:scala.runtime.MatchCase " + - "-skip-by-regex:.+\\.internal($|\\..+) " + - "-skip-by-regex:.+\\.impl($|\\..+) " + - "-comment-syntax wiki -siteroot docs -project-logo docs/logo.svg " + - "-external-mappings:.*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/ " + - "-social-links:github::https://github.com/lampepfl/dotty," + - "gitter::https://gitter.im/scala/scala," + - "twitter::https://twitter.com/scala_lang " + - s"-source-links:$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library " + - s"-doc-root-content $docRootFile" - )) - }.evaluated, - - generateTestcasesDocumentation := Def.taskDyn { - generateDocumentation(Build.testcasesOutputDir.in(Test).value, "scaladoc testcases", "scaladoc/output/testcases", "master") - }.value, - - buildInfoKeys in Test := Seq[BuildInfoKey]( - Build.testcasesOutputDir.in(Test), - Build.testcasesSourceRoot.in(Test), - Build.testDocumentationRoot, - ), Compile / buildInfoKeys := Seq[BuildInfoKey](version), Compile / buildInfoPackage := "dotty.tools.scaladoc", - Compile / resourceGenerators += Def.task { - val jsDestinationFile = (Compile / resourceManaged).value / "dotty_res" / "scripts" / "searchbar.js" - sbt.IO.copyFile((fullOptJS in Compile in `scaladoc-js`).value.data, jsDestinationFile) - Seq(jsDestinationFile) - }.taskValue, - Compile / resourceGenerators += Def.task { - val cssDesitnationFile = (Compile / resourceManaged).value / "dotty_res" / "styles" / "scaladoc-searchbar.css" - val cssSourceFile = (resourceDirectory in Compile in `scaladoc-js`).value / "scaladoc-searchbar.css" - FileFunction.cached(streams.value.cacheDirectory / "css-cache") { (in: Set[File]) => - in.headOption.map(sbt.IO.copyFile(_, cssDesitnationFile)) - Set(cssDesitnationFile) - }.apply(Set(cssSourceFile)).toSeq - }.taskValue, - testDocumentationRoot := (baseDirectory.value / "test-documentations").getAbsolutePath, - buildInfoPackage in Test := "dotty.tools.scaladoc.test", - BuildInfoPlugin.buildInfoScopedSettings(Test), BuildInfoPlugin.buildInfoScopedSettings(Compile), BuildInfoPlugin.buildInfoDefaultSettings, ) } + def asScaladoc: Project = { + def generateDocumentation(targets: String, name: String, outDir: String, ref: String, params: String = "") = Def.taskDyn { + val projectVersion = version.value + IO.createDirectory(file(outDir)) + val scala3version = stdlibVersion(Bootstrapped) + // TODO add versions etc. + val srcManaged = s"out/bootstrap/stdlib-bootstrapped/scala-$baseVersion/src_managed/main/scala-library-src" + val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library -source-links:github://lampepfl/dotty" + val revision = s"-revision $ref -project-version $projectVersion" + val cmd = s""" -d $outDir -project "$name" $sourceLinks $revision $params $targets""" + run.in(Compile).toTask(cmd) + } + + def joinProducts(products: Seq[java.io.File]): String = + products.iterator.map(_.getAbsolutePath.toString).mkString(" ") + + val flexmarkVersion = "0.42.12" + + scaladocBasic(Bootstrapped).settings( + Test / test := (Test / test).dependsOn(compile.in(Compile).in(`scaladoc-testcases`)).value, + testcasesOutputDir.in(Test) := joinProducts((`scaladoc-testcases`/Compile/products).value), + testcasesSourceRoot.in(Test) := (baseDirectory.in(`scaladoc-testcases`).value / "src").getAbsolutePath.toString, + baseDirectory.in(run) := baseDirectory.in(ThisBuild).value, + generateSelfDocumentation := Def.taskDyn { + generateDocumentation( + classDirectory.in(Compile).value.getAbsolutePath, + "scaladoc", "scaladoc/output/self", VersionUtil.gitHash, + "-siteroot scaladoc/documentation -project-logo scaladoc/documentation/logo.svg " + + "-external-mappings:" + + ".*scala.*::scaladoc3::http://dotty.epfl.ch/api/," + + ".*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/" + ) + }.value, + generateScalaDocumentation := Def.inputTaskDyn { + val extraArgs = spaceDelimited("[output]").parsed + val dest = file(extraArgs.headOption.getOrElse("scaladoc/output/scala3")).getAbsoluteFile + val majorVersion = (scalaBinaryVersion in LocalProject("scala3-library-bootstrapped")).value + + val dottyJars: Seq[java.io.File] = Seq( + (`stdlib-bootstrapped`/Compile/products).value, + (`scala3-interfaces`/Compile/products).value, + (`tasty-core-bootstrapped`/Compile/products).value, + ).flatten + + val roots = joinProducts(dottyJars) + + val managedSources = + (`stdlib-bootstrapped`/Compile/sourceManaged).value / "scala-library-src" + val projectRoot = (ThisBuild/baseDirectory).value.toPath + val stdLibRoot = projectRoot.relativize(managedSources.toPath.normalize()) + val docRootFile = stdLibRoot.resolve("rootdoc.txt") + + if (dottyJars.isEmpty) Def.task { streams.value.log.error("Dotty lib wasn't found") } + else Def.task{ + IO.write(dest / "versions" / "latest-nightly-base", majorVersion) + + // This file is used by GitHub Pages when the page is available in a custom domain + IO.write(dest / "CNAME", "dotty.epfl.ch") + }.dependsOn(generateDocumentation( + roots, "Scala 3", dest.getAbsolutePath, "master", + // contains special definitions which are "transplanted" elsewhere + // and which therefore confuse Scaladoc when accessed from this pkg + "-skip-by-id:scala.runtime.stdLibPatches " + + // MatchCase is a special type that represents match type cases, + // Reflect doesn't expect to see it as a standalone definition + // and therefore it's easier just not to document it + "-skip-by-id:scala.runtime.MatchCase " + + "-skip-by-regex:.+\\.internal($|\\..+) " + + "-skip-by-regex:.+\\.impl($|\\..+) " + + "-comment-syntax wiki -siteroot docs -project-logo docs/logo.svg " + + "-external-mappings:.*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/ " + + "-social-links:github::https://github.com/lampepfl/dotty," + + "gitter::https://gitter.im/scala/scala," + + "twitter::https://twitter.com/scala_lang " + + s"-source-links:$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library " + + s"-doc-root-content $docRootFile" + )) + }.evaluated, + + generateTestcasesDocumentation := Def.taskDyn { + generateDocumentation(Build.testcasesOutputDir.in(Test).value, "scaladoc testcases", "scaladoc/output/testcases", "master") + }.value, + + buildInfoKeys in Test := Seq[BuildInfoKey]( + Build.testcasesOutputDir.in(Test), + Build.testcasesSourceRoot.in(Test), + Build.testDocumentationRoot, + ), + Compile / resourceGenerators += Def.task { + val jsDestinationFile = (Compile / resourceManaged).value / "dotty_res" / "scripts" / "searchbar.js" + sbt.IO.copyFile((fullOptJS in Compile in `scaladoc-js`).value.data, jsDestinationFile) + Seq(jsDestinationFile) + }.taskValue, + Compile / resourceGenerators += Def.task { + val cssDesitnationFile = (Compile / resourceManaged).value / "dotty_res" / "styles" / "scaladoc-searchbar.css" + val cssSourceFile = (resourceDirectory in Compile in `scaladoc-js`).value / "scaladoc-searchbar.css" + FileFunction.cached(streams.value.cacheDirectory / "css-cache") { (in: Set[File]) => + in.headOption.map(sbt.IO.copyFile(_, cssDesitnationFile)) + Set(cssDesitnationFile) + }.apply(Set(cssSourceFile)).toSeq + }.taskValue, + testDocumentationRoot := (baseDirectory.value / "test-documentations").getAbsolutePath, + buildInfoPackage in Test := "dotty.tools.scaladoc.test", + BuildInfoPlugin.buildInfoScopedSettings(Test), + ) + } + def asScaladocTestcases: Project = project.dependsOn(`scala3-compiler-bootstrapped`).settings(commonBootstrappedSettings) @@ -1681,7 +1619,7 @@ object Build { def asDist(implicit mode: Mode): Project = project. enablePlugins(PackPlugin). withCommonSettings. - dependsOn(`scala3-interfaces`, dottyCompiler, dottyLibrary, tastyCore, `scala3-staging`, `scala3-tasty-inspector`, dottyDoc). + dependsOn(`scala3-interfaces`, dottyCompiler, dottyLibrary, tastyCore, `scala3-staging`, `scala3-tasty-inspector`, scaladoc). settings(commonDistSettings). bootstrappedSettings( target := baseDirectory.value / "target" // override setting in commonBootstrappedSettings From 0f78f739dd31ba095f19d32707315d94469ae9f9 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Mon, 8 Feb 2021 18:50:58 +0100 Subject: [PATCH 02/11] remove dotty doc code --- doc-tool/bootstrap-theme/build.sh | 16 - doc-tool/bootstrap-theme/package-lock.json | 4544 ----------------- doc-tool/bootstrap-theme/package.json | 20 - doc-tool/bootstrap-theme/theme.scss | 99 - doc-tool/resources/_includes/header.html | 1 - doc-tool/resources/_includes/sidebar.html | 44 - doc-tool/resources/_includes/toolbar.html | 39 - doc-tool/resources/_layouts/api-page.html | 230 - doc-tool/resources/_layouts/base.html | 38 - doc-tool/resources/_layouts/blog-page.html | 35 - doc-tool/resources/_layouts/doc-page.html | 15 - doc-tool/resources/_layouts/index.html | 4 - doc-tool/resources/_layouts/main.html | 20 - doc-tool/resources/_layouts/search.html | 197 - doc-tool/resources/css/bootstrap.min.css | 1 - doc-tool/resources/css/color-brewer.css | 66 - doc-tool/resources/css/dottydoc.css | 268 - doc-tool/resources/css/search.css | 36 - doc-tool/resources/css/sidebar.css | 149 - doc-tool/resources/css/toolbar.css | 98 - .../resources/images/scala-logo-white.svg | 13 - doc-tool/resources/images/scala-logo.svg | 13 - .../resources/images/scala3-logo-white.svg | 30 - doc-tool/resources/images/scala3-logo.svg | 30 - doc-tool/resources/index.md | 5 - doc-tool/resources/js/api-search.js | 93 - doc-tool/resources/js/bootstrap.min.js | 7 - doc-tool/resources/js/dottydoc.js | 10 - doc-tool/resources/js/highlight.pack.js | 2 - doc-tool/resources/js/jquery.min.js | 2 - doc-tool/resources/js/sidebar.js | 6 - doc-tool/resources/js/toolbar.js | 20 - .../dotty/tools/dottydoc/DocCompiler.scala | 77 - .../src/dotty/tools/dottydoc/DocDriver.scala | 81 - doc-tool/src/dotty/tools/dottydoc/Main.scala | 5 - .../core/AlternateConstructorsPhase.scala | 34 - .../tools/dottydoc/core/ContextDottydoc.scala | 136 - .../tools/dottydoc/core/DocASTPhase.scala | 256 - .../dottydoc/core/DocImplicitsPhase.scala | 26 - .../tools/dottydoc/core/DocstringPhase.scala | 74 - .../dottydoc/core/LinkCompanionsPhase.scala | 42 - .../dottydoc/core/PackageObjectsPhase.scala | 30 - .../core/RemoveEmptyPackagesPhase.scala | 15 - .../dottydoc/core/SortMembersPhase.scala | 55 - .../tools/dottydoc/core/StatisticsPhase.scala | 156 - .../dottydoc/core/TypeLinkingPhases.scala | 119 - .../tools/dottydoc/core/UsecasePhase.scala | 38 - .../dotty/tools/dottydoc/core/transform.scala | 234 - .../tools/dottydoc/model/JavaConverters.scala | 299 -- .../dottydoc/model/comment/BodyEntities.scala | 94 - .../dottydoc/model/comment/Comment.scala | 173 - .../model/comment/CommentCleaner.scala | 26 - .../model/comment/CommentParser.scala | 243 - .../dottydoc/model/comment/CommentRegex.scala | 84 - .../dottydoc/model/comment/HtmlParsers.scala | 154 - .../model/comment/MarkdownShortener.scala | 84 - .../dottydoc/model/comment/WikiParser.scala | 550 -- .../dotty/tools/dottydoc/model/entities.scala | 127 - .../tools/dottydoc/model/factories.scala | 218 - .../dotty/tools/dottydoc/model/internal.scala | 130 - .../tools/dottydoc/model/references.scala | 30 - .../tools/dottydoc/staticsite/BlogPost.scala | 64 - .../dottydoc/staticsite/DefaultParams.scala | 132 - .../dottydoc/staticsite/MapOperations.scala | 25 - .../staticsite/MarkdownCodeBlockVisitor.scala | 20 - .../staticsite/MarkdownLinkVisitor.scala | 46 - .../tools/dottydoc/staticsite/Page.scala | 180 - .../dottydoc/staticsite/ResourceFinder.scala | 16 - .../tools/dottydoc/staticsite/Site.scala | 456 -- .../tools/dottydoc/staticsite/Template.scala | 135 - .../dotty/tools/dottydoc/staticsite/Yaml.java | 23 - .../tools/dottydoc/staticsite/filters.scala | 79 - .../tools/dottydoc/staticsite/tags.scala | 242 - .../tools/dottydoc/util/MemberLookup.scala | 89 - .../tools/dottydoc/util/internal/mutate.scala | 70 - .../dotty/tools/dottydoc/util/syntax.scala | 26 - .../tools/dottydoc/util/traversing.scala | 43 - .../tools/dottydoc/CommentCleanerTest.scala | 83 - .../tools/dottydoc/ConstructorTest.scala | 196 - .../dotty/tools/dottydoc/DottyDocTest.scala | 151 - .../test/dotty/tools/dottydoc/GenDocs.scala | 37 - .../tools/dottydoc/JavaConverterTest.scala | 319 -- .../dotty/tools/dottydoc/MarkdownTests.scala | 311 -- .../tools/dottydoc/PackageStructure.scala | 108 - .../dotty/tools/dottydoc/SettingsTests.scala | 18 - .../dotty/tools/dottydoc/SimpleComments.scala | 74 - .../dotty/tools/dottydoc/SourceUtil.scala | 18 - .../dotty/tools/dottydoc/TypeRendering.scala | 51 - .../dotty/tools/dottydoc/UsecaseTest.scala | 269 - .../tools/dottydoc/staticsite/PageTests.scala | 102 - .../tools/dottydoc/staticsite/SiteTests.scala | 116 - .../dottydoc/staticsite/SourceFileOps.scala | 59 - .../staticsite/TemplateErrorTests.scala | 32 - 93 files changed, 13331 deletions(-) delete mode 100755 doc-tool/bootstrap-theme/build.sh delete mode 100644 doc-tool/bootstrap-theme/package-lock.json delete mode 100644 doc-tool/bootstrap-theme/package.json delete mode 100644 doc-tool/bootstrap-theme/theme.scss delete mode 100644 doc-tool/resources/_includes/header.html delete mode 100644 doc-tool/resources/_includes/sidebar.html delete mode 100644 doc-tool/resources/_includes/toolbar.html delete mode 100644 doc-tool/resources/_layouts/api-page.html delete mode 100644 doc-tool/resources/_layouts/base.html delete mode 100644 doc-tool/resources/_layouts/blog-page.html delete mode 100644 doc-tool/resources/_layouts/doc-page.html delete mode 100644 doc-tool/resources/_layouts/index.html delete mode 100644 doc-tool/resources/_layouts/main.html delete mode 100644 doc-tool/resources/_layouts/search.html delete mode 100644 doc-tool/resources/css/bootstrap.min.css delete mode 100644 doc-tool/resources/css/color-brewer.css delete mode 100644 doc-tool/resources/css/dottydoc.css delete mode 100644 doc-tool/resources/css/search.css delete mode 100644 doc-tool/resources/css/sidebar.css delete mode 100644 doc-tool/resources/css/toolbar.css delete mode 100644 doc-tool/resources/images/scala-logo-white.svg delete mode 100644 doc-tool/resources/images/scala-logo.svg delete mode 100644 doc-tool/resources/images/scala3-logo-white.svg delete mode 100644 doc-tool/resources/images/scala3-logo.svg delete mode 100644 doc-tool/resources/index.md delete mode 100644 doc-tool/resources/js/api-search.js delete mode 100644 doc-tool/resources/js/bootstrap.min.js delete mode 100644 doc-tool/resources/js/dottydoc.js delete mode 100644 doc-tool/resources/js/highlight.pack.js delete mode 100644 doc-tool/resources/js/jquery.min.js delete mode 100644 doc-tool/resources/js/sidebar.js delete mode 100644 doc-tool/resources/js/toolbar.js delete mode 100644 doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/DocDriver.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/Main.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/AlternateConstructorsPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/DocImplicitsPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/DocstringPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/LinkCompanionsPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/RemoveEmptyPackagesPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/StatisticsPhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/core/transform.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/BodyEntities.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/Comment.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/CommentCleaner.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/CommentParser.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/CommentRegex.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/HtmlParsers.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/MarkdownShortener.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/comment/WikiParser.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/entities.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/factories.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/internal.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/model/references.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/BlogPost.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/MapOperations.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownCodeBlockVisitor.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/ResourceFinder.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.java delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/util/internal/mutate.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/util/syntax.scala delete mode 100644 doc-tool/src/dotty/tools/dottydoc/util/traversing.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/CommentCleanerTest.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/ConstructorTest.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/DottyDocTest.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/GenDocs.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/JavaConverterTest.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/MarkdownTests.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/PackageStructure.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/SettingsTests.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/SimpleComments.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/SourceUtil.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/TypeRendering.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/UsecaseTest.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/SourceFileOps.scala delete mode 100644 doc-tool/test/dotty/tools/dottydoc/staticsite/TemplateErrorTests.scala diff --git a/doc-tool/bootstrap-theme/build.sh b/doc-tool/bootstrap-theme/build.sh deleted file mode 100755 index caff40b679b3..000000000000 --- a/doc-tool/bootstrap-theme/build.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -cd "$(dirname "$0")" -if [ ! -d "node_modules" ]; then - npm install -fi -npm run build -echo "Copying CSS result..." -cp target/bootstrap.min.css ../resources/css/bootstrap.min.css - -# Update the generated website without running sbt -gen_dir=../../docs/_site/css -if [ -d "$gen_dir" ]; then - cp ../resources/css/* $gen_dir/ -fi - -echo "Bootstrap CSS updated." diff --git a/doc-tool/bootstrap-theme/package-lock.json b/doc-tool/bootstrap-theme/package-lock.json deleted file mode 100644 index 0b6fe4fe703c..000000000000 --- a/doc-tool/bootstrap-theme/package-lock.json +++ /dev/null @@ -1,4544 +0,0 @@ -{ - "name": "dottydoc-bootstrap-theme", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@mrmlnc/readdir-enhanced": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", - "requires": { - "call-me-maybe": "^1.0.1", - "glob-to-regexp": "^0.3.0" - } - }, - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" - }, - "@types/node": { - "version": "12.7.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.1.tgz", - "integrity": "sha512-aK9jxMypeSrhiYofWWBf/T7O+KwaiAHzM4sveCdWPn71lzUSMimRnKzhXDKfKwV1kWoBo2P1aGgaIYGLf9/ljw==" - }, - "@types/q": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", - "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "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" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "requires": { - "micromatch": "^3.1.4", - "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=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" - }, - "autoprefixer": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", - "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", - "requires": { - "browserslist": "^4.6.3", - "caniuse-lite": "^1.0.30000980", - "chalk": "^2.4.2", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.17", - "postcss-value-parser": "^4.0.0" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "~2.0.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "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" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browserslist": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.6.tgz", - "integrity": "sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==", - "requires": { - "caniuse-lite": "^1.0.30000984", - "electron-to-chromium": "^1.3.191", - "node-releases": "^1.1.25" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "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" - } - }, - "call-me-maybe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", - "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30000989", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz", - "integrity": "sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", - "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-declaration-sorter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", - "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", - "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" - } - }, - "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", - "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" - }, - "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "css-unit-converter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", - "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" - }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" - }, - "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", - "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", - "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" - } - }, - "cssnano-util-get-arguments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", - "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" - }, - "cssnano-util-get-match": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", - "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" - }, - "cssnano-util-raw-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", - "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", - "requires": { - "postcss": "^7.0.0" - } - }, - "cssnano-util-same-parent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", - "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" - }, - "csso": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", - "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", - "requires": { - "css-tree": "1.0.0-alpha.29" - }, - "dependencies": { - "css-tree": { - "version": "1.0.0-alpha.29", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", - "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", - "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" - } - }, - "mdn-data": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", - "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "dependency-graph": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.0.tgz", - "integrity": "sha512-DCvzSq2UiMsuLnj/9AL484ummEgLtZIcRS7YvtO38QnpX3vqh9nJ8P+zhu8Ja+SmLrBHO2iDbva20jq38qvBkQ==" - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "requires": { - "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } - } - }, - "dom-serializer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", - "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.3.221", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.221.tgz", - "integrity": "sha512-YbNA7KgCvLq9ZaEa7wpYP7IP4LrJ4+b36oeF1lYBSJ0zVGVN7uo3Ct9qDUm/M3VDOWj03RVgsMFF8PdL8UjhzA==" - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "requires": { - "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", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.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" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "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" - }, - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "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" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "fast-glob": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", - "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "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=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "optional": 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, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": 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" - } - }, - "glob": { - "version": "7.1.3", - "bundled": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": 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" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": 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" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "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" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "^1.0.0" - } - }, - "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==" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-to-regexp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", - "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" - }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^1.0.2", - "dir-glob": "^2.2.2", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "graceful-fs": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.1.tgz", - "integrity": "sha512-b9usnbDGnD928gJB3LrCmxoibr3VE4U2SMo5PBuBnokWyDADTqDPXg4YpwKF1trpH+UbGp7QLicO3+aWEy0+mw==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "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=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "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=", - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" - }, - "hosted-git-info": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", - "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" - }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" - }, - "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==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "requires": { - "resolve-from": "^3.0.0" - } - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "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=" - }, - "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=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "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=", - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, - "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=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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=" - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.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==" - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "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=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "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==", - "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=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "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==", - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "^1.0.1" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "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==", - "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=" - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "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==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "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==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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==" - }, - "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=" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "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" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "requires": { - "chalk": "^2.0.1" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "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" - } - }, - "merge2": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", - "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "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" - } - }, - "mime-db": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" - }, - "mime-types": { - "version": "2.1.25", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", - "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "requires": { - "mime-db": "1.42.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "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" - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-releases": { - "version": "1.1.26", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.26.tgz", - "integrity": "sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==", - "requires": { - "semver": "^5.3.0" - } - }, - "node-sass": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", - "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.15", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "requires": { - "boolbase": "~1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "requires": { - "isobject": "^3.0.0" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "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==", - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" - }, - "postcss": { - "version": "7.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", - "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-calc": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", - "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", - "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-cli": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.1.3.tgz", - "integrity": "sha512-eieqJU+OR1OFc/lQqMsDmROTJpoMZFvoAQ+82utBQ8/8qGMTfH9bBSPsTdsagYA8uvNzxHw2I2cNSSJkLAGhvw==", - "requires": { - "chalk": "^2.1.0", - "chokidar": "^2.0.0", - "dependency-graph": "^0.8.0", - "fs-extra": "^7.0.0", - "get-stdin": "^6.0.0", - "globby": "^9.0.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "postcss-reporter": "^6.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "yargs": "^12.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" - }, - "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==" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "requires": { - "invert-kv": "^2.0.0" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.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": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "postcss-colormin": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", - "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", - "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-convert-values": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", - "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-discard-comments": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", - "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-duplicates": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", - "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-empty": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", - "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-discard-overridden": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", - "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-merge-longhand": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", - "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", - "requires": { - "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-merge-rules": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", - "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-minify-font-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", - "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-gradients": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", - "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-params": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", - "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", - "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-minify-selectors": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", - "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", - "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "postcss-normalize-charset": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", - "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", - "requires": { - "postcss": "^7.0.0" - } - }, - "postcss-normalize-display-values": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", - "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-positions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", - "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-repeat-style": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", - "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-string": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", - "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", - "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-timing-functions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", - "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-unicode": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", - "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", - "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-normalize-whitespace": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", - "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", - "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-ordered-values": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", - "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", - "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-reduce-initial": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", - "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", - "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", - "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", - "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-reporter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", - "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", - "requires": { - "chalk": "^2.4.1", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "postcss": "^7.0.7" - } - }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", - "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - } - } - }, - "postcss-unique-selectors": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", - "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", - "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" - } - }, - "postcss-value-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", - "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "requires": { - "pify": "^2.3.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "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==", - "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" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "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" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "resolve": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.2.tgz", - "integrity": "sha512-cAVTI2VLHWYsGOirfeYVVQ7ZDejtQ9fp4YhYckWDEkFfqbVjaT11iM8k6xSAfGFMM+gDpZjMnFssPu8we+mqFw==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" - }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - }, - "dependencies": { - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "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" - }, - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "kind-of": "^6.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==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "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" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "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" - } - }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "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=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, - "stylehacks": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", - "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", - "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" - }, - "dependencies": { - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", - "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - } - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "timsort": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", - "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "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=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "requires": { - "glob": "^7.1.2" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" - } - } - }, - "upath": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", - "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "vendors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", - "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "^3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } - } - } -} diff --git a/doc-tool/bootstrap-theme/package.json b/doc-tool/bootstrap-theme/package.json deleted file mode 100644 index d5a6090734c9..000000000000 --- a/doc-tool/bootstrap-theme/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "dottydoc-bootstrap-theme", - "version": "1.0.0", - "description": "Customized Bootstrap for Dottydoc", - "main": "", - "scripts": { - "process-sass": "node-sass theme.scss --output-style expanded --precision 6 target/bootstrap.css", - "enhance-css": "postcss target/bootstrap.css --use autoprefixer cssnano --output target/bootstrap.min.css --no-map", - "build": "npm run process-sass && npm run enhance-css" - }, - "author": "", - "license": "BSD 3-Clause", - "dependencies": { - "autoprefixer": "^9.6.1", - "bootstrap": "^4.3.1", - "cssnano": "^4.1.10", - "node-sass": "^4.13.0", - "postcss-cli": "^6.1.3" - } -} diff --git a/doc-tool/bootstrap-theme/theme.scss b/doc-tool/bootstrap-theme/theme.scss deleted file mode 100644 index 2459be2eded0..000000000000 --- a/doc-tool/bootstrap-theme/theme.scss +++ /dev/null @@ -1,99 +0,0 @@ -// Required imports -@import "node_modules/bootstrap/scss/functions"; -@import "node_modules/bootstrap/scss/variables"; -@import "node_modules/bootstrap/scss/mixins"; - -// Web fonts -@import url('https://fonts.googleapis.com/css?family=Lato:400,700|Fira+Code:400,700&display=fallback'); - -// Custom colors -$pro-grey: #414551; -$soft-red: #ca445e; -$light: #fafafa; -$code-color: $soft-red; // overrides bootstrap - -$theme-colors: ( - "primary": $pro-grey, - "secondary": $soft-red -); - -$colors: ( - "light": $light, - - "toolbar": $pro-grey, - "toolbar-entry": $light, - "toolbar-active": lighten($pro-grey, 25), - - "sidebar": $light, - "sidebar-category": #000, - "sidebar-page": $pro-grey, - "sidebar-active": $soft-red, - - "pre-bg": $light, //
 blocks of code background
-  "doc-bg": rgba($soft-red, 0.135) //#ca44c822
-);
-
-// Responsive control
-$container-max-widths: (
-  md: 720px,
-  lg: 960px,
-  xl: 960px
-);
-
-// Body Fonts
-$font-family-monospace: "Fira Code", "Andale Mono", monospace;
-$font-family-sans-serif: "Lato", sans-serif;
-//$font-family-serif: (use the default value)
-$font-family-base: $font-family-sans-serif;
-$headings-font-family: $font-family-sans-serif;
-
-$font-weight-light: 300;
-$font-weight-normal: 400;
-$font-weight-bold: 700;
-$headings-font-weight: 400;
-
-// Nav Fonts
-$toolbar-main-font: $headings-font-family;
-$toolbar-main-weight: $font-weight-normal;
-$toolbar-details-font: $headings-font-family;
-$toolbar-details-weight: $font-weight-normal;
-
-$sidebar-font: $headings-font-family;
-$sidebar-category-weight: $font-weight-normal;
-$sidebar-category-size: 18px;
-$sidebar-page-weight: $font-weight-normal;
-$sidebar-page-size: 1rem;
-
-// Features imports - follow the order of bootstrap.scss (bootstrap's module)
-@import "node_modules/bootstrap/scss/root";
-@import "node_modules/bootstrap/scss/reboot";
-@import "node_modules/bootstrap/scss/type";
-@import "node_modules/bootstrap/scss/images";
-@import "node_modules/bootstrap/scss/code";
-@import "node_modules/bootstrap/scss/grid";
-@import "node_modules/bootstrap/scss/tables";
-@import "node_modules/bootstrap/scss/buttons";
-@import "node_modules/bootstrap/scss/transitions";
-@import "node_modules/bootstrap/scss/nav";
-@import "node_modules/bootstrap/scss/navbar";
-@import "node_modules/bootstrap/scss/breadcrumb";
-@import "node_modules/bootstrap/scss/badge";
-@import "node_modules/bootstrap/scss/spinners";
-@import "node_modules/bootstrap/scss/utilities";
-
-// Additional CSS variables
-:root {
-  --font-family-toolbar-main: #{inspect($toolbar-main-font)};
-  --font-weight-toolbar-main: #{$toolbar-main-weight};
-
-  --font-family-toolbar-details: #{inspect($toolbar-details-font)};
-  --font-weight-toolbar-details: #{$toolbar-details-weight};
-
-  --font-family-sidebar: #{inspect($sidebar-font)};
-
-  --font-size-sidebar-category: #{$sidebar-category-size};
-  --font-weight-sidebar-category: #{$sidebar-category-weight};
-
-  --font-size-sidebar-page: #{$sidebar-page-size};
-  --font-weight-sidebar-page: #{$sidebar-page-weight};
-}
diff --git a/doc-tool/resources/_includes/header.html b/doc-tool/resources/_includes/header.html
deleted file mode 100644
index 219cdf7f9a5c..000000000000
--- a/doc-tool/resources/_includes/header.html
+++ /dev/null
@@ -1 +0,0 @@
-

Some header

diff --git a/doc-tool/resources/_includes/sidebar.html b/doc-tool/resources/_includes/sidebar.html deleted file mode 100644 index 947b4b0acf27..000000000000 --- a/doc-tool/resources/_includes/sidebar.html +++ /dev/null @@ -1,44 +0,0 @@ - diff --git a/doc-tool/resources/_includes/toolbar.html b/doc-tool/resources/_includes/toolbar.html deleted file mode 100644 index 521db3980d6e..000000000000 --- a/doc-tool/resources/_includes/toolbar.html +++ /dev/null @@ -1,39 +0,0 @@ -
- -
diff --git a/doc-tool/resources/_layouts/api-page.html b/doc-tool/resources/_layouts/api-page.html deleted file mode 100644 index 21fce2c381fe..000000000000 --- a/doc-tool/resources/_layouts/api-page.html +++ /dev/null @@ -1,230 +0,0 @@ ---- -layout: main ---- - -
-
- {{ entity.kind | first | capitalize }} - - - {{ entity.modifiers | join: " " }} - - {{ entity.kind }} - -

- {{ entity.name }} - {% if entity.typeParams and entity.typeParams.size > 0 %} - - [{{ entity.typeParams | join: ", " }}] - - {% endif %} -

- - {% if entity.superTypes.size > 0 %} - extends - {% if entity.superTypes.size == 1 %} - {% renderLink entity.superTypes[0] %} - {% else %} - {% renderLink entity.superTypes[0] %} - with {% renderLink entity.superTypes[1] %} - {% if entity.superTypes.size == 3 %} - with {% renderLink entity.superTypes[2] %} - {% elsif entity.superTypes.size > 3 %} - {% assign remaining = entity.superTypes.size | minus: 2 %} - and {{remaining}} more traits - {% endif %} - {% endif %} - {% endif %} - -
- - {% if entity.comment.body %} -
- {{ entity.comment.body }} -
- {% endif %} - - {% if entity.superTypes.size > 0 %} -
-

Supertypes

- - {% for superT in entity.superTypes %} - {% renderLink superT %}{% unless forloop.last %}, {% endunless %} - {% endfor %} - -
- {% endif %} - - {% if entity.annotations.size > 0 %} -
-

Annotations

- - {% for annot in entity.annotations %} - @{{ annot }}{% unless forloop.last %}, {% endunless %} - {% endfor %} - -
- {% endif %} - - {% if entity.kind == "class" or entity.kind == "case class" %} -
-

Constructors

- {% if entity.constructors and entity.constructors.size > 0 %} -
- {% for ctorParamLists in entity.constructors %} - - - -

{{ entity.name }}

- {% for plist in ctorParamLists %} - - ( - {% if plist.isImplicit %} - implicit  - {% endif %} - {% for param in plist.list %} - - {{ param.title }}: - {% if param.isByName %}=>{% endif %} - {% renderRef param.ref %} - - {% unless forloop.last %}, {% endunless %} - {% endfor %} - ) - - {% endfor %} -
-
- {% endfor %} -
- {% else %} - This {{ entity.kind }} cannot be constructed. - {% endif %} -
- {% endif %} - -
-

Members

-
- {% for member in entity.members %} - {% if member.isPrivate or member.isProtected %} - {% assign visibilityClass = "non-public" %} - {% else %} - {% assign visibilityClass = "public" %} - {% endif %} - - {% if member.isImplicitlyAddedFrom != null %} - {% assign implicitClass = "implicitly" %} - {% else %} - {% assign implicitClass = "" %} - {% endif %} - - {% assign kindClass = member.kind | replace: " ", "-" %} - {% assign sig = member.signature %} -
- - - - {{ member.modifiers | join: " " }} - - {{ member.kind }}  - - - - -

- {% if member.kind == "class" or member.kind == "case class" or member.kind == "object" or member.kind == "trait" %} - {{ member.name }} - {% elsif member.kind == "package" %} - {{ member.name }} - {% else %} - {{ member.name }} - {% endif %} -

- - {% if member.typeParams and member.typeParams.size > 0 %} - - [{{ member.typeParams | join: ", " }}] - - {% endif %} - - {% if member.paramLists and member.paramLists.size > 0 %} - {% for plist in member.paramLists %} - - ( - {% if plist.isImplicit %} - implicit  - {% endif %} {% for param in plist.list %} - - {{ param.title }}: - {% if param.isByName %}=>{% endif %} - {% renderRef param.ref %} - - {% unless forloop.last %}, {% endunless %} - {% endfor %} - ) - - {% endfor %} - {% endif %} - - {% if member.returnValue %} - : {% renderRef member.returnValue %} - {% endif %} - - {% if member.alias %} -  = {% renderRef member.alias %} - {% endif %} -
- -
- {% if member.comment.short %} - {{ member.comment.short }} - {% else %} -

- {% endif %} -
- -
- - {% assign c = member.comment %} - {% if c %} - {{ c.body }} - {% else %} -

- {% endif %} - -
-
- {% endfor %} -
-
-
diff --git a/doc-tool/resources/_layouts/base.html b/doc-tool/resources/_layouts/base.html deleted file mode 100644 index 69eb185fef16..000000000000 --- a/doc-tool/resources/_layouts/base.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - {{ page.title }} - - - - - - - - - - - - - {% for css in page.extraCSS %} - - {% endfor %} - - - - - {{ content }} - - - - {% for js in page.extraJS %} - - {% endfor %} - - - diff --git a/doc-tool/resources/_layouts/blog-page.html b/doc-tool/resources/_layouts/blog-page.html deleted file mode 100644 index 62724cd9c443..000000000000 --- a/doc-tool/resources/_layouts/blog-page.html +++ /dev/null @@ -1,35 +0,0 @@ ---- -layout: main ---- -
-
-

{{ page.title }}

- - {% if page.subTitle %} -
- {{ page.subTitle }} -
- {% endif %} -
- - {{ content }} - - {% if page.author and page.authorImg %} -
-
- - - {{ page.author }} - -
- {% endif %} -
diff --git a/doc-tool/resources/_layouts/doc-page.html b/doc-tool/resources/_layouts/doc-page.html deleted file mode 100644 index 694da12f1f20..000000000000 --- a/doc-tool/resources/_layouts/doc-page.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: main ---- -
-
-

{{ page.title }}

- -
- {{ content }} -
diff --git a/doc-tool/resources/_layouts/index.html b/doc-tool/resources/_layouts/index.html deleted file mode 100644 index 5be2d9794299..000000000000 --- a/doc-tool/resources/_layouts/index.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: main ---- -

{{ content }}

diff --git a/doc-tool/resources/_layouts/main.html b/doc-tool/resources/_layouts/main.html deleted file mode 100644 index 69b79f5eae57..000000000000 --- a/doc-tool/resources/_layouts/main.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: base -extraCSS: - - css/toolbar.css - - css/sidebar.css -extraJS: - - js/toolbar.js - - js/sidebar.js ---- -{% include "toolbar" %} -{% include "sidebar" %} -
- {{ content }} -
- - diff --git a/doc-tool/resources/_layouts/search.html b/doc-tool/resources/_layouts/search.html deleted file mode 100644 index 355a7e83eeb4..000000000000 --- a/doc-tool/resources/_layouts/search.html +++ /dev/null @@ -1,197 +0,0 @@ ---- -layout: main -title: Search ---- - -
- -

- - - -
-
-

Entity Results

-
    -
    -
    -

    Member Results

    -
      -
      -
      -
      - - diff --git a/doc-tool/resources/css/bootstrap.min.css b/doc-tool/resources/css/bootstrap.min.css deleted file mode 100644 index d9bbfab3ab34..000000000000 --- a/doc-tool/resources/css/bootstrap.min.css +++ /dev/null @@ -1 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Lato:400,700|Fira+Code:400,700&display=fallback");:root{--light:#fafafa;--toolbar:#414551;--toolbar-entry:#fafafa;--toolbar-active:#7c8296;--sidebar:#fafafa;--sidebar-category:#000;--sidebar-page:#414551;--sidebar-active:#ca445e;--pre-bg:#fafafa;--doc-bg:rgba(202,68,94,0.135);--primary:#414551;--secondary:#ca445e;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Lato",sans-serif;--font-family-monospace:"Fira Code","Andale Mono",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Lato,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:Fira Code,Andale Mono,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:Lato,sans-serif;font-weight:400;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#ca445e;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:960px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.333333%;max-width:8.333333%}.col-2{flex:0 0 16.666667%;max-width:16.666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.333333%;max-width:33.333333%}.col-5{flex:0 0 41.666667%;max-width:41.666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.333333%;max-width:58.333333%}.col-8{flex:0 0 66.666667%;max-width:66.666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.333333%;max-width:83.333333%}.col-11{flex:0 0 91.666667%;max-width:91.666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacbce}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ea5}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#bdbec2}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#f0cbd2}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#e39eab}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#eab7c1}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#414551;border-color:#414551}.btn-primary:hover{color:#fff;background-color:#30333c;border-color:#2a2d35}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(94,97,107,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#414551;border-color:#414551}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#2a2d35;border-color:#25272e}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(94,97,107,.5)}.btn-secondary{color:#fff;background-color:#ca445e;border-color:#ca445e}.btn-secondary:hover{color:#fff;background-color:#b5334c;border-color:#ab3048}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(210,96,118,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#ca445e;border-color:#ca445e}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#ab3048;border-color:#a12e44}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(210,96,118,.5)}.btn-outline-primary{color:#414551;border-color:#414551}.btn-outline-primary:hover{color:#fff;background-color:#414551;border-color:#414551}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(65,69,81,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#414551;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#414551;border-color:#414551}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,69,81,.5)}.btn-outline-secondary{color:#ca445e;border-color:#ca445e}.btn-outline-secondary:hover{color:#fff;background-color:#ca445e;border-color:#ca445e}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(202,68,94,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ca445e;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ca445e;border-color:#ca445e}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(202,68,94,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3;text-decoration:underline}.btn-link.focus,.btn-link:focus{text-decoration:underline;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#414551}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#2a2d35}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(65,69,81,.5)}.badge-secondary{color:#fff;background-color:#ca445e}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#ab3048}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(202,68,94,.5)}@-webkit-keyframes spinner-border{to{transform:rotate(1turn)}}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:spinner-grow .75s linear infinite;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#414551!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#2a2d35!important}.bg-secondary{background-color:#ca445e!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#ab3048!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#414551!important}.border-secondary{border-color:#ca445e!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.857143%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:Fira Code,Andale Mono,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#414551!important}a.text-primary:focus,a.text-primary:hover{color:#1f2127!important}.text-secondary{color:#ca445e!important}a.text-secondary:focus,a.text-secondary:hover{color:#972b40!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;overflow-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}:root{--font-family-toolbar-main:"Lato",sans-serif;--font-weight-toolbar-main:400;--font-family-toolbar-details:"Lato",sans-serif;--font-weight-toolbar-details:400;--font-family-sidebar:"Lato",sans-serif;--font-size-sidebar-category:18px;--font-weight-sidebar-category:400;--font-size-sidebar-page:1rem;--font-weight-sidebar-page:400} \ No newline at end of file diff --git a/doc-tool/resources/css/color-brewer.css b/doc-tool/resources/css/color-brewer.css deleted file mode 100644 index 9c3972d0219d..000000000000 --- a/doc-tool/resources/css/color-brewer.css +++ /dev/null @@ -1,66 +0,0 @@ -/* - -Colorbrewer theme -Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock -Ported by Fabrício Tavares de Oliveira - -*/ - -.hljs { - background: transparent; -} - -.hljs, -.hljs-subst { - color: #000; -} - -.hljs-string, -.hljs-meta, -.hljs-symbol, -.hljs-template-tag, -.hljs-template-variable, -.hljs-addition { - color: #756bb1; -} - -.hljs-comment, -.hljs-quote { - color: #636363; -} - -.hljs-number, -.hljs-regexp, -.hljs-literal, -.hljs-bullet, -.hljs-link { - color: #31a354; -} - -.hljs-deletion, -.hljs-variable { - color: #88f; -} - -.hljs-keyword, -.hljs-selector-tag, -.hljs-title, -.hljs-section, -.hljs-built_in, -.hljs-doctag, -.hljs-type, -.hljs-tag, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class, -.hljs-strong { - color: #3182bd; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-attribute { - color: #e6550d; -} diff --git a/doc-tool/resources/css/dottydoc.css b/doc-tool/resources/css/dottydoc.css deleted file mode 100644 index 0eabdd3acc4a..000000000000 --- a/doc-tool/resources/css/dottydoc.css +++ /dev/null @@ -1,268 +0,0 @@ -html, body { - font-weight: 300; - height: 100%; -} - -main.container { - min-height: 100vh; - padding: 15px 15px; - padding-bottom: 45px; /* prevents the content to be hidden by the gitter sidecar */ -} - -.container img { - width: 100%; - height: auto; -} - -/* headers */ -main header { - border-bottom: 1px solid rgba(0,0,0,.1); - margin-bottom: 16px; - padding-bottom: 16px; -} - -main > h1 { - margin-bottom: 20px; -} - -.byline, .byline a { - color: grey; -} -.byline .author { - display: block; -} - -/* indexes */ -ul.post-list { - list-style: none; - padding-left: 0; -} -.post-list h2 { - margin-bottom: 0; -} - -/* headings anchors */ -a.anchor { - color: white; - margin-left: -23px; - padding-right: 3px; - transition: color .4s ease-out; -} - -a.anchor::before { - content: "\f0c1"; - font-family: "Font Awesome 5 Free"; - font-weight: 900; - font-size: 20px; -} - -h1:hover a.anchor, -h2:hover a.anchor, -h3:hover a.anchor, -h4:hover a.anchor, -h5:hover a.anchor { - color: lightgrey; - text-decoration: none; -} - -h1:hover a.anchor:hover, -h2:hover a.anchor:hover, -h3:hover a.anchor:hover, -h4:hover a.anchor:hover, -h5:hover a.anchor:hover { - color: var(--secondary); -} - - -/* footer */ -footer { - color: grey; -} -footer img#author-img { - width: auto; - height: auto; - max-width:100px; - max-height:100px; - border-radius: 50%; -} - -/* api docs */ -.api span.letter-anchor { - float: left; - width: 50px; - height: 50px; - border-radius: 50px; - color: white; - margin-top: 6px; - margin-right: 8px; - line-height: 50px; - text-align: center; - text-decoration: none; - font-size: 43px; - font-family: var(--font-family-sans-serif); -} -.api span.letter-anchor.object { - line-height: 48px; -} -.api span.letter-anchor.class { - line-height: 48px; - padding-right: 3px; -} -.letter-anchor.object { - background: #2c6c8d; -} -.letter-anchor.class { - background: #44ad7d; -} -.letter-anchor.trait { - background: #19aacf; -} -.letter-anchor.enum { - background: #7803fc; -} -.letter-anchor.package { - background: #2c6c8d; -} - -.api header { - font-family: var(--font-family-sans-serif); -} -.api header .name-prefix { - display: block; -} -.api header .name-suffix { - display: inline-block; -} - -.api header h1 { - margin: -13px 8px 0 0; - display: inline-block; -} -.api h2 { - margin-top: 1rem; -} -.api h3 { - display: inline; - margin: 0; - font: inherit; - font-weight: bold; -} - -/* improved display and wrapping of parameters */ -.api .params, .api .type-params { - display: inline-flex; - flex-flow: wrap; -} - -/* api layout */ -.wide-table { - display: table; - width: 100%; -} -.api .member:hover { - background: var(--doc-bg); - cursor: pointer; -} -.api .left-column { - white-space: nowrap; - padding-left: 1em; - border-left: 3px solid transparent;/* table rows cannot have borders*/ - font-family: var(--font-family-monospace); - text-align: right; - width: 1px; -} -.api .member:hover .left-column { - border-left: 3px solid var(--secondary); -} -.api .right-column { - display: inline; - text-align: right; - font-family: var(--font-family-monospace); -} - -/* code */ -pre, code { - font-variant-ligatures: none; -} -pre { - padding: 0; - font-size: 13px; - background: var(--pre-bg); - border-radius: 2px; - border: 1px solid rgba(0, 0, 0, 0.1); -} - -pre > code { - display: block; - padding: 0.5rem; - overflow-x: auto; - background: transparent; -} - -/* admonitions */ -blockquote { - padding: 0 1em; - color: #777; - border-left: 0.25em solid #ddd; -} - -aside { - padding: 15px; - margin: 10px 0; -} - -aside.warning { - border-left: 3px solid #d62c2c; - background-color: #ffe4e4; -} - -aside.notice { - border-left: 3px solid #4c97e4; - background-color: #e4ebff; -} - -aside.success { - border-left: 3px solid #36bf1d; - background-color: #ebfddd; -} - -/* gitter chat */ -.gitter-open-chat-button { - background-color: grey; -} -.gitter-open-chat-button:focus, .gitter-open-chat-button:hover { - background-color: var(--primary); -} -.gitter-open-chat-button:focus { - box-shadow: 0 0 8px var(--primary); -} -.gitter-chat-embed { - top: 40px; /* 50px (navbar) - 10px (aside's margin) */ - bottom: -10px; -} - -/* media queries for bigger screens (dottydoc is mobile-first) */ -@media (min-width: 576px) { - .byline .author { - display: inline; - margin-left: 1em; - } - main.container { - padding: 15px 30px; - } -} -@media (min-width: 768px) { - .api .member { - display: table-row; - } - .api .left-column { - display: table-cell; - } - .api .right-column { - display: flex; - flex-flow: wrap; - } - main.container { - padding: 15px 45px; - } -} diff --git a/doc-tool/resources/css/search.css b/doc-tool/resources/css/search.css deleted file mode 100644 index cb1c868ab875..000000000000 --- a/doc-tool/resources/css/search.css +++ /dev/null @@ -1,36 +0,0 @@ -ul { - list-style: none; - padding: 0; -} - -ul li { - margin-bottom: 5px; - font-family: var(--font-family-sans-serif); -} - -h3 { - padding-top: .5rem; -} -h4 { - display: inline-block; - font-size: 1.25rem; -} - -.package-name a { - color: inherit; -} - -.entity-kinds { - display: inline; -} - -.member-result { - padding-left: 1em; - font-family: var(--font-family-monospace); -} - -@media(min-width: 768px) { - .tab-content > .tab-pane { - display: block; - } -} diff --git a/doc-tool/resources/css/sidebar.css b/doc-tool/resources/css/sidebar.css deleted file mode 100644 index 5f96c0889deb..000000000000 --- a/doc-tool/resources/css/sidebar.css +++ /dev/null @@ -1,149 +0,0 @@ -.sidebar { - position: fixed; - top: 50px; - left: 0; - z-index: 1000; - width: 275px; - height: 100%; - overflow-x: hidden; /* Safari and some others don't support overflow: x y */ - overflow-y: auto; - -webkit-overflow-scrolling: touch; /* nicer scrolling on touch screens */ - font-family: var(--font-family-sidebar); - background: var(--sidebar); - margin-left: -275px; /* invisible by default, shown by toggle */ - transition: margin .25s ease-out; -} - -.sidebar.toggled { - margin-left: 0; - box-shadow: -2px 0 8px var(--primary); -} - -.sidebar ul.toc { - padding-bottom: 60px; /* avoids unreachable elements at the end of toc */ - padding-left: 1em; - padding-top: 1em; - margin-bottom: 0; -} - -.sidebar ul { - list-style-type: none; - padding-left: 0; -} - -.sidebar li { - margin-top: .5em; -} - -.sidebar li.section ul { - padding-left: 1em; - display: none; -} -.sidebar li.section ul.toggled { - display: block; -} - -.sidebar li.section.index-entities ul { - padding-left: 0; -} - -.sidebar .index-entity.entity-package { - margin-left: 5px; - margin-top: .25em; -} - -.sidebar .toc > li:not(.index-entities) > ul { - border-left: 2px solid var(--sidebar-active); - padding-left: 1em; - margin-left: 5px; -} - -.sidebar li a { - font-size: var(--font-size-sidebar-page); - font-weight: var(--font-weight-sidebar-page); -} - -.sidebar > ul > li.leaf > a, .sidebar li.section > a { - font-size: var(--font-size-sidebar-category); - font-weight: var(--font-weight-sidebar-category); - text-transform: capitalize; - cursor: pointer; - color: var(--sidebar-category); -} - -.sidebar .entity-package > .entity-name { - text-transform: none; -} - -.sidebar a { - width: 100%; - color: var(--sidebar-page); - transition: color .2s ease-out; -} -.sidebar a:hover, .sidebar a.toggled { - color: var(--sidebar-active) !important; -} - -/* API Documentation */ -.package-toggle i.fas { - font-size: 15px; - margin-right: 1px; - color: var(--sidebar-active); -} - -.entity-kinds { - display: inline-flex; - /* so that it is aligned with the text AND allows to select the type - and its companion if any. */ -} - -.entity-kinds > a.letter-anchor { - float: left; - width: 1.5em; - height: 1.5em; - color: white; - text-align: center; - text-decoration: none; - margin-right: 5px; - border-radius: 1em; -} - -.entity-kinds a.object { - background: #2c6c8d; -} -.entity-kinds a.class { - background: #44ad7d; - padding-right: 1px; -} -.entity-kinds a.trait { - background: #19aacf; - padding-right: 1px; -} - -.with-companion .entity-kinds:not(:hover) a.object { - display:none; -} -.with-companion .entity-kinds:not(:hover) a.class { - background: linear-gradient(45deg, #2c6c8d 49%, #44ad7d 51%); -} -.with-companion .entity-kinds:not(:hover) a.trait { - background: linear-gradient(45deg, #2c6c8d 49%, #19aacf 51%); -} - -@media (min-width: 768px) { - .sidebar { /* visible by default, hidden by toggle */ - margin-left: 0; - box-shadow: -2px 0 8px var(--primary); - } - .sidebar.toggled { - margin-left: -275px; - box-shadow: none; - } - #content-wrapper { - margin-left: 275px !important; - transition: margin .25s ease-out; - } - .sidebar.toggled ~ #content-wrapper { - margin-left: 0 !important; - } -} diff --git a/doc-tool/resources/css/toolbar.css b/doc-tool/resources/css/toolbar.css deleted file mode 100644 index faf051e5dde8..000000000000 --- a/doc-tool/resources/css/toolbar.css +++ /dev/null @@ -1,98 +0,0 @@ -body { - margin-top: 50px; -} - -nav.navbar { - height: 50px; - line-height: 1; - font-size: 24px; - font-family: var(--font-family-toolbar-details); - background-color: var(--toolbar); - box-shadow: 0 0 6px; -} -nav.navbar-dark * { - color: var(--toolbar-entry); - transition: color .2s ease-out; -} - -nav.navbar-dark a:hover *, nav.navbar-dark a:focus * { - color: var(--toolbar-active); -} -nav.navbar a:hover { - text-decoration: none; -} -nav.navbar a { - cursor: pointer; -} - -.navbar-brand { - margin-right: auto; - margin-left: auto; - font-size: inherit; - display: flex; - align-items: center; -} - -.navbar-brand .project-logo { - display: none; - height: 40px; - margin-right: 7px; -} - -.navbar-brand .project-details * { - margin: 0; - line-height: inherit; -} -.navbar-brand .project-details h1 { - font-size: 1em; - font-family: var(--font-family-toolbar-main); - font-weight: var(--font-weight-toolbar-main); -} -.navbar-brand .project-details h2 { - font-size: 0.5em; - margin-top: 2px; - font-weight: var(--font-weight-toolbar-details); -} - -#search-api-input { - color: initial; - width: 10em; -} -#searchbar { - display: none; -} -#searchbar.shown { - display: initial; - margin-left: auto; - margin-right: auto; -} -#searchbar.shown + .navbar-brand { - display: none; -} - -#search-icon { - margin-left: .5em; -} - -@media (min-width: 420px) { - .navbar-brand .project-logo { - display: inline; - } -} - -@media (min-width: 768px) { - #search-icon, #searchbar.shown { - margin-left: 1em; - margin-right: initial; - } - #searchbar.shown + .navbar-brand { - display: flex; - } -} - -@media (min-width: 1200px) { - #searchbar.shown { - position: absolute; - margin-left: 4em; - } -} diff --git a/doc-tool/resources/images/scala-logo-white.svg b/doc-tool/resources/images/scala-logo-white.svg deleted file mode 100644 index be4e80b10768..000000000000 --- a/doc-tool/resources/images/scala-logo-white.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/doc-tool/resources/images/scala-logo.svg b/doc-tool/resources/images/scala-logo.svg deleted file mode 100644 index 6eb7cb4523f6..000000000000 --- a/doc-tool/resources/images/scala-logo.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/doc-tool/resources/images/scala3-logo-white.svg b/doc-tool/resources/images/scala3-logo-white.svg deleted file mode 100644 index 8fd33e25e3aa..000000000000 --- a/doc-tool/resources/images/scala3-logo-white.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc-tool/resources/images/scala3-logo.svg b/doc-tool/resources/images/scala3-logo.svg deleted file mode 100644 index 0bb0651aeffb..000000000000 --- a/doc-tool/resources/images/scala3-logo.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc-tool/resources/index.md b/doc-tool/resources/index.md deleted file mode 100644 index 82f1d9cfc8c6..000000000000 --- a/doc-tool/resources/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: main ---- - -Hello, world! diff --git a/doc-tool/resources/js/api-search.js b/doc-tool/resources/js/api-search.js deleted file mode 100644 index 4950d2067ffe..000000000000 --- a/doc-tool/resources/js/api-search.js +++ /dev/null @@ -1,93 +0,0 @@ -/** This Webworker performs search on the API structure - * - * It can be used as follows: - * - * ```javascript - * var apiSearch = new Worker(""); - * apiSearch.postMessage({ - * "type": "setup", - * "search": "", - * "docs": - * }); - * ``` - * - * It posts a few different messages to its parent: - * - * ```json - * { - * "type": "entityResult", - * "package": , - * "entity": - * } - * - * { - * "type": "memberResult", - * "package": , - * "parent": , - * "member": - * } - * ``` - */ -onmessage = function(e) { - var docs = e.data.docs; - var searchTerm = e.data.search; - - var regexForTerm = function(query) { - var escaped = query.replace(/([\.\*\+\?\|\(\)\[\]\\])/g, '\\$1'); - if (query.toLowerCase() != query) { - // Regexp that matches CamelCase subbits: "BiSe" is - // "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ... - return new RegExp(escaped.replace(/([A-Z])/g,"[a-z]*$1")); - } - else { // if query is all lower case make a normal case insensitive search - return new RegExp(escaped, "i"); - } - }; - - var searchRegex = regexForTerm(searchTerm); - - var filterPackages = function(entity) { - switch(entity.kind) { - case "val": - case "def": - case "type": - case "package": - return false; - default: - return true; - } - }; - - // look at this higher order function, such syntax: - var messageParentIfMatches = function(parent) { - return function(entity) { - var fullName = entity.path.join('.'); - - if (searchRegex.test(fullName)) { - postMessage({ - "type": "entityResult", - "package": parent, - "entity": entity - }); - } - - var searchChild = function(member) { - if (searchRegex.test(member.name)) { - postMessage({ - "type": "memberResult", - "package": parent, - "parent": entity, - "member": member, - }); - } - }; - entity.members.forEach(searchChild); - }; - }; - - docs.forEach(function(pack) { - pack.members - .filter(filterPackages) - .forEach(messageParentIfMatches(pack)); - }); -} diff --git a/doc-tool/resources/js/bootstrap.min.js b/doc-tool/resources/js/bootstrap.min.js deleted file mode 100644 index c4c0d1f95cd3..000000000000 --- a/doc-tool/resources/js/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
      ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t 0) { - window.scrollTo(0, $(window.location.hash).offset().top - 90); - } -}) diff --git a/doc-tool/resources/js/highlight.pack.js b/doc-tool/resources/js/highlight.pack.js deleted file mode 100644 index 134c2336e173..000000000000 --- a/doc-tool/resources/js/highlight.pack.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! highlight.js v9.15.9 | BSD3 License | git.io/hljslicense */ -!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],u=Object.keys,N={},c={},n=/^(no-?highlight|plain|text)$/i,s=/\blang(?:uage)?-([\w-]+)\b/i,t=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,r={case_insensitive:"cI",lexemes:"l",contains:"c",keywords:"k",subLanguage:"sL",className:"cN",begin:"b",beginKeywords:"bK",end:"e",endsWithParent:"eW",illegal:"i",excludeBegin:"eB",excludeEnd:"eE",returnBegin:"rB",returnEnd:"rE",relevance:"r",variants:"v",IDENT_RE:"IR",UNDERSCORE_IDENT_RE:"UIR",NUMBER_RE:"NR",C_NUMBER_RE:"CNR",BINARY_NUMBER_RE:"BNR",RE_STARTERS_RE:"RSR",BACKSLASH_ESCAPE:"BE",APOS_STRING_MODE:"ASM",QUOTE_STRING_MODE:"QSM",PHRASAL_WORDS_MODE:"PWM",C_LINE_COMMENT_MODE:"CLCM",C_BLOCK_COMMENT_MODE:"CBCM",HASH_COMMENT_MODE:"HCM",NUMBER_MODE:"NM",C_NUMBER_MODE:"CNM",BINARY_NUMBER_MODE:"BNM",CSS_NUMBER_MODE:"CSSNM",REGEXP_MODE:"RM",TITLE_MODE:"TM",UNDERSCORE_TITLE_MODE:"UTM",COMMENT:"C",beginRe:"bR",endRe:"eR",illegalRe:"iR",lexemesRe:"lR",terminators:"t",terminator_end:"tE"},b="",h={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function _(e){return e.replace(/&/g,"&").replace(//g,">")}function E(e){return e.nodeName.toLowerCase()}function v(e,n){var t=e&&e.exec(n);return t&&0===t.index}function l(e){return n.test(e)}function g(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function R(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:"start",offset:t,node:r}),t=e(r,t),E(r).match(/br|hr|img|input/)||a.push({event:"stop",offset:t,node:r}));return t}(e,0),a}function i(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(i)}}function m(o){function s(e){return e&&e.source||e}function c(e,n){return new RegExp(s(e),"m"+(o.cI?"i":"")+(n?"g":""))}!function n(t,e){if(!t.compiled){if(t.compiled=!0,t.k=t.k||t.bK,t.k){function r(t,e){o.cI&&(e=e.toLowerCase()),e.split(" ").forEach(function(e){var n=e.split("|");a[n[0]]=[t,n[1]?Number(n[1]):1]})}var a={};"string"==typeof t.k?r("keyword",t.k):u(t.k).forEach(function(e){r(e,t.k[e])}),t.k=a}t.lR=c(t.l||/\w+/,!0),e&&(t.bK&&(t.b="\\b("+t.bK.split(" ").join("|")+")\\b"),t.b||(t.b=/\B|\b/),t.bR=c(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\B|\b/),t.e&&(t.eR=c(t.e)),t.tE=s(t.e)||"",t.eW&&e.tE&&(t.tE+=(t.e?"|":"")+e.tE)),t.i&&(t.iR=c(t.i)),null==t.r&&(t.r=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return function(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return g(n,{v:null},e)})),n.cached_variants||n.eW&&[g(n)]||[n]}("self"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e);var i=t.c.map(function(e){return e.bK?"\\.?(?:"+e.b+")\\.?":e.b}).concat([t.tE,t.i]).map(s).filter(Boolean);t.t=i.length?c(function(e,n){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i')+n+(t?"":b):n}function o(){E+=null!=l.sL?function(){var e="string"==typeof l.sL;if(e&&!N[l.sL])return _(g);var n=e?C(l.sL,g,!0,f[l.sL]):O(g,l.sL.length?l.sL:void 0);return 0")+'"');return g+=n,n.length||1}var s=B(e);if(!s)throw new Error('Unknown language: "'+e+'"');m(s);var a,l=t||s,f={},E="";for(a=l;a!==s;a=a.parent)a.cN&&(E=c(a.cN,"",!0)+E);var g="",R=0;try{for(var d,p,M=0;l.t.lastIndex=M,d=l.t.exec(n);)p=r(n.substring(M,d.index),d[0]),M=d.index+p;for(r(n.substr(M)),a=l;a.parent;a=a.parent)a.cN&&(E+=b);return{r:R,value:E,language:e,top:l}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{r:0,value:_(n)};throw e}}function O(t,e){e=e||h.languages||u(N);var r={r:0,value:_(t)},a=r;return e.filter(B).filter(M).forEach(function(e){var n=C(e,t,!1);n.language=e,n.r>a.r&&(a=n),n.r>r.r&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function d(e){return h.tabReplace||h.useBR?e.replace(t,function(e,n){return h.useBR&&"\n"===e?"
      ":h.tabReplace?n.replace(/\t/g,h.tabReplace):""}):e}function o(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=s.exec(i))return B(t[1])?t[1]:"no-highlight";for(n=0,r=(i=i.split(/\s+/)).length;n/g,"\n"):n=e,i=n.textContent,r=o?C(o,i,!0):O(i),(t=R(n)).length&&((a=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=r.value,r.value=function(e,n,t){var r=0,a="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){a+=""}function s(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var l=o();if(a+=_(t.substring(r,l[0].offset)),r=l[0].offset,l===e){for(i.reverse().forEach(u);s(l.splice(0,1)[0]),(l=o())===e&&l.length&&l[0].offset===r;);i.reverse().forEach(c)}else"start"===l[0].event?i.push(l[0].node):i.pop(),s(l.splice(0,1)[0])}return a+_(t.substr(r))}(t,R(a),i)),r.value=d(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function p(){if(!p.called){p.called=!0;var e=document.querySelectorAll("pre code");f.forEach.call(e,o)}}function B(e){return e=(e||"").toLowerCase(),N[e]||N[c[e]]}function M(e){var n=B(e);return n&&!n.disableAutodetect}return a.highlight=C,a.highlightAuto=O,a.fixMarkup=d,a.highlightBlock=o,a.configure=function(e){h=g(h,e)},a.initHighlighting=p,a.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",p,!1),addEventListener("load",p,!1)},a.registerLanguage=function(n,e){var t=N[n]=e(a);i(t),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return u(N)},a.getLanguage=B,a.autoDetection=M,a.inherit=g,a.IR=a.IDENT_RE="[a-zA-Z]\\w*",a.UIR=a.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",a.NR=a.NUMBER_RE="\\b\\d+(\\.\\d+)?",a.CNR=a.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",a.BNR=a.BINARY_NUMBER_RE="\\b(0b[01]+)",a.RSR=a.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",a.BE=a.BACKSLASH_ESCAPE={b:"\\\\[\\s\\S]",r:0},a.ASM=a.APOS_STRING_MODE={cN:"string",b:"'",e:"'",i:"\\n",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:"comment",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C("//","$"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C("/\\*","\\*/"),a.HCM=a.HASH_COMMENT_MODE=a.C("#","$"),a.NM=a.NUMBER_MODE={cN:"number",b:a.NR,r:0},a.CNM=a.C_NUMBER_MODE={cN:"number",b:a.CNR,r:0},a.BNM=a.BINARY_NUMBER_MODE={cN:"number",b:a.BNR,r:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:"number",b:a.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},a.RM=a.REGEXP_MODE={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[a.BE,{b:/\[/,e:/\]/,r:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:"title",b:a.IR,r:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:"title",b:a.UIR,r:0},a.METHOD_GUARD={b:"\\.\\s*"+a.UIR,r:0},a});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("ocaml",function(e){return{aliases:["ml"],k:{keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value",built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref",literal:"true false"},i:/\/\/|>>/,l:"[a-z_]\\w*!?",c:[{cN:"literal",b:"\\[(\\|\\|)?\\]|\\(\\)",r:0},e.C("\\(\\*","\\*\\)",{c:["self"]}),{cN:"symbol",b:"'[A-Za-z_](?!')[\\w']*"},{cN:"type",b:"`[A-Z][\\w']*"},{cN:"type",b:"\\b[A-Z][\\w']*",r:0},{b:"[a-z_]\\w*'[\\w']*",r:0},e.inherit(e.ASM,{cN:"string",r:0}),e.inherit(e.QSM,{i:null}),{cN:"number",b:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",r:0},{b:/[-=]>/}]}});hljs.registerLanguage("java",function(e){var a="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",t={cN:"number",b:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",r:0};return{aliases:["jsp"],k:a,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_\.-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_\.-]+/},{b:/=/,eW:!0,r:0,c:[e.C(";","$"),e.HCM,{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("xml",function(s){var e={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("\x3c!--","--\x3e",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"meta",b:/<\?xml/,e:/\?>/,r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0},{b:'b"',e:'"',skip:!0},{b:"b'",e:"'",skip:!0},s.inherit(s.ASM,{i:null,cN:null,c:null,skip:!0}),s.inherit(s.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[e],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[e],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},e]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^\\s*([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("properties",function(r){var t="[ \\t\\f]*",e="("+t+"[:=]"+t+"|[ \\t\\f]+)",s="([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",n="([^\\\\:= \\t\\f\\n]|\\\\.)+",a={e:e,r:0,starts:{cN:"string",e:/$/,r:0,c:[{b:"\\\\\\n"}]}};return{cI:!0,i:/\S/,c:[r.C("^\\s*[!#]","$"),{b:s+e,rB:!0,c:[{cN:"attr",b:s,endsParent:!0,r:0}],starts:a},{b:n+e,rB:!0,r:0,c:[{cN:"meta",b:n,endsParent:!0,r:0}],starts:a},{cN:"attr",r:0,b:n+t+"$"}]}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d;var l=[{b:/^\s*=>/,starts:{e:"$",c:i.c=d}},{cN:"meta",b:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(l).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,{cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]}]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:c.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!"+e.UIR},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,c]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,{cN:"",b:/\\"/},{cN:"string",b:/'/,e:/'/},t]}});hljs.registerLanguage("scala",function(e){var t={cN:"subst",v:[{b:"\\$[A-Za-z0-9_]+"},{b:"\\${",e:"}"}]},a={cN:"string",v:[{b:'"',e:'"',i:"\\n",c:[e.BE]},{b:'"""',e:'"""',r:10},{b:'[a-z]+"',e:'"',i:"\\n",c:[e.BE,t]},{cN:"string",b:'[a-z]+"""',e:'"""',c:[t],r:10}]},r={cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},c={cN:"title",b:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,r:0},i={cN:"class",bK:"class object trait type",e:/[:={\[\n;]/,eE:!0,c:[{bK:"extends with",r:10},{b:/\[/,e:/\]/,eB:!0,eE:!0,r:0,c:[r]},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,r:0,c:[r]},c]},s={cN:"function",bK:"def",e:/[:={\[(\n;]/,eE:!0,c:[c]};return{k:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},c:[e.CLCM,e.CBCM,a,{cN:"symbol",b:"'\\w[\\w\\d_]*(?!')"},r,s,i,e.CNM,{cN:"meta",b:"@[A-Za-z]+"}]}}); \ No newline at end of file diff --git a/doc-tool/resources/js/jquery.min.js b/doc-tool/resources/js/jquery.min.js deleted file mode 100644 index a1c07fd803b5..000000000000 --- a/doc-tool/resources/js/jquery.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0 { - $(".sidebar").toggleClass("toggled"); - }) - $("#search-icon").click(() => { - $("#searchbar").toggleClass("shown"); - $("#search-api-input").focus(); - }) - const searchInput = $("#search-api-input"); - searchInput.keydown(evt => { - if (evt.which == 13) { - const baseUrl = $("#baseurl-input").val(); - window.location = ( - baseUrl + "/api/search.html?" + - "searchTerm=" + searchInput.val() + - "&previousUrl=" + encodeURI(window.location) - ); - } - }) -}) diff --git a/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala b/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala deleted file mode 100644 index f85b38ccc89c..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/DocCompiler.scala +++ /dev/null @@ -1,77 +0,0 @@ -package dotty.tools -package dottydoc - -import core._ -import core.transform._ -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Phases.Phase -import dotc.core.Mode -import dotc.{Compiler, CompilationUnit, Run} -import dotc.typer.FrontEnd - -import dotty.tools.dotc.fromtasty.{ReadTasty, TASTYRun} -import dotty.tools.dotc.transform.CookComments - -/** Custom Compiler with phases for the documentation tool - * - * The idea here is to structure `dottydoc` around the new infrastructure. As - * such, dottydoc will itself be a compiler. It will, however, produce a format - * that can be used by other tools or web-browsers. - * - * Example: - * 1. Use the existing FrontEnd to typecheck the code being fed to dottydoc, - * wihtout discarding AnyVal interfaces - * 2. Create an AST that is serializable - * 3. Serialize to JS object - */ -class DocCompiler extends Compiler { - - override def newRun(using Context): Run = { - if (ctx.settings.fromTasty.value) { - reset() - new TASTYRun(this, ctx.addMode(Mode.ReadPositions).addMode(Mode.ReadComments)) - } - else - super.newRun - } - - /** `DocFrontEnd` uses the Dotty `FrontEnd` without discarding the AnyVal - * interfaces for Boolean, Int, Char, Long, Byte etc. - * - * If `-from-tasty` is set, then the trees and documentation will be loaded - * from TASTY. The comments will be cooked after being unpickled. - * - * It currently still throws away Java sources by overriding - * `discardAfterTyper`. - */ - private class DocFrontEnd extends FrontEnd { - override protected def discardAfterTyper(unit: CompilationUnit)(using Context) = - unit.isJava - - override def isRunnable(using Context): Boolean = - super.isRunnable && !ctx.settings.fromTasty.value - } - - override def phases: List[List[Phase]] = List( - List(new DocFrontEnd), - List(new ReadTasty), - List(new CookComments), - List(new DocImplicitsPhase), - List(new DocASTPhase), - List(DocMiniTransformations( - new UsecasePhase, - new DocstringPhase)), - List(DocMiniTransformations( - new PackageObjectsPhase, - new LinkReturnTypes, - new LinkParamListTypes, - new LinkImplicitlyAddedTypes, - new LinkSuperTypes, - new LinkCompanions, - new AlternateConstructors, - new SortMembers)), - List(DocMiniTransformations( - new RemoveEmptyPackages)), - List(new StatisticsPhase) - ) -} diff --git a/doc-tool/src/dotty/tools/dottydoc/DocDriver.scala b/doc-tool/src/dotty/tools/dottydoc/DocDriver.scala deleted file mode 100644 index 3f095826b707..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/DocDriver.scala +++ /dev/null @@ -1,81 +0,0 @@ -package dotty.tools -package dottydoc - -import java.io.File - -import dotty.tools.dottydoc.util.syntax._ -import core.ContextDottydoc -import dotc.core.Contexts._ -import dotc.reporting.Reporter -import dotc.{ Compiler, Driver } -import dotc.config._ -import dotc.core.Comments.ContextDoc -import dotc.report -import staticsite.Site -import io.AbstractFile - -/** `DocDriver` implements the main entry point to the Dotty documentation - * tool. It's methods are used by the external scala and java APIs. - */ -class DocDriver extends Driver { - import java.util.{ Map => JMap } - import model.JavaConverters._ - - override def setup(args: Array[String], rootCtx: Context): (List[AbstractFile], Context) = { - val ctx = rootCtx.fresh - val summary = CompilerCommand.distill(args)(using ctx) - - ctx.setSettings(summary.sstate) - ctx.setSetting(ctx.settings.YcookComments, true) - ctx.setProperty(ContextDoc, new ContextDottydoc) - - inContext(ctx) { - val fileNames = CompilerCommand.checkUsage(summary, sourcesRequired) - val files = fileNames.map(ctx.getFile) - (files, fromTastySetup(files)) - } - } - - override def newCompiler(using Context): Compiler = new DocCompiler - - override def process(args: Array[String], rootCtx: Context): Reporter = { - val (filesToDocument, ictx) = setup(args, initCtx.fresh) - - implicit val ctx: Context = ictx - val reporter = doCompile(newCompiler, filesToDocument) - - val siteRoot = File(ctx.settings.siteRoot.value) - val projectName = ctx.settings.projectName.value - val projectVersion = ctx.settings.projectVersion.value - val projectUrl = Option(ctx.settings.projectUrl.value).filter(_.nonEmpty) - val projectLogo = Option(ctx.settings.projectLogo.value).filter(_.nonEmpty) - val docSnapshot = ctx.settings.docSnapshot.value - - val baseUrl = "" - val outDir = File(siteRoot, "_site") - val snapshotFolderName = if projectVersion.endsWith("NIGHTLY") then "nightly" else projectVersion - val snapshotOutDir = File(outDir, snapshotFolderName) - val snapshotBaseUrl = s"$baseUrl/$snapshotFolderName" - - if (projectName.isEmpty) - report.error(s"Site project name not set. Use `-project ` to set the project name") - else if (!siteRoot.exists) - report.echo(s"Site root (`-siteroot`) does not exist: $siteRoot, no documentation will be generated.") - else if (!siteRoot.isDirectory) - report.error(s"Site root (`-siteroot`) is not a directory: $siteRoot") - else { - def generateSite(outDir: File, baseUrl: String) = - Site(siteRoot, outDir, projectName, projectVersion, projectUrl, projectLogo, ctx.docbase.packages, baseUrl) - .generateApiDocs() - .copyStaticFiles() - .generateHtmlFiles() - .generateBlog() - - generateSite(outDir, baseUrl) - if docSnapshot then generateSite(snapshotOutDir, snapshotBaseUrl) - ctx.docbase.printSummary() - } - - reporter - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/Main.scala b/doc-tool/src/dotty/tools/dottydoc/Main.scala deleted file mode 100644 index f158bdbfce0c..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/Main.scala +++ /dev/null @@ -1,5 +0,0 @@ -package dotty.tools -package dottydoc - -/** Main runnable for DottyDoc */ -object Main extends DocDriver diff --git a/doc-tool/src/dotty/tools/dottydoc/core/AlternateConstructorsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/AlternateConstructorsPhase.scala deleted file mode 100644 index 567d2dddbb53..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/AlternateConstructorsPhase.scala +++ /dev/null @@ -1,34 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} - -import transform.DocMiniPhase -import model._ -import model.internal._ - -/** This DocMiniPhase adds the alternate constructors, currently defined as - * methods with the name `<init>`, to the Entity#constructors list - */ -class AlternateConstructors extends DocMiniPhase { - def partitionMembers(ent: Entity with Constructors with Members): (List[List[ParamList]], List[Entity]) = { - val (constructors, members) = ent.members.partition(x => x.name == "<init>") - - val paramLists: List[List[ParamList]] = constructors.collect { - case df: Def => df.paramLists - } - - (ent.constructors ++ paramLists, members) - } - - override def transformClass(using Context) = { case cls: ClassImpl => - val (constructors, members) = partitionMembers(cls) - cls.copy(members = members, constructors = constructors) :: Nil - } - - override def transformCaseClass(using Context) = { case cc: CaseClassImpl => - val (constructors, members) = partitionMembers(cc) - cc.copy(members = members, constructors = constructors) :: Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala b/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala deleted file mode 100644 index 31ae8bdda749..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/ContextDottydoc.scala +++ /dev/null @@ -1,136 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Symbols._ -import dotc.core.Flags._ -import dotc.core.Decorators._ -import dotc.core.Comments.ContextDocstrings -import model.{ Package, Entity } -import model.comment.Comment - -import dotc.core.Contexts.{Context, ctx} -import dotc.printing.Highlighting._ -import dotc.printing.Formatting.hl -import dotc.util.{ SourcePosition, NoSourcePosition } -import dotc.report - -class ContextDottydoc extends ContextDocstrings { - import scala.collection.mutable - - private[this] val _packages: mutable.Map[String, Package] = mutable.Map.empty - def packages: Map[String, Package] = _packages.toMap - def packagesMutable: mutable.Map[String, Package] = _packages - - private[this] var _statistics: Map[String, Statistics] = Map.empty - def registerStatistics(pkgName: String, stat: Statistics): Unit = - _statistics = _statistics + (pkgName -> stat) - - def statistics: Map[String, Statistics] = _statistics - - /** Should perhaps factorize this into caches that get flushed */ - private[this] var _defs: Map[Symbol, Set[Symbol]] = Map.empty - def defs(sym: Symbol): Set[Symbol] = _defs.get(sym).getOrElse(Set.empty) - - def addDef(s: Symbol, d: Symbol): Unit = _defs = (_defs + { - s -> _defs.get(s).map(xs => xs + d).getOrElse(Set(d)) - }) - - def error(msg: String, pos: SourcePosition)(using Context): Unit = report.error({ - NoColor("[") + Red("doc error") + "] " + msg - }.toString, pos) - - def error(msg: String)(using Context): Unit = error(msg, NoSourcePosition) - - def warn(msg: String, pos: SourcePosition)(using Context): Unit = report.warning({ - NoColor("[") + Yellow("doc warn") + "] " + msg - }.toString, pos) - - def warn(msg: String)(using Context): Unit = warn(msg, NoSourcePosition) - - def echo(msg: String, pos: SourcePosition)(using Context): Unit = report.echo({ - "[doc info] " + msg - }.toString, pos) - - def echo(msg: String)(using Context): Unit = echo(msg, NoSourcePosition) - - def debug(msg: String, pos: SourcePosition)(using Context): Unit = - if (ctx.settings.Ydebug.value) report.inform({ - "[doc debug] " + msg - }.toString, pos) - - def debug(msg: String)(using Context): Unit = debug(msg, NoSourcePosition) - - def printSummary()(using Context): Unit = { - def colored(part: Int, total: Int) = - if (total == 0) "0" - else { - val percentage = (part * 100.0 / total).toInt - val str = s"$part/$total ($percentage%)" - - if (percentage > 75) Green(str) - else if (percentage > 50) Yellow(str) - else Red(str) - } - - val totalEntities = statistics.totalEntities - - val projectName = ctx.settings.projectName.value - val warningsText = - if (ctx.reporter.hasWarnings) - s"total warnings with regards to compilation and documentation: ${ctx.reporter.warningCount}" - else "" - - val api = statistics.values.iterator.map(_.api).foldLeft(Counters(0,0,0,0,0,0))(_ merge _) - val internalApi = statistics.values.iterator.map(_.internalApi).foldLeft(Counters(0,0,0,0,0,0))(_ merge _) - - val apiSummary = (for { - (pkgName, stat) <- statistics.toList.sortBy(_._1) - } yield { - val pub = colored(stat.api.publicDocstrings, stat.api.publicEntities) - val pro = colored(stat.api.protectedDocstrings, stat.api.protectedEntities) - s"""|package $pkgName - |${Blue("-" * ctx.settings.pageWidth.value)} - |public: $pub \t protected: $pro - |""".stripMargin - }).mkString("\n") - - val internalSummary = (for { - (pkgName, stat) <- statistics.toList.sortBy(_._1) - } yield { - val pub = colored(stat.internalApi.publicDocstrings, stat.internalApi.publicEntities) - val pro = colored(stat.internalApi.protectedDocstrings, stat.internalApi.protectedEntities) - val pri = colored(stat.internalApi.privateDocstrings, stat.internalApi.privateEntities) - s"""|package $pkgName - |${Blue("-" * ctx.settings.pageWidth.value)} - |public: $pub \t protected: $pro \t private: $pri - |""".stripMargin - }).mkString("\n") - - report.echo { - s"""|${Blue("=" * ctx.settings.pageWidth.value)} - |Dottydoc summary report for project `$projectName` - |${Blue("=" * ctx.settings.pageWidth.value)} - |Documented members in public API: - | - |$apiSummary - | - |Summary: - | - |public members with docstrings: ${colored(api.publicDocstrings, api.publicEntities)} - |${hl("protected")} members with docstrings: ${colored(api.protectedDocstrings, api.protectedEntities)} - |${Blue("=" * ctx.settings.pageWidth.value)} - | - |Documented members in internal API: - | - |$internalSummary - | - |Summary internal API: - | - |public members with docstrings: ${colored(internalApi.publicDocstrings, internalApi.publicEntities)} - |${hl("protected")} members with docstrings: ${colored(internalApi.protectedDocstrings, internalApi.protectedEntities)} - |${hl("private")} members with docstrings: ${colored(internalApi.privateDocstrings, internalApi.privateEntities)} - |$warningsText""".stripMargin - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala deleted file mode 100644 index d9a1fde9781f..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocASTPhase.scala +++ /dev/null @@ -1,256 +0,0 @@ -package dotty.tools -package dottydoc -package core - -/** Dotty and Dottydoc imports */ -import dotc.ast.Trees._ -import dotc.CompilationUnit -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Types.PolyType -import dotc.core.Phases.Phase -import dotc.core.Symbols.{ Symbol, NoSymbol } -import dotc.core.NameOps._ -import dotc.report - -class DocASTPhase extends Phase { - import model._ - import model.factories._ - import model.internal._ - import dotty.tools.dotc.core.Flags - import dotty.tools.dotc.ast.tpd._ - import dotty.tools.dottydoc.util.syntax._ - import util.traversing._ - import util.internal.setters._ - - def phaseName = "docASTPhase" - - /** Build documentation hierarchy from existing tree */ - def collect(tree: Tree)(using Context): List[Entity] = { - val implicitConversions = ctx.docbase.defs(tree.symbol) - - def collectList(xs: List[Tree]): List[Entity] = - xs.flatMap(collect) - - def collectEntityMembers(xs: List[Tree]) = - collectList(xs).asInstanceOf[List[Entity with Members]] - - def collectMembers(tree: Tree)(using Context): List[Entity] = { - val defs = tree match { - case t: Template => collectList(t.body) - case _ => Nil - } - - defs ++ implicitConversions.flatMap(membersFromSymbol) - } - - def membersFromSymbol(sym: Symbol): List[Entity] = { - if (sym.info.exists) { - val defs = sym.info.bounds.hi.finalResultType.membersBasedOnFlags(Flags.Method, Flags.Synthetic | Flags.Private) - .filterNot(_.symbol.owner.name.show == "Any") - .map { meth => - DefImpl( - meth.symbol, - annotations(meth.symbol), - meth.symbol.name.show, - Nil, - path(meth.symbol), - returnType(meth.info), - typeParams(meth.symbol), - paramLists(meth.info), - implicitlyAddedFrom = Some(returnType(meth.symbol.owner.info)) - ) - }.toList - - // don't add privates, synthetics or class parameters (i.e. value class constructor val) - val vals = sym.info.fields.filterNot(_.symbol.isOneOf(Flags.ParamAccessor | Flags.Private | Flags.Synthetic)).map { value => - val kind = if (value.symbol.is(Flags.Mutable)) "var" else "val" - ValImpl( - value.symbol, - annotations(value.symbol), - value.symbol.name.show, - Nil, path(value.symbol), - returnType(value.info), - kind, - implicitlyAddedFrom = Some(returnType(value.symbol.owner.info)) - ) - } - - defs ++ vals - } - else Nil - } - - - if (tree.symbol.is(Flags.Synthetic) && !tree.symbol.is(Flags.Module)) Nil - else tree match { - /** package */ - case pd @ PackageDef(pid, st) => - addPackage(PackageImpl(pd.symbol, annotations(pd.symbol), pd.symbol.showFullName, collectEntityMembers(st), path(pd.symbol))) :: Nil - - /** type alias */ - case t: TypeDef if !t.isClassDef => - val sym = t.symbol - if (sym.isOneOf(Flags.Synthetic | Flags.Param)) - Nil - else { - val tparams = t.rhs.tpe match { - case tp: PolyType => tp.paramNames.map(_.show) - case _ => Nil - } - TypeAliasImpl(sym, annotations(sym), flags(t), t.name.show.split("\\$\\$").last, path(sym), alias(t.rhs.tpe), tparams) :: Nil - } - - /** trait */ - case t @ TypeDef(n, rhs) if t.symbol.is(Flags.Trait) => - //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - TraitImpl(t.symbol, annotations(t.symbol), n.show, collectMembers(rhs), flags(t), path(t.symbol), typeParams(t.symbol), traitParameters(t.symbol), superTypes(t)) :: Nil - - /** objects, on the format "Object$" so drop the last letter */ - case o @ TypeDef(n, rhs) if o.symbol.is(Flags.Module) => - //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - ObjectImpl(o.symbol, annotations(o.symbol), o.name.stripModuleClassSuffix.show, collectMembers(rhs), flags(o), path(o.symbol), superTypes(o)) :: Nil - - /** class / case class */ - case c @ TypeDef(n, rhs) if c.symbol.isClass => - //TODO: should not `collectMember` from `rhs` - instead: get from symbol, will get inherited members as well - val parameters = (c.symbol, annotations(c.symbol), n.show, collectMembers(rhs), flags(c), path(c.symbol), typeParams(c.symbol), constructors(c.symbol), superTypes(c), None, Nil, None) - val constr = - if (c.symbol.is(Flags.CaseClass)) CaseClassImpl.apply - else ClassImpl.apply - - constr.tupled(parameters) :: Nil - - /** def */ - case d: DefDef => - DefImpl(d.symbol, annotations(d.symbol), d.name.decode.toString, flags(d), path(d.symbol), returnType(d.tpt.tpe), typeParams(d.symbol), paramLists(d.symbol.info)) :: Nil - - /** val */ - case v: ValDef if !v.symbol.is(Flags.ModuleVal) => - val kind = if (v.symbol.is(Flags.Mutable)) "var" else "val" - ValImpl(v.symbol, annotations(v.symbol), v.name.decode.toString, flags(v), path(v.symbol), returnType(v.tpt.tpe), kind) :: Nil - - case x => { - ctx.docbase.debug(s"Found unwanted entity: $x (${x.span},\n${x.show}") - Nil - } - } - } - - var packages: Map[String, PackageImpl] = Map.empty - - def addPackage(newPkg: PackageImpl): Package = { - def mergeMembers(newPkg: PackageImpl, oldPkg: PackageImpl): Unit = { - val othersNew = newPkg.members.filterNot(_.kind == "package") - val (oldPacks, othersOld) = oldPkg.members.partition(_.kind == "package") - - val others = othersNew ::: othersOld - // here we can just choose the old packs, since we're recursively (bottom up) - // discovering the tree, we should have met the child packages first, as - // such - they were already inserted into the tree - val newMembers = (others ++ oldPacks) - - oldPkg.members = newMembers - } - - // This function mutates packages in place as not to create any orphaned references - def mergedPackages(old: PackageImpl, newPkg: PackageImpl): PackageImpl = { - if (old.symbol eq NoSymbol) old.symbol = newPkg.symbol - if (old.annotations.isEmpty) old.annotations = newPkg.annotations - mergeMembers(newPkg, old) - if (old.superTypes.isEmpty) old.superTypes = newPkg.superTypes - if (old.comment.isEmpty) old.comment = newPkg.comment - old - } - - def insertOrModifyRoot(): PackageImpl = { - val modifiedPkg = - packages - .get(newPkg.name) - .map(mergedPackages(_, newPkg)) - .getOrElse(newPkg) - - packages = packages + (modifiedPkg.name -> modifiedPkg) - modifiedPkg - } - - // This function inserts a package by creating empty packages to the point - // where it can insert the supplied package `newPkg`. - def createAndInsert(currentPkg: PackageImpl, path: List[String]): PackageImpl = { - (path: @unchecked) match { - case x :: Nil => { - val existingPkg = currentPkg.members.collectFirst { - case p: PackageImpl if p.name == newPkg.name => p - } - - if (existingPkg.isDefined) mergedPackages(existingPkg.get, newPkg) - else { - currentPkg.members = newPkg :: currentPkg.members - newPkg - } - } - case x :: xs => { - val subPkg = s"${currentPkg.name}.$x" - val existingPkg = currentPkg.members.collectFirst { - case p: PackageImpl if p.name == subPkg => p - } - - if (existingPkg.isDefined) createAndInsert(existingPkg.get, xs) - else { - val newEmpty = EmptyPackage(currentPkg.path :+ x, subPkg) - packages = packages + (subPkg -> newEmpty) - currentPkg.members = newEmpty :: currentPkg.members - createAndInsert(newEmpty, xs) - } - } - } - } - - val path = newPkg.path - if (path.length == 1) - insertOrModifyRoot() - else if (packages.contains(newPkg.name)) - mergedPackages(packages(newPkg.name), newPkg) - else { - val root = packages.get(path.head) - if (root.isDefined) - // Root ancestor of `newPkg` exists, start recursing to point of - // insertion. Point of insertion will be the parent package of `newPkg`. - // - // Which is the first element of `newPkg`'s path - thus we use the tail - // to continue traversing down the tree. - createAndInsert(root.get, path.tail) - else { - val newEmpty = EmptyPackage(List(path.head), path.head) - packages = packages + (path.head -> newEmpty) - createAndInsert(newEmpty, path.tail) - } - } - } - - private[this] var totalRuns = 0 - private[this] var currentRun = 0 - - override def run(using Context): Unit = { - currentRun += 1 - report.echo(s"Compiling ($currentRun/$totalRuns): ${ctx.compilationUnit.source.file.name}") - collect(ctx.compilationUnit.tpdTree) // Will put packages in `packages` var - } - - override def runOn(units: List[CompilationUnit])(using Context): List[CompilationUnit] = { - // (1) Create package structure for all `units`, this will give us a complete structure - totalRuns = units.length - val compUnits = super.runOn(units) - - // (2) Set parents of entities, needed for linking - for { - parent <- rootPackages(packages) - child <- parent.members - } setParent(child, to = parent) - - // (3) Update Doc AST in ctx.base - for (kv <- packages) ctx.docbase.packagesMutable += kv - - // Return super's result - compUnits - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocImplicitsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocImplicitsPhase.scala deleted file mode 100644 index e9f61c47dce5..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocImplicitsPhase.scala +++ /dev/null @@ -1,26 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotty.tools.dotc.transform.MegaPhase.MiniPhase -import dotty.tools.dotc.core.Flags -import dotc.core.Contexts.{Context, ctx} -import util.syntax._ - -class DocImplicitsPhase extends MiniPhase { - import dotty.tools.dotc.ast.tpd._ - - def phaseName = "addImplicitsPhase" - - override def transformDefDef(tree: DefDef)(using Context): Tree = { - if tree.symbol.isOneOf(Flags.GivenOrImplicit) // has to have an implicit flag - && tree.symbol.owner.isStaticOwner // owner has to be static (e.g. top-level `object`) - && tree.termParamss.length > 0 - && tree.termParamss(0).length == 1 // should only take one arg, since it has to be a transformation - then - val convertee = tree.termParamss(0)(0).symbol.info.widenDealias.finalResultType.typeSymbol // the pimped type (i.e. `class`) - ctx.docbase.addDef(convertee, tree.symbol.info.widenDealias.finalResultType.typeSymbol) - - tree - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/DocstringPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/DocstringPhase.scala deleted file mode 100644 index 4b8b9402936a..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/DocstringPhase.scala +++ /dev/null @@ -1,74 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Symbols.Symbol -import dotc.core.Comments.{ Comment => CompilerComment } -import transform.DocMiniPhase -import model._ -import model.internal._ -import model.comment._ -import util.syntax._ - -/** Phase to add docstrings to the Dottydoc AST */ -class DocstringPhase extends DocMiniPhase with CommentParser with CommentCleaner { - - private def getComment(sym: Symbol)(using Context): Option[CompilerComment] = { - ctx.docbase.docstring(sym) - .orElse { - // If the symbol doesn't have a docstring, look for an overridden - // ancestor with a docstring - sym.allOverriddenSymbols.collectFirst { - case parentSym if ctx.docbase.docstring(parentSym).isDefined => - parentSym - } - .flatMap(ctx.docbase.docstring) - } - } - - private def parsedComment(ent: Entity)(using Context): Option[Comment] = { - for { - comment <- getComment(ent.symbol) - text <- comment.expandedBody - } yield { - val parsed = parse(ent, ctx.docbase.packages, clean(text), text, comment.span) - if (ctx.settings.wikiSyntax.value) - WikiComment(ent, parsed, comment.span).comment - else - MarkdownComment(ent, parsed, comment.span).comment - } - } - - override def transformPackage(using Context) = { case ent: PackageImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformClass(using Context) = { case ent: ClassImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformCaseClass(using Context) = { case ent: CaseClassImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformTrait(using Context) = { case ent: TraitImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformObject(using Context) = { case ent: ObjectImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformDef(using Context) = { case ent: DefImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformVal(using Context) = { case ent: ValImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } - - override def transformTypeAlias(using Context) = { case ent: TypeAliasImpl => - ent.copy(comment = parsedComment(ent)) :: Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/LinkCompanionsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/LinkCompanionsPhase.scala deleted file mode 100644 index a3135a3b3f59..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/LinkCompanionsPhase.scala +++ /dev/null @@ -1,42 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} - -import transform.DocMiniPhase -import model.internal._ -import model._ - -class LinkCompanions extends DocMiniPhase { - private def linkCompanions(ent: Entity)(using Context): ent.type = { - ent.children.groupBy(_.name).foreach { - case (_, List(x1: Companion, x2: Companion)) => - x1.companionPath = x2.path - x2.companionPath = x1.path - - case _ => () - } - ent - } - - override def transformPackage(using Context) = { case ent: PackageImpl => - linkCompanions(ent) :: Nil - } - - override def transformClass(using Context) = { case ent: ClassImpl => - linkCompanions(ent) :: Nil - } - - override def transformCaseClass(using Context) = { case ent: CaseClassImpl => - linkCompanions(ent) :: Nil - } - - override def transformObject(using Context) = { case ent: ObjectImpl => - linkCompanions(ent) :: Nil - } - - override def transformTrait(using Context) = { case ent: TraitImpl => - linkCompanions(ent) :: Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala deleted file mode 100644 index 74636755c65d..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/PackageObjectsPhase.scala +++ /dev/null @@ -1,30 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} -import model._ -import model.internal._ -import transform.DocMiniPhase - -class PackageObjectsPhase extends DocMiniPhase { - - override def transformPackage(using Context) = { case pkg: PackageImpl => - pkg - .members - .collectFirst { case o: Object if o.symbol.isPackageObject => o } - .map { obj => - pkg.copy( - members = obj.members ++ pkg.members, - superTypes = obj.superTypes, - comment = obj.comment - ) - } - .getOrElse(pkg) :: Nil - } - - override def transformObject(using Context) = { case obj: Object => - if (obj.symbol.isPackageObject) Nil - else obj :: Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/RemoveEmptyPackagesPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/RemoveEmptyPackagesPhase.scala deleted file mode 100644 index 19bcee63133e..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/RemoveEmptyPackagesPhase.scala +++ /dev/null @@ -1,15 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} - -import transform.DocMiniPhase -import model._ - -class RemoveEmptyPackages extends DocMiniPhase { - override def transformPackage(using Context) = { case p: Package => - if (p.members.exists(_.kind != "package")) p :: Nil - else Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala deleted file mode 100644 index a544df2c6a92..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/SortMembersPhase.scala +++ /dev/null @@ -1,55 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} - -import transform.DocMiniPhase -import model._ -import model.internal._ - -/** This DocMiniPhase sorts the members of all classes, traits, objects and packages */ -class SortMembers extends DocMiniPhase { - private implicit val EntityOrdering: Ordering[Entity] = new Ordering[Entity] { - def compare(x: Entity, y: Entity): Int = { - val nameComp = x.name.compareTo(y.name) - if (nameComp == 0) x.kind.compareTo(y.kind) - else nameComp - } - } - - private def sort(xs: List[Entity]): List[Entity] = { - def sortOrNil(xs: Option[List[Entity]]*) = - xs.map(_.getOrElse(Nil)).reduceLeft(_ ++ _).sorted - - val map = xs.groupBy(_.kind) - - val pkgs = sortOrNil(map.get("package")) - val typs = sortOrNil(map.get("type")) - val vals = sortOrNil(map.get("val"), map.get("var")) - val nested = sortOrNil(map.get("object"), map.get("class"), map.get("case class"), map.get("trait")) - val defs = sortOrNil(map.get("def")) - - pkgs ++ nested ++ typs ++ vals ++ defs - } - - override def transformPackage(using Context) = { case p: PackageImpl => - p.copy(members = sort(p.members)) :: Nil - } - - override def transformClass(using Context) = { case c: ClassImpl => - c.copy(members = sort(c.members)) :: Nil - } - - override def transformCaseClass(using Context) = { case cc: CaseClassImpl => - cc.copy(members = sort(cc.members)) :: Nil - } - - override def transformTrait(using Context) = { case t: TraitImpl => - t.copy(members = sort(t.members)) :: Nil - } - - override def transformObject(using Context) = { case o: ObjectImpl => - o.copy(members = sort(o.members)) :: Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/StatisticsPhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/StatisticsPhase.scala deleted file mode 100644 index bb409bbb5259..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/StatisticsPhase.scala +++ /dev/null @@ -1,156 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Phases.Phase -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Symbols.Symbol -import dotc.core.Decorators._ -import dotc.core.Flags._ -import dotc.CompilationUnit -import dottydoc.util.syntax._ -import dottydoc.util.traversing._ - -import model._ - -object Statistics { - implicit class MapTotals(val map: Map[String, Statistics]) extends AnyVal { - def totalEntities = - map.values.foldLeft(0)(_ + _.totalEntities) - } -} - -case class Statistics(pkgName: String, api: Counters, internalApi: Counters) { - def totalEntities = - api.totalEntities + internalApi.totalEntities - - def totalDocstrings = - api.totalDocstrings + internalApi.totalDocstrings -} - -case class Counters( - publicEntities: Int, - privateEntities: Int, - protectedEntities: Int, - - publicDocstrings: Int, - privateDocstrings: Int, - protectedDocstrings: Int -) { - def totalEntities = - publicEntities + privateEntities + protectedEntities - - def totalDocstrings = - publicDocstrings + privateDocstrings + protectedDocstrings - - def merge(o: Counters): Counters = Counters( - publicEntities + o.publicEntities, - privateEntities + o.privateEntities, - protectedEntities + o.protectedEntities, - publicDocstrings + o.publicDocstrings, - privateDocstrings + o.privateDocstrings, - protectedDocstrings + o.protectedDocstrings - ) -} - -class StatisticsPhase extends Phase { - - def phaseName = "StatisticsPhase" - - override def run(using Context): Unit = () - - override def runOn(units: List[CompilationUnit])(using Context): List[CompilationUnit] = { - for { - (pkgName, pack) <- ctx.docbase.packages - externalApi = collectPublicStats(pack) - internalApi = collectInternalStats(pack) - stats = Statistics(pkgName, externalApi, internalApi) - } ctx.docbase.registerStatistics(pkgName, stats) - - units - } - - def collectPublicStats(pack: Package)(using Context): Counters = { - var publicEntities: Int = 0 - var protectedEntities: Int = 0 - var publicDocstrings: Int = 0 - var protectedDocstrings: Int = 0 - - if (pack.comment.isDefined) { - publicEntities += 1 - publicDocstrings += 1 - } - - def doCount(sym: Symbol, comment: Int): Unit = - if (!sym.is(Protected)) { - publicEntities += 1 - publicDocstrings += comment - } - else { - protectedEntities += 1 - protectedDocstrings += comment - } - - - def recur(e: Entity, reachable: Boolean): Unit = { - val isVisible = !e.symbol.is(Private) && !e.symbol.privateWithin.exists - val shouldCount = isVisible && reachable - e match { - case e: Package => () - case e: Entity with Members => if (shouldCount) { - doCount(e.symbol, if (e.comment.isDefined) 1 else 0) - e.members.foreach { c => - if (!(e.symbol.is(Final) && c.symbol.is(Protected))) recur(c, true) - } - } - case e => - if (shouldCount) doCount(e.symbol, if (e.comment.isDefined) 1 else 0) - } - } - - pack.members.foreach(recur(_, true)) - Counters(publicEntities, 0, protectedEntities, publicDocstrings, 0, protectedDocstrings) - } - - def collectInternalStats(pack: Package)(using Context): Counters = { - var publicEntities: Int = 0 - var privateEntities: Int = 0 - var protectedEntities: Int = 0 - var publicDocstrings: Int = 0 - var privateDocstrings: Int = 0 - var protectedDocstrings: Int = 0 - - def doCount(sym: Symbol, comment: Int): Unit = - if (sym.is(Private)) { - privateEntities += 1 - privateDocstrings += comment - } - else if (!sym.is(Protected)) { - publicEntities += 1 - publicDocstrings += comment - } - else { - protectedEntities += 1 - protectedDocstrings += comment - } - - - def recur(e: Entity, reachable: Boolean): Unit = { - val internal = !reachable || e.symbol.is(Private) || e.symbol.privateWithin.exists - e match { - case _: Package => () - case e: Entity with Members => - e.members.foreach { c => - val childIsInternal = !internal || (e.symbol.is(Final) && c.symbol.is(Protected)) - recur(c, childIsInternal) - } - if (internal) doCount(e.symbol, if (e.comment.isDefined) 1 else 0) - case _ => - if (internal) doCount(e.symbol, if (e.comment.isDefined) 1 else 0) - } - } - - pack.members.foreach(recur(_, true)) - Counters(publicEntities, privateEntities, protectedEntities, publicDocstrings, privateDocstrings, protectedDocstrings) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala b/doc-tool/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala deleted file mode 100644 index be780b7c06c1..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/TypeLinkingPhases.scala +++ /dev/null @@ -1,119 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} - -import transform.DocMiniPhase -import model._ -import model.internal._ -import model.comment._ -import model.references._ -import HtmlParsers._ -import util.MemberLookup -import util.syntax._ - -class LinkReturnTypes extends DocMiniPhase with TypeLinker { - override def transformDef(using Context) = { case df: DefImpl => - val returnValue = linkReference(df, df.returnValue, ctx.docbase.packages) - df.copy(returnValue = returnValue) :: Nil - } - - override def transformVal(using Context) = { case vl: ValImpl => - val returnValue = linkReference(vl, vl.returnValue, ctx.docbase.packages) - vl.copy(returnValue = returnValue) :: Nil - } - - override def transformTypeAlias(using Context) = { case ta: TypeAliasImpl => - ta.alias.map { alias => - val linkedAlias = linkReference(ta, alias, ctx.docbase.packages) - ta.copy(alias = Some(linkedAlias)) :: Nil - } - .getOrElse(ta :: Nil) - } -} - -class LinkParamListTypes extends DocMiniPhase with TypeLinker { - override def transformDef(using Context) = { case df: DefImpl => - val newParamLists = for { - ParamListImpl(list, isImplicit) <- df.paramLists - newList = list.map(linkReference(df, _, ctx.docbase.packages)) - } yield ParamListImpl(newList.asInstanceOf[List[NamedReference]], isImplicit) - - df.copy(paramLists = newParamLists) :: Nil - } -} - -class LinkSuperTypes extends DocMiniPhase with TypeLinker { - def linkSuperTypes(ent: Entity with SuperTypes)(using Context): List[MaterializableLink] = - ent.superTypes.collect { - case UnsetLink(title, query) => - handleEntityLink(title, lookup(Some(ent), ctx.docbase.packages, query), ent) - } - - override def transformClass(using Context) = { case cls: ClassImpl => - cls.copy(superTypes = linkSuperTypes(cls)) :: Nil - } - - override def transformCaseClass(using Context) = { case cc: CaseClassImpl => - cc.copy(superTypes = linkSuperTypes(cc)) :: Nil - } - - override def transformTrait(using Context) = { case trt: TraitImpl => - trt.copy(superTypes = linkSuperTypes(trt)) :: Nil - } - - override def transformObject(using Context) = { case obj: ObjectImpl => - obj.copy(superTypes = linkSuperTypes(obj)) :: Nil - } -} - -class LinkImplicitlyAddedTypes extends DocMiniPhase with TypeLinker { - override def transformDef(using Context) = { - case df: DefImpl if df.implicitlyAddedFrom.isDefined => - val implicitlyAddedFrom = linkReference(df, df.implicitlyAddedFrom.get, ctx.docbase.packages) - df.copy(implicitlyAddedFrom = Some(implicitlyAddedFrom)) :: Nil - } - - override def transformVal(using Context) = { - case vl: ValImpl if vl.implicitlyAddedFrom.isDefined => - val implicitlyAddedFrom = linkReference(vl, vl.implicitlyAddedFrom.get, ctx.docbase.packages) - vl.copy(implicitlyAddedFrom = Some(implicitlyAddedFrom)) :: Nil - } -} - -trait TypeLinker extends MemberLookup { - def handleEntityLink(title: String, target: Option[Entity], ent: Entity, query: String = ""): MaterializableLink = - target match { - case Some(target) => new MaterializedLink(title, target) - case none => NoLink(title, query) - } - - def linkReference(ent: Entity, ref: Reference, packs: Map[String, Package]): Reference = { - def linkRef(ref: Reference) = linkReference(ent, ref, packs) - - ref match { - case ref @ TypeReference(_, UnsetLink(t, query), tps) => - val inlineToHtml = InlineToHtml(ent) - val title = t - - val target = handleEntityLink(title, lookup(Some(ent), packs, query), ent, query) - val tpTargets = tps.map(linkReference(ent, _, packs)) - ref.copy(tpeLink = target, paramLinks = tpTargets) - case ref @ OrTypeReference(left, right) => - ref.copy(left = linkReference(ent, left, packs), right = linkReference(ent, right, packs)) - case ref @ AndTypeReference(left, right) => - ref.copy(left = linkReference(ent, left, packs), right = linkReference(ent, right, packs)) - case ref @ NamedReference(_, rf, _, _) => - ref.copy(ref = linkRef(rf)) - case ref @ FunctionReference(args, rv, _) => - ref.copy(args = args.map(linkReference(ent, _, packs)), returnValue = linkReference(ent, rv, packs)) - case ref @ TupleReference(args) => - ref.copy(args = args.map(linkRef)) - case ref @ BoundsReference(low, high) => - ref.copy(low = linkRef(low), high = linkRef(high)) - case _ => - ref - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala b/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala deleted file mode 100644 index 3bf100a059f9..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/UsecasePhase.scala +++ /dev/null @@ -1,38 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.core.Contexts.{Context, ctx} -import dotc.ast.tpd - -import transform.DocMiniPhase -import model.internal._ -import model.factories._ -import dotty.tools.dotc.core.Symbols.Symbol -import util.syntax._ - -class UsecasePhase extends DocMiniPhase { - private def defdefToDef(d: tpd.DefDef, sym: Symbol)(using Context) = { - val name = d.name.show.split("\\$").head - DefImpl( - sym, - annotations(sym), - name, - flags(d), - path(d.symbol).init :+ name, - returnType(d.tpt.tpe), - typeParams(d.symbol), - paramLists(d.symbol.info) - ) - } - - override def transformDef(using Context) = { case df: DefImpl => - val defdefs = - ctx.docbase.docstring(df.symbol) - .map(_.usecases.flatMap(_.tpdCode)) - .getOrElse(Nil) - - if (defdefs.isEmpty) df :: Nil - else defdefs.map(defdefToDef(_, df.symbol)) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/core/transform.scala b/doc-tool/src/dotty/tools/dottydoc/core/transform.scala deleted file mode 100644 index 04e2d771159a..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/core/transform.scala +++ /dev/null @@ -1,234 +0,0 @@ -package dotty.tools -package dottydoc -package core - -import dotc.CompilationUnit -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Phases.Phase -import model._ -import model.internal._ -import util.syntax._ -import util.traversing._ - -object transform { - /** - * The idea behind DocMiniTransformations is to fuse transformations to the - * doc AST, much like `MiniPhase` in dotty core - but in a much simpler - * implementation - * - * Usage - * ----- - * - * Create a `DocMiniPhase` which overrides the relevant method: - * - * ``` - * override def transformDef(using Context) = { - * case x if shouldTransform(x) => x.copy(newValue = ...) :: Nil - * } - * ``` - * - * On each node in the AST, the appropriate method in `DocMiniPhase` will be - * called in the order that they are supplied in - * `DocMiniphaseTransformations`. - * - * There won't be a match-error as `transformX` is composed with an - * `identity` function. - * - * The transformations in `DocMiniTransformations` will apply transformations - * to all nodes - this means that you do _not_ need to transform children in - * `transformPackage`, because `transformX` will be called for the relevant - * children. If you want to add children to `Package` you need to do that in - * `transformPackage`, these additions will be persisted. - * - * Deleting nodes in the AST - * ------------------------- - * To delete a node in the AST, simply return an empty list from transforming method - */ - abstract class DocMiniTransformations extends Phase { - def transformations: List[DocMiniPhase] - - override def runOn(units: List[CompilationUnit])(using Context): List[CompilationUnit] = { - for { - pack <- rootPackages(ctx.docbase.packages) - transformed = performPackageTransform(pack) - } { - ctx.docbase.packagesMutable -= pack.name - transformed.foreach(p => ctx.docbase.packagesMutable += p.name -> p) - } - - units - } - - private def performPackageTransform(pack: Package)(using Context): List[Package] = { - def transformEntity[E <: Entity](e: E, f: DocMiniPhase => E => List[E])(createNew: E => E): List[Entity] = { - val transformEntities = transformations.foldLeft(e :: Nil) { case (oldEs, transf) => - oldEs.flatMap(f(transf)) - } - transformEntities.map(createNew) - } - - def traverse(ent: Entity): List[Entity] = ent match { - case p: Package => transformEntity(p, _.packageTransformation) { p => - val newPackage = PackageImpl( - p.symbol, - p.annotations, - p.name, - p.members.flatMap(traverse), - p.path, - p.superTypes, - p.comment, - p.parent - ) - - // Update reference in context to newPackage - ctx.docbase.packagesMutable += (newPackage.path.mkString(".") -> newPackage) - - newPackage - } - case t: TypeAlias => transformEntity(t, _.typeAliasTransformation) { t => - TypeAliasImpl( - t.symbol, - t.annotations, - t.modifiers, - t.name, - t.path, - t.alias, - t.typeParams, - t.comment, - t.parent - ) - } - case c: Class => transformEntity(c, _.classTransformation) { cls => - ClassImpl( - cls.symbol, - cls.annotations, - cls.name, - cls.members.flatMap(traverse), - cls.modifiers, - cls.path, - cls.typeParams, - cls.constructors, - cls.superTypes, - cls.comment, - cls.companionPath, - cls.parent - ) - } - case cc: CaseClass => transformEntity(cc, _.caseClassTransformation) { cc => - CaseClassImpl( - cc.symbol, - cc.annotations, - cc.name, - cc.members.flatMap(traverse), - cc.modifiers, - cc.path, - cc.typeParams, - cc.constructors, - cc.superTypes, - cc.comment, - cc.companionPath, - cc.parent - ) - } - case trt: Trait => transformEntity(trt, _.traitTransformation) { trt => - TraitImpl( - trt.symbol, - trt.annotations, - trt.name, - trt.members.flatMap(traverse), - trt.modifiers, - trt.path, - trt.typeParams, - trt.traitParams, - trt.superTypes, - trt.comment, - trt.companionPath, - trt.parent - ) - } - case obj: Object => transformEntity(obj, _.objectTransformation) { obj => - ObjectImpl( - obj.symbol, - obj.annotations, - obj.name, - obj.members.flatMap(traverse), - obj.modifiers, - obj.path, - obj.superTypes, - obj.comment, - obj.companionPath, - obj.parent - ) - } - case df: Def => transformEntity(df, _.defTransformation) { df => - DefImpl( - df.symbol, - df.annotations, - df.name, - df.modifiers, - df.path, - df.returnValue, - df.typeParams, - df.paramLists, - df.comment, - df.implicitlyAddedFrom, - df.parent - ) - } - case vl: Val => transformEntity(vl, _.valTransformation) { vl => - ValImpl( - vl.symbol, - vl.annotations, - vl.name, - vl.modifiers, - vl.path, - vl.returnValue, - vl.kind, - vl.comment, - vl.implicitlyAddedFrom, - vl.parent - ) - } - } - - traverse(pack).asInstanceOf[List[Package]] - } - - override def run(using Context): Unit = () - } - - object DocMiniTransformations { - private var previousPhase = 0 - def apply(miniPhases: DocMiniPhase*) = - new DocMiniTransformations { - val transformations = miniPhases.toList - val packages = Map.empty[String, Package] - - def phaseName = s"MiniTransformation${ previousPhase += 1 }" - } - } - - trait DocMiniPhase { phase => - private def identity[E]: PartialFunction[E, List[E]] = { - case id: E @unchecked => id :: Nil - } - - def transformPackage(using Context): PartialFunction[Package, List[Package]] = identity - def transformTypeAlias(using Context): PartialFunction[TypeAlias, List[TypeAlias]] = identity - def transformClass(using Context): PartialFunction[Class, List[Class]] = identity - def transformCaseClass(using Context): PartialFunction[CaseClass, List[CaseClass]] = identity - def transformTrait(using Context): PartialFunction[Trait, List[Trait]] = identity - def transformObject(using Context): PartialFunction[Object, List[Object]] = identity - def transformDef(using Context): PartialFunction[Def, List[Def]] = identity - def transformVal(using Context): PartialFunction[Val, List[Val]] = identity - - private[transform] def packageTransformation(p: Package)(using Context) = (transformPackage orElse identity)(p) - private[transform] def typeAliasTransformation(alias: TypeAlias)(using Context) = (transformTypeAlias orElse identity)(alias) - private[transform] def classTransformation(cls: Class)(using Context) = (transformClass orElse identity)(cls) - private[transform] def caseClassTransformation(cc: CaseClass)(using Context) = (transformCaseClass orElse identity)(cc) - private[transform] def traitTransformation(trt: Trait)(using Context) = (transformTrait orElse identity)(trt) - private[transform] def objectTransformation(obj: Object)(using Context) = (transformObject orElse identity)(obj) - private[transform] def defTransformation(df: Def)(using Context) = (transformDef orElse identity)(df) - private[transform] def valTransformation(vl: Val)(using Context) = (transformVal orElse identity)(vl) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala b/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala deleted file mode 100644 index f9d26e1052d1..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/JavaConverters.scala +++ /dev/null @@ -1,299 +0,0 @@ -package dotty.tools.dottydoc -package model - -import comment._ -import references._ - -import java.util.LinkedList - -object JavaConverters { - import scala.collection.JavaConverters._ - import java.util.{ Map => JMap } - - implicit class OptStr(val opt: Option[String]) extends AnyVal { - def asJava = opt.getOrElse(null) - } - - implicit class OptMap(val opt: Option[JMap[String, _]]) extends AnyVal { - def asJava = opt.getOrElse(Map.empty.asJava) - } - - implicit class JavaComment(val cmt: Comment) extends AnyVal { - def asJava: JMap[String, _] = Map( - "body" -> cmt.body, - "short" -> cmt.short, - "authors" -> cmt.authors.asJava, - "see" -> cmt.see.asJava, - "result" -> cmt.result.asJava, - "throws" -> cmt.throws.asJava, - "valueParams" -> cmt.valueParams.asJava, - "typeParams" -> cmt.typeParams.asJava, - "version" -> cmt.version.asJava, - "since" -> cmt.since.asJava, - "todo" -> cmt.todo.asJava, - "deprecated" -> cmt.deprecated.asJava, - "note" -> cmt.note.asJava, - "example" -> cmt.example.asJava, - "constructor" -> cmt.constructor.asJava, - "group" -> cmt.group.asJava, - "groupDesc" -> cmt.groupDesc.asJava, - "groupNames" -> cmt.groupNames.asJava, - "groupPrio" -> cmt.groupPrio.asJava, - "hideImplicitConversions" -> cmt.hideImplicitConversions.asJava - ).asJava - } - - implicit class JavaParamList(val pl: ParamList) extends AnyVal { - def asJava: JMap[String, _] = Map( - "list" -> pl.list.map(_.asJava).asJava, - "isImplicit" -> pl.isImplicit - ).asJava - } - - implicit class JavaReference(val ref: Reference) extends AnyVal { - def asJava: JMap[String, _] = ref match { - case TypeReference(title, tpeLink, paramLinks) => Map( - "kind" -> "TypeReference", - "title" -> title, - "tpeLink" -> tpeLink.asJava, - "paramLinks" -> paramLinks.map(_.asJava).asJava, - "scala" -> ref - ).asJava - - case OrTypeReference(left, right) => Map( - "kind" -> "OrTypeReference", - "left" -> left.asJava, - "right" -> right.asJava, - "scala" -> ref - ).asJava - - case AndTypeReference(left, right) => Map( - "kind" -> "AndTypeReference", - "left" -> left.asJava, - "right" -> right.asJava, - "scala" -> ref - ).asJava - - case FunctionReference(args, returnValue, isImplicit) => Map( - "kind" -> "FunctionReference", - "args" -> args.map(_.asJava).asJava, - "returnValue" -> returnValue.asJava, - "isImplicit" -> isImplicit, - "scala" -> ref - ).asJava - - case TupleReference(args) => Map( - "kind" -> "TupleReference", - "args" -> args.map(_.asJava).asJava, - "scala" -> ref - ).asJava - - case BoundsReference(low, high) => Map( - "kind" -> "BoundsReference", - "low" -> low.asJava, - "hight" -> high.asJava, - "scala" -> ref - ).asJava - - case NamedReference(title, ref, isByName, isRepeated) => Map( - "kind" -> "NamedReference", - "title" -> title, - "ref" -> ref.asJava, - "isByName" -> isByName, - "isRepeated" -> isRepeated, - "scala" -> ref - ).asJava - - case ConstantReference(title) => Map( - "kind" -> "ConstantReference", - "title" -> title, - "scala" -> ref - ).asJava - - case EmptyReference => - throw new IllegalStateException("Empty reference discovered while converting to Java Map") - } - } - - implicit class JavaMaterializableLink(val link: MaterializableLink) extends AnyVal { - def asJava: JMap[String, _] = link match { - case UnsetLink(title, query) => Map( - "kind" -> "UnsetLink", - "title" -> title, - "query" -> query, - "scala" -> link - ).asJava - - case MaterializedLink(title, target) => Map( - "kind" -> "MaterializedLink", - "title" -> title, - "target" -> target, - "scala" -> link - ).asJava - - case NoLink(title, target) => Map( - "kind" -> "NoLink", - "title" -> title, - "target" -> target, - "scala" -> link - ).asJava - } - } - - implicit class JavaEntity(val ent: Entity) extends AnyVal { - def asJava: JMap[String, _] = parseEntity(ent) - } - - private def parseEntity(ent: Entity): JMap[String, _] = { - val entity = Map( - "kind" -> ent.kind, - "annotations" -> ent.annotations.asJava, - "name" -> ent.name, - "path" -> ent.path.asJava, - "children" -> ent.children.map(_.asJava).asJava, - "comment" -> ent.comment.map(_.asJava).asJava, - "signature" -> ent.signature - ) - val members = ent match { - case ent: Members => Map( - "members" -> ent.members.map(_.asJava).asJava, - "hasVisibleMembers" -> ent.hasVisibleMembers - ) - case _ => Map.empty - } - val superTypes = ent match { - case ent: SuperTypes => Map( - "superTypes" -> ent.superTypes.map(_.asJava).asJava - ) - case _ => Map.empty - } - val modifiers = ent match { - case ent: Modifiers => Map( - "modifiers" -> ent.modifiers.asJava, - "isPrivate" -> ent.isPrivate, - "isProtected" -> ent.isProtected - ) - case _ => Map.empty - } - val typeParams = ent match { - case ent: TypeParams => Map( - "typeParams" -> ent.typeParams.asJava - ) - case _ => Map.empty - } - val constructors = ent match { - case ent: Constructors => Map( - "constructors" -> ent.constructors.map(_.map(_.asJava).asJava).asJava - ) - case _ => Map.empty - } - val companion = ent match { - case ent: Companion => Map( - "hasCompanion" -> ent.hasCompanion, - "companionPath" -> ent.companionPath.asJava - ) - case _ => Map.empty - } - val returnValue = ent match { - case ent: ReturnValue => Map( - "returnValue" -> ent.returnValue.asJava - ) - case _ => Map.empty - } - val implicitlyAddedEntity = ent match { - case ent: ImplicitlyAddedEntity => Map( - "implicitlyAddedFrom" -> ent.implicitlyAddedFrom.map(_.asJava).asJava - ) - case _ => Map.empty - } - val typeAlias : Map[String, _] = ent match { - case ent: TypeAlias => Map( - "alias" -> ent.alias.map(_.asJava).asJava - ) - case _ => Map.empty - } - val trt = ent match { - case ent: Trait => Map( - "traitParams" -> ent.traitParams.map(_.asJava).asJava - ) - case _ => Map.empty - } - val df = ent match { - case ent: Def => Map( - "paramLists" -> ent.paramLists.map(_.asJava).asJava - ) - case _ => Map.empty - } - - { - entity ++ - members ++ - superTypes ++ - modifiers ++ - typeParams ++ - constructors ++ - companion ++ - returnValue ++ - implicitlyAddedEntity ++ - typeAlias ++ - trt ++ - df - }.asJava - } - - implicit class JavaMap(val map: collection.immutable.Map[String, Package]) extends AnyVal { - def toJavaList: LinkedList[AnyRef] = - convertToList(map.transform((_, v) => v.asJava).toMap) - - def flattened: LinkedList[AnyRef] = - convertToList(map.transform((_, v) => flattenEntity(v)).toMap) - - private[this] def convertToList(ms: collection.Map[String, AnyRef]): LinkedList[AnyRef] = - ms.toList.sortBy(_._1) - .foldLeft(new LinkedList[AnyRef]()) { case (list, (_, value)) => - list.add(value); list - } - - private[this] def flattenEntity(e: Entity): JMap[String, _] = { - def entity(e: Entity) = - Map("name" -> e.name, "path" -> e.path.asJava, "kind" -> e.kind) - - def members(e: Entity with Members) = - Map("members" -> e.members.map(flattenEntity).asJava) - - def companion(e: Companion) = Map( - "hasCompanion" -> e.hasCompanion, - "companionPath" -> e.companionPath.asJava - ) - - def typeParams(e: TypeParams) = - Map("typeParams" -> e.typeParams.asJava) - - def paramLists(e: Def) = Map( - "paramLists" -> { - e.paramLists.map { paramList => - Map( - "isImplicit" -> paramList.isImplicit, - "list" -> paramList.list.map(_.asJava).asJava - ).asJava - } - .asJava - } - ) - - def returnValue(e: ReturnValue) = - Map("returnValue" -> e.returnValue.asJava) - - entity(e) ++ (e match { - case e: Package => members(e) - case e: Class => members(e) ++ companion(e) - case e: CaseClass => members(e) ++ companion(e) - case e: Trait => members(e) ++ companion(e) - case e: Object => members(e) ++ companion(e) - case e: Def => typeParams(e) ++ paramLists(e) ++ returnValue(e) - case e: TypeAlias => Map.empty - case e: Val => Map.empty - }) - }.asJava - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/BodyEntities.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/BodyEntities.scala deleted file mode 100644 index 019ba24dfec4..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/BodyEntities.scala +++ /dev/null @@ -1,94 +0,0 @@ -package dotty.tools.dottydoc -package model -package comment - -import scala.collection.SortedMap - -/** A body of text. A comment has a single body, which is composed of - * at least one block. Inside every body is exactly one summary (see - * [[scala.tools.nsc.doc.model.comment.Summary]]). */ -final case class Body(blocks: Seq[Block]) { - - /** The summary text of the comment body. */ - lazy val summary: Option[Body] = { - def summaryInBlock(block: Block): Seq[Inline] = block match { - case Title(text, _) => summaryInInline(text) - case Paragraph(text) => summaryInInline(text) - case UnorderedList(items) => items flatMap summaryInBlock - case OrderedList(items, _) => items flatMap summaryInBlock - case DefinitionList(items) => items.values.toSeq flatMap summaryInBlock - case _ => Nil - } - def summaryInInline(text: Inline): Seq[Inline] = text match { - case Summary(text) => List(text) - case Chain(items) => items flatMap summaryInInline - case Italic(text) => summaryInInline(text) - case Bold(text) => summaryInInline(text) - case Underline(text) => summaryInInline(text) - case Superscript(text) => summaryInInline(text) - case Subscript(text) => summaryInInline(text) - case Link(_, title) => summaryInInline(title) - case _ => Nil - } - (blocks flatMap summaryInBlock).toList match { - case Nil => None - case inl :: Nil => Some(Body(Seq(Paragraph(inl)))) - case inls => Some(Body(Seq(Paragraph(Chain(inls))))) - } - } -} - -/** A block-level element of text, such as a paragraph or code block. */ -sealed abstract class Block - -final case class Title(text: Inline, level: Int) extends Block -final case class Paragraph(text: Inline) extends Block -final case class Code(data: String) extends Block -final case class UnorderedList(items: Seq[Block]) extends Block -final case class OrderedList(items: Seq[Block], style: String) extends Block -final case class DefinitionList(items: SortedMap[Inline, Block]) extends Block -final case class HorizontalRule() extends Block - -/** An section of text inside a block, possibly with formatting. */ -sealed abstract class Inline - -final case class Chain(items: Seq[Inline]) extends Inline -final case class Italic(text: Inline) extends Inline -final case class Bold(text: Inline) extends Inline -final case class Underline(text: Inline) extends Inline -final case class Superscript(text: Inline) extends Inline -final case class Subscript(text: Inline) extends Inline -final case class Link(target: String, title: Inline) extends Inline -final case class Monospace(text: Inline) extends Inline -final case class Text(text: String) extends Inline -abstract class EntityLink(val title: Inline) extends Inline { def link: LinkTo } -object EntityLink { - def apply(title: Inline, linkTo: LinkTo) = new EntityLink(title) { def link: LinkTo = linkTo } - def unapply(el: EntityLink): Some[(Inline, LinkTo)] = Some((el.title, el.link)) -} -final case class HtmlTag(data: String) extends Inline { - private val Pattern = """(?ms)\A<(/?)(.*?)[\s>].*\z""".r - private val (isEnd, tagName) = data match { - case Pattern(s1, s2) => - (! s1.isEmpty, Some(s2.toLowerCase)) - case _ => - (false, None) - } - - def canClose(open: HtmlTag) = { - isEnd && tagName == open.tagName - } - - private val TagsNotToClose = Set("br", "img") - def close = tagName collect { case name if !TagsNotToClose(name) => HtmlTag(s"</$name>") } -} - -/** The summary of a comment, usually its first sentence. There must be exactly one summary per body. */ -final case class Summary(text: Inline) extends Inline - -sealed trait LinkTo -final case class LinkToExternal(name: String, url: String) extends LinkTo -final case class Tooltip(name: String) extends LinkTo - -/** Linking directly to entities is not picklable because of cyclic references */ -final case class LinkToEntity(entity: Entity) extends LinkTo diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/Comment.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/Comment.scala deleted file mode 100644 index 619445cf8d3b..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/Comment.scala +++ /dev/null @@ -1,173 +0,0 @@ -package dotty.tools -package dottydoc -package model -package comment - -import dotty.tools.dottydoc.util.syntax._ -import dotty.tools.dotc.core.Contexts.{Context, ctx} -import dotty.tools.dotc.util.Spans._ -import com.vladsch.flexmark.util.ast.{ Node => MarkdownNode } -import HtmlParsers._ -import util.MemberLookup - -case class Comment ( - body: String, - short: String, - authors: List[String], - see: List[String], - result: Option[String], - throws: Map[String, String], - valueParams: Map[String, String], - typeParams: Map[String, String], - version: Option[String], - since: Option[String], - todo: List[String], - deprecated: Option[String], - note: List[String], - example: List[String], - constructor: Option[String], - group: Option[String], - groupDesc: Map[String, String], - groupNames: Map[String, String], - groupPrio: Map[String, String], - /** List of conversions to hide - containing e.g: `scala.Predef.FloatArrayOps` */ - hideImplicitConversions: List[String] -) - -private[comment] case class ParsedComment ( - body: String, - authors: List[String], - see: List[String], - result: List[String], - throws: Map[String, String], - valueParams: Map[String, String], - typeParams: Map[String, String], - version: List[String], - since: List[String], - todo: List[String], - deprecated: List[String], - note: List[String], - example: List[String], - constructor: List[String], - group: List[String], - groupDesc: Map[String, String], - groupNames: Map[String, String], - groupPrio: Map[String, String], - hideImplicitConversions: List[String], - shortDescription: List[String] -) - -trait MarkupConversion[T] extends MemberLookup { - def ent: Entity - def span: Span - def parsed: ParsedComment - - protected def linkedExceptions(m: Map[String, String])(using Context): Map[String, String] - protected def stringToMarkup(str: String)(using Context): T - protected def markupToHtml(t: T)(using Context): String - protected def stringToShortHtml(str: String)(using Context): String - protected def filterEmpty(xs: List[String])(using Context): List[T] - protected def filterEmpty(xs: Map[String, String])(using Context): Map[String, T] - - private def single(annot: String, xs: List[String], filter: Boolean = true)(using Context): Option[T] = - (if (filter) filterEmpty(xs) else xs.map(stringToMarkup)) match { - case x :: xs => - if (xs.nonEmpty) ctx.docbase.warn( - s"Only allowed to have a single annotation for $annot", - ent.symbol.sourcePosition(span) - ) - Some(x) - case _ => None - } - - final def comment(using Context): Comment = Comment( - body = markupToHtml(stringToMarkup(parsed.body)), - short = stringToShortHtml(parsed.body), - authors = filterEmpty(parsed.authors).map(markupToHtml), - see = filterEmpty(parsed.see).map(markupToHtml), - result = single("@return", parsed.result).map(markupToHtml), - throws = linkedExceptions(parsed.throws), - valueParams = filterEmpty(parsed.valueParams).transform((_, v) => markupToHtml(v)).toMap, - typeParams = filterEmpty(parsed.typeParams).transform((_, v) => markupToHtml(v)).toMap, - version = single("@version", parsed.version).map(markupToHtml), - since = single("@since", parsed.since).map(markupToHtml), - todo = filterEmpty(parsed.todo).map(markupToHtml), - deprecated = single("@deprecated", parsed.deprecated, filter = false).map(markupToHtml), - note = filterEmpty(parsed.note).map(markupToHtml), - example = filterEmpty(parsed.example).map(markupToHtml), - constructor = single("@constructor", parsed.constructor).map(markupToHtml), - group = single("@group", parsed.group).map(markupToHtml), - groupDesc = filterEmpty(parsed.groupDesc).transform((_, v) => markupToHtml(v)).toMap, - groupNames = filterEmpty(parsed.groupNames).transform((_, v) => markupToHtml(v)).toMap, - groupPrio = filterEmpty(parsed.groupPrio).transform((_, v) => markupToHtml(v)).toMap, - hideImplicitConversions = filterEmpty(parsed.hideImplicitConversions).map(markupToHtml) - ) -} - -case class MarkdownComment(ent: Entity, parsed: ParsedComment, span: Span) -extends MarkupConversion[MarkdownNode] { - - def stringToMarkup(str: String)(using Context) = - str.toMarkdown(ent) - - def stringToShortHtml(str: String)(using Context) = - str.toMarkdown(ent).shortenAndShow - - def markupToHtml(md: MarkdownNode)(using Context) = - md.show - - def linkedExceptions(m: Map[String, String])(using Context) = { - val inlineToHtml = InlineToHtml(ent) - m.map { case (targetStr, body) => - val link = makeEntityLink(ent, ctx.docbase.packages, Monospace(Text(targetStr)), targetStr) - (targetStr, inlineToHtml(link)) - } - } - - def filterEmpty(xs: List[String])(using Context) = - xs.map(_.trim) - .filterNot(_.isEmpty) - .map(stringToMarkup) - - def filterEmpty(xs: Map[String, String])(using Context) = - xs.transform((_, v) => v.trim) - .filterNot { case (_, v) => v.isEmpty } - .transform((_, v) => stringToMarkup(v)) -} - -case class WikiComment(ent: Entity, parsed: ParsedComment, span: Span) -extends MarkupConversion[Body] { - - def filterEmpty(xs: Map[String,String])(using Context) = - xs.transform((_, v) => v.toWiki(ent, ctx.docbase.packages, span)) - .filterNot { case (_, v) => v.blocks.isEmpty } - - def filterEmpty(xs: List[String])(using Context) = - xs.map(_.toWiki(ent, ctx.docbase.packages, span)) - - def markupToHtml(t: Body)(using Context) = - t.show(ent) - - def stringToMarkup(str: String)(using Context) = - str.toWiki(ent, ctx.docbase.packages, span) - - def stringToShortHtml(str: String)(using Context) = { - val parsed = stringToMarkup(str) - parsed.summary.getOrElse(parsed).show(ent) - } - - def linkedExceptions(m: Map[String, String])(using Context) = { - m.transform((_, v) => v.toWiki(ent, ctx.docbase.packages, span)).map { case (targetStr, body) => - val link = lookup(Some(ent), ctx.docbase.packages, targetStr) - val newBody = body match { - case Body(List(Paragraph(Chain(content)))) => - val descr = Text(" ") +: content - val link = makeEntityLink(ent, ctx.docbase.packages, Monospace(Text(targetStr)), targetStr) - Body(List(Paragraph(Chain(link +: descr)))) - case _ => body - } - - (targetStr, newBody.show(ent)) - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentCleaner.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentCleaner.scala deleted file mode 100644 index 3ac2ea1623c8..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentCleaner.scala +++ /dev/null @@ -1,26 +0,0 @@ -package dotty.tools.dottydoc -package model -package comment - -trait CommentCleaner { - import Regexes._ - import java.util.regex.Matcher - - def clean(comment: String): List[String] = { - def cleanLine(line: String): String = { - // Remove trailing whitespaces - TrailingWhitespace.replaceAllIn(line, "") match { - case CleanCommentLine(ctl) => ctl - case tl => tl - } - } - val strippedComment = comment.trim.stripPrefix("/*").stripSuffix("*/") - val safeComment = DangerousTags.replaceAllIn(strippedComment, { htmlReplacement(_) }) - val javadoclessComment = JavadocTags.replaceAllIn(safeComment, { javadocReplacement(_) }) - val markedTagComment = - SafeTags.replaceAllIn(javadoclessComment, { mtch => - Matcher.quoteReplacement(s"${safeTagMarker}${mtch.matched}${safeTagMarker}") - }) - markedTagComment.linesIterator.toList map (cleanLine) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentParser.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentParser.scala deleted file mode 100644 index a73ab94bc18e..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentParser.scala +++ /dev/null @@ -1,243 +0,0 @@ -package dotty.tools.dottydoc -package model -package comment - -import dotty.tools.dottydoc.util.syntax._ -import dotty.tools.dotc.util.Spans._ -import dotty.tools.dotc.core.Symbols._ -import dotty.tools.dotc.core.Contexts.{Context, ctx} -import dotty.tools.dotc.core.Decorators._ -import dotty.tools.dotc.printing.Formatting.hl -import scala.collection.mutable -import dotty.tools.dotc.config.Printers.dottydoc -import scala.util.matching.Regex -import com.vladsch.flexmark.util.ast.{ Node => MarkdownNode } -import com.vladsch.flexmark.parser.{ Parser => MarkdownParser } - -trait CommentParser extends util.MemberLookup { - import Regexes._ - import model.internal._ - - /** Parses a raw comment string into a `Comment` object. - * @param packages all packages parsed by Scaladoc tool, used for lookup - * @param cleanComment a cleaned comment to be parsed - * @param src the raw comment source string. - * @param span the position of the comment in source. - */ - def parse( - entity: Entity, - packages: Map[String, Package], - comment: List[String], - src: String, - span: Span, - site: Symbol = NoSymbol - )(using Context): ParsedComment = { - - /** Parses a comment (in the form of a list of lines) to a `Comment` - * instance, recursively on lines. To do so, it splits the whole comment - * into main body and tag bodies, then runs the `WikiParser` on each body - * before creating the comment instance. - * - * @param docBody The body of the comment parsed until now. - * @param tags All tags parsed until now. - * @param lastTagKey The last parsed tag, or `None` if the tag section - * hasn't started. Lines that are not tagged are part - * of the previous tag or, if none exists, of the body. - * @param remaining The lines that must still recursively be parsed. - * @param inCodeBlock Whether the next line is part of a code block (in - * which no tags must be read). - */ - def parseComment ( - docBody: StringBuilder, - tags: Map[TagKey, List[String]], - lastTagKey: Option[TagKey], - remaining: List[String], - inCodeBlock: Boolean - ): ParsedComment = remaining match { - - case CodeBlockStartRegex(before, marker, after) :: ls if (!inCodeBlock) => - if (!before.trim.isEmpty && !after.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, before :: marker :: after :: ls, inCodeBlock = false) - else if (!before.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, before :: marker :: ls, inCodeBlock = false) - else if (!after.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, marker :: after :: ls, inCodeBlock = true) - else lastTagKey match { - case Some(key) => - val value = - ((tags get key): @unchecked) match { - case Some(b :: bs) => (b + endOfLine + marker) :: bs - case None => oops("lastTagKey set when no tag exists for key") - } - parseComment(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock = true) - case None => - parseComment(docBody append endOfLine append marker, tags, lastTagKey, ls, inCodeBlock = true) - } - - case CodeBlockEndRegex(before, marker, after) :: ls => { - if (!before.trim.isEmpty && !after.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, before :: marker :: after :: ls, inCodeBlock = true) - if (!before.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, before :: marker :: ls, inCodeBlock = true) - else if (!after.trim.isEmpty) - parseComment(docBody, tags, lastTagKey, marker :: after :: ls, inCodeBlock = false) - else lastTagKey match { - case Some(key) => - val value = - ((tags get key): @unchecked) match { - case Some(b :: bs) => (b + endOfLine + marker) :: bs - case None => oops("lastTagKey set when no tag exists for key") - } - parseComment(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock = false) - case None => - parseComment(docBody append endOfLine append marker, tags, lastTagKey, ls, inCodeBlock = false) - } - } - - case SymbolTagRegex(name, sym, body) :: ls if (!inCodeBlock) => { - val key = SymbolTagKey(name, sym) - val value = body :: tags.getOrElse(key, Nil) - parseComment(docBody, tags + (key -> value), Some(key), ls, inCodeBlock) - } - - case SimpleTagRegex(name, body) :: ls if (!inCodeBlock) => { - val key = SimpleTagKey(name) - val value = body :: tags.getOrElse(key, Nil) - parseComment(docBody, tags + (key -> value), Some(key), ls, inCodeBlock) - } - - case SingleTagRegex(name) :: ls if (!inCodeBlock) => { - val key = SimpleTagKey(name) - val value = "" :: tags.getOrElse(key, Nil) - parseComment(docBody, tags + (key -> value), Some(key), ls, inCodeBlock) - } - - case line :: ls if (lastTagKey.isDefined) => { - val newtags = if (!line.isEmpty) { - val key = lastTagKey.get - val value = - ((tags get key): @unchecked) match { - case Some(b :: bs) => (b + endOfLine + line) :: bs - case None => oops("lastTagKey set when no tag exists for key") - } - tags + (key -> value) - } else tags - parseComment(docBody, newtags, lastTagKey, ls, inCodeBlock) - } - - case line :: ls => { - if (docBody.length > 0) docBody append endOfLine - docBody append line - parseComment(docBody, tags, lastTagKey, ls, inCodeBlock) - } - - case Nil => { - // Take the {inheritance, content} diagram keys aside, as it doesn't need any parsing - val inheritDiagramTag = SimpleTagKey("inheritanceDiagram") - val contentDiagramTag = SimpleTagKey("contentDiagram") - - val inheritDiagramText: List[String] = tags.get(inheritDiagramTag) match { - case Some(list) => list - case None => List.empty - } - - val contentDiagramText: List[String] = tags.get(contentDiagramTag) match { - case Some(list) => list - case None => List.empty - } - - val stripTags = List(inheritDiagramTag, contentDiagramTag, SimpleTagKey("template"), SimpleTagKey("documentable")) - val tagsWithoutDiagram = tags.filterNot(pair => stripTags.contains(pair._1)) - - val bodyTags: mutable.Map[TagKey, List[String]] = - mutable.Map((tagsWithoutDiagram).toSeq: _*) - - def allTags(key: SimpleTagKey): List[String] = - (bodyTags remove key).getOrElse(Nil).reverse - - def allSymsOneTag(key: TagKey, filterEmpty: Boolean = true): Map[String, String] = { - val keys: Seq[SymbolTagKey] = - bodyTags.keys.toSeq flatMap { - case stk: SymbolTagKey if (stk.name == key.name) => Some(stk) - case stk: SimpleTagKey if (stk.name == key.name) => - dottydoc.println(s"$span: tag '@${stk.name}' must be followed by a symbol name") - None - case _ => None - } - val pairs: Seq[(String, String)] = - for (key <- keys) yield { - val bs = (bodyTags remove key).get - if (bs.length > 1) - dottydoc.println(s"$span: only one '@${key.name}' tag for symbol ${key.symbol} is allowed") - (key.symbol, bs.head) - } - Map.empty[String, String] ++ pairs - } - - val cmt = ParsedComment( - body = docBody.toString, - authors = allTags(SimpleTagKey("author")), - see = allTags(SimpleTagKey("see")), - result = allTags(SimpleTagKey("return")), - throws = allSymsOneTag(SimpleTagKey("throws")), - valueParams = allSymsOneTag(SimpleTagKey("param")), - typeParams = allSymsOneTag(SimpleTagKey("tparam")), - version = allTags(SimpleTagKey("version")), - since = allTags(SimpleTagKey("since")), - todo = allTags(SimpleTagKey("todo")), - deprecated = allTags(SimpleTagKey("deprecated")), - note = allTags(SimpleTagKey("note")), - example = allTags(SimpleTagKey("example")), - constructor = allTags(SimpleTagKey("constructor")), - group = allTags(SimpleTagKey("group")), - groupDesc = allSymsOneTag(SimpleTagKey("groupdesc")), - groupNames = allSymsOneTag(SimpleTagKey("groupname")), - groupPrio = allSymsOneTag(SimpleTagKey("groupprio")), - hideImplicitConversions = allTags(SimpleTagKey("hideImplicitConversion")), - shortDescription = allTags(SimpleTagKey("shortDescription")) - ) - - for ((key, _) <- bodyTags) ctx.docbase.warn( - em"Tag '${hl("@" + key.name)}' is not recognised", - // FIXME: here the position is stretched out over the entire comment, - // with the point being at the very end. This ensures that the entire - // comment will be visible in error reporting. A more fine-grained - // reporting would be amazing here. - entity.symbol.sourcePosition(Span(span.start, span.end, span.end)) - ) - - cmt - } - } - - parseComment(new StringBuilder(comment.size), Map.empty, None, comment, inCodeBlock = false) - } - - /** A key used for a tag map. The key is built from the name of the tag and - * from the linked symbol if the tag has one. - * Equality on tag keys is structural. */ - private sealed abstract class TagKey { - def name: String - } - - private /*final*/ case class SimpleTagKey(name: String) extends TagKey - private /*final*/ case class SymbolTagKey(name: String, symbol: String) extends TagKey - - /** Something that should not have happened, happened, and Scaladoc should exit. */ - private def oops(msg: String): Nothing = - throw new IllegalArgumentException("program logic: " + msg) - - /** Parses a string containing wiki syntax into a `Comment` object. - * Note that the string is assumed to be clean: - * - Removed Scaladoc start and end markers. - * - Removed start-of-line star and one whitespace afterwards (if present). - * - Removed all end-of-line whitespace. - * - Only `endOfLine` is used to mark line endings. */ - def parseWikiAtSymbol( - entity: Entity, - packages: Map[String, Package], - string: String, - span: Span, - site: Symbol - )(using Context): Body = new WikiParser(entity, packages, string, span, site).document() -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentRegex.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentRegex.scala deleted file mode 100644 index faefd19a7c08..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/CommentRegex.scala +++ /dev/null @@ -1,84 +0,0 @@ -package dotty.tools.dottydoc -package model -package comment - -import scala.util.matching.Regex - -object Regexes { - val TrailingWhitespace = """\s+$""".r - - /** The body of a line, dropping the (optional) start star-marker, - * one leading whitespace and all trailing whitespace - */ - val CleanCommentLine = - new Regex("""(?:\s*\*\s?\s?)?(.*)""") - - /** Dangerous HTML tags that should be replaced by something safer, - * such as wiki syntax, or that should be dropped - */ - val DangerousTags = - new Regex("""<(/?(div|ol|ul|li|h[1-6]|p))( [^>]*)?/?>|<!--.*-->""") - - /** Javadoc tags that should be replaced by something useful, such as wiki - * syntax, or that should be dropped. */ - val JavadocTags = - new Regex("""\{\@(code|docRoot|linkplain|link|literal|value)\p{Zs}*([^}]*)\}""") - - /** Maps a javadoc tag to a useful wiki replacement, or an empty string if it cannot be salvaged. */ - def javadocReplacement(mtch: Regex.Match): String = { - mtch.group(1) match { - case "code" => "<code>" + mtch.group(2) + "</code>" - case "docRoot" => "" - case "link" => "`[[" + mtch.group(2) + "]]`" - case "linkplain" => "[[" + mtch.group(2) + "]]" - case "literal" => "`" + mtch.group(2) + "`" - case "value" => "`" + mtch.group(2) + "`" - case _ => "" - } - } - - /** Maps a dangerous HTML tag to a safe wiki replacement, or an empty string - * if it cannot be salvaged. */ - def htmlReplacement(mtch: Regex.Match): String = mtch.group(1) match { - case "p" | "div" => "\n\n" - case "h1" => "\n= " - case "/h1" => " =\n" - case "h2" => "\n== " - case "/h2" => " ==\n" - case "h3" => "\n=== " - case "/h3" => " ===\n" - case "h4" | "h5" | "h6" => "\n==== " - case "/h4" | "/h5" | "/h6" => " ====\n" - case "li" => "\n * - " - case _ => "" - } - - /** Safe HTML tags that can be kept. */ - val SafeTags = - new Regex("""((&\w+;)|(&#\d+;)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|code|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""") - - val safeTagMarker = '\u000E' - val endOfLine = '\u000A' - val endOfText = '\u0003' - - /** A Scaladoc tag not linked to a symbol and not followed by text */ - val SingleTagRegex = - new Regex("""\s*@(\S+)\s*""") - - /** A Scaladoc tag not linked to a symbol. Returns the name of the tag, and the rest of the line. */ - val SimpleTagRegex = - new Regex("""\s*@(\S+)\s+(.*)""") - - /** A Scaladoc tag linked to a symbol. Returns the name of the tag, the name - * of the symbol, and the rest of the line. */ - val SymbolTagRegex = - new Regex("""\s*@(param|tparam|throws|groupdesc|groupname|groupprio)\s+(\S*)\s*(.*)""") - - /** The start of a Scaladoc code block */ - val CodeBlockStartRegex = - new Regex("""(.*?)((?:\{\{\{)|(?:\u000E<pre(?: [^>]*)?>\u000E))(.*)""") - - /** The end of a Scaladoc code block */ - val CodeBlockEndRegex = - new Regex("""(.*?)((?:\}\}\})|(?:\u000E</pre>\u000E))(.*)""") -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/HtmlParsers.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/HtmlParsers.scala deleted file mode 100644 index f23b16fa1528..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/HtmlParsers.scala +++ /dev/null @@ -1,154 +0,0 @@ -package dotty.tools -package dottydoc -package model -package comment - -import dotc.core.Contexts.{Context, ctx} -import dotc.util.Spans._ -import dotty.tools.dottydoc.util.syntax._ -import util.MemberLookup - -import com.vladsch.flexmark.util.ast.{ Node => MarkdownNode} -import com.vladsch.flexmark.html.HtmlRenderer -import com.vladsch.flexmark.parser.Parser -import com.vladsch.flexmark.util.sequence.CharSubSequence - -object HtmlParsers { - - implicit class StringToMarkdown(val text: String) extends AnyVal { - def toMarkdown(origin: Entity)(using Context): MarkdownNode = { - import com.vladsch.flexmark.ast.Link - import com.vladsch.flexmark.util.ast.{Visitor, VisitHandler, NodeVisitor } - - - val inlineToHtml = InlineToHtml(origin) - - val node = Parser.builder(staticsite.Site.markdownOptions) - .build.parse(text) - - def isOuter(url: String) = - url.startsWith("http://") || - url.startsWith("https://") || - url.startsWith("ftp://") || - url.startsWith("ftps://") - - def isRelative(url: String) = - url.startsWith("../") || - url.startsWith("./") - - val linkVisitor = new NodeVisitor( - new VisitHandler(classOf[Link], new Visitor[Link] with MemberLookup { - def queryToUrl(title: String, link: String) = makeEntityLink(origin, ctx.docbase.packages, Text(title), link).link match { - case Tooltip(_) => "#" - case LinkToExternal(_, url) => url - case LinkToEntity(t: Entity) => t match { - case e: Entity with Members => inlineToHtml.relativePath(t) - case x => x.parent.fold("#") { xpar => inlineToHtml.relativePath(xpar) } - } - } - - override def visit(link: Link) = { - val linkUrl = link.getUrl.toString - if (!isOuter(linkUrl) && !isRelative(linkUrl)) - link.setUrl(CharSubSequence.of(queryToUrl(link.getTitle.toString, linkUrl))) - } - }) - ) - - linkVisitor.visit(node) - node - } - - def toMarkdownString(origin: Entity)(using Context): String = - toMarkdown(origin).show - } - - implicit class MarkdownToHtml(val markdown: MarkdownNode) extends AnyVal { - def show(using Context): String = - HtmlRenderer.builder(staticsite.Site.markdownOptions).build().render(markdown) - - def shortenAndShow(using Context): String = - (new MarkdownShortener).shorten(markdown).show - } - - implicit class StringToWiki(val text: String) extends AnyVal { - def toWiki(origin: Entity, packages: Map[String, Package], span: Span): Body = - new WikiParser(origin, packages, text, span, origin.symbol).document() - } - - implicit class BodyToHtml(val body: Body) extends AnyVal { - def show(origin: Entity): String = { - val inlineToHtml = InlineToHtml(origin) - - def bodyToHtml(body: Body): String = - (body.blocks map blockToHtml).mkString - - def blockToHtml(block: Block): String = block match { - case Title(in, 1) => s"<h1>${inlineToHtml(in)}</h1>" - case Title(in, 2) => s"<h2>${inlineToHtml(in)}</h2>" - case Title(in, 3) => s"<h3>${inlineToHtml(in)}</h3>" - case Title(in, _) => s"<h4>${inlineToHtml(in)}</h4>" - case Paragraph(in) => s"<p>${inlineToHtml(in)}</p>" - case Code(data) => s"""<pre><code class="scala">$data</code></pre>""" - case UnorderedList(items) => - s"<ul>${listItemsToHtml(items)}</ul>" - case OrderedList(items, listStyle) => - s"<ol class=${listStyle}>${listItemsToHtml(items)}</ol>" - case DefinitionList(items) => - s"<dl>${items map { case (t, d) => s"<dt>${inlineToHtml(t)}</dt><dd>${blockToHtml(d)}</dd>" } }</dl>" - case HorizontalRule() => - "<hr/>" - } - - def listItemsToHtml(items: Seq[Block]) = - items.foldLeft(""){ (list, item) => - item match { - case OrderedList(_, _) | UnorderedList(_) => // html requires sub ULs to be put into the last LI - list + s"<li>${blockToHtml(item)}</li>" - case Paragraph(inl) => - list + s"<li>${inlineToHtml(inl)}</li>" // LIs are blocks, no need to use Ps - case block => - list + s"<li>${blockToHtml(block)}</li>" - } - } - - bodyToHtml(body) - } - } - - case class InlineToHtml(origin: Entity) { - def apply(inl: Inline) = toHtml(inl) - - def relativePath(target: Entity) = - util.traversing.relativePath(origin, target) - - def toHtml(inl: Inline): String = inl match { - case Chain(items) => (items map toHtml).mkString - case Italic(in) => s"<i>${toHtml(in)}</i>" - case Bold(in) => s"<b>${toHtml(in)}</b>" - case Underline(in) => s"<u>${toHtml(in)}</u>" - case Superscript(in) => s"<sup>${toHtml(in)}</sup>" - case Subscript(in) => s"<sub>${toHtml(in) }</sub>" - case Link(raw, title) => s"""<a href=$raw target="_blank">${toHtml(title)}</a>""" - case Monospace(in) => s"<code>${toHtml(in)}</code>" - case Text(text) => text - case Summary(in) => toHtml(in) - case HtmlTag(tag) => tag - case EntityLink(target, link) => enityLinkToHtml(target, link) - } - - def enityLinkToHtml(target: Inline, link: LinkTo) = link match { - case Tooltip(_) => toHtml(target) - case LinkToExternal(n, url) => s"""<a href="$url">$n</a>""" - case LinkToEntity(t: Entity) => t match { - // Entity is a package member - case e: Entity with Members => - s"""<a href="${relativePath(t)}">${toHtml(target)}</a>""" - // Entity is a Val / Def - case x => x.parent.fold(toHtml(target)) { xpar => - s"""<a href="${relativePath(xpar)}#${x.name}">${toHtml(target)}</a>""" - } - } - } - } -} \ No newline at end of file diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/MarkdownShortener.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/MarkdownShortener.scala deleted file mode 100644 index a38454178f75..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/MarkdownShortener.scala +++ /dev/null @@ -1,84 +0,0 @@ -package dotty.tools -package dottydoc -package model -package comment - -/** The `MarkdownShortener` takes a node and *mutates* it and all children so - * that the displayed length of the generated HTML doesn't exceeed `maxLen`. - * This number defaults to 150 characters. - * - * @note calling `shorten` **will** mutate the Markdown AST node. - */ -class MarkdownShortener { - import com.vladsch.flexmark.util.ast._ - import com.vladsch.flexmark.ast._ - - def shorten(node: Node, maxLen: Int = 150): Node = { - var len = 0 - var didUnlink = false - - def count(node: Node, length: => Int, shortenOrUnlink: Int => Unit) = { - val remaining = math.max(maxLen - len, 0) - if (didUnlink || remaining == 0) node.unlink() - else { - if (length <= remaining) len += length - else { - shortenOrUnlink(remaining) - len = maxLen - } - } - } - - val nodeVisitor = new NodeVisitor( - new VisitHandler(classOf[Text], new Visitor[Text] { - override def visit(node: Text) = count( - node, - node.getChars.length, - remaining => node.setChars( - node.getChars.subSequence(0, remaining).trimEnd.append("...") - ) - ) - }), - new VisitHandler(classOf[Code], new Visitor[Code] { - override def visit(node: Code) = count( - node, - node.getText.length, - remaining => node.setText( - node.getText.subSequence(0, remaining).trimEnd.append("...") - ) - ) - }), - new VisitHandler(classOf[Image], new Visitor[Image] { - override def visit(node: Image) = count(node, maxLen, _ => node.unlink()) - }), - new VisitHandler(classOf[FencedCodeBlock], new Visitor[FencedCodeBlock] { - override def visit(node: FencedCodeBlock) = count(node, maxLen, _ => node.unlink()) - }), - new VisitHandler(classOf[BulletListItem], new Visitor[BulletListItem] { - override def visit(node: BulletListItem) = count( - node, - if (didUnlink) maxLen - else node.getSegments.map(_.length).reduceLeft(_ + _), - _ => { - node.unlink() - didUnlink = true // unlink all following bullets - } - ) - }), - new VisitHandler(classOf[OrderedListItem], new Visitor[OrderedListItem] { - override def visit(node: OrderedListItem) = count( - node, - if (didUnlink) maxLen - else node.getSegments.map(_.length).reduceLeft(_ + _), - _ => { - node.unlink() - didUnlink = true // unlink all following bullets - } - ) - }) - ) - - nodeVisitor.visit(node) - node - } -} \ No newline at end of file diff --git a/doc-tool/src/dotty/tools/dottydoc/model/comment/WikiParser.scala b/doc-tool/src/dotty/tools/dottydoc/model/comment/WikiParser.scala deleted file mode 100644 index b0cd50b5db4d..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/comment/WikiParser.scala +++ /dev/null @@ -1,550 +0,0 @@ -package dotty.tools.dottydoc -package model -package comment - -import dotty.tools.dotc.core.Contexts.{Context, ctx} -import dotty.tools.dotc.util.Spans._ -import dotty.tools.dotc.core.Symbols._ -import dotty.tools.dotc.config.Printers.dottydoc -import util.MemberLookup -import scala.collection.mutable - -import Regexes._ -import model.internal._ - -/** Original wikiparser from NSC - * @author Ingo Maier - * @author Manohar Jonnalagedda - * @author Gilles Dubochet - */ -private[comment] final class WikiParser( - entity: Entity, - packages: Map[String, Package], - val buffer: String, - span: Span, - site: Symbol -) extends CharReader(buffer) with MemberLookup { wiki => - var summaryParsed = false - - def document(): Body = { - val blocks = new mutable.ListBuffer[Block] - while (char != endOfText) - blocks += block() - Body(blocks.toList) - } - - /* BLOCKS */ - - /** {{{ block ::= code | title | hrule | listBlock | para }}} */ - def block(): Block = { - if (checkSkipInitWhitespace("{{{")) - code() - else if (checkSkipInitWhitespace('=')) - title() - else if (checkSkipInitWhitespace("----")) - hrule() - else if (checkList) - listBlock() - else { - para() - } - } - - /** listStyle ::= '-' spc | '1.' spc | 'I.' spc | 'i.' spc | 'A.' spc | 'a.' spc - * Characters used to build lists and their constructors */ - protected val listStyles = Map[String, (Seq[Block] => Block)]( - "- " -> ( UnorderedList(_) ), - "1. " -> ( OrderedList(_,"decimal") ), - "I. " -> ( OrderedList(_,"upperRoman") ), - "i. " -> ( OrderedList(_,"lowerRoman") ), - "A. " -> ( OrderedList(_,"upperAlpha") ), - "a. " -> ( OrderedList(_,"lowerAlpha") ) - ) - - /** Checks if the current line is formed with more than one space and one the listStyles */ - def checkList = - (countWhitespace > 0) && (listStyles.keys exists { checkSkipInitWhitespace(_) }) - - /** {{{ - * nListBlock ::= nLine { mListBlock } - * nLine ::= nSpc listStyle para '\n' - * }}} - * Where n and m stand for the number of spaces. When `m > n`, a new list is nested. */ - def listBlock(): Block = { - - /** Consumes one list item block and returns it, or None if the block is - * not a list or a different list. */ - def listLine(indent: Int, style: String): Option[Block] = - if (countWhitespace > indent && checkList) - Some(listBlock()) - else if (countWhitespace != indent || !checkSkipInitWhitespace(style)) - None - else { - jumpWhitespace() - jump(style) - val p = Paragraph(getInline(isInlineEnd = false)) - blockEnded("end of list line ") - Some(p) - } - - /** Consumes all list item blocks (possibly with nested lists) of the - * same list and returns the list block. */ - def listLevel(indent: Int, style: String): Block = { - val lines = mutable.ListBuffer.empty[Block] - var line: Option[Block] = listLine(indent, style) - while (line.isDefined) { - lines += line.get - line = listLine(indent, style) - } - val constructor = listStyles(style) - constructor(lines.toList) - } - - val indent = countWhitespace - val style = (listStyles.keys find { checkSkipInitWhitespace(_) }).getOrElse(listStyles.keys.head) - listLevel(indent, style) - } - - def code(): Block = { - jumpWhitespace() - jump("{{{") - val str = readUntil("}}}") - if (char == endOfText) - reportError(span, "unclosed code block") - else - jump("}}}") - blockEnded("code block") - Code(normalizeIndentation(str)) - } - - /** {{{ title ::= ('=' inline '=' | "==" inline "==" | ...) '\n' }}} */ - def title(): Block = { - jumpWhitespace() - val inLevel = repeatJump('=') - val text = getInline(check("=" * inLevel)) - val outLevel = repeatJump('=', inLevel) - if (inLevel != outLevel) - reportError(span, "unbalanced or unclosed heading") - blockEnded("heading") - Title(text, inLevel) - } - - /** {{{ hrule ::= "----" { '-' } '\n' }}} */ - def hrule(): Block = { - jumpWhitespace() - repeatJump('-') - blockEnded("horizontal rule") - HorizontalRule() - } - - /** {{{ para ::= inline '\n' }}} */ - def para(): Block = { - val p = - if (summaryParsed) - Paragraph(getInline(isInlineEnd = false)) - else { - val s = summary() - val r = - if (checkParaEnded()) List(s) else List(s, getInline(isInlineEnd = false)) - summaryParsed = true - Paragraph(Chain(r)) - } - while (char == endOfLine && char != endOfText) - nextChar() - p - } - - /* INLINES */ - - val OPEN_TAG = "^<([A-Za-z]+)( [^>]*)?(/?)>$".r - val CLOSE_TAG = "^</([A-Za-z]+)>$".r - private def readHTMLFrom(begin: HtmlTag): String = { - val list = mutable.ListBuffer.empty[String] - val stack = mutable.ListBuffer.empty[String] - - begin.close match { - case Some(HtmlTag(CLOSE_TAG(s))) => - stack += s - case _ => - return "" - } - - while { - val str = readUntil { char == safeTagMarker || char == endOfText } - nextChar() - - list += str - - str match { - case OPEN_TAG(s, _, standalone) => { - if (standalone != "/") { - stack += s - } - } - case CLOSE_TAG(s) => { - if (s == stack.last) { - stack.remove(stack.length-1) - } - } - case _ => ; - } - stack.length > 0 && char != endOfText - } do () - - list mkString "" - } - - def getInline(isInlineEnd: => Boolean): Inline = { - - def inline0(): Inline = { - if (char == safeTagMarker) { - val tag = htmlTag() - HtmlTag(tag.data + readHTMLFrom(tag)) - } - else if (check("'''")) bold() - else if (check("''")) italic() - else if (check("`")) monospace() - else if (check("__")) underline() - else if (check("^")) superscript() - else if (check(",,")) subscript() - else if (check("[[")) link() - else { - val str = readUntil { - char == safeTagMarker || - check("''") || - char == '`' || - check("__") || - char == '^' || - check(",,") || - check("[[") || - isInlineEnd || - checkParaEnded() || - char == endOfLine - } - Text(str) - } - } - - val inlines: List[Inline] = { - val iss = mutable.ListBuffer.empty[Inline] - iss += inline0() - while (!isInlineEnd && !checkParaEnded()) { - val skipEndOfLine = if (char == endOfLine) { - nextChar() - true - } else { - false - } - - val current = inline0() - (iss.last, current) match { - case (Text(t1), Text(t2)) if skipEndOfLine => - iss.update(iss.length - 1, Text(t1 + endOfLine + t2)) - case (i1, i2) if skipEndOfLine => - iss ++= List(Text(endOfLine.toString), i2) - case _ => iss += current - } - } - iss.toList - } - - inlines match { - case Nil => Text("") - case i :: Nil => i - case is => Chain(is) - } - - } - - def htmlTag(): HtmlTag = { - jump(safeTagMarker) - val read = readUntil(safeTagMarker) - if (char != endOfText) jump(safeTagMarker) - HtmlTag(read) - } - - def bold(): Inline = { - jump("'''") - val i = getInline(check("'''")) - jump("'''") - Bold(i) - } - - def italic(): Inline = { - jump("''") - val i = getInline(check("''")) - jump("''") - Italic(i) - } - - def monospace(): Inline = { - jump("`") - val i = getInline(check("`")) - jump("`") - Monospace(i) - } - - def underline(): Inline = { - jump("__") - val i = getInline(check("__")) - jump("__") - Underline(i) - } - - def superscript(): Inline = { - jump("^") - val i = getInline(check("^")) - if (jump("^")) { - Superscript(i) - } else { - Chain(Seq(Text("^"), i)) - } - } - - def subscript(): Inline = { - jump(",,") - val i = getInline(check(",,")) - jump(",,") - Subscript(i) - } - - def summary(): Inline = { - val i = getInline(checkSentenceEnded()) - Summary( - if (jump(".")) - Chain(List(i, Text("."))) - else - i - ) - } - - def link(): Inline = { - val SchemeUri = """([a-z]+:.*)""".r - jump("[[") - val parens = 2 + repeatJump('[') - val stop = "]" * parens - val target = readUntil { check(stop) || isWhitespaceOrNewLine(char) } - val title = - if (!check(stop)) Some({ - jumpWhitespaceOrNewLine() - getInline(check(stop)) - }) - else None - jump(stop) - - (target, title) match { - case (SchemeUri(uri), optTitle) => - Link(uri, optTitle getOrElse Text(uri)) - case (qualName, optTitle) => - makeEntityLink(entity, packages, optTitle getOrElse Text(target), target) - } - } - - /* UTILITY */ - - /** {{{ eol ::= { whitespace } '\n' }}} */ - def blockEnded(blockType: String): Unit = { - if (char != endOfLine && char != endOfText) { - reportError(span, "no additional content on same line after " + blockType) - jumpUntil(endOfLine) - } - while (char == endOfLine) - nextChar() - } - - /** - * Eliminates the (common) leading spaces in all lines, based on the first line - * For indented pieces of code, it reduces the indent to the least whitespace prefix: - * {{{ - * indented example - * another indented line - * if (condition) - * then do something; - * ^ this is the least whitespace prefix - * }}} - */ - def normalizeIndentation(_code: String): String = { - - val code = _code.replaceAll("\\s+$", "").dropWhile(_ == '\n') // right-trim + remove all leading '\n' - val lines = code.split("\n") - - // maxSkip - size of the longest common whitespace prefix of non-empty lines - val nonEmptyLines = lines.filter(_.trim.nonEmpty) - val maxSkip = if (nonEmptyLines.isEmpty) 0 else nonEmptyLines.map(line => line.takeWhile(_ == ' ').length).min - - // remove common whitespace prefix - lines.map(line => if (line.trim.nonEmpty) line.substring(maxSkip) else line).mkString("\n") - } - - def checkParaEnded(): Boolean = { - (char == endOfText) || - ((char == endOfLine) && { - val poff = offset - nextChar() // read EOL - val ok = { - checkSkipInitWhitespace(endOfLine) || - checkSkipInitWhitespace('=') || - checkSkipInitWhitespace("{{{") || - checkList || - checkSkipInitWhitespace('\u003D') - } - offset = poff - ok - }) - } - - def checkSentenceEnded(): Boolean = { - (char == '.') && { - val poff = offset - nextChar() // read '.' - val ok = char == endOfText || char == endOfLine || isWhitespace(char) - offset = poff - ok - } - } - - def reportError(span: Span, message: String) = - dottydoc.println(s"$span: $message") -} - -sealed class CharReader(buffer: String) { reader => - - var offset: Int = 0 - def char: Char = - if (offset >= buffer.length) endOfText else buffer charAt offset - - final def nextChar() = - offset += 1 - - final def check(chars: String): Boolean = { - val poff = offset - val ok = jump(chars) - offset = poff - ok - } - - def checkSkipInitWhitespace(c: Char): Boolean = { - val poff = offset - jumpWhitespace() - val ok = jump(c) - offset = poff - ok - } - - def checkSkipInitWhitespace(chars: String): Boolean = { - val poff = offset - jumpWhitespace() - val (ok0, chars0) = - if (chars.charAt(0) == ' ') - (offset > poff, chars substring 1) - else - (true, chars) - val ok = ok0 && jump(chars0) - offset = poff - ok - } - - def countWhitespace: Int = { - var count = 0 - val poff = offset - while (isWhitespace(char) && char != endOfText) { - nextChar() - count += 1 - } - offset = poff - count - } - - /* Jumpers */ - - /** Jumps a character and consumes it - * @return true only if the correct character has been jumped */ - final def jump(ch: Char): Boolean = { - if (char == ch) { - nextChar() - true - } - else false - } - - /** Jumps all the characters in chars, consuming them in the process. - * @return true only if the correct characters have been jumped - */ - final def jump(chars: String): Boolean = { - var index = 0 - while (index < chars.length && char == chars.charAt(index) && char != endOfText) { - nextChar() - index += 1 - } - index == chars.length - } - - final def repeatJump(c: Char, max: Int = Int.MaxValue): Int = { - var count = 0 - while (jump(c) && count < max) - count += 1 - count - } - - final def jumpUntil(ch: Char): Int = { - var count = 0 - while (char != ch && char != endOfText) { - nextChar() - count += 1 - } - count - } - - final def jumpUntil(pred: => Boolean): Int = { - var count = 0 - while (!pred && char != endOfText) { - nextChar() - count += 1 - } - count - } - - def jumpWhitespace() = jumpUntil(!isWhitespace(char)) - - def jumpWhitespaceOrNewLine() = jumpUntil(!isWhitespaceOrNewLine(char)) - - /* Readers */ - final def readUntil(c: Char): String = { - withRead { - while (char != c && char != endOfText) { - nextChar() - } - } - } - - final def readUntil(chars: String): String = { - assert(chars.length > 0) - withRead { - val c = chars.charAt(0) - while (!check(chars) && char != endOfText) { - nextChar() - while (char != c && char != endOfText) - nextChar() - } - } - } - - final def readUntil(pred: => Boolean): String = { - withRead { - while (char != endOfText && !pred) { - nextChar() - } - } - } - - private def withRead(read: => Unit): String = { - val start = offset - read - buffer.substring(start, offset) - } - - /* Chars classes */ - def isWhitespace(c: Char) = c == ' ' || c == '\t' - - def isWhitespaceOrNewLine(c: Char) = isWhitespace(c) || c == '\n' -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala b/doc-tool/src/dotty/tools/dottydoc/model/entities.scala deleted file mode 100644 index 71e96ca165c3..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/entities.scala +++ /dev/null @@ -1,127 +0,0 @@ -package dotty.tools.dottydoc -package model - -import comment._ -import references._ -import dotty.tools.dotc.core.Symbols.Symbol - -trait Entity { entity => - def symbol: Symbol - - def name: String - - /** Path from root, i.e. `scala.Option$` */ - def path: List[String] - - def comment: Option[Comment] - - def kind: String - - def parent: Option[Entity] - - def annotations: List[String] - - def signature: String = - entity.name + (entity match { - case o: Object => "$" - case d: Def => d.paramLists.mkString - case _ => "" - }) - - def children: List[Entity with Members] = entity match { - case e: Entity with Members => - e.members.collect { case e: Entity with Members if e.kind != "package" => e } - case _ => Nil - } - - /** All parents from package level i.e. Package to Object to Member etc */ - def parents: List[Entity] = this :: this.parents -} - -trait SuperTypes { - def superTypes: List[MaterializableLink] -} - -trait Members { - def members: List[Entity] - - def hasVisibleMembers: Boolean = members.exists { - case e: Entity with Modifiers => !(e.isPrivate || e.isProtected) - case e => true - } -} - -trait Modifiers { - def modifiers: List[String] - - def isPrivate: Boolean = - modifiers.contains("private") - - def isProtected: Boolean = - modifiers.contains("protected") -} - -trait TypeParams { - def typeParams: List[String] -} - -trait ReturnValue { - def returnValue: Reference -} - -trait ParamList { - def list: List[NamedReference] - def isImplicit: Boolean - - override def toString = list.map(_.title).mkString("(", ",", ")") -} - -trait Constructors { - def constructors: List[List[ParamList]] -} - -trait Companion extends Entity { - def hasCompanion: Boolean = companionPath ne Nil - - def companionPath: List[String] - - def companionPath_=(xs: List[String]): Unit -} - -trait ImplicitlyAddedEntity extends Entity { - def implicitlyAddedFrom: Option[Reference] -} - -trait Package extends Entity with Members with SuperTypes { - val kind = "package" -} - -trait TypeAlias extends Entity with Modifiers with TypeParams { - val kind = "type" - def alias: Option[Reference] - def isAbstract: Boolean = !alias.isDefined -} - -trait Class extends Entity with Modifiers with TypeParams with Constructors with SuperTypes with Members with Companion { - val kind = "class" -} - -trait CaseClass extends Entity with Modifiers with TypeParams with Constructors with SuperTypes with Members with Companion { - override val kind = "case class" -} - -trait Trait extends Entity with Modifiers with TypeParams with SuperTypes with Members with Companion { - def traitParams: List[ParamList] - override val kind = "trait" -} - -trait Object extends Entity with Modifiers with SuperTypes with Members with Companion { - override val kind = "object" -} - -trait Def extends Entity with Modifiers with TypeParams with ReturnValue with ImplicitlyAddedEntity { - val kind = "def" - def paramLists: List[ParamList] -} - -trait Val extends Entity with Modifiers with ReturnValue with ImplicitlyAddedEntity diff --git a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala b/doc-tool/src/dotty/tools/dottydoc/model/factories.scala deleted file mode 100644 index ef35cd440a7c..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/factories.scala +++ /dev/null @@ -1,218 +0,0 @@ -package dotty.tools.dottydoc -package model - -import references._ -import dotty.tools.dotc -import dotc.core.Types -import Types._ -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Symbols.{ Symbol, ClassSymbol } -import dotty.tools.dotc.core.SymDenotations._ - -import scala.annotation.tailrec - - -object factories { - import dotty.tools.dotc.ast.tpd._ - import dotty.tools.dottydoc.model.internal.ParamListImpl - import dotc.core.Flags._ - - type TypeTree = dotty.tools.dotc.ast.Trees.Tree[Type] - - def flags(t: Tree)(using Context): List[String] = { - val pw = t.symbol.privateWithin - val pwStr = if (pw.exists) pw.name.show else "" - (t.symbol.flags & (if (t.symbol.isType) TypeSourceModifierFlags else TermSourceModifierFlags)) - .flagStrings(pwStr).toList - .filter(_ != "<trait>") - .filter(_ != "interface") - .filter(_ != "case") - } - - def path(sym: Symbol)(using Context): List[String] = { - @tailrec def go(sym: Symbol, acc: List[String]): List[String] = - if (sym.isRoot) - acc - else - go(sym.owner, sym.name.mangledString :: acc) - go(sym, Nil) - } - - def annotations(sym: Symbol)(using Context): List[String] = - sym.annotations.collect { - case ann if ann.symbol != ctx.definitions.SourceFileAnnot => ann.symbol.showFullName - } - - private val product = """Product[1-9][0-9]*""".r - - def alias(t: Type)(using Context): Option[Reference] = { - val defn = ctx.definitions - t match { - case TypeBounds(low, high) if (low eq defn.NothingType) && (high eq defn.AnyType) => - None - case t => Some(returnType(t)) - } - } - - def returnType(t: Type)(using Context): Reference = { - val defn = ctx.definitions - - def typeRef(name: String, query: String = "", params: List[Reference] = Nil) = { - val realQuery = if (query != "") query else name - TypeReference(name, UnsetLink(name, realQuery), params) - } - - def expandTpe(t: Type, params: List[Reference] = Nil): Reference = t match { - case AppliedType(tycon, args) => { - val cls = tycon.typeSymbol - - if (defn.isFunctionClass(cls)) - FunctionReference(args.init.map(expandTpe(_, Nil)), expandTpe(args.last), defn.isContextFunctionClass(cls)) - else if (defn.isTupleClass(cls)) - TupleReference(args.map(expandTpe(_, Nil))) - else { - val query = cls.showFullName - val name = cls.name.show - typeRef(name, query, params = args.map(expandTpe(_, Nil))) - } - } - - case t: TypeRef => { - val cls = t.typeSymbol - typeRef(cls.name.show.split("\\$\\$").last, query = cls.showFullName, params = params) - } - - case TypeBounds(lo, hi) => - BoundsReference(expandTpe(lo), expandTpe(hi)) - - case t: TypeParamRef => - typeRef(t.paramName.show, params = params) - - case ExprType(tpe) => - expandTpe(tpe) - - case t: ThisType => - expandTpe(t.underlying) - - case AnnotatedType(t, _) => - expandTpe(t) - - case t: MethodType => - expandTpe(t.finalResultType) - - case t: TermRef => { - /** A `TermRef` appears in the return type in e.g: - * ``` - * def id[T](t: T): t.type = t - * ``` - */ - typeRef(t.name.show + ".type", params = params) - } - - case ci: ClassInfo => - typeRef(ci.cls.name.show, query = ci.typeSymbol.showFullName) - - case tl: TypeLambda => - expandTpe(tl.resType) - - case OrType(left, right) => - OrTypeReference(expandTpe(left), expandTpe(right)) - - case AndType(left, right) => - AndTypeReference(expandTpe(left), expandTpe(right)) - - case c: ConstantType => - ConstantReference(c.value.show) - - case ref @ RefinedType(parent, rn, info) => - expandTpe(parent) //FIXME: will be a refined HK, aka class Foo[X] { def bar: List[X] } or similar - - case tp: LazyRef => - expandTpe(tp.ref) - - case MatchType(bound, scrutinee, cases) => - // See #6295 - ConstantReference("FIXME: MatchType support") - } - - expandTpe(t) - } - - def typeParams(sym: Symbol)(using Context): List[String] = - sym.info match { - case pt: TypeLambda => // TODO: not sure if this case is needed anymore - pt.paramNames.map(_.show.split("\\$").last) - case ClassInfo(_, _, _, decls, _) => - decls.iterator - .filter(_.flags is TypeParam) - .map { tp => - val prefix = - if (tp.flags is Covariant) "+" - else if (tp.flags is Contravariant) "-" - else "" - prefix + tp.name.show.split("\\$").last - } - .toList - case tp: Types.TypeAlias => - typeParams(tp.alias.typeSymbol) - case _ => - Nil - } - - def constructors(sym: Symbol)(using Context): List[List[ParamList]] = sym match { - case sym: ClassSymbol => - paramLists(sym.primaryConstructor.info) :: Nil - case _ => Nil - } - - def traitParameters(sym: Symbol)(using Context): List[ParamList] = - constructors(sym).head - - def paramLists(tpe: Type)(using Context): List[ParamList] = tpe match { - case pt: TypeLambda => - paramLists(pt.resultType) - - case mt: MethodType => - ParamListImpl(mt.paramNames.zip(mt.paramInfos).map { case (name, tpe) => - NamedReference( - name.decode.toString, - returnType(tpe), - isByName = tpe.isInstanceOf[ExprType], - isRepeated = tpe.isRepeatedParam - ) - }, mt.isImplicitMethod) :: paramLists(mt.resultType) - - case mp: TermParamRef => - paramLists(mp.underlying) - - case annot: AnnotatedType => - paramLists(annot.parent) - - case _ => - Nil // return types should not be in the paramlist - } - - def superTypes(t: Tree)(using Context): List[MaterializableLink] = t.symbol.denot match { - case cd: ClassDenotation => - def isJavaLangObject(prefix: Type): Boolean = - prefix match { - case TypeRef(ThisType(TypeRef(NoPrefix, outerName)), innerName) => - outerName.toString == "lang" && innerName.toString == "Object" - case _ => false - } - - def isProductWithArity(prefix: Type): Boolean = prefix match { - case TypeRef(TermRef(TermRef(NoPrefix, root), scala), prod) => - root.toString == "_root_" && - scala.toString == "scala" && - product.findFirstIn(prod.toString).isDefined - case _ => false - } - - cd.classParents.map(_.typeConstructor).collect { - case t: TypeRef if !isJavaLangObject(t) && !isProductWithArity(t) => - UnsetLink(t.name.toString, path(t.symbol).mkString(".")) - } - case _ => Nil - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala b/doc-tool/src/dotty/tools/dottydoc/model/internal.scala deleted file mode 100644 index ebf9ce057b18..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/internal.scala +++ /dev/null @@ -1,130 +0,0 @@ -package dotty.tools.dottydoc -package model - -import comment.Comment -import references._ -import dotty.tools.dotc.core.Symbols.{ Symbol, NoSymbol } - -object internal { - - final case class PackageImpl( - var symbol: Symbol, - var annotations: List[String], - var name: String, - var members: List[Entity], - var path: List[String], - var superTypes: List[MaterializableLink] = Nil, - var comment: Option[Comment] = None, - var parent: Option[Entity] = None - ) extends Package - - object EmptyPackage { - def apply(path: List[String], name: String): PackageImpl = { - PackageImpl(NoSymbol, Nil, name, Nil, path) - } - } - - final case class TypeAliasImpl ( - symbol: Symbol, - annotations: List[String], - modifiers: List[String], - name: String, - path: List[String], - alias: Option[Reference], - typeParams: List[String] = Nil, - var comment: Option[Comment] = None, - var parent: Option[Entity] = None - ) extends TypeAlias - - final case class ClassImpl( - symbol: Symbol, - annotations: List[String], - name: String, - members: List[Entity], - modifiers: List[String], - path: List[String], - typeParams: List[String] = Nil, - constructors: List[List[ParamList]] = Nil, - superTypes: List[MaterializableLink] = Nil, - var comment: Option[Comment] = None, - var companionPath: List[String] = Nil, - var parent: Option[Entity] = None - ) extends Class - - final case class CaseClassImpl( - symbol: Symbol, - annotations: List[String], - name: String, - members: List[Entity], - modifiers: List[String], - path: List[String], - typeParams: List[String] = Nil, - constructors: List[List[ParamList]] = Nil, - superTypes: List[MaterializableLink] = Nil, - var comment: Option[Comment] = None, - var companionPath: List[String] = Nil, - var parent: Option[Entity] = None - ) extends CaseClass - - final case class TraitImpl( - symbol: Symbol, - annotations: List[String], - name: String, - members: List[Entity], - modifiers: List[String], - path: List[String], - typeParams: List[String] = Nil, - traitParams: List[ParamList] = Nil, - superTypes: List[MaterializableLink] = Nil, - var comment: Option[Comment] = None, - var companionPath: List[String] = Nil, - var parent: Option[Entity] = None - ) extends Trait - - final case class ObjectImpl( - symbol: Symbol, - annotations: List[String], - name: String, - members: List[Entity], - private val mods: List[String], - path: List[String], - superTypes: List[MaterializableLink] = Nil, - var comment: Option[Comment] = None, - var companionPath: List[String] = Nil, - var parent: Option[Entity] = None - ) extends Object { - def modifiers: List[String] = mods.filterNot(_ == "final") - } - - final case class DefImpl( - symbol: Symbol, - annotations: List[String], - name: String, - modifiers: List[String], - path: List[String], - returnValue: Reference, - typeParams: List[String] = Nil, - paramLists: List[ParamList] = Nil, - var comment: Option[Comment] = None, - implicitlyAddedFrom: Option[Reference] = None, - var parent: Option[Entity] = None - ) extends Def - - final case class ValImpl( - symbol: Symbol, - annotations: List[String], - name: String, - modifiers: List[String], - path: List[String], - returnValue: Reference, - kind: String, - var comment: Option[Comment] = None, - implicitlyAddedFrom: Option[Reference] = None, - var parent: Option[Entity] = None - ) extends Val - - final case class ParamListImpl( - list: List[NamedReference], - isImplicit: Boolean - ) extends ParamList -} diff --git a/doc-tool/src/dotty/tools/dottydoc/model/references.scala b/doc-tool/src/dotty/tools/dottydoc/model/references.scala deleted file mode 100644 index d34b09490bc0..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/model/references.scala +++ /dev/null @@ -1,30 +0,0 @@ -package dotty.tools.dottydoc -package model - -object references { - sealed trait Reference - final case class TypeReference(title: String, tpeLink: MaterializableLink, paramLinks: List[Reference]) extends Reference - final case class OrTypeReference(left: Reference, right: Reference) extends Reference - final case class AndTypeReference(left: Reference, right: Reference) extends Reference - final case class FunctionReference(args: List[Reference], returnValue: Reference, isImplicit: Boolean) extends Reference - final case class TupleReference(args: List[Reference]) extends Reference - final case class BoundsReference(low: Reference, high: Reference) extends Reference - final case class NamedReference(title: String, ref: Reference, isByName: Boolean = false, isRepeated: Boolean = false) extends Reference - final case class ConstantReference(title: String) extends Reference - case object EmptyReference extends Reference - - /** Use MaterializableLink for entities that need be picklable */ - sealed trait MaterializableLink { def title: String } - final case class UnsetLink(title: String, query: String) extends MaterializableLink - final case class MaterializedLink(title: String, target: String) extends MaterializableLink { - def this(title: String, target: Entity) = this(title, target match { - case target: Package => - target.path.mkString("/") + "/index.html" - case _: TypeAlias | _: Def | _: Val => - target.parent.map(_.path.mkString("/")).getOrElse("") + ".html#" + target.signature - case _ => - target.path.mkString("/") + ".html" - }) - } - final case class NoLink(title: String, target: String) extends MaterializableLink -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/BlogPost.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/BlogPost.scala deleted file mode 100644 index deadb7825241..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/BlogPost.scala +++ /dev/null @@ -1,64 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import java.io.{ File => JFile } -import java.util.{ List => JList, Map => JMap } - -import dotc.core.Contexts.{Context, ctx} -import util.syntax._ - -import MapOperations._ - -/** - * A `BlogPost` represents the parsed posts from `./blog/_posts/` - * each post must be named according to the format - * `YYYY-MM-DD-title.{md,html}` - */ -class BlogPost( - val title: String, - val url: String, - val date: String, - val content: String, - firstParagraph: String, - val excerpt_separator: Option[String], - val categories: JList[String] -) { - import scala.collection.JavaConverters._ - lazy val excerpt: String = excerpt_separator match { - case Some(str) => content.split(str).head - case _ => firstParagraph - } - - lazy val toMap: JMap[String, AnyRef] = Map( - "title" -> title, - "date" -> date, - "url" -> url, - "excerpt" -> excerpt, - "excerpt_separator" -> excerpt_separator.getOrElse(""), - "content" -> content, - "categories" -> categories - ).asJava -} - -object BlogPost { - val extract = """(\d\d\d\d)-(\d\d)-(\d\d)-(.*)\.(md|html)""".r - def apply(file: JFile, page: Page)(using Context): Option[BlogPost] = { - def report(key: String, fallback: String = "") = { - ctx.docbase.error(s"couldn't find page.$key in ${file.getName}") - fallback - } - - // Relying on the person using this class to pass a valid `file` - val extract(year, month, day, name, _) = file.getName - val title = page.yaml.getString("title").getOrElse(report("title", name)) - val url = page.yaml.getString("url").getOrElse(report("url")) - val date = page.yaml.getString("date").getOrElse(s"$year-$month-$day 00:00:00") - val excerptSep = page.yaml.getString("excerpt_separator") - val categories = page.yaml.list("categories") - - page.html.map { html => - new BlogPost(title, url, date, html, page.firstParagraph, excerptSep, categories) - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala deleted file mode 100644 index c88997c42c58..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/DefaultParams.scala +++ /dev/null @@ -1,132 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import model.{Entity, Package} - -import java.util.{HashMap, List => JList, Map => JMap} -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import scala.collection.JavaConverters._ - -case class DefaultParams( - docs: JList[_], - docsFlattened: JList[_], - originalDocs: Map[String, Package], - page: PageInfo, - site: SiteInfo, - sidebar: Sidebar, - entity: Option[Entity] = None -) { - import model.JavaConverters._ - - def toMap: Map[String, AnyRef] = { - val base = Map( - "docs" -> docs, - - "searchableDocs" -> docsFlattened, - - "originalDocs" -> originalDocs, - - "page" -> Map( - "url" -> page.url, - "date" -> page.date, - "path" -> page.path - ), - - "site" -> Map( - "baseurl" -> site.baseurl, - "posts" -> site.posts.map(_.toMap), - "project" -> site.projectTitle, - "version" -> site.projectVersion, - "projectUrl" -> site.projectUrl.orNull, - "logo" -> site.projectLogo.orNull, - "root" -> site.root - ).asJava, - - "sidebar" -> sidebar.toMap - ) - val entityMap = entity match { - case None => Map.empty - case Some(entity) => Map( - "entity" -> entity.asJava - ) - } - base ++ entityMap - } - - def withPosts(posts: Array[BlogPost]): DefaultParams = - copy(site = SiteInfo( - site.baseurl, site.projectTitle, site.projectVersion, site.projectUrl, site.projectLogo, - posts, site.root)) - - def withUrl(url: String): DefaultParams = - copy(page = PageInfo(url)) - - def withEntity(e: Option[model.Entity]) = copy(entity = e) - - def withDate(d: String) = copy(page = PageInfo(page.url, d)) -} - -case class PageInfo(url: String, date: String = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).toString ) { - val path: Array[String] = url.split('/').drop(1) -} - -case class SiteInfo( - baseurl: String, - projectTitle: String, - projectVersion: String, - projectUrl: Option[String], - projectLogo: Option[String], - posts: Array[BlogPost], - root: String -) - -case class Sidebar(titles: List[Title]) { - import model.JavaConverters._ - def toMap: JMap[String, _] = - Map("titles" -> titles.map(_.toMap).asJava).asJava -} - -object Sidebar { - def apply(map: HashMap[String, AnyRef]): Option[Sidebar] = Option(map.get("sidebar")).map { - case list: JList[JMap[String, AnyRef]] @unchecked if !list.isEmpty => - new Sidebar(list.asScala.map(Title.apply).flatten.toList) - case _ => Sidebar.empty - } - - def empty: Sidebar = Sidebar(Nil) -} - -case class Title(title: String, url: Option[String], subsection: List[Title], description: Option[String]) { - def toMap: JMap[String, _] = Map( - "title" -> title, - "url" -> url.orNull, // ugh, Java - "subsection" -> subsection.map(_.toMap).asJava, - "description" -> description.orNull - ).asJava -} - -object Title { - def apply(map: JMap[String, AnyRef]): Option[Title] = { - val title = Option(map.get("title")).collect { - case s: String => s - } - val url = Option(map.get("url")).collect { - case s: String => s - } - - val description = Option(map.get("description")).collect { - case s: String => s - } - - val subsection = Option(map.get("subsection")).collect { - case xs: JList[JMap[String, AnyRef]] @unchecked => - xs.asScala.map(Title.apply).toList.flatten - }.getOrElse(Nil) - - title.map { - case title: String => Title(title, url, subsection, description) - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/MapOperations.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/MapOperations.scala deleted file mode 100644 index 9dd88cb67508..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/MapOperations.scala +++ /dev/null @@ -1,25 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import java.util.{ List => JList, Map => JMap } - -/** A simple wrapper for Maps to impose a certain degree of typesafety */ -object MapOperations { - implicit class SaferMap(val map: Map[String, AnyRef]) extends AnyVal { - // `AnyRef` is actually `String | JList[String]` - def getString(str: String): Option[String] = map.get(str).flatMap { - case res: String => Some(res) - case _ => None - } - - def getList(str: String): Option[JList[String]] = map.get(str).flatMap { - case res: JList[String] @unchecked => Some(res) - case _ => None - } - - def string(str: String): String = getString(str).getOrElse("") - def list(str: String): JList[String] = getList(str).getOrElse(new java.util.ArrayList[String]) - } -} - diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownCodeBlockVisitor.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownCodeBlockVisitor.scala deleted file mode 100644 index 04995a8ec8d4..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownCodeBlockVisitor.scala +++ /dev/null @@ -1,20 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import com.vladsch.flexmark.util.ast._ -import com.vladsch.flexmark.ast._ -import com.vladsch.flexmark.util.sequence.CharSubSequence - -object MarkdownCodeBlockVisitor { - def apply(node: Node): Unit = - new NodeVisitor( - new VisitHandler(classOf[FencedCodeBlock], new Visitor[FencedCodeBlock] { - override def visit(node: FencedCodeBlock): Unit = { - if (node.getOpeningMarker.length == 3) - node.setOpeningMarker(CharSubSequence.of("```scala")) - } - }) - ) - .visit(node) -} \ No newline at end of file diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala deleted file mode 100644 index dc6d7d075eeb..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/MarkdownLinkVisitor.scala +++ /dev/null @@ -1,46 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import com.vladsch.flexmark.ast._ -import com.vladsch.flexmark.util.ast._ -import com.vladsch.flexmark.util.sequence.{BasedSequence, CharSubSequence} -import model.{Def, Package, TypeAlias, Val} -import dottydoc.util.MemberLookup - -object MarkdownLinkVisitor { - private val EntityLink = """([^\.]+)(\.[^\.]+)*""".r - def apply(node: Node, docs: Map[String, Package], params: Map[String, AnyRef]): Unit = - new NodeVisitor( - new VisitHandler(classOf[Link], new Visitor[Link] with MemberLookup { - override def visit(node: Link): Unit = { - def isExternal(url: BasedSequence) = - url.startsWith("http") || url.startsWith("https") - - val url = node.getUrl - if (url.endsWith(".md") && !isExternal(url)) node.setUrl { - url.subSequence(0, url.lastIndexOf('.')).append(".html") - } - else if (EntityLink.unapplySeq(url.toString).isDefined) { - lookup(None, docs, url.toString).foreach { ent => - val (path, suffix) = ent match { - case ent: Val => (ent.path.dropRight(1), ".html#" + ent.signature) - case ent: Def => (ent.path.dropRight(1), ".html#" + ent.signature) - case ent: TypeAlias => (ent.path.dropRight(1), ".html#" + ent.signature) - case ent: Package => (ent.path, "/index.html") - case ent => (ent.path, ".html") - } - - params("site") match { - case map: java.util.Map[String, String] @unchecked => node.setUrl { - CharSubSequence.of(path.mkString(map.get("baseurl") + "/api/", "/", suffix)) - } - case _ => () - } - } - } - } - }) - ) - .visit(node) -} \ No newline at end of file diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala deleted file mode 100644 index 78871c888a3b..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Page.scala +++ /dev/null @@ -1,180 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import model.Package - -import dotc.util.SourceFile -import dotc.core.Contexts.{Context, ctx} -import io.VirtualFile - -import com.vladsch.flexmark.html.HtmlRenderer -import com.vladsch.flexmark.parser.Parser -import com.vladsch.flexmark.ext.yaml.front.matter.AbstractYamlFrontMatterVisitor - -import java.util.{ Map => JMap, List => JList } -import java.io.{ OutputStreamWriter, BufferedWriter } -import java.nio.charset.StandardCharsets - -import scala.io.Codec - -/** When the YAML front matter cannot be parsed, this exception is thrown */ -case class IllegalFrontMatter(message: String) extends Exception(message) - -trait Page { - import scala.collection.JavaConverters._ - - /** Full map of includes, from name to contents */ - def includes: Map[String, Include] - - /** `SourceFile` with contents of page */ - def sourceFile: SourceFile - - /** String containing full unexpanded content of page */ - final lazy val content: String = new String(sourceFile.content) - - /** Parameters to page */ - def params: Map[String, AnyRef] - - /** Path to template */ - def path: String - - /** YAML front matter from the top of the file */ - def yaml(using Context): Map[String, AnyRef] = { - if (_yaml eq null) initFields - _yaml - } - - /** HTML generated from page */ - def html(using Context): Option[String] = { - if (_html eq null) initFields - _html - } - - /** First paragraph of page extracted from rendered HTML */ - def firstParagraph(using Context): String = { - if (_html eq null) initFields - - _html.map { _html => - val sb = new StringBuilder - var pos = 0 - // to handle nested paragraphs in non markdown code - var open = 0 - - while (pos < _html.length - 4) { - val str = _html.substring(pos, pos + 4) - val lstr = str.toLowerCase - sb append str.head - - pos += 1 - if (lstr.contains("<p>")) - open += 1 - else if (lstr == "</p>") { - open -= 1 - if (open == 0) { - pos = Int.MaxValue - sb append "/p>" - } - } - } - - sb.toString - } - .getOrElse("") - } - - protected def virtualFile(subSource: String): SourceFile = { - val virtualFile = new VirtualFile(path, path) - val writer = new BufferedWriter(new OutputStreamWriter(virtualFile.output, StandardCharsets.UTF_8.name)) - writer.write(subSource) - writer.close() - - new SourceFile(virtualFile, Codec.UTF8) - } - - protected[this] var _yaml: Map[String, AnyRef /* String | JList[String] */] = _ - protected[this] var _html: Option[String] = _ - protected[this] def initFields(using Context) = { - val md = Parser.builder(Site.markdownOptions).build.parse(content) - val yamlCollector = new AbstractYamlFrontMatterVisitor() - yamlCollector.visit(md) - - _yaml = updatedYaml { - yamlCollector - .getData().asScala - .toMap - .transform { - case (_, xs) if xs.size == 1 => - val str = xs.get(0) - if (str.length > 0 && str.head == '"' && str.last == '"') - str.substring(1, str.length - 1) - else str - case (_, xs) => xs - } - } - - // YAML must start with "---" and end in either "---" or "..." - val withoutYaml = virtualFile( - if (content.startsWith("---\n")) { - val str = - content.linesIterator - .drop(1) - .dropWhile(line => line != "---" && line != "...") - .drop(1).mkString("\n") - - if (str.isEmpty) throw IllegalFrontMatter(content) - else str - } - else content - ) - - // make accessible via "{{ page.title }}" in templates - val page = Map("page" -> _yaml.asJava) - _html = LiquidTemplate(path, withoutYaml).render(params ++ page, includes) - } - - /** Takes "page" from `params` map in case this is a second expansion, and - * removes "layout" from the parameters if it exists. We don't want to - * preserve the layout from the previously expanded template - */ - private def updatedYaml(newYaml: Map[String, AnyRef]): Map[String, AnyRef] = - params - .get("page") - .flatMap { - case page: Map[String, AnyRef] @unchecked => - Some(page - "layout" ++ newYaml) - case _ => None - } - .getOrElse(newYaml) -} - -class HtmlPage( - val path: String, - val sourceFile: SourceFile, - val params: Map[String, AnyRef], - val includes: Map[String, Include] -) extends Page - -class MarkdownPage( - val path: String, - val sourceFile: SourceFile, - val params: Map[String, AnyRef], - val includes: Map[String, Include], - docs: Map[String, Package] -) extends Page { - - override protected[this] def initFields(using Context) = { - super.initFields - _html = _html.map { _html => - val md = Parser.builder(Site.markdownOptions).build.parse(_html) - // fix markdown linking - MarkdownLinkVisitor(md, docs, params) - MarkdownCodeBlockVisitor(md) - HtmlRenderer - .builder(Site.markdownOptions) - .escapeHtml(false) - .build() - .render(md) - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/ResourceFinder.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/ResourceFinder.scala deleted file mode 100644 index 630b26e61dcc..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/ResourceFinder.scala +++ /dev/null @@ -1,16 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -trait ResourceFinder { - /** If, for some reason, the supplied default files cannot be found - this - * exception will be thrown in `layouts`. - */ - /*final*/ case class ResourceNotFoundException(message: String) extends Exception(message) - - protected def getResource(r: String): String = - Option(getClass.getResourceAsStream(r)) - .map(scala.io.Source.fromInputStream(_)(scala.io.Codec.UTF8)) - .map(_.mkString) - .getOrElse(throw ResourceNotFoundException(r)) -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala deleted file mode 100644 index 5be2a3621c57..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Site.scala +++ /dev/null @@ -1,456 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import java.nio.file.{ Files, FileSystems } -import java.nio.file.StandardCopyOption.REPLACE_EXISTING -import java.io.{ File => JFile, OutputStreamWriter, BufferedWriter, ByteArrayInputStream } -import java.util.{ List => JList, Arrays } -import java.nio.file.Path -import java.nio.charset.StandardCharsets -import java.io.File.{ separator => sep } - -import com.vladsch.flexmark.parser.{ Parser, ParserEmulationProfile } -import com.vladsch.flexmark.ext.gfm.tables.TablesExtension -import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension -import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension -import com.vladsch.flexmark.ext.emoji.EmojiExtension -import com.vladsch.flexmark.ext.autolink.AutolinkExtension -import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension -import com.vladsch.flexmark.ext.yaml.front.matter.YamlFrontMatterExtension -import com.vladsch.flexmark.html.HtmlRenderer -import com.vladsch.flexmark.util.options.{ DataHolder, MutableDataSet } - -import dotc.core.Contexts.{Context, ctx} -import dotc.util.SourceFile -import model.Package -import scala.io.{ Codec, Source } -import scala.util.Using -import io.{ AbstractFile, VirtualFile, File } -import scala.collection.mutable.ArrayBuffer -import util.syntax._ - -case class Site( - root: JFile, - outDir: JFile, - projectTitle: String, - projectVersion: String, - projectUrl: Option[String], - projectLogo: Option[String], - documentation: Map[String, Package], - baseUrl: String -) extends ResourceFinder { - /** Documentation serialized to java maps */ - private val docs: JList[_] = { - import model.JavaConverters._ - documentation.toJavaList - } - - private val docsFlattened: JList[_] = { - import model.JavaConverters._ - documentation.flattened - } - - /** All files that are considered static in this context, this can be - * anything from CSS, JS to images and other files. - * - * @note files that are *not* considered static are files ending in a compilable - * extension. - */ - def staticAssets(using Context): Array[JFile] = { - if (_staticAssets eq null) initFiles - _staticAssets - } - - /** All files that are considered compilable assets in this context. This - * is mainly markdown and html files, but could include other files in the - * future. - * - * @note files that are considered compilable end in `.md` or `.html` - */ - def compilableFiles(using Context): Array[JFile] = { - if (_compilableFiles eq null) initFiles - _compilableFiles - } - - /** All files that are considered blogposts, currently this means that files have been placed in: - * - * ``` - * ./blog/_posts/year-month-day-title.ext - * ``` - * - * where `ext` is either markdown or html. - */ - def blogposts(using Context): Array[JFile] = { - if (_blogposts eq null) initFiles - _blogposts - } - - /** Sidebar created from `sidebar.yml` file in site root */ - val sidebar: Sidebar = - root - .listFiles - .find(_.getName == "sidebar.yml") - .map(f => "---\n" + Using(Source.fromFile(f))(_.mkString).get + "\n---") - .map(Yaml.apply) - .flatMap(Sidebar.apply) - .getOrElse(Sidebar.empty) - - private[this] var _blogInfo: Array[BlogPost] = _ - protected def blogInfo(using Context): Array[BlogPost] = { - if (_blogInfo eq null) { - _blogInfo = - blogposts - .flatMap { file => - val BlogPost.extract(year, month, day, name, ext) = file.getName - val sourceFile = toSourceFile(file) - val params = defaultParams(file).withUrl(s"/blog/$year/$month/$day/$name.html").toMap - val page = - if (ext == "md") - new MarkdownPage(file.getPath, sourceFile, params, includes, documentation) - else new HtmlPage(file.getPath, sourceFile, params, includes) - BlogPost(file, page) - } - .sortBy(_.date) - .reverse - } - - _blogInfo - } - - // FileSystem getter - private[this] val fs = FileSystems.getDefault - - /** Create virtual file from string `sourceCode` */ - private def stringToSourceFile(name: String, path: String, sourceCode: String): SourceFile = { - val virtualFile = new VirtualFile(name, path) - val writer = new BufferedWriter(new OutputStreamWriter(virtualFile.output, StandardCharsets.UTF_8.name)) - writer.write(sourceCode) - writer.close() - - new SourceFile(virtualFile, Codec.UTF8) - } - - def copyStaticFiles()(using Context): this.type = - createOutput { - // Copy user-defined static assets - staticAssets.foreach { asset => - val target = mkdirs(fs.getPath(outDir.getAbsolutePath, stripRoot(asset))) - val source = mkdirs(fs.getPath(asset.getAbsolutePath)) - Files.copy(source, target, REPLACE_EXISTING) - } - - // Copy statics included in resources - Map( - "css/toolbar.css" -> "/css/toolbar.css", - "css/search.css" -> "/css/search.css", - "css/sidebar.css" -> "/css/sidebar.css", - "css/dottydoc.css" -> "/css/dottydoc.css", - "css/color-brewer.css" -> "/css/color-brewer.css", - "css/bootstrap.min.css" -> "/css/bootstrap.min.css", - "js/toolbar.js" -> "/js/toolbar.js", - "js/sidebar.js" -> "/js/sidebar.js", - "js/dottydoc.js" -> "/js/dottydoc.js", - "js/api-search.js" -> "/js/api-search.js", - "js/bootstrap.min.js" -> "/js/bootstrap.min.js", - "js/jquery.min.js" -> "/js/jquery.min.js", - "js/highlight.pack.js" -> "/js/highlight.pack.js", - "images/scala3-logo.svg" -> "/images/scala3-logo.svg", - "images/scala-logo.svg" -> "/images/scala-logo.svg", - "images/scala3-logo-white.svg" -> "/images/scala3-logo-white.svg", - "images/scala-logo-white.svg" -> "/images/scala-logo-white.svg" - ) - .transform((_, v) => getResource(v)) - .foreach { case (path, resource) => - val source = new ByteArrayInputStream(resource.getBytes(StandardCharsets.UTF_8)) - val target = mkdirs(fs.getPath(outDir.getAbsolutePath, path)) - Files.copy(source, target, REPLACE_EXISTING) - } - } - - /** Generate default params included in each page */ - private def defaultParams(pageLocation: JFile): DefaultParams = - val pathFromRoot = stripRoot(pageLocation) - DefaultParams( - docs, docsFlattened, documentation, PageInfo(pathFromRoot), - SiteInfo( - baseUrl, projectTitle, projectVersion, projectUrl, projectLogo, Array(), - root.toString - ), - sidebar - ) - - /* Creates output directories if allowed */ - private def createOutput(op: => Unit)(using Context): this.type = { - if (!outDir.isDirectory) outDir.mkdirs() - if (!outDir.isDirectory) ctx.docbase.error(s"couldn't create output folder: $outDir") - else op - this - } - - /** Generate HTML for the API documentation */ - def generateApiDocs()(using Context): this.type = - createOutput { - def genDoc(e: model.Entity): Unit = { - ctx.docbase.echo(s"Generating doc page for: ${e.path.mkString(".")}") - // Suffix is index.html for packages and therefore the additional depth - // is increased by 1 - val (suffix, offset) = - if (e.kind == "package") (sep + "index.html", -1) - else (".html", 0) - - val path = if (scala.util.Properties.isWin) - e.path.map(_.replace("<", "_").replace(">", "_")) - else - e.path - val target = mkdirs(fs.getPath(outDir.getAbsolutePath + sep + "api" + sep + path.mkString(sep) + suffix)) - val params = defaultParams(target.toFile).withPosts(blogInfo).withEntity(Some(e)).toMap - val page = new HtmlPage("_layouts" + sep + "api-page.html", layouts("api-page").content, params, includes) - - render(page).foreach { rendered => - val source = new ByteArrayInputStream(rendered.getBytes(StandardCharsets.UTF_8)) - Files.copy(source, target, REPLACE_EXISTING) - } - - // Generate docs for nested objects/classes: - e.children.foreach(genDoc) - } - - documentation.values.foreach { pkg => - genDoc(pkg) - pkg.children.foreach(genDoc) - } - - // generate search page: - val target = mkdirs(fs.getPath(outDir.getAbsolutePath + sep + "api" + sep + "search.html")) - val searchPageParams = defaultParams(target.toFile).withPosts(blogInfo).toMap - val searchPage = new HtmlPage("_layouts" + sep + "search.html", layouts("search").content, searchPageParams, includes) - render(searchPage).foreach { rendered => - Files.copy( - new ByteArrayInputStream(rendered.getBytes(StandardCharsets.UTF_8)), - target, - REPLACE_EXISTING - ) - } - } - - /** Generate HTML files from markdown and .html sources */ - def generateHtmlFiles()(using Context): this.type = - createOutput { - compilableFiles.foreach { asset => - val pathFromRoot = stripRoot(asset) - val sourceFile = toSourceFile(asset) - val params = defaultParams(asset).withPosts(blogInfo).toMap - val page = - if (asset.getName.endsWith(".md")) new MarkdownPage(pathFromRoot, sourceFile, params, includes, documentation) - else new HtmlPage(pathFromRoot, sourceFile, params, includes) - - render(page).foreach { renderedPage => - val source = new ByteArrayInputStream(renderedPage.getBytes(StandardCharsets.UTF_8)) - val target = pathFromRoot.splitAt(pathFromRoot.lastIndexOf('.'))._1 + ".html" - val htmlTarget = mkdirs(fs.getPath(outDir.getAbsolutePath, target)) - Files.copy(source, htmlTarget, REPLACE_EXISTING) - } - } - } - - /** Generate blog from files in `blog/_posts` and output in `outDir` */ - def generateBlog()(using Context): this.type = - createOutput { - blogposts.foreach { file => - val BlogPost.extract(year, month, day, name, ext) = file.getName - val sourceFile = toSourceFile(file) - val date = s"$year-$month-$day 00:00:00" - val params = defaultParams(file).withPosts(blogInfo).withDate(date).toMap - - // Output target - val target = mkdirs(fs.getPath(outDir.getAbsolutePath, "blog", year, month, day, name + ".html")) - - val page = - if (ext == "md") - new MarkdownPage(target.toString, sourceFile, params, includes, documentation) - else - new HtmlPage(target.toString, sourceFile, params, includes) - - render(page).map { rendered => - val source = new ByteArrayInputStream(rendered.getBytes(StandardCharsets.UTF_8)) - Files.copy(source, target, REPLACE_EXISTING) - } - } - } - - /** Create directories and issue an error if could not */ - private def mkdirs(path: Path)(using Context): path.type = { - val parent = path.getParent.toFile - - if (!parent.isDirectory && !parent.mkdirs()) - ctx.docbase.error(s"couldn't create directory: $parent") - - path - } - - /** This function allows the stripping of the path that leads up to root. - * - * ```scala - * stripRoot(new JFile("/some/root/dir/css/index.css")) - * // returns: dir/css/index.css - * // given that root is: /some/root - * ``` - */ - def stripRoot(f: JFile, root: JFile = root): String = { - val rootLen = root.getAbsolutePath.length + 1 - f.getAbsolutePath.drop(rootLen) - } - - // Initialization of `staticAssets` and `compilableAssets`, and `blogPosts`: - private[this] var _staticAssets: Array[JFile] = _ - private[this] var _compilableFiles: Array[JFile] = _ - private[this] var _blogposts: Array[JFile] = _ - - private[this] def initFiles(using Context) = { - // Split files between compilable and static assets - def splitFiles(f: JFile, assets: ArrayBuffer[JFile], comp: ArrayBuffer[JFile]): Unit = { - val name = f.getName - if (f.isDirectory) { - val name = f.getName - if (!name.startsWith("_") && name != "api") f.listFiles.foreach(splitFiles(_, assets, comp)) - if (f.getName == "api") ctx.docbase.warn { - "the specified `/api` directory will not be used since it is needed for the api documentation" - } - } - else if (name.endsWith(".md") || name.endsWith(".html")) comp.append(f) - else assets.append(f) - } - - // Collect posts from ./blog/_posts - def collectPosts(file: JFile): Option[JFile] = file.getName match { - case BlogPost.extract(year, month, day, name, ext) => Some(file) - case _ => None - } - - val assets = new ArrayBuffer[JFile] - val comp = new ArrayBuffer[JFile] - splitFiles(root, assets, comp) - _staticAssets = assets.toArray - _compilableFiles = comp.toArray - - _blogposts = - root - .listFiles - .find(dir => dir.getName == "blog" && dir.isDirectory) - .map(_.listFiles).getOrElse(Array.empty[JFile]) //FIXME: remove [JFile] once #1907 is fixed - .find(dir => dir.getName == "_posts" && dir.isDirectory) - .map(_.listFiles).getOrElse(Array.empty[JFile]) //FIXME: remove [JFile] once #1907 is fixed - .flatMap(collectPosts) - } - - /** Files that define a layout then referred to by `layout: filename-no-ext` - * in yaml front-matter. - * - * The compiler will look in two locations, `<root>/_layouts/` and - * in the bundled jar file's resources `/_layouts`. - * - * If the user supplies a layout that has the same name as one of the - * defaults, the user-defined one will take precedence. - */ - val layouts: Map[String, Layout] = { - val userDefinedLayouts = - root - .listFiles.find(d => d.getName == "_layouts" && d.isDirectory) - .map(collectFiles(_, f => f.endsWith(".md") || f.endsWith(".html"))) - .getOrElse(Array.empty[JFile]) - .map(f => (f.getName.substring(0, f.getName.lastIndexOf('.')), Layout(f.getPath, toSourceFile(f)))) - .toMap - - val defaultLayouts: Map[String, Layout] = Map( - "base" -> "/_layouts/base.html", - "main" -> "/_layouts/main.html", - "search" -> "/_layouts/search.html", - "doc-page" -> "/_layouts/doc-page.html", - "api-page" -> "/_layouts/api-page.html", - "blog-page" -> "/_layouts/blog-page.html", - "index" -> "/_layouts/index.html" - ).map { - case (name, path) => - (name, Layout(path, stringToSourceFile(name, path, getResource(path)))) - } - - defaultLayouts ++ userDefinedLayouts - } - - /** Include files are allowed under the directory `_includes`. These files - * have to be compilable files and can be used with liquid includes: - * - * ``` - * {% include "some-file" %} - * ``` - * - * You can also use the `with` statement: - * - * ``` - * {% include "some-file" with { key: value } %} - * ``` - */ - val includes: Map[String, Include] = { - val userDefinedIncludes = - root - .listFiles.find(d => d.getName == "_includes" && d.isDirectory) - .map(collectFiles(_, f => f.endsWith(".md") || f.endsWith(".html"))) - .getOrElse(Array.empty[JFile]) - .map(f => (f.getName, Include(f.getPath, toSourceFile(f)))) - .toMap - - val defaultIncludes: Map[String, Include] = Map( - "header.html" -> "/_includes/header.html", - "toolbar.html" -> "/_includes/toolbar.html", - "sidebar.html" -> "/_includes/sidebar.html" - ).map { - case (name, path) => - (name, Include(path, stringToSourceFile(name, path, getResource(path)))) - } - - defaultIncludes ++ userDefinedIncludes - } - - private def toSourceFile(f: JFile): SourceFile = - new SourceFile(AbstractFile.getFile(new File(f.toPath)), Using(Source.fromFile(f, StandardCharsets.UTF_8.name))(_.toArray).get) - - private def collectFiles(dir: JFile, includes: String => Boolean): Array[JFile] = - dir - .listFiles - .filter(f => includes(f.getName)) - - /** Render a page to html, the resulting string is the result of the complete - * expansion of the template with all its layouts and includes. - */ - def render(page: Page, params: Map[String, AnyRef] = Map.empty)(using Context): Option[String] = - page.yaml.get("layout").flatMap(xs => layouts.get(xs.toString)) match { - case Some(layout) if page.html.isDefined => - val newParams = page.params ++ params ++ Map("page" -> page.yaml) ++ Map("content" -> page.html.get) - val expandedTemplate = new HtmlPage(layout.path, layout.content, newParams, includes) - render(expandedTemplate, params) - case _ => - page.html - } -} - -object Site { - val markdownOptions: DataHolder = - new MutableDataSet() - .setFrom(ParserEmulationProfile.KRAMDOWN.getOptions) - .set(Parser.INDENTED_CODE_BLOCK_PARSER, false) - .set(HtmlRenderer.FENCED_CODE_LANGUAGE_CLASS_PREFIX, "") - .set(HtmlRenderer.FENCED_CODE_NO_LANGUAGE_CLASS, "nohighlight") - .set(AnchorLinkExtension.ANCHORLINKS_WRAP_TEXT, false) - .set(AnchorLinkExtension.ANCHORLINKS_ANCHOR_CLASS, "anchor") - .set(EmojiExtension.ROOT_IMAGE_PATH, "https://github.global.ssl.fastly.net/images/icons/emoji/") - .set(Parser.EXTENSIONS, Arrays.asList( - TablesExtension.create(), - TaskListExtension.create(), - AutolinkExtension.create(), - AnchorLinkExtension.create(), - EmojiExtension.create(), - YamlFrontMatterExtension.create(), - StrikethroughExtension.create() - )) -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala deleted file mode 100644 index 21175cc3a3b2..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Template.scala +++ /dev/null @@ -1,135 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import scala.util.control.NonFatal - -import dotc.util.SourceFile -import dotc.core.Contexts.{Context, ctx} -import dotc.util.Spans.Span -import dotc.report -import util.syntax._ - -trait Template { - def path: String - def content: SourceFile - def show: String = new String(content.content) -} - -case class TemplateRenderingError(path: String, ex: Throwable) -extends Exception(s"error rendering $path, $ex") - -case class Layout(path: String, content: SourceFile) extends Template - -case class Include(path: String, content: SourceFile) extends Template - -case class LiquidTemplate(path: String, content: SourceFile) extends Template with ResourceFinder { - import scala.collection.JavaConverters._ - import dotc.printing.Highlighting._ - import liqp.Template - import liqp.filters.Filter - import liqp.parser.Flavor.JEKYLL - import java.util.{ HashMap, Map => JMap } - import filters._ - import tags._ - - /** Register filters to static container */ - Filter.registerFilter(new Reverse) - Filter.registerFilter(new First) - Filter.registerFilter(new Json) - Filter.registerFilter(new EscapeCSS) - - // For some reason, liqp rejects a straight conversion using `.asJava` - private def toJavaMap(map: Map[String, AnyRef]): HashMap[String, Object] = - map.foldLeft(new HashMap[String, Object]()) { case (map, (k, v)) => - map.put(k, v) - map - } - - private def protectedRender(op: => String)(using Context) = try { - Some(op) - } catch { - case NonFatal(ex) => { - // TODO: when we reimplement the liquid parser, this can go away. For now - // this is an OK approximation of what went wrong. - if ((ex.getCause eq null) || ex.getMessage.contains("exceeded the max amount of time")) { - ctx.docbase.error( - "unknown error occurred in " + - Blue(path).toString + - ", most likely incorrect usage of tag" - ) - None - } - else ex.getCause match { - case mm: org.antlr.runtime.MismatchedTokenException => { - val unexpected = LiquidTemplate.token(mm.getUnexpectedType) - val expected = LiquidTemplate.token(mm.expecting) - - // mm.index is incorrect, let's compute the index manually - // mm.line starts at 1, not 0 - val index = content.lineToOffset(mm.line-1) + mm.charPositionInLine - report.error( - if (unexpected == "EOF") - s"unexpected end of file, expected $expected" - else - s"unexpected $unexpected, expected $expected", - content atSpan Span(index) - ) - - None - } - case _ => { - throw ex - } - } - } - } - - def render(params: Map[String, AnyRef], includes: Map[String, Include])(using Context): Option[String] = - protectedRender { - Template.parse(show, JEKYLL) - .`with`(ResourceInclude(params, includes)) - .`with`(RenderReference(params)) - .`with`(RenderLink(params)) - .`with`(RenderTitle(params)) - .`with`(Docstring(params)) - .render(toJavaMap(params)) - } -} - -object LiquidTemplate { - import liqp.parser.LiquidParser - import scala.collection.mutable.HashMap - - final val TokenSymbols = HashMap( - "TagStart" -> "{%", - "TagEnd" -> "%}", - "OutStart" -> "{{", - "OutEnd" -> "}}", - "Pipe" -> "|", - "DotDot" -> "..", - "Dot" -> ".", - "Eq" -> "==", - "EqSign" -> "=", - "Gt" -> ">", - "GtEq" -> ">=", - "Lt" -> "<", - "LtEq" -> "<=", - "Minus" -> "-", - "Col" -> ":", - "Comma" -> ",", - "OPar" -> "(", - "CPar" -> ")", - "OBr" -> "[", - "CBr" -> "]", - "QMark" -> "?" - ).mapValuesInPlace((k,v) => s"'$v' ($k)") - - def token(i: Int): String = - if (i == -1) "EOF" - else if (i >= LiquidParser.tokenNames.length) "non-existing token" - else { - val name = LiquidParser.tokenNames(i) - TokenSymbols.getOrElse(name, name) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.java b/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.java deleted file mode 100644 index 23f0c11be0d1..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/Yaml.java +++ /dev/null @@ -1,23 +0,0 @@ -package dotty.tools.dottydoc.staticsite; - -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.core.type.TypeReference; - -import java.util.HashMap; -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; - -public class Yaml { - - public static HashMap<String, Object> apply(String input) - throws java.io.UnsupportedEncodingException, java.io.IOException { - ByteArrayInputStream is = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)); - ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); - - TypeReference<HashMap<String, Object>> typeRef = - new TypeReference<HashMap<String, Object>>() {}; - - return mapper.readValue(is, typeRef); - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala deleted file mode 100644 index 0a0ab4db6fcf..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/filters.scala +++ /dev/null @@ -1,79 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import java.util.{ Map => JMap, List => JList } - -import com.fasterxml.jackson.databind.ObjectMapper -import liqp.filters.Filter - -/** Custom liquid template filters */ -object filters { - - /** Used to reverse arrays: - * - * ```html - * {% assign array = "1,2,3,4,5" | split: "," %} - * {{ array | reverse }} - * ``` - */ - final class Reverse extends Filter("reverse") { - override def apply(value: Any, params: AnyRef*): AnyRef = { - val array = super.asArray(value) - if (array.length == 0) null - else array.reverse - } - } - - /** Used to get the first element of arrays and strings: - * - * ```html - * {% assign array = "1,2,3,4,5" | split: "," %} - * {{ array | first }} - * ``` - * The above snippet will render "1" - */ - final class First extends Filter("first") { - override def apply(value: Any, params: AnyRef*): AnyRef = value match { - case str: String if str.nonEmpty => str.charAt(0).toString - case xs: Array[String] if xs.nonEmpty => xs.head - case _ => null - } - } - - /** Used to transform java representation to valid JSON - * - * This can be used on things like the docs (`java.util.List[Map[String,_]]`) - * which are available globally: - * - * ```html - * {{ docs | json }} - * ``` - */ - final class Json extends Filter("json") { - override def apply(value: Any, params: AnyRef*): AnyRef = value match { - case map: JList[_] => new ObjectMapper().writeValueAsString(map) - case _ => null - } - } - - /** Escapes characters forbidden in CSS selectors - * - * ```html - * {{ scalaSignature | escapeCSS }} - * ``` - * - */ - final class EscapeCSS extends Filter("escapeCSS") { - private def isValid(c: Char): Boolean = - (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' || c == '_' || c == '-') - - override def apply(value: Any, params: AnyRef*): AnyRef = value match { - case str: String => str.map(c => { - if (c == ',') '_' // make commas and parentheses different - else if (isValid(c)) c else '-' - }) - case _ => null - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala b/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala deleted file mode 100644 index 084233c3bc4c..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/staticsite/tags.scala +++ /dev/null @@ -1,242 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import model.references._ -import dotc.core.Contexts.{Context, ctx} - -import liqp.tags.Tag -import liqp.TemplateContext -import liqp.nodes.LNode - -import java.util.{ Map => JMap, List => JList } -import model._ -import util.syntax._ - -object tags { - - sealed trait ParamConverter { - def params: Map[String, AnyRef] - - private[this] var _baseurl: String = _ - def baseurl(using Context): String = { - if (_baseurl eq null) { - _baseurl = - params.get("site").flatMap { - case map: JMap[String, String] @unchecked => - Some(map.get("baseurl")) - case _ => - None - } - .getOrElse { - ctx.docbase.warn(s"missing `baseurl` in: $params") - "" - } - } - _baseurl - } - } - - /** Renders a `MaterializableLink` into a HTML anchor tag. If the link is - * `NoLink` it will just return a string with the link's title. - */ - final case class RenderLink(params: Map[String, AnyRef])(using Context) - extends Tag("renderLink") with ParamConverter { - override def render(tctx: TemplateContext, nodes: LNode*): AnyRef = nodes(0).render(tctx) match { - case map: JMap[String, AnyRef] @unchecked => - val link = map.get("scala") - if (link.isInstanceOf[MaterializableLink] && (link ne null)) - renderLink(baseurl, link.asInstanceOf[MaterializableLink]) - else if (link eq null) - null // Option[Reference] was None - else { - ctx.docbase.error(s"illegal argument: $link, to `renderLink` function") - null - } - case _ => null - } - } - - - private[this] def renderLink(baseurl: String, link: MaterializableLink)(using Context): String = - link match { - case MaterializedLink(title, target) => - s"""<a href="$baseurl/api/$target">$title</a>""" - case _ => link.title - } - - final case class RenderReference(params: Map[String, AnyRef])(using Context) - extends Tag("renderRef") with ParamConverter { - - private def renderReference(ref: Reference): String = ref match { - case TypeReference(_, tpeLink, paramLinks) => { - if (paramLinks.nonEmpty) { - val link = renderLink(baseurl, tpeLink); - val typeParamsLinks = paramLinks.map(renderReference).mkString("[", ",", "]"); - s"""$link<span class="type-params">$typeParamsLinks</span>""" - } - else renderLink(baseurl, tpeLink) - } - - case OrTypeReference(left, right) => - s"""${renderReference(left)}<span class="and-or-separator"> | </span>${renderReference(right)}""" - - case AndTypeReference(left, right) => - s"""${renderReference(left)}<span class="and-or-separator"> & </span>${renderReference(right)}""" - - case FunctionReference(args, returnValue, isImplicit) => { - val implicitPrefix = if (isImplicit) "implicit " else "" - val params = - if (args.isEmpty) "<span>() => </span>" - else if (args.tail.isEmpty) renderReference(args.head) + """<span class="right-arrow"> => </span>""" - else args.map(renderReference).mkString("<span>(</span>", "<span>, </span>", "<span>) => </span>") - - implicitPrefix + params + renderReference(returnValue) - } - - case TupleReference(args) => - s"""|<span class="no-right">(</span> - |${ args.map(renderReference).mkString("<span>, </span>") } - |<span class="no-left">)</span>""".stripMargin - - case BoundsReference(low, high) => - s"""${ renderReference(low) }<span class="bounds"> <: </span>${ renderReference(high) }""" - - case NamedReference(title, _, _, _) => - ctx.docbase.error(s"received illegal named reference in rendering: $ref") - title - - case ConstantReference(title) => title - - case _ => // EmptyReference - ctx.docbase.error(s"invalid reference: $ref") - null - } - override def render(tctx: TemplateContext, nodes: LNode*): AnyRef = nodes(0).render(tctx) match { - case map: JMap[String, AnyRef] @unchecked => - val ref = map.get("scala") - if (ref.isInstanceOf[Reference] && (ref ne null)) renderReference(ref.asInstanceOf[Reference]) - else if (ref eq null) null // Option[Reference] was None - else { - ctx.docbase.error(s"illegal argument: $ref, to `renderRef` function") - null - } - case _ => null - } - } - - case class ResourceInclude(params: Map[String, AnyRef], includes: Map[String, Include])(using Context) - extends Tag("include") { - import scala.collection.JavaConverters._ - val DefaultExtension = ".html" - - override def render(tctx: TemplateContext, nodes: LNode*): AnyRef = { - val origInclude = asString(nodes(0).render(tctx)) - val incResource = origInclude match { - case fileWithExt if fileWithExt.indexOf('.') > 0 => fileWithExt - case file => file + DefaultExtension - } - - includes - .get(incResource) - .map { template => - if (nodes.length > 1) tctx.put(origInclude, nodes(1).render(tctx)) - - LiquidTemplate(template.path, template.content) - .render(tctx.getVariables.asScala.toMap, includes) - .getOrElse("") - } - .getOrElse { - ctx.docbase.error(s"couldn't find include file '$origInclude'") - "" - } - } - } - - /** Can be used to render the `sidebar.yml` entries, represented here as - * `Title`. - * - * ```html - * {% renderTitle title, page.url %} - * ``` - */ - case class RenderTitle(params: Map[String, AnyRef])(using Context) - extends Tag("renderTitle") with ParamConverter { - private def isParent(t: Title, htmlPath: String): Boolean = { - t.url match { - case Some(url) => url == htmlPath - case None => t.subsection.exists(isParent(_, htmlPath)) - } - } - private def replaceSuffix(url: String, suffixes: Iterable[String]): String = { - suffixes.find(url.endsWith(_)).map(url.replace(_, ".html")).getOrElse(url) - } - private def renderTitle(t: Title, pageUrl: String): String = { - val htmlPath = replaceSuffix(pageUrl, Seq("-spec.md", "-details.md", "-new.md", ".md")) - val marker = if (isParent(t, htmlPath)) "class=\"toggled\"" else "" - if (!t.url.isDefined && t.subsection.nonEmpty) { - s"""|<li class="section"> - | <a onclick='toggleSection(this);'>${t.title}</a> - | <ul $marker> - | ${ t.subsection.map(renderTitle(_, htmlPath)).mkString("\n") } - | </ul> - |</li> - |""".stripMargin - } - else if (t.url.isDefined) { - val url = t.url.get - s"""<li class="leaf"><a href="$baseurl/$url" $marker>${t.title}</a></li>""" - } - else { - ctx.docbase.error( - s"url was defined for subsection with title: ${t.title}, remove url to get toggleable entries" - ) - t.title - } - } - - override def render(ctx: TemplateContext, nodes: LNode*): AnyRef = - ((nodes(0).render(ctx), nodes(1).render(ctx)) match { - case (map: JMap[String, AnyRef] @unchecked, url: String) => - Title(map).map(renderTitle(_, url)) - case (map: JMap[String, AnyRef] @unchecked, _) => - Title(map).map(renderTitle(_, "./")) // file is in top dir - case _ => None - }).orNull - } - - /** Allows the extraction of docstrings from the given path. E.g: - * - * ```html - * {% docstring "scala.collection.Seq" %} - * ``` - * - * In Scaladoc, objects are denoted by a name ending in '$'. This means that - * a path that goes through, or targets an object need to appropriately - * intersperse these, e.g: - * - * ```html - * {% docstring "scala.collection.Seq$" %} - * ``` - */ - case class Docstring(params: Map[String, AnyRef]) extends Tag("docstring") { - private def find(xs: List[String], ent: Entity with Members): Option[Entity] = xs match { - case Nil => None - case x :: Nil => - ent.members collect { case e: Entity with Members => e } find (_.path.last == x) - case x :: xs => - ent.members collect { case e: Entity with Members => e } find (_.path.last == x) flatMap (find(xs, _)) - } - - override def render(ctx: TemplateContext, nodes: LNode*): AnyRef = nodes(0).render(ctx) match { - case query: String => - params.get("originalDocs").collect { - case docs: Map[String, Package] @unchecked => - val search = query.split("\\.") - if (search.isEmpty || !docs.contains(search.head)) null - else find(search.tail.toList, docs(search.head)).flatMap(_.comment.map(_.body)).getOrElse(null) - }.getOrElse(null) - case _ => null - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala b/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala deleted file mode 100644 index ea2faac5fdc2..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/util/MemberLookup.scala +++ /dev/null @@ -1,89 +0,0 @@ -package dotty.tools -package dottydoc -package util - -import model.comment._ -import model._ - -trait MemberLookup { - /** Performs a lookup based on the provided (pruned) query string - * - * Will return a `Tooltip` if unsuccessful, otherwise a LinkToEntity or - * LinkToExternal - */ - def lookup(entity: Option[Entity], packages: Map[String, Package], query: String): Option[Entity] = { - val notFound: Option[Entity] = None - val querys = query.split("\\.").toList - - /** Looks for the specified entity among `ent`'s members */ - def localLookup(ent: Entity with Members, searchStr: String): Option[Entity] = - ent - .members - .collect { case x if x.name == searchStr => x } - .sortBy(_.path.last) - .headOption - - /** Looks for an entity down in the structure, if the search list is Nil, - * the search stops - */ - def downwardLookup(ent: Entity with Members, search: List[String]): Option[Entity] = - search match { - case Nil => notFound - case x :: Nil => - localLookup(ent, x) - case x :: xs => - ent - .members - .collectFirst { - case e: Entity with Members if e.name == x => e - case e: Entity with Members if e.name == x.init && x.last == '$' => e - } - .fold(notFound)(e => downwardLookup(e, xs)) - } - - /** Finds package with longest matching name, then does downwardLookup in - * the package - */ - def globalLookup: Option[Entity] = { - def longestMatch(list: List[String]): List[String] = - if (list eq Nil) Nil - else - packages - .get(list.mkString(".")) - .map(_ => list) - .getOrElse(longestMatch(list.dropRight(1))) - - longestMatch(querys) match { - case Nil => notFound - case xs => downwardLookup(packages(xs.mkString(".")), querys diff xs) - } - } - - (querys, entity) match { - case (xs, None) => globalLookup - case (x :: Nil, Some(e: Entity with Members)) => - localLookup(e, x) - case (x :: _, Some(e: Entity with Members)) if x == e.name => - downwardLookup(e, querys) - case (x :: xs, _) => - if (xs.nonEmpty) globalLookup - else lookup(entity, packages, "scala." + query) - case (Nil, _) => - throw new IllegalArgumentException("`query` cannot be empty") - } - } - - def makeEntityLink( - entity: Entity, - packages: Map[String, Package], - title: Inline, - query: String - ): EntityLink = { - val link = - lookup(Some(entity), packages, query) - .map(LinkToEntity.apply) - .getOrElse(Tooltip(query)) - - EntityLink(title, link) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/util/internal/mutate.scala b/doc-tool/src/dotty/tools/dottydoc/util/internal/mutate.scala deleted file mode 100644 index 2f4a255dccf8..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/util/internal/mutate.scala +++ /dev/null @@ -1,70 +0,0 @@ -package dotty.tools.dottydoc -package util -package internal - -object setters { - import model._ - import comment.Comment - import internal._ - - def setComment(ent: Entity, to: Option[Comment]) = ent match { - case x: PackageImpl => x.comment = to - case x: ClassImpl => x.comment = to - case x: CaseClassImpl => x.comment = to - case x: TraitImpl => x.comment = to - case x: ObjectImpl => x.comment = to - case x: DefImpl => x.comment = to - case x: ValImpl => x.comment = to - case x: TypeAliasImpl => x.comment = to - } - - def setParent(ent: Entity, to: Entity): Unit = ent match { - case e: PackageImpl => - e.parent = Some(to) - e.members.foreach(setParent(_, e)) - case e: ClassImpl => - e.parent = Some(to) - e.members.foreach(setParent(_, e)) - case e: CaseClassImpl => - e.parent = Some(to) - e.members.foreach(setParent(_, e)) - case e: ObjectImpl => - e.parent = Some(to) - e.members.foreach(setParent(_, e)) - case e: TraitImpl => - e.parent = Some(to) - e.members.foreach(setParent(_, e)) - case e: ValImpl => - e.parent = Some(to) - case e: DefImpl => - e.parent = Some(to) - case e: TypeAliasImpl => - e.parent = Some(to) - case _ => () - } - - implicit class FlattenedEntity(val ent: Entity) extends AnyVal { - /** Returns a flat copy if anything was changed (Entity with Members) else - * the identity - */ - def flat: Entity = { - def flattenMember: Entity => Entity = { - case e: PackageImpl => e.copy(members = Nil) - case e: ObjectImpl => e.copy(members = Nil) - case e: CaseClassImpl => e.copy(members = Nil) - case e: ClassImpl => e.copy(members = Nil) - case e: TraitImpl => e.copy(members = Nil) - case other => other - } - - ent match { - case e: PackageImpl => e.copy(members = e.members.map(flattenMember)) - case e: ObjectImpl => e.copy(members = e.members.map(flattenMember)) - case e: CaseClassImpl => e.copy(members = e.members.map(flattenMember)) - case e: ClassImpl => e.copy(members = e.members.map(flattenMember)) - case e: TraitImpl => e.copy(members = e.members.map(flattenMember)) - case other => other - } - } - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/util/syntax.scala b/doc-tool/src/dotty/tools/dottydoc/util/syntax.scala deleted file mode 100644 index 486cdff6d8fa..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/util/syntax.scala +++ /dev/null @@ -1,26 +0,0 @@ -package dotty.tools -package dottydoc -package util - -import dotc.core.Contexts.{Context, ctx} -import dotc.core.Comments.{_, given} -import model.Package -import core.ContextDottydoc -import dotc.core.Symbols._ - -import dotc.util.{ SourcePosition, SourceFile } -import dotc.util.Spans.Span -import scala.io.Codec - -object syntax { - implicit class ContextWithContextDottydoc(val ctx: Context) extends AnyVal { - def docbase: ContextDottydoc = ctx.docCtx.getOrElse { - throw new IllegalStateException("DocBase must be set before running dottydoc phases") - }.asInstanceOf[ContextDottydoc] - } - - implicit class SymbolExtensions(val sym: Symbol) extends AnyVal { - def sourcePosition(span: Span)(using Context): SourcePosition = - sym.source.atSpan(span) - } -} diff --git a/doc-tool/src/dotty/tools/dottydoc/util/traversing.scala b/doc-tool/src/dotty/tools/dottydoc/util/traversing.scala deleted file mode 100644 index 956cb9291499..000000000000 --- a/doc-tool/src/dotty/tools/dottydoc/util/traversing.scala +++ /dev/null @@ -1,43 +0,0 @@ -package dotty.tools.dottydoc -package util - -object traversing { - import model._ - - def mutateEntities(e: Entity)(trans: Entity => Unit): Unit = e match { - case e: Entity with Members => - trans(e) - e.members.map(mutateEntities(_)(trans)) - case e: Entity => trans(e) - } - - def relativePath(from: Entity, to: Entity) = { - val offset = from match { - case v: Val if v.implicitlyAddedFrom.isDefined => 3 - case d: Def if d.implicitlyAddedFrom.isDefined => 3 - case _: Val | _: Def => 2 - case _ => 1 - } - - "../" * (from.path.length - offset) + - to.path.mkString("", "/", ".html") - } - - - def rootPackages(pkgs: Map[String, Package]): List[Package] = { - var currentDepth = Int.MaxValue - var packs = List.empty[String] - - for (key <- pkgs.keys) { - val keyDepth = key.split("\\.").length - packs = - if (keyDepth < currentDepth) { - currentDepth = keyDepth - key :: Nil - } else if (keyDepth == currentDepth) { - key :: packs - } else packs - } - packs.map(pkgs.apply) - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/CommentCleanerTest.scala b/doc-tool/test/dotty/tools/dottydoc/CommentCleanerTest.scala deleted file mode 100644 index 5cf5614c4cfe..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/CommentCleanerTest.scala +++ /dev/null @@ -1,83 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import model.comment.CommentCleaner - -class CommentCleanerTest extends CommentCleaner { - @Test def simpleOneliner = { - assertEquals(List("lol"), clean("/** lol */")) - } - - @Test def multiline = { - val docstring = clean { - """|/** First - | * Second - | */ - |""".stripMargin - } - - assertEquals(List("First", "Second", ""), docstring) - } - - @Test def multilineBad = { - val docstring = clean { - """|/** First - | * Second - | */ - |""".stripMargin - } - - assertEquals(List("First", " Second", ""), docstring) - } - - @Test def multilineWorse = { - val docstring = clean { - """|/** First - | * Second - | * Third - | */ - |""".stripMargin - } - - assertEquals(List("First", " Second", "Third", ""), docstring) - } - - @Test def multilineFirstNoSpace = { - val docstring = clean { - """|/**First - | * Second - | * Third - | */ - |""".stripMargin - } - - assertEquals(List("First", " Second", "Third", ""), docstring) - } - - @Test def multilineFirstTwoSpaces = { - val docstring = clean { - """|/** First - | * Second - | * Third - | */ - |""".stripMargin - } - - assertEquals(List("First", " Second", "Third", ""), docstring) - } - - @Test def multilineFirstThreeSpaces = { - val docstring = clean { - """|/** First - | * Second - | * Third - | */ - |""".stripMargin - } - - assertEquals(List(" First", " Second", "Third", ""), docstring) - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/ConstructorTest.scala b/doc-tool/test/dotty/tools/dottydoc/ConstructorTest.scala deleted file mode 100644 index e3ff3652b8ef..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/ConstructorTest.scala +++ /dev/null @@ -1,196 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import dotc.util.SourceFile -import model._ -import model.internal._ -import model.references._ - -class ConstructorsFromSourceTest extends ConstructorsBase with CheckFromSource -class ConstructorsFromTastyTest extends ConstructorsBase with CheckFromTasty - -abstract class ConstructorsBase extends DottyDocTest { - @Test def singleClassConstructor = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |class Class(val str: String) - """.stripMargin - ) - - val tastyFile = "scala/Class.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) => - cls.constructors.headOption match { - case Some(ParamListImpl(NamedReference("str", _, false, false) :: Nil, false) :: Nil) => - // success! - case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}") - } - } - } - } - - @Test def constructorPlusImplicitArgList = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |class Class(val str1: String)(implicit str2: String) - """.stripMargin - ) - - val tastyFile = "scala/Class.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) => - cls.constructors match { - case ( - ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) :: - ParamListImpl(NamedReference("str2", _, false, false) :: Nil, true) :: Nil - ) :: Nil => - // success! - case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}") - } - } - } - } - - @Test def multipleArgumentListsForConstructor = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |class Class(val str1: String)(val str2: String)(implicit str3: String) - """.stripMargin - ) - - val tastyFile = "scala/Class.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) => - cls.constructors match { - case ( - ParamListImpl(NamedReference("str1", _, false, false) :: Nil, false) :: - ParamListImpl(NamedReference("str2", _, false, false) :: Nil, false) :: - ParamListImpl(NamedReference("str3", _, false, false) :: Nil, true) :: Nil - ) :: Nil => - // success! - case _ => assert(false, s"Incorrect constructor found: ${cls.constructors}") - } - } - } - } - - @Test def multipleConstructors = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |class Class(val main: String) { - | def this(alt1: Int) = - | this("String") - | - | def this(alt2: List[String]) = - | this(alt2.head) - |} - """.stripMargin - ) - - val tastyFile = "scala/Class.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(cls: Class), _, _, _, _) => - cls.constructors match { - case ( - ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil - ) :: ( - ParamListImpl(NamedReference("alt1", _, false, false) :: Nil, false) :: Nil - ) :: ( - ParamListImpl(NamedReference("alt2", _, false, false) :: Nil, false) :: Nil - ) :: Nil => - // success! - case _ => - assert( - false, - s"""Incorrect constructor found:\n${cls.constructors.mkString("\n")}""" - ) - } - } - } - } - - @Test def multipleConstructorsCC = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |case class Class(val main: String) { - | def this(alt1: Int) = - | this("String") - | - | def this(alt2: List[String]) = - | this(alt2.head) - |} - """.stripMargin - ) - - val tastyFile = "scala/Class.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(cls: CaseClass, obj: Object), _, _, _, _) => - cls.constructors match { - case ( - ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil - ) :: ( - ParamListImpl(NamedReference("alt1", _, false, false) :: Nil, false) :: Nil - ) :: ( - ParamListImpl(NamedReference("alt2", _, false, false) :: Nil, false) :: Nil - ) :: Nil => - // success! - case _ => - println(obj.members.map(x => x.kind + " " + x.name)) - assert( - false, - s"""Incorrect constructor found:\n${cls.constructors.mkString("\n")}""" - ) - } - } - } - } - - @Test def traitParameters = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |trait Trait(val main: String) - """.stripMargin - ) - - val tastyFile = "scala/Trait.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - trt.traitParams match { - case ParamListImpl(NamedReference("main", _, false, false) :: Nil, false) :: Nil => - case _ => - assert( - false, - s"""Incorrect constructor found:\n${trt.traitParams.mkString("\n")}""" - ) - } - } - } - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/DottyDocTest.scala b/doc-tool/test/dotty/tools/dottydoc/DottyDocTest.scala deleted file mode 100644 index 26ae91070581..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/DottyDocTest.scala +++ /dev/null @@ -1,151 +0,0 @@ -package dotty.tools -package dottydoc - -import vulpix.TestConfiguration - -import dotc.Compiler -import dotc.core.Contexts.{ Context, ContextBase, FreshContext } -import dotc.core.Comments.{ ContextDoc, ContextDocstrings } -import dotc.util.SourceFile -import dotc.core.Phases.Phase -import dotty.tools.io.AbstractFile -import dotc.typer.FrontEnd -import dottydoc.core.{ DocASTPhase, ContextDottydoc } -import model.Package -import dotty.tools.dottydoc.util.syntax._ -import dotty.tools.io.AbstractFile -import dotc.reporting.{ StoreReporter, MessageRendering } -import dotc.interfaces.Diagnostic.ERROR -import io.{Directory, PlainFile, Path, PlainDirectory} -import org.junit.Assert.fail - -import java.io.{ BufferedWriter, OutputStreamWriter } -import java.nio.charset.StandardCharsets - -trait DottyDocTest extends MessageRendering { - dotty.tools.dotc.parsing.Scanners // initialize keywords - - private def freshCtx(extraClasspath: List[String]): FreshContext = { - val base = new ContextBase - import base.settings._ - val ctx = base.initialCtx.fresh - ctx.setSetting(ctx.settings.language, List("Scala2")) - ctx.setSetting(ctx.settings.YcookComments, true) - ctx.setSetting(ctx.settings.Ycheck, "all" :: Nil) - ctx.setSetting(ctx.settings.wikiSyntax, true) - ctx.setProperty(ContextDoc, new ContextDottydoc) - ctx.setSetting( - ctx.settings.classpath, - (TestConfiguration.basicClasspath :: extraClasspath).mkString(java.io.File.pathSeparator) - ) - ctx.setReporter(new StoreReporter(ctx.reporter)) - base.initialize()(using ctx) - ctx - } - implicit val ctx: FreshContext = freshCtx(Nil) - - private def compilerWithChecker(assertion: (Context, Map[String, Package]) => Unit) = new DocCompiler { - override def phases = { - val assertionPhase = new Phase { - def phaseName = "assertionPhase" - override def run(implicit ctx: Context): Unit = { - assertion(ctx, ctx.docbase.packages) - if (ctx.reporter.hasErrors) { - System.err.println("reporter had errors:") - ctx.reporter.removeBufferedMessages.foreach { msg => - System.err.println { - messageAndPos(msg.msg, msg.pos, diagnosticLevel(msg)) - } - } - } - } - } - super.phases :+ List(assertionPhase) - } - } - - private def callingMethod: String = - Thread.currentThread.getStackTrace.find { - _.getMethodName match { - case "checkSource" | "callingMethod" | "getStackTrace" | "currentThread" => - false - case _ => - true - } - } - .map(_.getMethodName) - .getOrElse { - throw new IllegalStateException("couldn't get calling method via reflection") - } - - private def sourceFileFromString(name: String, contents: String): SourceFile = { - val virtualFile = new dotty.tools.io.VirtualFile(name) - val writer = new BufferedWriter(new OutputStreamWriter(virtualFile.output, StandardCharsets.UTF_8)) - writer.write(contents) - writer.close() - new SourceFile(virtualFile, scala.io.Codec.UTF8) - } - - def checkSource(source: String)(assertion: (Context, Map[String, Package]) => Unit): Unit = { - val c = compilerWithChecker(assertion) - val run = c.newRun - run.compileSources(sourceFileFromString(callingMethod, source) :: Nil) - } - - def checkFiles(sources: List[String])(assertion: (Context, Map[String, Package]) => Unit): Unit = { - val c = compilerWithChecker(assertion) - val run = c.newRun - val files = sources.map(path => new PlainFile(Path(path))) - run.compile(files) - } - - def checkFromSource(sourceFiles: List[SourceFile])(assertion: (Context, Map[String, Package]) => Unit): Unit = { - val c = compilerWithChecker(assertion) - val run = c.newRun - run.compileSources(sourceFiles) - } - - def checkFromTasty(tastyFiles: List[String], sources: List[SourceFile])(assertion: (Context, Map[String, Package]) => Unit): Unit = { - Directory.inTempDirectory { tmp => - val ctx = "shadow ctx" - val out = tmp./(Directory("out")) - out.createDirectory() - - val dotcCtx = { - val ctx = freshCtx(out.toString :: Nil) - ctx.setSetting(ctx.settings.outputDir, AbstractFile.getDirectory(out)) - } - val dotc = new Compiler - val run = dotc.newRun(using dotcCtx) - run.compileSources(sources) - assert(!dotcCtx.reporter.hasErrors) - - val fromTastyCtx = { - val ctx = freshCtx(out.toString :: Nil) - ctx.setSetting(ctx.settings.fromTasty, true) - } - val fromTastyCompiler = compilerWithChecker(assertion) - val fromTastyRun = fromTastyCompiler.newRun(using fromTastyCtx) - val outDir = new PlainDirectory(out) - val files = tastyFiles.map(outDir.fileNamed) - fromTastyRun.compile(files) - fromTastyCtx.reporter.allErrors.foreach(println) - assert(!fromTastyCtx.reporter.hasErrors) - } - } - - def check(tastyFiles: List[String], sources: List[SourceFile])(assertion: (Context, Map[String, Package]) => Unit): Unit - -} - -trait CheckFromSource extends DottyDocTest { - override def check(tastyFiles: List[String], sources: List[SourceFile])(assertion: (Context, Map[String, Package]) => Unit): Unit = { - checkFromSource(sources)(assertion) - } -} - -trait CheckFromTasty extends DottyDocTest { - override def check(tastyFiles: List[String], sources: List[SourceFile])(assertion: (Context, Map[String, Package]) => Unit): Unit = { - checkFromTasty(tastyFiles, sources)(assertion) - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/GenDocs.scala b/doc-tool/test/dotty/tools/dottydoc/GenDocs.scala deleted file mode 100644 index 95dcefbf16e9..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/GenDocs.scala +++ /dev/null @@ -1,37 +0,0 @@ -package dotty.tools -package dottydoc - -import vulpix.TestConfiguration - -object Files { - type JFile = java.io.File - - implicit class ToUrl(val f: JFile) extends AnyVal { - def getUrl = f.toURI.toURL - } -} - -trait LocalResources extends DocDriver { - import Files._ - - def getFiles(file: JFile): Array[JFile] = - if (file.isDirectory) file.listFiles.flatMap(getFiles) - else if (file.getAbsolutePath.endsWith(".scala")) Array(file) - else Array() - - def withClasspath(files: Array[String]) = - "-siteroot" +: "../docs" - +: "-project" +: "Dotty" - +: "-source" +: "3.0-migration" - +: "-classpath" +: TestConfiguration.basicClasspath - +: files -} - -object GenDottyDocs extends LocalResources { - import Files._ - - val dottyFiles = new JFile("../compiler/src/dotty").listFiles.flatMap(getFiles).map(_.getAbsolutePath) - - override def main(args: Array[String]): Unit = - super.main(withClasspath(dottyFiles)) -} diff --git a/doc-tool/test/dotty/tools/dottydoc/JavaConverterTest.scala b/doc-tool/test/dotty/tools/dottydoc/JavaConverterTest.scala deleted file mode 100644 index 795a9c08e0a3..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/JavaConverterTest.scala +++ /dev/null @@ -1,319 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import model.{ - Val, - Object => EObject, - CaseClass, - Entity, - Members, - SuperTypes, - Modifiers, - TypeParams, - Constructors => EConstructors, - Class, - Companion, - ReturnValue, - ImplicitlyAddedEntity, - TypeAlias, - Trait, - Package, - Def, - ParamList -} -import model.references._ -import model.internal.ParamListImpl -import dotty.tools.dotc.core.Symbols.NoSymbol -import java.util.{Map => JMap, List => JList} - -class JavaConverterTest { - import model.JavaConverters._ - import scala.collection.JavaConverters._ - - @Test def entityConversions = { - val paramList = new ParamListImpl(new NamedReference("x", new TypeReference("Int", new NoLink("title", "target"), List())) :: Nil, false) - val df = new Def { - def symbol = NoSymbol - def name = "test" - def path = "path" :: "to" :: "def" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "private" :: Nil - def typeParams = "String" :: "String" :: Nil - def implicitlyAddedFrom = Some( - new TypeReference("String", new NoLink("title", "target"), List())) - def returnValue = new TypeReference("String", new NoLink("title", "target"), List()) - def paramLists = List(paramList) - } - assertSerializedCorrectly(df, df.asJava) - val trt = new Trait { - def symbol = NoSymbol - def name = "someTrait" - def path = "path" :: "to" :: "trait" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "protected" :: Nil - def typeParams = "String" :: "String" :: Nil - def superTypes = new NoLink("title", "query") :: Nil - def members = df :: Nil - def traitParams = List(paramList) - def companionPath = "path" :: "to" :: "companion" :: Nil - def companionPath_=(xs: List[String]) = {} - } - assertSerializedCorrectly(trt, trt.asJava) - val cls = new Class { - def symbol = NoSymbol - def name = "test" - def path = "path" :: "to" :: "test" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "private" :: Nil - def typeParams = "String" :: "String" :: Nil - def superTypes = new NoLink("title", "query") :: Nil - def members = Nil - def companionPath = "path" :: "to" :: "companion" :: Nil - def companionPath_=(xs: List[String]) = {} - def constructors = List(List(paramList)) - } - assertSerializedCorrectly(cls, cls.asJava) - val caseClass = new CaseClass { - def symbol = NoSymbol - def name = "test" - def path = "path" :: "to" :: "test" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "private" :: Nil - def typeParams = "String" :: "String" :: Nil - def constructors = List(List(paramList)) - def superTypes = new NoLink("title", "query") :: Nil - def members = Nil - def companionPath = "path" :: "to" :: "companion" :: Nil - def companionPath_=(xs: List[String]) = {} - } - assertSerializedCorrectly(caseClass, caseClass.asJava) - val obj = new EObject { - def symbol = NoSymbol - def name = "someObject" - def path = "path" :: "to" :: "object" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "protected" :: Nil - def typeParams = "String" :: "String" :: Nil - def superTypes = new NoLink("title", "query") :: Nil - def members = df :: Nil - def companionPath = "path" :: "to" :: "companion" :: Nil - def companionPath_=(xs: List[String]) = {} - } - assertSerializedCorrectly(obj, obj.asJava) - val typeAlias = new TypeAlias { - def symbol = NoSymbol - def name = "typeAlias" - def path = "path" :: "to" :: "typeAlias" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "private" :: Nil - def typeParams = "String" :: "String" :: Nil - def alias = Some(new TypeReference("String", new NoLink("title", "target"), List())) - } - assertSerializedCorrectly(typeAlias, typeAlias.asJava) - val vl = new Val { - val kind = "val" - def symbol = NoSymbol - def name = "val" - def path = "path" :: "to" :: "val" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def modifiers = "private" :: Nil - def returnValue = new TypeReference("String", new NoLink("title", "target"), List()) - def implicitlyAddedFrom = Some( - new TypeReference("String", new NoLink("title", "target"), List())) - } - assertSerializedCorrectly(vl, vl.asJava) - val pkg = new Package { - def symbol = NoSymbol - def name = "test" - def path = "path" :: "to" :: "test" :: Nil - def comment = None - def annotations = List("test") - def parent = None - def members = trt :: typeAlias :: Nil - def superTypes = new NoLink("title", "query") :: Nil - } - assertSerializedCorrectly(pkg, pkg.asJava) - } - - def assertEach[E, C[E] <: Seq[E]](expected: C[E], serialized: Any)(pairwiseAssertion: (E, Any) => Unit): Unit = { - val s = serialized.asInstanceOf[JList[_]] - val actual = s.asScala.toList - assertEquals(expected.length, actual.length) - for ((exp, act) <- expected zip actual) { - pairwiseAssertion(exp, act) - } - } - def assertSameSeq[T, C[T] <: Seq[T]](expected: C[T], serialized: Any): Unit = { - val actual = serialized.asInstanceOf[java.util.List[T]].asScala.toList - assertEquals(expected, actual); - } - def assertSerializedCorrectly(expected: ParamList, serialized: Any): Unit = { - val actual = serialized.asInstanceOf[JMap[String, _]] - assertEach(expected.list, actual.get("list")) {(exp, act) => - assertSerializedCorrectly(exp, act) - } - assertEquals(expected.isImplicit, actual.get("isImplicit")) - } - def assertSerializedCorrectly(expected: Reference, serialized: Any): Unit = { - val actual = serialized.asInstanceOf[JMap[String, _]] - expected match { - case TypeReference(title, tpeLink, paramLinks) => - assertEquals(title, actual.get("title")) - assertSerializedCorrectly(tpeLink, actual.get("tpeLink")) - assertEach(paramLinks, actual.get("paramLinks")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - case OrTypeReference(left, right) => - assertSerializedCorrectly(left, actual.get("left")) - assertSerializedCorrectly(right, actual.get("right")) - case AndTypeReference(left, right) => - assertSerializedCorrectly(left, actual.get("left")) - assertSerializedCorrectly(right, actual.get("right")) - case FunctionReference(args, returnValue, isImplicit) => - assertEquals(isImplicit, actual.get("isImplicit")) - assertEach(args, actual.get("args")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - assertSerializedCorrectly(returnValue, actual.get("returnValue")) - case TupleReference(args) => - assertEach(args, actual.get("args")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - case BoundsReference(low, high) => - assertSerializedCorrectly(low, actual.get("low")) - assertSerializedCorrectly(high, actual.get("high")) - case NamedReference(title, ref, isByName, isRepeated) => - assertEquals(title, actual.get("title")) - assertSerializedCorrectly(ref, actual.get("ref")) - assertEquals(isByName, actual.get("isByName")) - assertEquals(isRepeated, actual.get("isRepeated")) - case ConstantReference(title) => - assertEquals(title, actual.get("title")) - case EmptyReference => - } - } - def assertSerializedCorrectly(expected: MaterializableLink, serialized: Any): Unit = { - val actual = serialized.asInstanceOf[JMap[String, _]] - expected match { - case UnsetLink(title, query) => - assertEquals(title, actual.get("title")) - assertEquals(query, actual.get("query")) - case MaterializedLink(title, target) => - assertEquals(title, actual.get("title")) - assertEquals(target, actual.get("target")) - case NoLink(title, target) => - assertEquals(title, actual.get("title")) - assertEquals(target, actual.get("target")) - } - } - def assertSerializedCorrectly(expected: Entity, serialized: Any): Unit = { - val actual = serialized.asInstanceOf[JMap[String, _]] - assertEquals(expected.name, actual.get("name")) - assertEquals(expected.kind, actual.get("kind")) - assertSameSeq(expected.annotations, actual.get("annotations")) - assertSameSeq(expected.path, actual.get("path")) - // Only test if a comment is present - expected.comment match { - case Some(c) => assertNotEquals(null, actual.get("comment")) - case _ => - } - expected match { - case e: Members => { - assertEach(e.members, actual.get("members")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - } - case _ => - } - expected match { - case e: SuperTypes => { - assertEach(e.superTypes, actual.get("superTypes")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - } - case _ => - } - expected match { - case e: Modifiers => { - assertSameSeq(e.modifiers, actual.get("modifiers")) - assertEquals(e.isPrivate, actual.get("isPrivate")) - assertEquals(e.isProtected, actual.get("isProtected")) - } - case _ => - } - expected match { - case e: TypeParams => { - assertSameSeq(e.typeParams, actual.get("typeParams")) - } - case _ => - } - expected match { - case e: EConstructors => { - // constructors is of type List[List[ParamList]], so we need to apply assertEach twice - assertEach(e.constructors, actual.get("constructors")) { (exp, act) => - assertEach(exp, act) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - } - } - case _ => - } - expected match { - case e: Companion => { - assertSameSeq(e.companionPath, actual.get("companionPath")) - } - case _ => - } - expected match { - case e: ReturnValue => { - assertSerializedCorrectly(e.returnValue, actual.get("returnValue")) - } - case _ => - } - expected match { - case e: ImplicitlyAddedEntity => { - e.implicitlyAddedFrom.map(assertSerializedCorrectly(_, actual.get("implicitlyAddedFrom"))) - } - case _ => - } - expected match { - case e: TypeAlias => { - e.alias.map(assertSerializedCorrectly(_, actual.get("alias"))) - } - case _ => - } - expected match { - case e: Def => { - assertEach(e.paramLists, actual.get("paramLists")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - } - case _ => - } - expected match { - case e: Trait => { - assertEach(e.traitParams, actual.get("traitParams")) { (exp, act) => - assertSerializedCorrectly(exp, act) - } - } - case _ => - } - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/MarkdownTests.scala b/doc-tool/test/dotty/tools/dottydoc/MarkdownTests.scala deleted file mode 100644 index 1fb506ce5a25..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/MarkdownTests.scala +++ /dev/null @@ -1,311 +0,0 @@ -package dotty.tools -package dottydoc - -import vulpix.TestConfiguration - -import org.junit.Test -import org.junit.Assert._ - -import dotc.core.Contexts.{ Context, ContextBase, FreshContext } -import dotc.core.Comments.{ ContextDoc, ContextDocstrings } -import dottydoc.core.ContextDottydoc - -class MarkdownTests extends DottyDocTest with CheckFromSource { - override implicit val ctx: FreshContext = { - // TODO: check if can reuse parent instead of copy-paste - val base = new ContextBase - import base.settings._ - val ctx = base.initialCtx.fresh - ctx.setSetting(ctx.settings.language, List("Scala2")) - ctx.setSetting(ctx.settings.YcookComments, true) - ctx.setSetting(ctx.settings.Ycheck, "all" :: Nil) - // No wiki syntax! - ctx.setSetting(ctx.settings.wikiSyntax, false) - ctx.setProperty(ContextDoc, new ContextDottydoc) - ctx.setSetting( - ctx.settings.classpath, - TestConfiguration.basicClasspath - ) - base.initialize()(using ctx) - ctx - } - - @Test def simpleMarkdown = { - val source = - """ - |package scala - | - |/** *Hello*, world! */ - |trait HelloWorld - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals("<p><em>Hello</em>, world!</p>", traitCmt) - } - } - - @Test def outerLink = { - val source = - """ - |package scala - | - |/** [out](http://www.google.com) */ - |trait HelloWorld - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals("""<p><a href="http://www.google.com">out</a></p>""", traitCmt) - } - } - - @Test def relativeLink = { - val source = - """ - |package scala - | - |/** [None](./None.html) */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals("""<p><a href="./None.html">None</a></p>""", traitCmt) - } - } - - @Test def absoluteLink = { - val source = - """ - |package scala - | - |/** [None](scala.None) */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals("""<p><a href="../scala/None.html">None</a></p>""", traitCmt) - } - } - - @Test def handleLists = { - val source = - """ - |package scala - | - |/** - Item1 - | * - Item2 - | * - Item3 - | */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals( - """|<ul> - |<li>Item1</li> - |<li>Item2</li> - |<li>Item3</li> - |</ul>""".stripMargin, traitCmt) - } - } - - @Test def handleNestedLists = { - val source = - """ - |package scala - | - |/** - Item1 - | * - Item1a - | * - Item1b - | * - Item2 - | * - Item3 - | */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals( - """|<ul> - |<li>Item1 - |<ul> - |<li>Item1a</li> - |<li>Item1b</li> - |</ul> - |</li> - |<li>Item2</li> - |<li>Item3</li> - |</ul>""".stripMargin, traitCmt) - } - } - - @Test def handleCodeBlock = { - val source = - """ - |package scala - | - |/** ```scala - | * val x = 1 + 5 - | * ``` - | */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals( - """|<pre><code class="scala">val x = 1 + 5 - |</code></pre>""".stripMargin, traitCmt) - } - } - - @Test def handleCodeBlockJavaDocstring = { - // the following works, but not when the start of the codeblock is on the - // first line - val source = - """ - |package scala - | - |/** - | * ```scala - | * val x = 1 + 5 - | * ``` - | */ - |trait HelloWorld - | - |trait None - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - .trim - - assertEquals( - """|<pre><code class="scala">val x = 1 + 5 - |</code></pre>""".stripMargin, traitCmt) - } - } - - @Test def docstringSummary = { - val source = - """ - |package scala - | - |/** This - | * ==== - | * is a short text [that](http://google.com) should not be more than a - | * `few` lines long. This text *should* be shortened somewhere that is - | * appropriate for the **ui**. Might be here, or there or somewhere - | * else. - | */ - |trait HelloWorld - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.short)) - .get - .trim - - assert( - traitCmt.endsWith("Might be here...\n</p>"), - s"""|docstring summary should strip the following docstring so that it ends in "Might be here..." - | - |$traitCmt""".stripMargin - ) - } - } - - @Test def docstringSummaryWithImage = { - val source = - """ - |package scala - | - |/** This - | * ==== - | * should quit before ![alt text](https://whatever.com/1.png "Img Text"), - | * I shouldn't be visible. - | */ - |trait HelloWorld - """.stripMargin - - checkSource(source) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.short)) - .get - .trim - - assert( - !traitCmt.contains("<img") && - !traitCmt.contains("I shouldn't be visible."), - s"""|docstring summary shouldn't contain image, error in `MarkdownShortener.scala` - | - |$traitCmt""".stripMargin) - } - - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/PackageStructure.scala b/doc-tool/test/dotty/tools/dottydoc/PackageStructure.scala deleted file mode 100644 index 152ef13ca29e..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/PackageStructure.scala +++ /dev/null @@ -1,108 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ -import dotc.util.SourceFile -import model.Trait -import model.internal._ - -class PackageStructureFromSourceTest extends PackageStructureBase with CheckFromSource -class PackageStructureFromTastyTest extends PackageStructureBase with CheckFromTasty - -abstract class PackageStructureBase extends DottyDocTest { - - @Test def sourceFileAnnotIsStripped = { - val source = SourceUtil.makeTemp( - """package scala - | - |/** Some doc */ - |trait A - """.stripMargin - ) - - val tastyFile = "scala/A.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - assert(trt.annotations.isEmpty) - } - } - } - - @Test def multipleCompilationUnits = { - val source1 = SourceUtil.makeTemp( - """ - |package scala - | - |trait A - """.stripMargin - ) - - val source2 = SourceUtil.makeTemp( - """ - |package scala - | - |trait B - """.stripMargin - ) - - val tastyFiles = "scala/A.tasty" :: "scala/B.tasty" :: Nil - - check(tastyFiles, source1 :: source2 :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(tA, tB), _, _, _, _) => - assert( - tA.name == "A" && tB.name == "B", - s"trait A had name '${tA.name}' and trait B had name '${tB.name}'" - ) - case _ => fail("Incorrect package structure after run") - } - } - } - - - @Test def multiplePackages = { - val source1 = SourceUtil.makeTemp( - """ - |package scala - |package collection - | - |trait A - """.stripMargin) - - val source2 = SourceUtil.makeTemp( - """ - |package scala - |package collection - | - |trait B - """.stripMargin) - - val tastyFiles = "scala/collection/A.tasty" :: "scala/collection/B.tasty" :: Nil - - check(tastyFiles, source1 :: source2 :: Nil) { (ctx, packages) => - packages("scala.collection") match { - case PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _, _) => - assert( - tA.name == "A" && tB.name == "B", - s"trait A had name '${tA.name}' and trait B had name '${tB.name}'" - ) - - case _ => - fail(s"""Incorrect package structure for 'scala' package: ${packages("scala")}""") - } - - packages("scala.collection") match { - case PackageImpl(_, _, "scala.collection", List(tA, tB), _, _, _, _) => - assert( - tA.name == "A" && tB.name == "B", - s"trait A had name '${tA.name}' and trait B had name '${tB.name}'" - ) - - case _ => fail("Incorrect package structure for 'scala.collection' package") - } - } - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/SettingsTests.scala b/doc-tool/test/dotty/tools/dottydoc/SettingsTests.scala deleted file mode 100644 index 2ee945953a80..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/SettingsTests.scala +++ /dev/null @@ -1,18 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -class SettingsTests { - - @Test def t8124: Unit = { - val source = "tests/pos/Foo.scala" - val url = "https://github.com/lampepfl/dotty/tree/master/tests" - val options = Array("-project", "-project-url", url, source) - val reporter = Main.process(options) - assertEquals(2, reporter.errorCount) - assertEquals("missing argument for option -project", reporter.allErrors.last.message) - } - -} diff --git a/doc-tool/test/dotty/tools/dottydoc/SimpleComments.scala b/doc-tool/test/dotty/tools/dottydoc/SimpleComments.scala deleted file mode 100644 index 56c35b0738a1..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/SimpleComments.scala +++ /dev/null @@ -1,74 +0,0 @@ -package dotty.tools -package dottydoc - -import model.internal._ -import dotc.util.SourceFile -import dotty.tools.io._ - -import org.junit.Test -import org.junit.Assert._ - -class SimpleCommentsFromSourceTest extends SimpleCommentsBase with CheckFromSource -class SimpleCommentsFromTastyTest extends SimpleCommentsBase with CheckFromTasty - -abstract class SimpleCommentsBase extends DottyDocTest { - - @Test def cookCommentEmptyClass = { - val source = - """ - |package scala - | - |/** - | * An empty trait: $Variable - | * - | * @define Variable foobar - | */ - |trait Test""".stripMargin - - checkSource(source) { (_, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt), _, _, _, _) => - assert(trt.comment.isDefined, "Lost comment in transformations") - assert(trt.comment.get.body.contains("An empty trait: foobar")) - assert(trt.name == "Test", s"Incorrect name after transform: ${trt.name}") - } - } - } - - @Test def simpleComment = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |/** Hello, world! */ - |trait HelloWorld - """.stripMargin - ) - - - val tastyFile = "scala/HelloWorld.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - val traitCmt = - packages("scala") - .children.find(_.path.mkString(".") == "scala.HelloWorld") - .flatMap(_.comment.map(_.body)) - .get - - assertEquals(traitCmt, "<p>Hello, world!</p>") - } - } - - @Test def commentOnPackageObject = { - val source = - """ - |/** Hello, world! */ - |package object foobar { class A } - """.stripMargin - - checkSource(source) { (_, packages) => - val packageCmt = packages("foobar").comment.get.body - assertEquals("<p>Hello, world!</p>", packageCmt) - } - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/SourceUtil.scala b/doc-tool/test/dotty/tools/dottydoc/SourceUtil.scala deleted file mode 100644 index eef86f5da9d2..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/SourceUtil.scala +++ /dev/null @@ -1,18 +0,0 @@ -package dotty.tools.dottydoc - -import dotty.tools.dotc.util.SourceFile -import dotty.tools.io.{Path, PlainFile} - -object SourceUtil { - - /** Create a temporary `.scala` source file with the given content */ - def makeTemp(content: String): SourceFile = { - val tempFile = java.io.File.createTempFile("dottydoc-test-", ".scala") - tempFile.deleteOnExit() - val file = new PlainFile(Path(tempFile.toPath)) - val out = file.output - out.write(content.getBytes) - new SourceFile(file, scala.io.Codec.UTF8) - } - -} diff --git a/doc-tool/test/dotty/tools/dottydoc/TypeRendering.scala b/doc-tool/test/dotty/tools/dottydoc/TypeRendering.scala deleted file mode 100644 index 5e4d50274ac3..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/TypeRendering.scala +++ /dev/null @@ -1,51 +0,0 @@ -package dotty.tools -package dottydoc - -import dotty.tools.dotc.util.SourceFile -import dotty.tools.dottydoc.model._ -import dotty.tools.dottydoc.model.internal._ -import dotty.tools.dottydoc.model.references._ - -import org.junit.Test -import org.junit.Assert.{assertTrue, fail} - -class TypeRenderingTestFromTasty extends TypeRenderingTest with CheckFromTasty -class TypeRenderingTestFromSource extends TypeRenderingTest with CheckFromSource -abstract class TypeRenderingTest extends DottyDocTest { - @Test def renderImplicitFunctionType = { - val source = SourceFile.virtual( - "ImplicitFunctionType.scala", - """ - |package scala - | - |trait Test { - | def a: implicit Int => Int = ??? - | def b(x: implicit Int => Int) = ??? - | type c = implicit Int => Int - |} - """.stripMargin - ) - - def checkImplicitFunctionType(ref: Reference) = ref match { - case FunctionReference(_, _, isImplicit) => - assertTrue("Should be an implicit function type", isImplicit) - case _ => - fail("Unexpected: " + ref) - } - - checkFromSource(source :: Nil) { case (_, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(a: Def, b: Def, c: TypeAlias) = trt.members.sortBy(_.name) - checkImplicitFunctionType(a.returnValue) - b.paramLists.head.list.head match { - case NamedReference("x", ref, _, _) => - checkImplicitFunctionType(ref) - case _ => - fail("Unexpected: " + b.paramLists.head.list.head) - } - checkImplicitFunctionType(c.alias.get) - } - } - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/UsecaseTest.scala b/doc-tool/test/dotty/tools/dottydoc/UsecaseTest.scala deleted file mode 100644 index 681c0773e6f0..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/UsecaseTest.scala +++ /dev/null @@ -1,269 +0,0 @@ -package dotty.tools -package dottydoc - -import org.junit.Test -import org.junit.Assert._ - -import dotc.util.SourceFile -import model._ -import model.internal._ -import model.references._ -import util.syntax._ - -class UsecaseFromSourceTest extends UsecaseBase with CheckFromSource -class UsecaseFromTastyTest extends UsecaseBase with CheckFromTasty - -abstract class UsecaseBase extends DottyDocTest { - @Test def simpleUsecase = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |trait Test[A] { - | /** Definition with a "disturbing" signature - | * - | * @usecase def foo: A - | */ - | def foo[B]: A => B - |} - """.stripMargin - ) - - val tastyFile = "scala/Test.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(foo: Def) = trt.members - - assert(foo.comment.isDefined, "Lost comment in transformations") - - val returnValue = foo.returnValue match { - case ref: TypeReference => ref.title - case _ => - assert( - false, - "Incorrect return value after usecase transformation" - ) - "" - } - - assert( - foo.typeParams.isEmpty, - "Type parameters were not stripped by usecase" - ) - assert(returnValue == "A", "Incorrect return type after usecase") - - assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}") - } - } - } - - @Test def simpleUsecaseAddedArg = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |trait Test[A] { - | /** Definition with a "disturbing" signature - | * - | * @usecase def foo(a: A): A - | */ - | def foo[B]: A => B - |} - """.stripMargin - ) - - val tastyFile = "scala/Test.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(foo: Def) = trt.members - - val returnValue = foo.returnValue match { - case ref: TypeReference => ref.title - case _ => - assert( - false, - "Incorrect return value after usecase transformation" - ) - "" - } - - assert( - foo.typeParams.isEmpty, - "Type parameters were not stripped by usecase" - ) - assert(returnValue == "A", "Incorrect return type after usecase") - assert( - foo.paramLists.head.list.head.title == "a", - "Incorrect parameter to function after usecase transformation" - ) - assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}") - } - } - } - - @Test def simpleTparamUsecase = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |trait Test[A] { - | /** Definition with a "disturbing" signature - | * - | * @usecase def foo[C]: A - | */ - | def foo[B]: A => B - |} - """.stripMargin - ) - - val tastyFile = "scala/Test.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(foo: Def) = trt.members - - val returnValue = foo.returnValue match { - case ref: TypeReference => ref.title - case _ => - assert( - false, - "Incorrect return value after usecase transformation" - ) - "" - } - - assert( - foo.typeParams.nonEmpty, - "Type parameters were incorrectly stripped by usecase" - ) - - assert(foo.typeParams.head == "C", "Incorrectly switched tparam") - assert(returnValue == "A", "Incorrect return type after usecase") - - assert(foo.name == "foo", s"Incorrect name after transform: ${foo.name}") - } - } - } - - @Test def expandColl = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |/** The trait $Coll - | * - | * @define Coll Iterable - | */ - |trait Iterable[A] { - | /** Definition with a "disturbing" signature - | * - | * @usecase def map[B](f: A => B): $Coll[B] - | */ - | def map[B, M[B]](f: A => B): M[B] = ??? - |} - """.stripMargin - ) - - val tastyFile = "scala/Iterable.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(map: Def) = trt.members - - val returnValue = map.returnValue match { - case ref: TypeReference => ref.title - case _ => - assert( - false, - "Incorrect return value after usecase transformation" - ) - "" - } - - assert( - returnValue == "Iterable", - "Incorrect return type after usecase transformation" - ) - } - } - } - - @Test def checkStripping = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |/** The trait $Coll - | * - | * @define Coll Iterable - | */ - |trait Iterable[A] { - | /** Definition with a "disturbing" signature - | * - | * @usecase def map[B](f: A => B): $Coll[B] - | */ - | def map[B, M[B]](f: A => B): M[B] = ??? - |} - """.stripMargin - ) - - val tastyFile = "scala/Iterable.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(map: Def) = trt.members - assert(map.comment.isDefined, "Lost comment in transformations") - - val docstr = ctx.docbase.docstring(map.symbol).get.expandedBody.get - assert( - !docstr.contains("@usecase"), - s"Comment should not contain usecase after stripping, but was:\n$docstr" - ) - } - } - } - - @Test def multipleUseCases: Unit = { - val source = SourceUtil.makeTemp( - """ - |package scala - | - |trait Test { - | /** A first method - | * @usecase def foo(x: Int): Int - | * @usecase def foo(x: Double): Double - | */ - | def foo(x: String): Unit - |} - """.stripMargin - ) - - val tastyFile = "scala/Test.tasty" - - check(tastyFile :: Nil, source :: Nil) { (ctx, packages) => - packages("scala") match { - case PackageImpl(_, _, _, List(trt: Trait), _, _, _, _) => - val List(foo0: Def, foo1: Def) = trt.members - assertEquals(TypeReference("Int", NoLink("Int", "scala.Int"), Nil), foo0.returnValue) - assertEquals(TypeReference("Double", NoLink("Double", "scala.Double"), Nil), foo1.returnValue) - } - } - } - - @Test def checkIterator = - checkFiles("../tests/scala2-library/src/library/scala/collection/Iterator.scala" :: Nil) { case _ => - // success if typer throws no errors! :) - } - - @Test def checkIterableLike = - checkFiles("../tests/scala2-library/src/library/scala/collection/IterableLike.scala" :: Nil) { case _ => - // success if typer throws no errors! :) - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala deleted file mode 100644 index 7ef28ba7ad7c..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/PageTests.scala +++ /dev/null @@ -1,102 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import org.junit.Test -import org.junit.Assert._ - -class PageTests extends DottyDocTest with SourceFileOps with CheckFromSource { - import scala.collection.JavaConverters._ - - @Test def mdHas1Key = { - val page = markdownPage( - """|--- - |key: - |--- - | - |great""".stripMargin - ) - - assert( - page.yaml == Map("key" -> List.empty.asJava), - s"""incorrect yaml, expected "key:" without key in: ${page.yaml}""" - ) - - assertEquals("<p>great</p>\n", page.html.get) - } - - @Test def yamlPreservesLiquidTags = { - val page1 = markdownPage( - """|--- - |key: - |--- - | - |{{ content }}""".stripMargin, - params = Map("content" -> "Hello, world!") - ) - - assert( - page1.yaml == Map("key" -> List.empty.asJava), - s"""incorrect yaml, expected "key:" without key in: ${page1.yaml}""" - ) - - assertEquals("<p>Hello, world!</p>\n", page1.html.get) - - val page2 = markdownPage( - """|{{ content }}""".stripMargin, - params = Map("content" -> "hello") - ) - assert( - page2.yaml == Map(), - s"""incorrect yaml, expected "key:" without key in: ${page2.yaml}""" - ) - assertEquals("<p>hello</p>\n", page2.html.get) - - val page3 = markdownPage( - """|{% if product.title == "Awesome Shoes" %} - |These shoes are awesome! - |{% endif %}""".stripMargin, - params = Map("product" -> Map("title" -> "Awesome Shoes").asJava) - ) - - assertEquals( - "<p>These shoes are awesome!</p>\n", - page3.html.get - ) - } - - @Test def simpleHtmlPage = { - val p1 = htmlPage("""<h1>{{ "hello, world!" }}</h1>""") - assert(p1.yaml == Map(), "non-empty yaml found") - assertEquals("<h1>hello, world!</h1>", p1.html.get) - } - - @Test def htmlPageHasNoYaml = { - val page = htmlPage( - """|--- - |layout: main - |--- - | - |Hello, world!""".stripMargin - ) - - assert(!page.html.get.contains("---\nlayout: main\n---"), - s"page still contains yaml:\n${page.html.get}") - } - - @Test def illegalYamlFrontMatter = try { - val page = htmlPage( - """|--- - |layout: main - | - | - |Hello, world!""".stripMargin - ) - - page.html.get - fail("illegal front matter didn't throw exception") - } catch { - case IllegalFrontMatter(x) => // success! - case t: Throwable => throw t - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala deleted file mode 100644 index b2c979d1d258..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/SiteTests.scala +++ /dev/null @@ -1,116 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import org.junit.Test -import org.junit.Assert._ - -class SiteTests extends DottyDocTest with SourceFileOps with CheckFromSource { - @Test def hasCorrectLayoutFiles = { - assert(site.root.exists && site.root.isDirectory, - s"'${site.root.getName}' is not a directory") - - val expectedLayouts = Set("base", "main", "index", "blog-page", "doc-page", "api-page", "search") - assert(site.layouts.keys == expectedLayouts, - s"Incorrect layouts in: ${site.layouts.keys}, expected: $expectedLayouts") - } - - @Test def renderHelloInMainLayout = { - val renderedPage = site.render(htmlPage( - """|--- - |layout: main - |--- - | - |Hello, world!""".stripMargin - ), Map.empty).get - - assert( - renderedPage.contains("Hello, world!") && - !renderedPage.contains("---\nlayout: main\n---\n") && - renderedPage.contains("<!DOCTYPE html>"), - "html page did not render properly" - ) - } - - @Test def renderMultipleTemplates = { - val renderedPage = site.render(htmlPage( - """|--- - |layout: index - |--- - |Hello, world!""".stripMargin - ), Map.empty).get - - assert( - renderedPage.contains("<h1>Hello, world!</h1>") && - !renderedPage.contains("---\nlayout: main\n---\n") && - !renderedPage.contains("---\nlayout: index\n---\n") && - renderedPage.contains("<!DOCTYPE html>"), - "html page did not render properly" - ) - } - - @Test def preservesPageYaml = { - val renderedPage = site.render(htmlPage( - """|--- - |title: Hello, world - |layout: index - |--- - |Hello, world!""".stripMargin - ), Map.empty).get - - assert( - renderedPage.contains("<h1>Hello, world!</h1>") && - !renderedPage.contains("---\nlayout: main\n---\n") && - !renderedPage.contains("---\nlayout: index\n---\n") && - renderedPage.contains("<title>Hello, world") && - renderedPage.contains(""), - "html page did not render properly:\n" + renderedPage - ) - } - - @Test def include = { - val renderedInclude = site.render( - htmlPage("""{% include "header.html" %}""", includes = site.includes), - Map.empty - ).get - - assertEquals("

      Some header

      \n", renderedInclude) - } - - @Test def siteStructure = { - val assets = site.staticAssets.map(site.stripRoot(_).replace('\\','/')).toSet - val compd = site.compilableFiles.map(site.stripRoot(_).replace('\\','/')).toSet - - val expectedAssets = Set( - "css/bootstrap.min.css", - "css/color-brewer.css", - "css/dottydoc.css", - "css/search.css", - "css/sidebar.css", - "css/toolbar.css", - "images/scala3-logo-white.svg", - "images/scala3-logo.svg", - "images/scala-logo-white.svg", - "images/scala-logo.svg", - "js/api-search.js", - "js/bootstrap.min.js", - "js/dottydoc.js", - "js/highlight.pack.js", - "js/jquery.min.js", - "js/sidebar.js", - "js/toolbar.js" - ) - val expectedCompd = Set( - // Directories starting in `_` are not included in compilable files - "index.md" - ) - - def printSet(xs: Set[String]): String = - xs.toList.sorted.mkString("\n{\n ", ",\n ", "\n}") - - assert(expectedAssets == assets, - s"assets incorrect, found: ${ printSet(assets) } - expected ${ printSet(expectedAssets) }") - assert(expectedCompd == compd, - s"compilable files incorrect, found: ${ printSet(compd) } - expected ${ printSet(expectedCompd) }") - } -} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/SourceFileOps.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/SourceFileOps.scala deleted file mode 100644 index 698c9ffc93ed..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/SourceFileOps.scala +++ /dev/null @@ -1,59 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import dotc.util.SourceFile -import io.VirtualFile - -import model.Package - -import java.io.{ BufferedWriter, OutputStreamWriter } -import java.nio.charset.StandardCharsets - -import scala.io.Codec - - -trait SourceFileOps { - import scala.collection.JavaConverters._ - val siteRoot = new java.io.File("doc-tool/resources/") - val site = new Site( - siteRoot, new java.io.File(siteRoot, "_site"), - "test-site", "v0.1", Some("http://github.com/lampepfl/dotty"), None, Map.empty, "/" - ) - - def stringToSource(path: String, sourceCode: String): SourceFile = { - val virtualFile = new VirtualFile(path, path) - val writer = new BufferedWriter(new OutputStreamWriter(virtualFile.output, StandardCharsets.UTF_8.name)) - writer.write(sourceCode) - writer.close() - - new SourceFile(virtualFile, Codec.UTF8) - } - - def markdownPage( - sourceCode: String, - path: String = "test-page", - params: Map[String, AnyRef] = Map.empty, - includes: Map[String, Include] = Map.empty, - docs: Map[String, Package] = Map.empty - ) = new MarkdownPage( - path, - stringToSource(path, sourceCode), - params, - includes, - docs - ) - - def htmlPage( - sourceCode: String, - path: String = "test-page", - params: Map[String, AnyRef] = Map.empty, - includes: Map[String, Include] = Map.empty, - docs: Map[String, Package] = Map.empty - ) = new HtmlPage( - path, - stringToSource(path, sourceCode), - params, - includes - ) -} diff --git a/doc-tool/test/dotty/tools/dottydoc/staticsite/TemplateErrorTests.scala b/doc-tool/test/dotty/tools/dottydoc/staticsite/TemplateErrorTests.scala deleted file mode 100644 index 42518cae99ad..000000000000 --- a/doc-tool/test/dotty/tools/dottydoc/staticsite/TemplateErrorTests.scala +++ /dev/null @@ -1,32 +0,0 @@ -package dotty.tools -package dottydoc -package staticsite - -import org.junit.Test -import org.junit.Assert._ - -class TemplateErrorTests extends DottyDocTest with SourceFileOps with CheckFromSource { - @Test def unclosedTag: Unit = { - htmlPage( - """|Yo dawg: - |{% include "stuff" - |I heard you like to include stuff""".stripMargin - ).html - } - - @Test def missingEndif: Unit = { - htmlPage( - """|{% if someStuff %} - |Dude - |""".stripMargin - ).html - } - - @Test def nonExistingTag: Unit = { - htmlPage( - """|{% someStuff 'ofDude' %} - |Dude - |""".stripMargin - ).html - } -} From 190e127c477ffe6cb7f65c3e803b2fa06ae5c814 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Tue, 9 Feb 2021 18:31:00 +0100 Subject: [PATCH 03/11] Fix community build after removal of scala3-doc --- .../src/scala/dotty/communitybuild/Main.scala | 2 +- .../src/scala/dotty/communitybuild/projects.scala | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/community-build/src/scala/dotty/communitybuild/Main.scala b/community-build/src/scala/dotty/communitybuild/Main.scala index a4f56a8ac0c7..1747884d1721 100644 --- a/community-build/src/scala/dotty/communitybuild/Main.scala +++ b/community-build/src/scala/dotty/communitybuild/Main.scala @@ -85,7 +85,7 @@ object Main: println("COMMAND is one of: publish doc") println("Available projects are:") allProjects.foreach { k => - println(s"\t$k") + println(s"\t${k.project}") } sys.exit(1) diff --git a/community-build/src/scala/dotty/communitybuild/projects.scala b/community-build/src/scala/dotty/communitybuild/projects.scala index ed58801fb662..f071d9a31c33 100644 --- a/community-build/src/scala/dotty/communitybuild/projects.scala +++ b/community-build/src/scala/dotty/communitybuild/projects.scala @@ -160,10 +160,9 @@ final case class SbtCommunityProject( """set testOptions in Global += Tests.Argument(TestFramework("munit.Framework"), "+l"); """ ++ s"$baseCommand$sbtTestCommand" - override val publishCommand = if sbtPublishCommand eq null then null else - val disableDocCommand = - if sbtDocCommand eq null then "" else "set every useScaladoc := false;" - s"$baseCommand$disableDocCommand$sbtPublishCommand" + override val publishCommand = + if sbtPublishCommand eq null then null else s"$baseCommand$sbtPublishCommand" + override val docCommand = if sbtDocCommand eq null then null else val cmd = if sbtDocCommand.startsWith(";") then sbtDocCommand else s";$sbtDocCommand" @@ -627,7 +626,7 @@ object projects: sbtPublishCommand = "publishLocal", dependencies = List(scalatest) ) - + lazy val perspective = SbtCommunityProject( project = "perspective", // No library with easy typeclasses to verify data against exist for Dotty, so no tests yet From 2af295efa9095af12bb3d2d082910803a50305b9 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 03:19:48 +0100 Subject: [PATCH 04/11] Create scaladoc script and replace scalad --- dist/bin/scalad | 96 ------------------------------ dist/bin/scaladoc | 138 ++++++++++++++++++++++++++++++++++++++++++++ project/Build.scala | 78 +++++++++++++++---------- 3 files changed, 185 insertions(+), 127 deletions(-) delete mode 100755 dist/bin/scalad create mode 100755 dist/bin/scaladoc diff --git a/dist/bin/scalad b/dist/bin/scalad deleted file mode 100755 index bc0378af956e..000000000000 --- a/dist/bin/scalad +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env bash - -# Try to autodetect real location of the script - -if [ -z "$PROG_HOME" ] ; then - ## resolve links - $0 may be a link to PROG_HOME - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - PROG_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - PROG_HOME=`cd "$PROG_HOME" && pwd` - - cd "$saveddir" -fi - -source "$PROG_HOME/bin/common" - -# Set scala3-doc dep: -DOTTY_DOC_LIB=$(find_lib "*scala3-doc*") - -# Set flexmark deps: -FLEXMARK_LIBS="" -FLEXMARK_LIBS+=$(find_lib "*flexmark-0*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-formatter*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-anchorlink*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-autolink*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-emoji*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-gfm-strikethrough*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-gfm-tables*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-gfm-tasklist*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-ins*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-superscript*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-tables*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-wikilink*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-ext-yaml-front-matter*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-jira-converter*")$PSEP -FLEXMARK_LIBS+=$(find_lib "*flexmark-util*") - -# Set jackson deps: -JACKSON_LIBS="" -JACKSON_LIBS+=$(find_lib "*jackson-annotations*")$PSEP -JACKSON_LIBS+=$(find_lib "*jackson-core*")$PSEP -JACKSON_LIBS+=$(find_lib "*jackson-databind*")$PSEP -JACKSON_LIBS+=$(find_lib "*jackson-dataformat-yaml*") - -# Set liqp dep: -LIQP_LIB=$(find_lib "*liqp*") - -# Set ANTLR dep: -ANTLR_LIB=$(find_lib "*antlr-3*") -ANTLR_RUNTIME_LIB=$(find_lib "*antlr-runtime-3*") - -# Set autolink dep: -AUTOLINK_LIB=$(find_lib "*autolink-0.6*") # conflict with flexmark-ext-autolink-0.11 - -# Set snakeyaml dep: -SNAKEYAML_LIB=$(find_lib "*snakeyaml*") - -# Set ST4 dep: -ST4_LIB=$(find_lib "*ST4*") - -# Set jsoup dep: -JSOUP_LIB=$(find_lib "*jsoup*") - -CLASS_PATH="$DOTTY_LIB$PSEP$DOTTY_COMP$PSEP$TASTY_CORE$PSEP$DOTTY_DOC_LIB$PSEP$DOTTY_INTF$PSEP$SBT_INTF$PSEP$DOTTY_STAGING$PSEP$DOTTY_TASTY_INSPECTOR" -CLASS_PATH="$CLASS_PATH$PSEP$SCALA_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$FLEXMARK_LIBS" -CLASS_PATH="$CLASS_PATH$PSEP$JACKSON_LIBS" -CLASS_PATH="$CLASS_PATH$PSEP$LIQP_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$ANTLR_LIB$PSEP$ANTLR_RUNTIME_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$AUTOLINK_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$SNAKEYAML_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$ST4_LIB" -CLASS_PATH="$CLASS_PATH$PSEP$JSOUP_LIB" - -eval exec "\"$JAVACMD\"" \ - -Dscala.usejavacp=true \ - "-classpath \"$CLASS_PATH\"" \ - dotty.tools.dottydoc.Main \ - $@ - -exit $? diff --git a/dist/bin/scaladoc b/dist/bin/scaladoc new file mode 100755 index 000000000000..792de1fe2201 --- /dev/null +++ b/dist/bin/scaladoc @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +if [ -z "$PROG_HOME" ] ; then + ## resolve links - $0 may be a link to PROG_HOME + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + PROG_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + PROG_HOME=`cd "$PROG_HOME" && pwd` + + cd "$saveddir" +fi + +source "$PROG_HOME/bin/common" + +default_java_opts="-Xmx768m -Xms768m" +withCompiler=true + +CompilerMain=dotty.tools.dotc.Main +DecompilerMain=dotty.tools.dotc.decompiler.Main +ReplMain=dotty.tools.repl.Main +ScriptingMain=dotty.tools.scripting.Main + +PROG_NAME=$CompilerMain + +addJava () { + java_args+=("'$1'") +} +addScala () { + scala_args+=("'$1'") +} +addResidual () { + residual_args+=("'$1'") +} +addScripting () { + scripting_args+=("'$1'") +} + +classpathArgs () { + CLASS_PATH="" + CLASS_PATH+="$(find_lib "*scaladoc*")$PSEP" + CLASS_PATH+="$(find_lib "*scala3-compiler*")$PSEP" + CLASS_PATH+="$(find_lib "*scala3-interfaces*")$PSEP" + CLASS_PATH+="$(find_lib "*scala3-library*")$PSEP" + CLASS_PATH+="$(find_lib "*tasty-core*")$PSEP" + CLASS_PATH+="$(find_lib "*scala3-tasty-inspector*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-0*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-html-parser*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-anchorlink*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-autolink*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-emoji*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-gfm-strikethrough*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-gfm-tables*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-gfm-tasklist*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-wikilink*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-yaml-front-matter*")$PSEP" + CLASS_PATH+="$(find_lib "*liqp*")$PSEP" + CLASS_PATH+="$(find_lib "*jsoup*")$PSEP" + CLASS_PATH+="$(find_lib "*jackson-dataformat-yaml*")$PSEP" + CLASS_PATH+="$(find_lib "*scala-asm*")$PSEP" + CLASS_PATH+="$(find_lib "*compiler-interface*")$PSEP" + CLASS_PATH+="$(find_lib "*jline-reader*")$PSEP" + CLASS_PATH+="$(find_lib "*jline-terminal-3*")$PSEP" + CLASS_PATH+="$(find_lib "*jline-terminal-jna*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-util*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-formatter*")$PSEP" + CLASS_PATH+="$(find_lib "*autolink-0.6*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-jira-converter*")$PSEP" + CLASS_PATH+="$(find_lib "*antlr-3*")$PSEP" + CLASS_PATH+="$(find_lib "*jackson-annotations*")$PSEP" + CLASS_PATH+="$(find_lib "*jackson-core*")$PSEP" + CLASS_PATH+="$(find_lib "*jackson-databind*")$PSEP" + CLASS_PATH+="$(find_lib "*snakeyaml*")$PSEP" + CLASS_PATH+="$(find_lib "*scala-library*")$PSEP" + CLASS_PATH+="$(find_lib "*protobuf-java*")$PSEP" + CLASS_PATH+="$(find_lib "*util-interface*")$PSEP" + CLASS_PATH+="$(find_lib "*jna-5*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-tables*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-ins*")$PSEP" + CLASS_PATH+="$(find_lib "*flexmark-ext-superscript*")$PSEP" + CLASS_PATH+="$(find_lib "*antlr-runtime*")$PSEP" + CLASS_PATH+="$(find_lib "*ST4*")" + + jvm_cp_args="-classpath \"$CLASS_PATH\"" +} + +in_scripting_args=false +while [[ $# -gt 0 ]]; do +case "$1" in + --) shift; for arg; do addResidual "$arg"; done; set -- ;; + -h|-help) help=true && shift ;; + -v|-verbose) verbose=true && addScala "-verbose" && shift ;; + -debug) DEBUG="$DEBUG_STR" && shift ;; + -q|-quiet) quiet=true && shift ;; + + -colors) colors=true && shift ;; + -no-colors) unset colors && shift ;; + # break out -D and -J options and add them to java_args so + # they reach the JVM in time to do some good. The -D options + # will be available as system properties. + -D*) addJava "$1" && shift ;; + -J*) addJava "${1:2}" && shift ;; + *) if [ $in_scripting_args == false ]; then + addResidual "$1" + else + addScripting "$1" + fi + shift + ;; + esac +done + +classpathArgs + +eval exec "\"$JAVACMD\"" \ + ${JAVA_OPTS:-$default_java_opts} \ + "$DEBUG" \ + "${java_args[@]}" \ + "$jvm_cp_args" \ + "dotty.tools.scaladoc.Main" \ + "${scala_args[@]}" \ + "${residual_args[@]}" \ + "$scripting_string" +exit $? diff --git a/project/Build.scala b/project/Build.scala index 199c84e2618d..556a5f4d2f25 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -1496,20 +1496,23 @@ object Build { } def asScaladoc: Project = { - def generateDocumentation(targets: String, name: String, outDir: String, ref: String, params: String = "") = Def.taskDyn { + def generateDocumentation(targets: Seq[String], name: String, outDir: String, ref: String, params: Seq[String] = Nil) = + Def.taskDyn { + val distLocation = pack.in(dist).value val projectVersion = version.value IO.createDirectory(file(outDir)) val scala3version = stdlibVersion(Bootstrapped) // TODO add versions etc. val srcManaged = s"out/bootstrap/stdlib-bootstrapped/scala-$baseVersion/src_managed/main/scala-library-src" - val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library -source-links:github://lampepfl/dotty" - val revision = s"-revision $ref -project-version $projectVersion" - val cmd = s""" -d $outDir -project "$name" $sourceLinks $revision $params $targets""" - run.in(Compile).toTask(cmd) - } + val sourceLinks = s"-source-links:$srcManaged=github://scala/scala/v$scala3version#src/library-source-links:github://lampepfl/dotty" + val revision = Seq("-revision", ref, "-project-version", projectVersion) + val cmd = Seq("-d", outDir, "-project", name, sourceLinks) ++ revision ++ params ++ targets + import _root_.scala.sys.process._ + Def.task((s"$distLocation/bin/scaladoc" +: cmd).!) + } def joinProducts(products: Seq[java.io.File]): String = - products.iterator.map(_.getAbsolutePath.toString).mkString(" ") + products.iterator.map(_.getAbsolutePath).map(p => s"'$p'").mkString(" ") val flexmarkVersion = "0.42.12" @@ -1520,12 +1523,16 @@ object Build { baseDirectory.in(run) := baseDirectory.in(ThisBuild).value, generateSelfDocumentation := Def.taskDyn { generateDocumentation( - classDirectory.in(Compile).value.getAbsolutePath, + classDirectory.in(Compile).value.getAbsolutePath :: Nil, "scaladoc", "scaladoc/output/self", VersionUtil.gitHash, - "-siteroot scaladoc/documentation -project-logo scaladoc/documentation/logo.svg " + - "-external-mappings:" + - ".*scala.*::scaladoc3::http://dotty.epfl.ch/api/," + - ".*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/" + Seq( + "-siteroot", "scaladoc/documentation", + "-project-logo", "scaladoc/documentation/logo.svg", + "-external-mappings:" + + ".*scala.*::scaladoc3::http://dotty.epfl.ch/api/," + + ".*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/" + ) + ) }.value, generateScalaDocumentation := Def.inputTaskDyn { @@ -1539,7 +1546,7 @@ object Build { (`tasty-core-bootstrapped`/Compile/products).value, ).flatten - val roots = joinProducts(dottyJars) + val roots = dottyJars.map(_.getAbsolutePath) val managedSources = (`stdlib-bootstrapped`/Compile/sourceManaged).value / "scala-library-src" @@ -1555,27 +1562,36 @@ object Build { IO.write(dest / "CNAME", "dotty.epfl.ch") }.dependsOn(generateDocumentation( roots, "Scala 3", dest.getAbsolutePath, "master", - // contains special definitions which are "transplanted" elsewhere - // and which therefore confuse Scaladoc when accessed from this pkg - "-skip-by-id:scala.runtime.stdLibPatches " + - // MatchCase is a special type that represents match type cases, - // Reflect doesn't expect to see it as a standalone definition - // and therefore it's easier just not to document it - "-skip-by-id:scala.runtime.MatchCase " + - "-skip-by-regex:.+\\.internal($|\\..+) " + - "-skip-by-regex:.+\\.impl($|\\..+) " + - "-comment-syntax wiki -siteroot docs -project-logo docs/logo.svg " + - "-external-mappings:.*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/ " + - "-social-links:github::https://github.com/lampepfl/dotty," + - "gitter::https://gitter.im/scala/scala," + - "twitter::https://twitter.com/scala_lang " + - s"-source-links:$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library " + - s"-doc-root-content $docRootFile" - )) + Seq( + // contains special definitions which are "transplanted" elsewhere + // and which therefore confuse Scaladoc when accessed from this pkg + "-skip-by-id:scala.runtime.stdLibPatches", + // MatchCase is a special type that represents match type cases, + // Reflect doesn't expect to see it as a standalone definition + // and therefore it's easier just not to document it + "-skip-by-id:scala.runtime.MatchCase", + "-skip-by-regex:.+\\.internal($|\\..+)", + "-skip-by-regex:.+\\.impl($|\\..+)", + "-comment-syntax", "wiki", + "-siteroot", "docs", + "-project-logo", "docs/logo.svg", + "-external-mappings:.*java.*::javadoc::https://docs.oracle.com/javase/8/docs/api/", + "-social-links:" + + "github::https://github.com/lampepfl/dotty," + + "gitter::https://gitter.im/scala/scala," + + "twitter::https://twitter.com/scala_lang", + s"-source-links:$stdLibRoot=github://scala/scala/v${stdlibVersion(Bootstrapped)}#src/library", + "-doc-root-content", docRootFile.toString + ) + )) }.evaluated, generateTestcasesDocumentation := Def.taskDyn { - generateDocumentation(Build.testcasesOutputDir.in(Test).value, "scaladoc testcases", "scaladoc/output/testcases", "master") + generateDocumentation( + Build.testcasesOutputDir.in(Test).value :: Nil, + "scaladoc testcases", + "scaladoc/output/testcases", + "master") }.value, buildInfoKeys in Test := Seq[BuildInfoKey]( From ba6a323d0cef1ff00299a5b41eafe198d5faf09f Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 04:04:58 +0100 Subject: [PATCH 05/11] Doc do not fail for empty (or java) modules --- community-build/src/scala/dotty/communitybuild/projects.scala | 2 +- scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/community-build/src/scala/dotty/communitybuild/projects.scala b/community-build/src/scala/dotty/communitybuild/projects.scala index f071d9a31c33..f0bfb02d5fc7 100644 --- a/community-build/src/scala/dotty/communitybuild/projects.scala +++ b/community-build/src/scala/dotty/communitybuild/projects.scala @@ -408,7 +408,7 @@ object projects: sbtTestCommand = "testsJVM/test;testsJS/test;", // Hardcode the version to avoid having to deal with something set by sbt-dynver sbtPublishCommand = s"""set every version := "${Versions.munit}"; munitJVM/publishLocal; munitJS/publishLocal; munitScalacheckJVM/publishLocal; munitScalacheckJS/publishLocal; junit/publishLocal""", - sbtDocCommand = "munitJVM/doc", + sbtDocCommand = "junit/doc; munitJVM/doc", dependencies = List(scalacheck) ) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala index 47a98c3a430f..eadf63c70def 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/TastyParser.scala @@ -123,7 +123,7 @@ case class ScaladocTastyInspector()(using ctx: DocContext) extends DocTastyInspe val filePaths = ctx.args.tastyFiles.map(_.getAbsolutePath).toList val classpath = ctx.args.classpath.split(java.io.File.pathSeparator).toList - inspectFilesInContext(classpath, filePaths) + if filePaths.nonEmpty then inspectFilesInContext(classpath, filePaths) val all = topLevels.result() all.groupBy(_._1).map { case (pckName, members) => From 58e0618c89f9fcc7a05b383c5666956c9562f147 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 10:45:00 +0100 Subject: [PATCH 06/11] Fix tests in scaladoc --- project/Build.scala | 8 ++++---- .../dotty/tools/scaladoc/BaseHtmlTest.scala | 2 +- .../dotty/tools/scaladoc/RaportingTest.scala | 5 ----- .../tools/scaladoc/tasty/util/TestUtils.scala | 20 +++++++++++-------- .../test/dotty/tools/scaladoc/testUtils.scala | 7 +++++-- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/project/Build.scala b/project/Build.scala index 556a5f4d2f25..14827e604b9a 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -1151,7 +1151,7 @@ object Build { lazy val `scala3-bench-bootstrapped` = project.in(file("bench")).asDottyBench(Bootstrapped) lazy val `scala3-bench-run` = project.in(file("bench-run")).asDottyBench(Bootstrapped) - val testcasesOutputDir = taskKey[String]("Root directory where tests classses are generated") + val testcasesOutputDir = taskKey[Seq[String]]("Root directory where tests classses are generated") val testcasesSourceRoot = taskKey[String]("Root directory where tests sources are generated") val testDocumentationRoot = taskKey[String]("Root directory where tests documentation are stored") val generateSelfDocumentation = taskKey[Unit]("Generate example documentation") @@ -1512,13 +1512,13 @@ object Build { } def joinProducts(products: Seq[java.io.File]): String = - products.iterator.map(_.getAbsolutePath).map(p => s"'$p'").mkString(" ") + products.iterator.map(_.getAbsolutePath).mkString(" ") val flexmarkVersion = "0.42.12" scaladocBasic(Bootstrapped).settings( Test / test := (Test / test).dependsOn(compile.in(Compile).in(`scaladoc-testcases`)).value, - testcasesOutputDir.in(Test) := joinProducts((`scaladoc-testcases`/Compile/products).value), + testcasesOutputDir.in(Test) := (`scaladoc-testcases`/Compile/products).value.map(_.getAbsolutePath), testcasesSourceRoot.in(Test) := (baseDirectory.in(`scaladoc-testcases`).value / "src").getAbsolutePath.toString, baseDirectory.in(run) := baseDirectory.in(ThisBuild).value, generateSelfDocumentation := Def.taskDyn { @@ -1588,7 +1588,7 @@ object Build { generateTestcasesDocumentation := Def.taskDyn { generateDocumentation( - Build.testcasesOutputDir.in(Test).value :: Nil, + Build.testcasesOutputDir.in(Test).value, "scaladoc testcases", "scaladoc/output/testcases", "master") diff --git a/scaladoc/test/dotty/tools/scaladoc/BaseHtmlTest.scala b/scaladoc/test/dotty/tools/scaladoc/BaseHtmlTest.scala index de3b25c0595b..2432fe984751 100644 --- a/scaladoc/test/dotty/tools/scaladoc/BaseHtmlTest.scala +++ b/scaladoc/test/dotty/tools/scaladoc/BaseHtmlTest.scala @@ -31,7 +31,7 @@ class BaseHtmlTest: try val args = Scaladoc.Args( name = projectName, - tastyFiles = pcks.flatMap(tastyFiles), + tastyFiles = pcks.flatMap(tastyFiles(_)), output = dest.toFile, docsRoot = docsRoot, projectVersion = Some(projectVersion), diff --git a/scaladoc/test/dotty/tools/scaladoc/RaportingTest.scala b/scaladoc/test/dotty/tools/scaladoc/RaportingTest.scala index 88f9b7c0f3f3..a73f026f7774 100644 --- a/scaladoc/test/dotty/tools/scaladoc/RaportingTest.scala +++ b/scaladoc/test/dotty/tools/scaladoc/RaportingTest.scala @@ -33,11 +33,6 @@ class ReportingTest: assertNoInfos(diag) } - @Test - def noClassesErors = checkReportedDiagnostics(_.copy(tastyFiles = Nil)){ diag => - assertMessagesAbout(diag.errorMsgs)("classes should no be empty") - } - @Test def errorsInCaseOfIncompletClasspath = val notTasty = Files.createTempFile("broken", ".notTasty") diff --git a/scaladoc/test/dotty/tools/scaladoc/tasty/util/TestUtils.scala b/scaladoc/test/dotty/tools/scaladoc/tasty/util/TestUtils.scala index 4ffc06516312..356268c44b3a 100644 --- a/scaladoc/test/dotty/tools/scaladoc/tasty/util/TestUtils.scala +++ b/scaladoc/test/dotty/tools/scaladoc/tasty/util/TestUtils.scala @@ -8,8 +8,6 @@ object TestUtils { import java.io.File import scala.collection.mutable.ListBuffer - val classRoot = new File(BuildInfo.test_testcasesOutputDir) - def go(bld: ListBuffer[String])(file: File): Unit = file.listFiles.foreach { f => if f.isFile() then @@ -17,11 +15,17 @@ object TestUtils { else go(bld)(f) } - if classRoot.isDirectory then - val bld = new ListBuffer[String] - go(bld)(classRoot) - bld.result - else - sys.error(s"Class root could not be found: $classRoot") + def listEntry(entry: String): List[String] = + val classRoot = File(entry) + if classRoot.isDirectory then + val bld = new ListBuffer[String] + go(bld)(classRoot) + bld.result + else + sys.error(s"Class root could not be found: $classRoot") + + val files = BuildInfo.test_testcasesOutputDir.flatMap(listEntry).toList + assert(files.nonEmpty, "Provided list of root directories is empty") + files } } diff --git a/scaladoc/test/dotty/tools/scaladoc/testUtils.scala b/scaladoc/test/dotty/tools/scaladoc/testUtils.scala index 4bab27fb1b70..cfab383c9ba8 100644 --- a/scaladoc/test/dotty/tools/scaladoc/testUtils.scala +++ b/scaladoc/test/dotty/tools/scaladoc/testUtils.scala @@ -60,7 +60,7 @@ def testContext = (new ContextBase).initialCtx.fresh.setReporter(new TestReporte def testDocContext(files: Seq[File] = Nil) = DocContext(testArgs(files), testContext) -def tastyFiles(name: String) = +def tastyFiles(name: String, allowEmpty: Boolean = false) = def listFilesSafe(dir: File) = Option(dir.listFiles).getOrElse { throw AssertionError(s"$dir not found. The test name is incorrect or scaladoc-testcases were not recompiled.") } @@ -69,4 +69,7 @@ def tastyFiles(name: String) = case f if f.getName endsWith ".tasty" => f :: Nil case _ => Nil } - collectFiles(File(s"${BuildInfo.test_testcasesOutputDir}/tests/$name")) + val files = BuildInfo.test_testcasesOutputDir.flatMap(p => collectFiles(File(s"$p/tests/$name"))) + assert(files.nonEmpty || allowEmpty) + files.toSeq + From cccfb15133e42558be8dd3ebb410a3d1eb3b50ce Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 11:34:14 +0100 Subject: [PATCH 07/11] Fix cmd tests for scaladoc --- .github/workflows/ci.yaml | 2 +- bin/{scalad => scaladoc} | 2 +- docs/docs/usage/getting-started.md | 4 ++-- project/scripts/bootstrapCmdTests | 27 +++++++++++++++------------ 4 files changed, 19 insertions(+), 16 deletions(-) rename bin/{scalad => scaladoc} (59%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a9af880284cf..d008d09319f4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -100,7 +100,7 @@ jobs: - name: Add SBT proxy repositories run: cp -vf .github/workflows/repositories /root/.sbt/ ; true - - name: Test + - name: Cmd Tests run: | ./project/scripts/sbt ";scala3-bootstrapped/compile ;scala3-bootstrapped/test;sjsSandbox/run;sjsSandbox/test;sjsJUnitTests/test;sjsCompilerTests/test ;sbt-dotty/scripted scala2-compat/* ;configureIDE ;stdlib-bootstrapped/test:run ;stdlib-bootstrapped-tasty-tests/test" ./project/scripts/bootstrapCmdTests diff --git a/bin/scalad b/bin/scaladoc similarity index 59% rename from bin/scalad rename to bin/scaladoc index 43693684ea70..11a754c6579f 100755 --- a/bin/scalad +++ b/bin/scaladoc @@ -2,4 +2,4 @@ ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" >& /dev/null && pwd)/.." -"$ROOT/bin/common" "$ROOT/dist/target/pack/bin/scalad" "$@" +"$ROOT/bin/common" "$ROOT/dist/target/pack/bin/scaladoc" "$@" diff --git a/docs/docs/usage/getting-started.md b/docs/docs/usage/getting-started.md index 3600b90a0a51..190f07992c09 100644 --- a/docs/docs/usage/getting-started.md +++ b/docs/docs/usage/getting-started.md @@ -38,13 +38,13 @@ Start using the Dotty IDE in any Dotty project by following the ### Standalone installation Releases are available for download on the [Releases Section](https://github.com/lampepfl/dotty/releases) of the Dotty repository. Releases include three executables: `scalac` the Dotty compiler, -`scalad` the [Dotty Documentation tool](./dottydoc.md) and `scala` the Dotty REPL. +`scaladoc` the [Scaladoc](scaladoc.md) and `scala` the Dotty REPL. ``` . └── bin    ├── scalac -    ├── scalad +    ├── scaladoc    └── scala ``` diff --git a/project/scripts/bootstrapCmdTests b/project/scripts/bootstrapCmdTests index 201fc3d61ab0..cc431604a712 100755 --- a/project/scripts/bootstrapCmdTests +++ b/project/scripts/bootstrapCmdTests @@ -5,18 +5,18 @@ set -e source $(dirname $0)/cmdTestsCommon.inc.sh # check that benchmarks can run -"$SBT" "scala3-bench/jmh:run 1 1 tests/pos/alias.scala" -# The above is here as it relies on the bootstrapped library. -"$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 tests/pos/alias.scala" -"$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 -with-compiler compiler/src/dotty/tools/dotc/core/Types.scala" +# "$SBT" "scala3-bench/jmh:run 1 1 tests/pos/alias.scala" +# # The above is here as it relies on the bootstrapped library. +# "$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 tests/pos/alias.scala" +# "$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 -with-compiler compiler/src/dotty/tools/dotc/core/Types.scala" -echo "testing scala.quoted.Expr.run from sbt scala" -"$SBT" ";scala3-compiler-bootstrapped/scalac -with-compiler tests/run-staging/quote-run.scala; scala3-compiler-bootstrapped/scala -with-compiler Test" > "$tmp" -grep -qe "val a: scala.Int = 3" "$tmp" +# echo "testing scala.quoted.Expr.run from sbt scala" +# "$SBT" ";scala3-compiler-bootstrapped/scalac -with-compiler tests/run-staging/quote-run.scala; scala3-compiler-bootstrapped/scala -with-compiler Test" > "$tmp" +# grep -qe "val a: scala.Int = 3" "$tmp" # setup for `scalac`/`scala` script tests -"$SBT" dist/pack +# "$SBT" dist/pack # check that `scalac` compiles and `scala` runs it echo "testing ./bin/scalac and ./bin/scala" @@ -25,11 +25,14 @@ clear_out "$OUT" ./bin/scala -classpath "$OUT" "$MAIN" > "$tmp" test "$EXPECTED_OUTPUT" = "$(cat "$tmp")" +# Test scaladoc based on compiled classes +./bin/scaladoc -project Staging -d "$OUT1" "$OUT" +clear_out "$OUT1" + # check that `scalac` and `scala` works for staging clear_out "$OUT" ./bin/scalac tests/run-staging/i4044f.scala -d "$OUT" ./bin/scala -with-compiler -classpath "$OUT" Test > "$tmp" -./bin/scalad -project Staging -siteroot "$OUT" "tests/run-staging/i4044f.scala" # check that `scalac -from-tasty` compiles and `scala` runs it echo "testing ./bin/scalac -from-tasty and scala -classpath" @@ -51,6 +54,6 @@ grep -qe "def main(args: scala.Array\[scala.Predef.String\]): scala.Unit =" "$tm # echo ":quit" | ./dist/target/pack/bin/scala # not supported by CI -echo "testing ./bin/scalad" -clear_out "$OUT" -./bin/scalad -project Hello -siteroot "$OUT" "$SOURCE" +echo "testing ./bin/scaladoc" +clear_out "$OUT1" +./bin/scaladoc -project Hello -d "$OUT1" "$OUT/out.jar" From 7b11f0e8366ee2acc064d3e3ccfa37f94b7bbd48 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 12:44:40 +0100 Subject: [PATCH 08/11] Add option to run single tests from community build --- .../src/scala/dotty/communitybuild/Main.scala | 28 +++++++++++++++++-- .../scala/dotty/communitybuild/projects.scala | 4 +++ .../communitybuild/CommunityBuildTest.scala | 14 ++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/community-build/src/scala/dotty/communitybuild/Main.scala b/community-build/src/scala/dotty/communitybuild/Main.scala index 1747884d1721..b5b86bf8d08b 100644 --- a/community-build/src/scala/dotty/communitybuild/Main.scala +++ b/community-build/src/scala/dotty/communitybuild/Main.scala @@ -19,10 +19,34 @@ object Main: e.printStackTrace() Nil + def withProjects[T](names: Seq[String], opName: String)(op: CommunityProject => Unit): Unit = + val missing = names.filterNot(projectMap.contains) + if missing.nonEmpty then + println(s"Missing projects: ${missing.mkString(", ")}. All projects: ${allProjects.mkString(", ")}") + sys.exit(1) + + val failed = names.flatMap( o => + try + op(projectMap(o)) + None + catch case e: Throwable => + e.printStackTrace() + Some(o) + ) + + if failed.nonEmpty then + println(s"$opName failed for ${failed.mkString(", ")}") + sys.exit(1) + /** Allows running various commands on community build projects. */ def main(args: Array[String]): Unit = args.toList match - case "publish" :: name :: Nil => + case "publish" :: names => + withProjects(names, "Publishing")(_.publish()) + + case "build" :: names => + withProjects(names, "Build")(_.build()) + case "doc" :: "all" :: destStr :: Nil => val dest = Paths.get(destStr) Seq("rm", "-rf", destStr).! @@ -82,7 +106,7 @@ object Main: case args => println("USAGE: ") - println("COMMAND is one of: publish doc") + println("COMMAND is one of: publish doc run") println("Available projects are:") allProjects.foreach { k => println(s"\t${k.project}") diff --git a/community-build/src/scala/dotty/communitybuild/projects.scala b/community-build/src/scala/dotty/communitybuild/projects.scala index f0bfb02d5fc7..071246026ff4 100644 --- a/community-build/src/scala/dotty/communitybuild/projects.scala +++ b/community-build/src/scala/dotty/communitybuild/projects.scala @@ -84,6 +84,10 @@ sealed trait CommunityProject: if exitCode != 0 then throw RuntimeException(s"Doc command exited with code $exitCode for project $project. Project details:\n$this") + final def build(): Int = exec(projectDir, binaryName, buildCommands: _*) + + final def buildCommands = runCommandsArgs :+ testCommand + end CommunityProject final case class MillCommunityProject( diff --git a/community-build/test/scala/dotty/communitybuild/CommunityBuildTest.scala b/community-build/test/scala/dotty/communitybuild/CommunityBuildTest.scala index d8a0c9f57f8d..3d219c2648a5 100644 --- a/community-build/test/scala/dotty/communitybuild/CommunityBuildTest.scala +++ b/community-build/test/scala/dotty/communitybuild/CommunityBuildTest.scala @@ -22,7 +22,7 @@ abstract class CommunityBuildTest: */ extension (self: CommunityProject) def run()(using suite: CommunityBuildTest) = self.dependencies.foreach(_.publish()) - suite.test(self.project, self.binaryName, self.runCommandsArgs :+ self.testCommand) + suite.test(self) /** Build the given project with the published local compiler and sbt plugin. * @@ -34,10 +34,14 @@ abstract class CommunityBuildTest: * a build tool like SBT or Mill * @param arguments Arguments to pass to the testing program */ - def test(project: String, command: String, arguments: Seq[String]): Unit = { + def test(projectDef: CommunityProject): Unit = { + val project = projectDef.project + val command = projectDef.binaryName + val arguments = projectDef.buildCommands + @annotation.tailrec - def execTimes(task: => Int, timesToRerun: Int): Boolean = - val exitCode = task + def execTimes(task: () => Int, timesToRerun: Int): Boolean = + val exitCode = task() if exitCode == 0 then true else if timesToRerun == 0 @@ -60,7 +64,7 @@ abstract class CommunityBuildTest: |""".stripMargin) } - val testsCompletedSuccessfully = execTimes(exec(projectDir, command, arguments: _*), 3) + val testsCompletedSuccessfully = execTimes(projectDef.build, 3) if (!testsCompletedSuccessfully) { fail(s""" From 022835fe9367ca6d2eab2c63a5a69faa57f3e56b Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 14:47:58 +0100 Subject: [PATCH 09/11] Scala doc support for MillSome of mill projects are added to community build as well. --- .../src/scala/dotty/communitybuild/Main.scala | 33 +++++++++---------- .../scala/dotty/communitybuild/projects.scala | 19 ++++++++--- project/Build.scala | 2 ++ scaladoc/src/dotty/tools/scaladoc/Main.scala | 24 +++++++------- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/community-build/src/scala/dotty/communitybuild/Main.scala b/community-build/src/scala/dotty/communitybuild/Main.scala index b5b86bf8d08b..9709c22493dd 100644 --- a/community-build/src/scala/dotty/communitybuild/Main.scala +++ b/community-build/src/scala/dotty/communitybuild/Main.scala @@ -19,32 +19,34 @@ object Main: e.printStackTrace() Nil - def withProjects[T](names: Seq[String], opName: String)(op: CommunityProject => Unit): Unit = + def withProjects[T](names: Seq[String], opName: String)(op: CommunityProject => T): Seq[T] = val missing = names.filterNot(projectMap.contains) if missing.nonEmpty then - println(s"Missing projects: ${missing.mkString(", ")}. All projects: ${allProjects.mkString(", ")}") + val allNames = allProjects.map(_.project).mkString(", ") + println(s"Missing projects: ${missing.mkString(", ")}. All projects: $allNames") sys.exit(1) - val failed = names.flatMap( o => + val (failed, completed) = names.flatMap(projectMap.apply).partitionMap( o => try - op(projectMap(o)) - None + Right(op(o)) catch case e: Throwable => e.printStackTrace() - Some(o) + Left(o) ) if failed.nonEmpty then println(s"$opName failed for ${failed.mkString(", ")}") sys.exit(1) + completed + /** Allows running various commands on community build projects. */ def main(args: Array[String]): Unit = args.toList match - case "publish" :: names => + case "publish" :: names if names.nonEmpty => withProjects(names, "Publishing")(_.publish()) - case "build" :: names => + case "build" :: names if names.nonEmpty => withProjects(names, "Build")(_.build()) case "doc" :: "all" :: destStr :: Nil => @@ -90,16 +92,13 @@ object Main: sys.exit(1) case "doc" :: names if names.nonEmpty => - val missing = names.filterNot(projectMap.contains) - if missing.nonEmpty then - println(s"Missing projects: ${missing.mkString(", ")}. All projects: ${allProjects.mkString(", ")}") - sys.exit(1) - - val failed = names.filter{ p => - val docsRoots = generateDocs(projectMap(p)) + val failed = withProjects(names, "Documenting"){ p => + val docsRoots = generateDocs(p) + println(docsRoots) if docsRoots.nonEmpty then println(s"Docs for $p generated in $docsRoots") - docsRoots.isEmpty - } + if docsRoots.isEmpty then Some(p.project) else None + }.flatten + if failed.nonEmpty then println(s"Documentation not found for ${failed.mkString(", ")}") sys.exit(1) diff --git a/community-build/src/scala/dotty/communitybuild/projects.scala b/community-build/src/scala/dotty/communitybuild/projects.scala index 071246026ff4..8c6ba7873a88 100644 --- a/community-build/src/scala/dotty/communitybuild/projects.scala +++ b/community-build/src/scala/dotty/communitybuild/projects.scala @@ -93,11 +93,15 @@ end CommunityProject final case class MillCommunityProject( project: String, baseCommand: String, - dependencies: List[CommunityProject] = Nil) extends CommunityProject: + dependencies: List[CommunityProject] = Nil, + ignoreDocs: Boolean = false, + ) extends CommunityProject: override val binaryName: String = "./mill" override val testCommand = s"$baseCommand.test" override val publishCommand = s"$baseCommand.publishLocal" override val docCommand = null + // uncomment once mill is released + // if ignoreDocs then null else s"$baseCommand.docJar" override val runCommandsArgs = List("-i", "-D", s"dottyVersion=$compilerVersion") final case class SbtCommunityProject( @@ -198,11 +202,13 @@ object projects: lazy val utest = MillCommunityProject( project = "utest", baseCommand = s"utest.jvm[$compilerVersion]", + ignoreDocs = true ) lazy val sourcecode = MillCommunityProject( project = "sourcecode", baseCommand = s"sourcecode.jvm[$compilerVersion]", + ignoreDocs = true ) lazy val oslib = MillCommunityProject( @@ -214,7 +220,8 @@ object projects: lazy val oslibWatch = MillCommunityProject( project = "os-lib", baseCommand = s"os.watch[$compilerVersion]", - dependencies = List(utest, sourcecode) + dependencies = List(utest, sourcecode), + ignoreDocs = true ) lazy val ujson = MillCommunityProject( @@ -244,13 +251,15 @@ object projects: lazy val fansi = MillCommunityProject( project = "fansi", baseCommand = s"fansi.jvm[$compilerVersion]", - dependencies = List(utest, sourcecode) + dependencies = List(utest, sourcecode), + ignoreDocs = true ) lazy val pprint = MillCommunityProject( project = "PPrint", baseCommand = s"pprint.jvm[$compilerVersion]", - dependencies = List(fansi) + dependencies = List(fansi), + ignoreDocs = true ) lazy val requests = MillCommunityProject( @@ -705,4 +714,4 @@ def allProjects = List( projects.perspective, ) -lazy val projectMap = allProjects.map(p => p.project -> p).toMap +lazy val projectMap = allProjects.groupBy(_.project) diff --git a/project/Build.scala b/project/Build.scala index 14827e604b9a..9d233d3dae2f 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -1160,6 +1160,8 @@ object Build { val generateTestcasesDocumentation = taskKey[Unit]("Generate documentation for testcases, usefull for debugging tests") lazy val `scaladoc` = project.in(file("scaladoc")).asScaladoc lazy val `scaladoc-nonBootstrapped` = project.in(file("scaladoc")).scaladocBasic(NonBootstrapped).settings( + // Unit tests in scaladoc depends on scaladoc-testcases + // we do not want to just cross compile them with bootstrapped and unbootstrapped compiler sources.in(Test) := Nil ) diff --git a/scaladoc/src/dotty/tools/scaladoc/Main.scala b/scaladoc/src/dotty/tools/scaladoc/Main.scala index 3f796d4b6840..c78af8bb52b7 100644 --- a/scaladoc/src/dotty/tools/scaladoc/Main.scala +++ b/scaladoc/src/dotty/tools/scaladoc/Main.scala @@ -13,17 +13,19 @@ import dotty.tools.dotc.config.CommonScalaSettings import dotty.tools.dotc.core.Contexts._ /** Main class for the doctool when used from cli. */ +class Main: + // This is an entry point for Mill or other tools in the future since it provides easy access to reporter + def run(args: Array[String]) = Scaladoc.run(args, (new ContextBase).initialCtx) + object Main: def main(args: Array[String]): Unit = - try - // We should create our own context here... - val reporter = Scaladoc.run(args, (new ContextBase).initialCtx) + try + // We should create our own context here... + val reporter = Main().run(args) + // Sometimes jvm is hanging, so we want to be sure that we force shout down the jvm + sys.exit(if reporter.hasErrors then 1 else 0) + catch + case a: Exception => + a.printStackTrace() // Sometimes jvm is hanging, so we want to be sure that we force shout down the jvm - sys.exit(if reporter.hasErrors then 1 else 0) - catch - case a: Exception => - a.printStackTrace() - // Sometimes jvm is hanging, so we want to be sure that we force shout down the jvm - sys.exit(1) - - + sys.exit(1) From ee5ce8e923bccc76d18ee4b581eb4f5edefee353 Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Wed, 10 Feb 2021 20:01:38 +0100 Subject: [PATCH 10/11] Ignore docs for now, fix typos --- community-build/community-projects/geny | 2 +- community-build/community-projects/upickle | 2 +- project/scripts/bootstrapCmdTests | 16 ++++++++-------- .../src/dotty/tools/scaladoc/ScaladocArgs.scala | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/community-build/community-projects/geny b/community-build/community-projects/geny index 03ff552cd384..c511f4ad1ae2 160000 --- a/community-build/community-projects/geny +++ b/community-build/community-projects/geny @@ -1 +1 @@ -Subproject commit 03ff552cd3846939e1686481b3623ea6d06d1d24 +Subproject commit c511f4ad1ae2adf94bd55691bd8b4afed41213fc diff --git a/community-build/community-projects/upickle b/community-build/community-projects/upickle index bee9cc1d4276..52e388109f3a 160000 --- a/community-build/community-projects/upickle +++ b/community-build/community-projects/upickle @@ -1 +1 @@ -Subproject commit bee9cc1d42768f5f578ee8855eb9c1e4d0f70080 +Subproject commit 52e388109f3a03f63795e0aa9b17cf6453eac69d diff --git a/project/scripts/bootstrapCmdTests b/project/scripts/bootstrapCmdTests index cc431604a712..d4d7313d300c 100755 --- a/project/scripts/bootstrapCmdTests +++ b/project/scripts/bootstrapCmdTests @@ -5,18 +5,18 @@ set -e source $(dirname $0)/cmdTestsCommon.inc.sh # check that benchmarks can run -# "$SBT" "scala3-bench/jmh:run 1 1 tests/pos/alias.scala" -# # The above is here as it relies on the bootstrapped library. -# "$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 tests/pos/alias.scala" -# "$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 -with-compiler compiler/src/dotty/tools/dotc/core/Types.scala" +"$SBT" "scala3-bench/jmh:run 1 1 tests/pos/alias.scala" +# The above is here as it relies on the bootstrapped library. +"$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 tests/pos/alias.scala" +"$SBT" "scala3-bench-bootstrapped/jmh:run 1 1 -with-compiler compiler/src/dotty/tools/dotc/core/Types.scala" -# echo "testing scala.quoted.Expr.run from sbt scala" -# "$SBT" ";scala3-compiler-bootstrapped/scalac -with-compiler tests/run-staging/quote-run.scala; scala3-compiler-bootstrapped/scala -with-compiler Test" > "$tmp" -# grep -qe "val a: scala.Int = 3" "$tmp" +echo "testing scala.quoted.Expr.run from sbt scala" +"$SBT" ";scala3-compiler-bootstrapped/scalac -with-compiler tests/run-staging/quote-run.scala; scala3-compiler-bootstrapped/scala -with-compiler Test" > "$tmp" +grep -qe "val a: scala.Int = 3" "$tmp" # setup for `scalac`/`scala` script tests -# "$SBT" dist/pack +"$SBT" dist/pack # check that `scalac` compiles and `scala` runs it echo "testing ./bin/scalac and ./bin/scala" diff --git a/scaladoc/src/dotty/tools/scaladoc/ScaladocArgs.scala b/scaladoc/src/dotty/tools/scaladoc/ScaladocArgs.scala index 19128206cd5e..9472173e2f88 100644 --- a/scaladoc/src/dotty/tools/scaladoc/ScaladocArgs.scala +++ b/scaladoc/src/dotty/tools/scaladoc/ScaladocArgs.scala @@ -106,7 +106,7 @@ object ScaladocArgs: ) def defaultDest(): File = - report.error("Destenation is missing, please provide '-d' parameter pointing to directory here docs should be created") + report.error("Destination is not provided, please provide '-d' parameter pointing to directory where docs should be created") File("output") val parseSyntax = syntax.nonDefault.fold(CommentSyntax.default){ str => From 5de44e0a864076abcde2449a63e9f4fd56fc75ed Mon Sep 17 00:00:00 2001 From: Krzysztof Romanowski Date: Thu, 11 Feb 2021 10:51:44 +0100 Subject: [PATCH 11/11] Fix upload action --- .github/workflows/scaladoc.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scaladoc.yaml b/.github/workflows/scaladoc.yaml index 0457237c7554..ac080a30a45d 100644 --- a/.github/workflows/scaladoc.yaml +++ b/.github/workflows/scaladoc.yaml @@ -69,7 +69,7 @@ jobs: DOC_DEST=pr-${PR_NUMBER:-${GITHUB_REF##*/}} echo uplading docs to https://scala3doc.virtuslab.com/$DOC_DEST az storage container create --name $DOC_DEST --account-name scala3docstorage --public-access container - az storage blob sync -s scaladoc/output -c $DOC_DEST --account-name scala3docstorage + az storage blob upload-batch -s scaladoc/output -d $DOC_DEST --account-name scala3docstorage community-docs: env: