shadow-4.0.3/000077500000000000000000000000001337527402300130115ustar00rootroot00000000000000shadow-4.0.3/.circleci/000077500000000000000000000000001337527402300146445ustar00rootroot00000000000000shadow-4.0.3/.circleci/config.yml000066400000000000000000000033021337527402300166320ustar00rootroot00000000000000defaults: &defaults working_directory: ~/shadow docker: - image: circleci/openjdk:8-jdk environment: - TERM: "dumb" - GRADLE_OPTS: "-Xmx1024m" version: 2 jobs: build: <<: *defaults steps: - checkout - restore_cache: keys: - v1-gradle-{{ .Branch }}-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "gradle/dependencies.gradle" }} - v1-gradle-{{ .Branch }}-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }} - v1-gradle-{{ .Branch }} - v1-gradle-master - v1-gradle - run: ./gradlew downloadDependencies - save_cache: key: v1-gradle-{{ .Branch }}-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "gradle/dependencies.gradle" }} paths: - ~/.gradle - run: ./gradlew build --scan - run: name: Save test results command: | mkdir -p ~/junit/ find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} ~/junit/ \; when: always - store_test_results: path: ~/junit - store_artifacts: path: ~/junit - persist_to_workspace: root: ~/shadow paths: - build/* deploy-snapshot: <<: *defaults steps: - checkout - attach_workspace: at: ~/build - run: ./gradlew artifactoryPublish workflows: version: 2 build_and_publish: jobs: - build: filters: branches: ignore: gh-pages - deploy-snapshot: requires: - build filters: branches: only: master shadow-4.0.3/.github/000077500000000000000000000000001337527402300143515ustar00rootroot00000000000000shadow-4.0.3/.github/ISSUE_TEMPLATE.md000066400000000000000000000004701337527402300170570ustar00rootroot00000000000000Please check the [User Guide](http://imperceptiblethoughts.com/shadow) before submitting "how do I do 'x'?" questions! ### Shadow Version ### Gradle Version ### Expected Behavior ### Actual Behavior ### Gradle Build Script(s) ### Content of Shadow JAR (`jar tf ` - post link to GIST if too long) shadow-4.0.3/.gitignore000066400000000000000000000002461337527402300150030ustar00rootroot00000000000000*.un~ *.iml *.ipr *.iws .idea build .gradle *.orig out .gradletasknamecache .gradle-test-kit classes/ node_modules/ yarn-error.log src/docs/.vuepress/dist/ .DS_Store shadow-4.0.3/LICENSE000066400000000000000000000261351337527402300140250ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.shadow-4.0.3/NOTICE000066400000000000000000000003501337527402300137130ustar00rootroot00000000000000Gradle-Shadow-Plugin Copyright (c) 2013 John Engelman All Rights Reserved. This product is licensed to you under the Apache License, Version 2.0 (the "License"). You may not use this product except in compliance with the License.shadow-4.0.3/README.md000066400000000000000000000020411337527402300142650ustar00rootroot00000000000000# Gradle Shadow Gradle plugin for creating fat/uber JARs with support for package relocation. ## Documentation Read the [User Guide](http://imperceptiblethoughts.com/shadow)! ## Current Status [ ![Download](https://api.bintray.com/packages/johnrengelman/gradle-plugins/gradle-shadow-plugin/images/download.png) ](https://bintray.com/johnrengelman/gradle-plugins/gradle-shadow-plugin/_latestVersion) [![Circle CI](https://circleci.com/gh/johnrengelman/shadow.png?style=badge)](https://circleci.com/gh/johnrengelman/shadow) ## Latest Test Compatibility | Gradle Version | Shadow Version | |----------------|----------------| | 4.x | 4.0.2| **NOTE**: Shadow v4.+ is compatible with Gradle 4.0+ and Java 7+ _only_. ## Gradle Plugins https://plugins.gradle.org/plugin/com.github.johnrengelman.shadow shadow-4.0.3/build.gradle000066400000000000000000000056641337527402300153030ustar00rootroot00000000000000import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation buildscript { repositories { jcenter() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.1' classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.7.5" classpath "com.gradle.publish:plugin-publish-plugin:0.10.0" classpath 'org.ajoberstar:grgit:2.1.1' classpath 'org.ajoberstar:gradle-git-publish:0.3.3' classpath "com.moowork.gradle:gradle-node-plugin:1.2.0" } } plugins { id 'com.gradle.build-scan' version '1.16' id 'groovy' id 'project-report' id 'idea' id 'java-gradle-plugin' } // Remove the gradleApi so it isn't merged into the jar file. configurations.compile.dependencies.remove dependencies.gradleApi() gradlePlugin { automatedPublishing = false } apply plugin: 'com.github.johnrengelman.shadow' buildScan { licenseAgreementUrl = 'https://gradle.com/terms-of-service' licenseAgree = 'yes' if (System.env.CI == 'true') { tag 'CI' if (System.env.CIRCLE_TAG) { link 'VCS', "https://github.com/johnrengelman/shadow/tree/${System.env.CIRCLE_TAG}" } else { link 'VCS', "https://github.com/johnrengelman/shadow/tree/${System.env.CIRCLE_BRANCH}" } link 'VCS Commit', "https://github.com/johnrengelman/shadow/commit/${System.env.CIRCLE_SHA1}" if (System.env.CI_PULL_REQUEST) { link 'Pull Request', "${System.env.CI_PULL_REQUEST}" } } } apply from: file('gradle/docs.gradle') apply from: file('gradle/publish.gradle') apply from: file('gradle/vuepress.gradle') apply from: file('gradle/ghPages.gradle') apply from: file('gradle/dependencies.gradle') repositories { jcenter() } test { if (System.env.CI == 'true') { testLogging.showStandardStreams = true minHeapSize "1g" maxHeapSize "1g" } } jar { from rootProject.file('LICENSE') from rootProject.file('NOTICE') } jar.enabled = false shadowJar { classifier = '' } idea { project { languageLevel = '1.7' } } sourceCompatibility = '1.7' targetCompatibility = '1.7' task downloadDependencies(type: Exec) { dependsOn configurations.testRuntime commandLine 'echo', 'Downloaded all dependencies' } tasks.build.dependsOn tasks.shadowJar project.tasks.withType(JavaCompile) { // This will be the default in Gradle 5.0 if (!options.compilerArgs.contains("-processor")) { options.compilerArgs << '-proc:none' } } project.tasks.withType(GroovyCompile) { // This will be the default in Gradle 5.0 if (!options.compilerArgs.contains("-processor")) { options.compilerArgs << '-proc:none' } } task relocateShadowJar(type: ConfigureShadowRelocation) { target = tasks.shadowJar } tasks.shadowJar.dependsOn tasks.relocateShadowJar shadow-4.0.3/buildSrc/000077500000000000000000000000001337527402300145605ustar00rootroot00000000000000shadow-4.0.3/buildSrc/build.gradle000066400000000000000000000041041337527402300170360ustar00rootroot00000000000000import org.codehaus.groovy.control.CompilerConfiguration apply plugin: 'groovy' repositories { jcenter() } ScriptHolder holder = new ScriptHolder() CompilerConfiguration cc = new CompilerConfiguration() cc.setScriptBaseClass(DelegatingScript.class.name) GroovyShell sh = new GroovyShell(Project.class.classLoader, new Binding(), cc) //The build file for the main project File projectBuildFile = file('../gradle/dependencies.gradle') //Use this parse command because Groovy wants to use the file name as the classname //which fails if your Gradle build file has been renamed to contain an invalid character (i.e. '-') DelegatingScript script = (DelegatingScript)sh.parse(projectBuildFile.text.replaceAll('shadow', 'compile'), 'GradlePlugins') script.setDelegate(holder) //Resolve the project main Gradle file against our ScriptHolder script.run() //Class for holding the evaluation of a Gradle script //You may need to add some extra methods here depending on what you have all placed in build.gradle class ScriptHolder { Closure dependencies void dependencies(Closure c) { this.dependencies = c } void apply(Map map) { } } //Grab the dependencies closure and resolve it against //the buildSrc project dependencies //This effectively applies the same dependenices from build.gradle into buildSrc/build.gradle //This is required so that when buildSrc is compiled it has the dependencies to compile the source code def closure = holder.dependencies.clone() closure.delegate = project.dependencies closure() sourceSets { main { java.srcDirs = ['../src/main/java'] groovy.srcDirs = ['../src/main/groovy'] resources.srcDirs = ['../src/main/resources'] } } project.tasks.withType(JavaCompile) { // This will be the default in Gradle 5.0 if (!options.compilerArgs.contains("-processor")) { options.compilerArgs << '-proc:none' } } project.tasks.withType(GroovyCompile) { // This will be the default in Gradle 5.0 if (!options.compilerArgs.contains("-processor")) { options.compilerArgs << '-proc:none' } } shadow-4.0.3/circle.yml.bak000066400000000000000000000006341337527402300155340ustar00rootroot00000000000000machine: java: version: oraclejdk8 environment: TERM: dumb GRADLE_OPTS: -Xmx1024m dependencies: override: - ./gradlew downloadDependencies test: override: - ./gradlew check -Dscan post: - mkdir -p $CIRCLE_TEST_REPORTS/junit/ - find . -type f -regex ".*/build/test-results/.*xml" -exec cp {} $CIRCLE_TEST_REPORTS/junit/ \; general: branches: ignore: - gh-pagesshadow-4.0.3/gradle.properties000066400000000000000000000000601337527402300163610ustar00rootroot00000000000000org.gradle.parallel=true org.gradle.daemon=true shadow-4.0.3/gradle/000077500000000000000000000000001337527402300142475ustar00rootroot00000000000000shadow-4.0.3/gradle/dependencies.gradle000066400000000000000000000014061337527402300200560ustar00rootroot00000000000000dependencies { shadow localGroovy() shadow gradleApi() shadow 'org.codehaus.groovy:groovy-backports-compat23:2.4.15' compile 'org.jdom:jdom2:2.0.6' compile 'org.ow2.asm:asm:7.0-beta' compile 'org.ow2.asm:asm-commons:7.0-beta' compile 'commons-io:commons-io:2.5' compile 'org.apache.ant:ant:1.9.7' compile 'org.codehaus.plexus:plexus-utils:3.0.24' compile "org.apache.logging.log4j:log4j-core:2.11.0" compile('org.vafer:jdependency:2.1.1') { exclude group: 'org.ow2.asm' } testCompile("org.spockframework:spock-core:1.0-groovy-2.4") { exclude module: 'groovy-all' } testCompile 'xmlunit:xmlunit:1.3' testCompile 'commons-lang:commons-lang:2.6' testCompile 'com.google.guava:guava:17.0' } shadow-4.0.3/gradle/docs.gradle000066400000000000000000000012531337527402300163600ustar00rootroot00000000000000def javaApiUrl = 'http://docs.oracle.com/javase/1.7.0/docs/api' def groovyApiUrl = "http://docs.groovy-lang.org/2.4.7/html/gapi/" tasks.withType(Javadoc) { classpath += project.configurations.shadow options.links(javaApiUrl, groovyApiUrl) if (JavaVersion.current().java8Compatible) { options.addStringOption('Xdoclint:none', '-quiet') } } task javadocJar(type: Jar, dependsOn: javadoc) { classifier = 'javadoc' from 'build/docs/javadoc' } task sourcesJar(type: Jar) { classifier = 'sources' from sourceSets.main.allSource } project.tasks.groovydoc { classpath += project.configurations.shadow } build.dependsOn javadocJar, sourcesJar shadow-4.0.3/gradle/ghPages.gradle000066400000000000000000000011171337527402300170050ustar00rootroot00000000000000import org.apache.tools.ant.filters.ReplaceTokens apply plugin: 'org.ajoberstar.git-publish' if (project.hasProperty('githubToken')) { System.setProperty('org.ajoberstar.grgit.auth.username', project.githubToken) } gitPublish { repoUri = 'https://github.com/johnrengelman/shadow.git' branch = 'gh-pages' contents { from 'build/site' into('api') { from project.tasks.groovydoc } filter(ReplaceTokens, tokens: [version: project.version]) } } tasks.gitPublishCopy.dependsOn yarn_build tasks.gitPublishCopy.dependsOn groovydoc shadow-4.0.3/gradle/publish.gradle000066400000000000000000000076451337527402300171110ustar00rootroot00000000000000apply plugin: 'com.jfrog.bintray' apply plugin: 'maven-publish' apply plugin: 'com.jfrog.artifactory' apply plugin: "com.gradle.plugin-publish" group = 'com.github.jengelman.gradle.plugins' def versionString = file('src/main/resources/shadow-version.txt').text.trim() if (System.env.CIRCLE_TAG && System.env.CIRCLE_TAG =~ /^\d\.\d\.\d$/) { version = System.env.CIRCLE_TAG } else { version = versionString if (!version.endsWith("-SNAPSHOT")) { version = version + "-SNAPSHOT" } } ext.isSnapshot = version.endsWith("SNAPSHOT") def pomConfig = { licenses { license { name 'The Apache Software License, Version 2.0' url 'http://www.apache.org/licenses/LICENSE-2.0.txt' distribution 'repo' } } developers { developer { id 'jengelman' name 'John Engelman' email 'john.r.engelman@gmail.com' } } } publishing { publications { plugin(MavenPublication) { shadow.component(it) artifact sourcesJar artifact javadocJar pom.withXml { def root = asNode() root.appendNode('description', 'Gradle plugin to combine/relocate dependencies in a single Jar.') root.children().last() + pomConfig } } } } artifactory { contextUrl = 'https://oss.jfrog.org/artifactory' publish { repository { repoKey = 'oss-snapshot-local' } defaults { publications 'plugin' } } } artifactoryPublish { task -> doFirst { if (!isSnapshot) { throw new GradleException('Cannot publish non-SNAPSHOT versions to OJO!') } } gradle.taskGraph.whenReady { taskGraph -> if (taskGraph.hasTask(task)) { project.artifactory { publish { repository { username = bintrayUser password = bintrayKey } } } } } } bintrayUpload { task -> doFirst { if (isSnapshot) { throw new GradleException('Cannot publish SNAPSHOT versions to BinTray!') } } gradle.taskGraph.whenReady { taskGraph -> if (taskGraph.hasTask(task)) { task.user = bintrayUser task.apiKey = bintrayKey } } } bintray { publications = ['plugin'] publish = true pkg { repo = 'gradle-plugins' name = 'gradle-shadow-plugin' licenses = ['Apache-2.0'] desc = 'Create uber-jar containing application code and dependencies.' labels = ['gradle', 'onejar', 'fatjar', 'uberjar', 'shade'] websiteUrl = 'https://github.com/johnrengelman/shadow' issueTrackerUrl = 'https://github.com/johnrengelman/shadow/issues' vcsUrl = 'https://github.com/johnrengelman/shadow.git' version { vcsTag = versionString attributes = [ 'gradle-plugin': 'com.github.johnrengelman.shadow:com.github.jengelman.gradle.plugins:shadow' ] } } } pluginBundle { website = 'https://github.com/johnrengelman/shadow' vcsUrl = 'https://github.com/johnrengelman/shadow' description = 'A Gradle plugin for collapsing all dependencies and project code into a single Jar file.' tags = ['onejar', 'shade', 'fatjar', 'uberjar'] plugins { shadowPlugin { id = 'com.github.johnrengelman.shadow' displayName = 'Shadow Plugin' } } mavenCoordinates { groupId = project.group artifactId = project.name } } publishPlugins { task -> doFirst { if (isSnapshot) { throw new GradleException('Cannot publish SNAPSHOT versions to Plugin Portal!') } } } task release() { dependsOn 'assemble', 'bintrayUpload', 'publishPlugins', 'gitPublishPush' } shadow-4.0.3/gradle/vuepress.gradle000066400000000000000000000002701337527402300173020ustar00rootroot00000000000000apply plugin: "com.moowork.node" node { yarnVersion = '1.5.1' } tasks.yarn_build.inputs.files project.fileTree('src/docs') tasks.yarn_build.outputs.dir project.file('build/site')shadow-4.0.3/gradle/wrapper/000077500000000000000000000000001337527402300157275ustar00rootroot00000000000000shadow-4.0.3/gradle/wrapper/gradle-wrapper.properties000066400000000000000000000003111337527402300227540ustar00rootroot00000000000000distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists shadow-4.0.3/gradlew000077500000000000000000000122601337527402300143650ustar00rootroot00000000000000#!/usr/bin/env sh ############################################################################## ## ## Gradle start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link 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 SAVED="`pwd`" cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn () { echo "$*" } die () { echo echo "$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD if [ $? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: $MAX_FD" fi else warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in $ROOTDIRSRAW ; do ROOTDIRS="$ROOTDIRS$SEP$dir" SEP="|" done OURCYGPATTERN="(^($ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "$@" ; do CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` else eval `echo args$i`="\"$arg\"" fi i=$((i+1)) done case $i in (0) set -- ;; (1) set -- "$args0" ;; (2) set -- "$args0" "$args1" ;; (3) set -- "$args0" "$args1" "$args2" ;; (4) set -- "$args0" "$args1" "$args2" "$args3" ;; (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi # Escape application args save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then cd "$(dirname "$0")" fi exec "$JAVACMD" "$@" shadow-4.0.3/gradlew.bat000066400000000000000000000043241337527402300151310ustar00rootroot00000000000000@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS= @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omega shadow-4.0.3/package.json000066400000000000000000000005731337527402300153040ustar00rootroot00000000000000{ "name": "shadow", "version": "1.0.0", "main": "index.js", "repository": "git@github.com:johnrengelman/shadow.git", "author": "John Engelman ", "license": "MIT", "devDependencies": { "vuepress": "^0.14.2", "prismjs": "^1.15.0" }, "scripts": { "build": "vuepress build src/docs", "start": "vuepress dev src/docs" } } shadow-4.0.3/settings.gradle000066400000000000000000000001071337527402300160270ustar00rootroot00000000000000 rootProject.name = 'shadow' enableFeaturePreview('STABLE_PUBLISHING') shadow-4.0.3/src/000077500000000000000000000000001337527402300136005ustar00rootroot00000000000000shadow-4.0.3/src/docs/000077500000000000000000000000001337527402300145305ustar00rootroot00000000000000shadow-4.0.3/src/docs/.vuepress/000077500000000000000000000000001337527402300164625ustar00rootroot00000000000000shadow-4.0.3/src/docs/.vuepress/components/000077500000000000000000000000001337527402300206475ustar00rootroot00000000000000shadow-4.0.3/src/docs/.vuepress/components/ApiLink.vue000066400000000000000000000004101337527402300227120ustar00rootroot00000000000000 shadow-4.0.3/src/docs/.vuepress/config.js000066400000000000000000000015341337527402300202700ustar00rootroot00000000000000module.exports = { base: "/shadow/", dest: "build/site", ga: "UA-321220-4", themeConfig: { repo: "johnrengelman/shadow", editLinks: true, editLinkText: 'Help improve these docs!', logo: '/logo+type.svg', docsDir: 'src/docs/vuepress', title: 'Gradle Shadow Plugin', nav: [ { text: 'User Guide', link: '/introduction/' } ], sidebar: [ '/', '/introduction/', '/getting-started/', '/configuration/', '/configuration/filtering/', '/configuration/dependencies/', '/configuration/merging/', '/configuration/relocation/', '/configuration/minimizing/', '/configuration/reproducible-builds/', '/custom-tasks/', '/application-plugin/', '/publishing/', '/multi-project/', '/plugins/', '/changes/', '/about/' ] } } shadow-4.0.3/src/docs/.vuepress/override.styl000066400000000000000000000001031337527402300212100ustar00rootroot00000000000000$accentColor = #B66E3C $textColor = #5F3416 $borderColor = #9FB2CC shadow-4.0.3/src/docs/.vuepress/public/000077500000000000000000000000001337527402300177405ustar00rootroot00000000000000shadow-4.0.3/src/docs/.vuepress/public/logo+type.orig.svg000066400000000000000000000160771337527402300233500ustar00rootroot00000000000000 shadow-4.0.3/src/docs/.vuepress/public/logo+type.svg000066400000000000000000016254201337527402300224100ustar00rootroot00000000000000 shadow-4.0.3/src/docs/.vuepress/public/logo.orig.svg000066400000000000000000000046621337527402300223700ustar00rootroot00000000000000 shadow-4.0.3/src/docs/.vuepress/public/logo.svg000066400000000000000000011010441337527402300214220ustar00rootroot00000000000000 shadow-4.0.3/src/docs/.vuepress/style.styl000066400000000000000000000002531337527402300205370ustar00rootroot00000000000000@import "~prismjs/themes/prism-tomorrow.css" div[class~="language-groovy"] &:before content "groovy" div[class~="language-kotlin"] &:before content "kotlin" shadow-4.0.3/src/docs/README.md000066400000000000000000000004221337527402300160050ustar00rootroot00000000000000--- home: true heroText: Gradle Shadow Plugin heroImage: /logo.svg tagline: The library author's dependency toolkit actionText: User Guide → actionLink: /introduction/ --- John Engelman - @johnrengelman [API Docs](http://imperceptiblethoughts.com/shadow/api/index.html) shadow-4.0.3/src/docs/about/000077500000000000000000000000001337527402300156425ustar00rootroot00000000000000shadow-4.0.3/src/docs/about/README.md000066400000000000000000000045111337527402300171220ustar00rootroot00000000000000# About This Project I started this project in December of 2012. We were working on converting from a monolithic application into the new hot jazz of "microservices" using Dropwizard. I had also just started learning about Gradle and I knew that the incremental build system it provided would benefit our development team greatly. Unfortunately, the closest thing that Gradle had to Maven's Shade plugin was its ability to create application TARs and ZIPs. So, Charlie Knudsen and myself set out to port the existing Shade code into a Gradle plugin. This port is what existed up until the `0.9` milestone releases for Shadow. It functioned, but it wasn't idiomatic Gradle by any means. Starting with 0.9, Shadow was rewritten from the ground up as standard Gradle plugin and leveraged as much of Gradle's classes and concepts as possible. At the same time as the 0.9 release, Gradle was announcing the [Gradle Plugin Portal](https://plugins.gradle.org) and so Shadow was published there. ## Maintainers * [John Engelman](https://github.com/johnrengelman) ## Contributors * [Charlie Knudsen](https://github.com/charliek) * [Fedor Korotkov](https://github.com/fkorotkov) * [Haw-Bin Chai](https://github.com/hbchai) * [Serban Iordache](https://github.com/siordache) * [Minecrell](https://github.com/Minecrell) * [Matt Hurne](https://github.com/mhurne) * [Andres Almiray](https://github.com/aalmiray) * [Brandon Kearby](https://github.com/brandonkearby) * [John Szakmeister](https://github.com/jszakmeister) * [Ethan Hall](https://github.com/ethankhall) * [Piotr Kubowicz](https://github.com/pkubowicz) * [Marc Philipp](https://github.com/marcphilipp) * [Rob Spieldenner](https://github.com/rspieldenner) * [Marke Vieira](https://github.com/mark-vieira) * [Ben Adazza](https://github.com/ben-adazza) * [Tyler Benson](https://github.com/tylerbenson) * [Scott Newson](https://github.com/sgnewson) * [Martin Sadowski](https://github.com/ttsiebzehntt) * [debanne](https://github.com/debanne) * [Felipe Lima](https://github.com/felipecsl) * [Paul N. Baker](https://github.com/paul-nelson-baker) * [Chris Cowan](https://github.com/Macil) * [Sergey Tselovalnikov](https://github.com/SerCeMan) * [Osip Fatkullin](https://github.com/osipxd) * [Victor Tso](https://github.com/roxchkplusony) * [Petar Petrov](https://github.com/petarov) * [Mark Vieira](https://github.com/mark-vieira) shadow-4.0.3/src/docs/application-plugin/000077500000000000000000000000001337527402300203275ustar00rootroot00000000000000shadow-4.0.3/src/docs/application-plugin/README.md000066400000000000000000000033331337527402300216100ustar00rootroot00000000000000# Integrating with Application Plugin Shadow reacts to the presence of Gradle's [`application`](https://docs.gradle.org/current/userguide/application_plugin.html) plugin and will automatically configure additional tasks for running the shadowed JAR and creating distributions containing the shadowed JAR. Just like the normal `jar` task, when the `application` plugin is applied, the `shadowJar` manifest will be configured to contain the `Main-Class` attribute with the value specified in the project's `mainClassName` attribute. ```groovy // Using Shadow with Application Plugin apply plugin: 'java' apply plugin: 'application' apply plugin: 'com.github.johnrengelman.shadow' mainClassName = 'myapp.Main' ``` ## Running the Shadow JAR When applied along with the `application` plugin, the `runShadow` task will be created for starting the application from the shadowed JAR. The `runShadow` task is a [`JavaExec`](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.JavaExec.html) task that is configured to execute `java -jar myproject-all.jar`. It can be configured the same as any other `JavaExec` task. ```groovy // Configuring the runShadow Task runShadow { args 'foo' } ``` ## Distributing the Shadow JAR The Shadow plugin will also configure distribution tasks when in the presence of the `application` plugin. The plugin will create `shadowDistZip` and `shadowDistTar` which creates Zip and Tar distributions respectively. Each distribution will contain the shadowed JAR file along with the necessary start scripts to launch the application. Additionally, the plugin will create the `installShadowDist` and `startShadowScripts` tasks which stages the necessary files for a distribution to `build/install/-shadow/`. shadow-4.0.3/src/docs/changes/000077500000000000000000000000001337527402300161405ustar00rootroot00000000000000shadow-4.0.3/src/docs/changes/README.md000066400000000000000000000357621337527402300174340ustar00rootroot00000000000000# Change Log ## v4.0.3 (2018-11-21) * [Mark Vieira](https://github.com/mark-vieira) - Don't leak plugin classes to Gradle's Spec cache [#430](https://github.com/johnrengelman/shadow/pull/430) ## v4.0.2 (2018-10-27) * [Petar Petrov](https://github.com/petarov) - Update to ASM 7.0-beta and jdependency 2.1.1 to support Java 11, [#415](https://github.com/johnrengelman/shadow/pull/415) * [Victor Tso](https://github.com/roxchkplusony) - Ensure input streams are closed, [#411](https://github.com/johnrengelman/shadow/pull/411) * [Osip Fatkullin](https://github.com/osipxd) - Exclude `api` configuration from minimization, [#405](https://github.com/johnrengelman/shadow/pull/405) ## v4.0.1 (2018-09-30) * **Breaking Change!** `Transform.modifyOutputStream(ZipOutputStream os)` to `Transform.modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps)`. Typically breaking changes are reserved for major version releases, but this change was necessary for `preserverFileTimestamps` (introduced in v4.0.0) to work correctly in the presence of transformers, [#404](https://github.com/johnrengelman/shadow/issues/404) * Fix regression in support Java 10+ during relocation, [#403](https://github.com/johnrengelman/shadow/issues/403) ## v4.0.0 (2018-09-25) * **Breaking Change!** Restrict Plugin to Gradle 4.0+. Shadow major versions will align with Gradle major versions going forward. * **Breaking Change!** For clarity purposes `com.github.johnrengelman.plugin-shadow` has been removed. If you intend to use this feature, you will need to declare your own `ConfigureShadowRelocation` task. See section [2.9.2](http://imperceptiblethoughts.com/shadow/#automatically_relocating_dependencies) of the User Guide * [Sergey Tselovalnikov](https://github.com/SerCeMan) - Upgrade to ASM 6.2.1 to support Java 11 * [Chris Cowan](https://github.com/Macil) - Add support for `shadowJar.preserveFileTimestamps` property. See [Jar.preserveFileTimestamps](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html#org.gradle.api.tasks.bundling.Jar:preserveFileTimestamps) * [Paul N. Baker](https://github.com/paul-nelson-baker) - Add `Log4j2PluginsCacheFileTransformer` to process Log4j DAT files during merge. * [Felipe Lima](https://github.com/felipecsl) - Fix the long standing "No property `mainClassName`" issue. * [debanne](https://github.com/debanne) - Implement JAR minimization actions. This will attempt to exclude unused classes in your shadowed JAR. * Configure exclusion of `module-info.class` from `shadowJar` when using the Shadow the Java plugin, [#352](https://github.com/johnrengelman/shadow/issues/352) ## v2.0.4 (2018-04-27) * Update to ASM 6.1.1 to address performance issues - [ASM Issue 317816](https://gitlab.ow2.org/asm/asm/issues/317816) * Close InputStreams after using them, [#364](https://github.com/johnrengelman/shadow/issues/364) * Remove usage of Gradle internal `AbstractFileCollection`. * Add task annotations to remove warnings when validating plugin. ## v2.0.3 (2018-03-24) * [Martin Sadowski](https://github.com/ttsiebzehntt) - Update to ASM 6.1 * [Scott Newson](https://github.com/sgnewson) - Fix deprecated Gradle warnings, [#356](https://github.com/johnrengelman/shadow/pull/356) ## v2.0.2 (2017-12-12) * [Ben Adazza](https://github.com/ben-adazza), [Tyler Benson](https://github.com/tylerbenson) - documentation * [Marke Vieira](https://github.com/mark-vieira) - Support multi-project builds with Build-Scan integration * Upgrade to ASM 6, [#294]https://github.com/johnrengelman/shadow/issues/294, [#303](https://github.com/johnrengelman/shadow/issues/303) * [Rob Spieldenner](https://github.com/rspieldenner) - Fix integration with `application` plugin in Gradle 4.3, [#339](https://github.com/johnrengelman/shadow/issues/339) * Fixed deprecation warning from Gradle 4.2+, [#326](https://github.com/johnrengelman/shadow/issues/326) ## v2.0.1 (2017-06-23) * Fix `null+configuration` error, [#297](https://github.com/johnrengelman/shadow/issues/297) ## v2.0.0 (2017-05-09) * **Breaking Change!** Restrict Plugin to Gradle 3.0+ * **Breaking Change!** Build with Java 7 * **Breaking Change!** Updated `Transformer` interface to accept `TransformerContext` object instead of individual values * **Breaking Change!** Updated `Relocator` interface to accept `RelocatePathContext` and `RelocateClassContext` objects * **Breaking Change!** Distribution tasks `distShadowZip` and `distShadowTar` have been removed and replaced with the standard `shadowDistZip` and `shadowDistTar` from the Gradle Distribution plugin. * **Breaking Change!** The `installShadowApp` task has been removed and replaced with the standard `installShadowDist` task from the Gradle Distribution plugin. * **Breaking Change!** The new `installShadowDist` task outputs to `build/install/-shadow` per the standard (formerly was `build/installShadow`) * **Breaking Change!** `component.shadow` removed in favor of `project.shadow.component(publication)` so as to remove dependency on internal Gradle APIs. * _NEW_ Introducing `ConfigureShadowRelocation` task and `com.github.johnrengelman.plugin-shadow` plugin to automatically configure package relocation for Gradle plugins. * _NEW_ Integration with Gradle Build Scans. When running a `ShadowJar` task with Build Scans, custom values including dependencies merged anc package relocations are published in the scan. * Build Shadow w/ Shadow. This will help prevent any future classpath conflicts with Gradle. * Replace `startShadowScripts` tasks with Gradle's built-in `CreateStartScripts` type. * Build with Gradle 3.1 * [Marc Philipp](https://github.com/marcphilipp) - Add `keyTransformer` property to `PropertiesFileTransformer` * Update to ASM 5.2 * [Piotr Kubowicz](https://github.com/pkubowicz) - Support `api`, `implementation`, `runtimeOnly` dependency configurations introdcued in Gradle 3.3 ## v1.2.4 (2016-11-03) * Don't resolve dependency configurations during config phase, [#128](https://github.com/johnrengelman/shadow/issues/129) * Build plugin with Gradle 2.14 * Fix docs regarding inheriting Jar manifest, [#251](https://github.com/johnrengelman/shadow/issues/251) * [Ethan Hall](https://github.com/ethankhall) - Support projects that configure uploading to Ivy repositories, [#256](https://github.com/johnrengelman/shadow/pull/256) * Force task to depend on dependency configuration, [#152](https://github.com/johnrengelman/shadow/issues/152) * Do not explode ZIP files into shadow jar, [#196](https://github.com/johnrengelman/shadow/issues/196) * [John Szakmeister](https://github.com/jszakmeister) - Preserve timestamps on merged jar entries, [#260](https://github.com/johnrengelman/shadow/pull/260) ## v1.2.3 (2016-01-25) * Support for Gradle 2.11-rc-1, [#177](https://github.com/johnrengelman/shadow/issues/177) * Convert internal framework to [Gradle TestKit](https://docs.gradle.org/current/userguide/test_kit.html) * [Fedor Korotkov](https://github.com/fkorotkov) - Use BufferedOutputStream when writing the Zip file, [#171](https://github.com/johnrengelman/shadow/pull/171[) * [Haw-Bin Chai](https://github.com/hbchai) - Quote Jar path in Windows start script as it may contain spaces, [#170](https://github.com/johnrengelman/shadow/pull/170) * [Serban Iordache](https://github.com/siordache) - Evaluate relocation specs when merging service descriptors, [#165](https://github.com/johnrengelman/shadow/pull/165) ## v1.2.2 (2015-07-17) * [Minecrell](https://github.com/Minecrell) - Gradle 2.5 compatibility, [#147](https://github.com/johnrengelman/shadow/issues/147) ## v1.2.1 (2015-01-23) * Apply package relocations to dependency resources, [#114](https://github.com/johnrengelman/shadow/issues/114) ## v1.2.0 (2014-11-24) * Re-organize some code to remove need for forcing the Gradle API ClassLoader to allow the `org.apache.tools.zip` package. * Upgrade JDOM library from 1.1 to 2.0.5 (change dependency from `jdom:jdom:1.1` to `org.jdom:jdom2:2.0.5`), [#98](https://github.com/johnrengelman/shadow/issues/98) * Convert ShadowJar.groovy to ShadowJar.java to workaround binary incompatibility introduced by Gradle 2.2, [#106](https://github.com/johnrengelman/shadow/issues/106) * Updated ASM library to `5.0.3` to support JDK8, [#97](https://github.com/johnrengelman/shadow/issues/97) * Allows for regex pattern matching in the `dependency` string when including/excluding, [#83](https://github.com/johnrengelman/shadow/issues/83) * Apply package relocations to resource files, [#93](https://github.com/johnrengelman/shadow/issues/93) ## v1.1.2 (2014-09-09) * fix bug in `runShadow` where dependencies from the `shadow` configuration are not available, [#94](https://github.com/johnrengelman/shadow/issues/94) ## v1.1.1 (2014-08-27) * Fix bug in `'createStartScripts'` task that was causing it to not execute `'shadowJar'` task, [#90](https://github.com/johnrengelman/shadow/issues/90) * Do not include `null` in ShadowJar Manifest `'Class-Path'` value when `jar` task does not specify a value for it, [#92](https://github.com/johnrengelman/shadow/issues/92) * ShadowJar Manifest `'Class-Path'` should reference jars from `'shadow'` config as relative to location of `shadowJar` output, [#91](https://github.com/johnrengelman/shadow/issues/91) ## v1.1.0 (2014-08-26) * **Breaking Change!** Fix leaking of `shadowJar.manifest` into `jar.manifest`, [#82](https://github.com/johnrengelman/shadow/issues/82) To simplify behavior, the `shadowJar.appendManifest` method has been removed. Replace uses with `shadowJar.manifest` * `ShadowTask` now has a `configurations` property that is resolved to the files in the resolved configuration before being added to the copy spec. This allows for an easier implementation for filtering. The default 'shadowJar' task has the convention of adding the `'runtime'` scope to this list. Manually created instances of `ShadowTask` have no configurations added by default and can be configured by setting `task.configurations`. * Properly configure integration with the `'maven'` plugin when added. When adding `'maven'` the `'uploadShadow'` task will now properly configure the POM dependencies by removing the `'compile'` and `'runtime'` configurations from the POM and adding the `'shadow'` configuration as a `RUNTIME` scope in the POM. This behavior matches the behavior when using the `'maven-publish'` plugin. * [Matt Hurne](https://github.com/mhurne) - Allow `ServiceFileTransformer` to specify include/exclude patterns for files within the configured path to merge. * [Matt Hurne](https://github.com/mhurne) - Added `GroovyExtensionModuleTransformer` for merging Groovy Extension module descriptor files. The existing `ServiceFileTransformer` now excludes Groovy Extension Module descriptors by default. * `distShadowZip` and `distShadowZip` now contain the shadow library and run scripts instead of the default from the `'application'` plugin, [#89](https://github.com/johnrengelman/shadow/issues/89) ## v1.0.3 (2014-07-29) * Make service files root path configurable for `ServiceFileTransformer`, [#72](https://github.com/johnrengelman/shadow/issues/72) * [Andres Almiray](https://github.com/aalmiray - Added PropertiesFileTransformer, [#73](https://github.com/johnrengelman/shadow/issues/73) * [Brandon Kearby](https://github.com/brandonkearby) - Fixed StackOverflow when a cycle occurs in the resolved dependency grap, [#69](https://github.com/johnrengelman/shadow/pull/69) * Apply Transformers to project resources, [#70](https://github.com/johnrengelman/shadow/issues/70), [#71](https://github.com/johnrengelman/shadow/issues/71) * [Minecrell](https://github.com/Minecrell) - Do not drop non-class files from dependencies when relocation is enabled, [#61](https://github.com/johnrengelman/shadow/issues/61) * Remove support for applying individual sub-plugins by Id (easier maintenance and cleaner presentation in Gradle Portal) ## v1.0.2 (2014-07-07) * Do not add an empty Class-Path attribute to the manifest when the `shadow` configuration contains no dependencies. * `runShadow` now registers `shadowJar` as an input. Previously, `runShadow` did not execute `shadowJar` and an error occurred. * Support Gradle 2.0, [#66](https://github.com/johnrengelman/shadow/issues/66) * Do not override existing 'Class-Path' Manifest attribute settings from Jar configuration. Instead combine, [#65](https://github.com/johnrengelman/shadow/issues/65) ## v1.0.1 (2014-06-28) * Fix issue where non-class files are dropped when using relocation, [#58](https://github.com/johnrengelman/shadow/issues/58) * Do not create a `/` directory inside the output jar. * Fix `runShadow` task to evaluate the `shadowJar.archiveFile` property at execution time, [#60](https://github.com/johnrengelman/shadow/issues/60) ## v1.0.0 (2014-06-27) * Previously known as v0.9.0 * All changes from 0.9.0-M1 to 0.9.0-M5 * Properly configure the ShadowJar task inputs to observe the include/excludes from the `dependencies` block. This allows UP-TO-DATE checking to work properly when changing the `dependencies` rulea, [#54](https://github.com/johnrengelman/shadow/issues/54) * Apply relocation remappings to classes and imports in source project, [#55](https://github.com/johnrengelman/shadow/issues/55) * Do not create directories in jar for source of remapped class, created directories in jar for destination of remapped classes, [#53](https://github.com/johnrengelman/shadow/issues/53) ## v0.9.0-M5 * Add commons-io to compile classpath * Update asm library to 4.1 ## v0.9.0-M4 * Break plugin into multiple sub-plugins. `ShadowBasePlugin` is always applied. `ShadowJavaPlugin` and `ShadowApplicationPlugin` are applied in reaction to applying the `java` and `application` plugins respectively. * Shadow does not applied `java` plugin automatically. `java` or `groovy` must be applied in conjunction with `shadow`. * Moved artifact filtering to `dependencies {}` block underneath `shadowJar`. This allows better include/exclude control for dependencies. * Dependencies added to the `shadow` configuration are automatically added to the `Class-Path` attribute in the manifest for `shadowJar` * Applying `application` plugin and settings `mainClassName` automatically configures the `Main-Class` attribute in the manifest for `shadowJar` * `runShadow` now utilizes the output of the `shadowJar` and executes using `java -jar ` * Start Scripts for shadow distribution now utilize `java -jar` to execute instead of placing all files on classpath and executing main class. * Excluding/Including dependencies no longer includes transitive dependencies. All dependencies for inclusion/exclusion must be explicitly configured via a spec. ## v0.9.0-M3 * Use commons.io FilenameUtils to determine name of resolved jars for including/excluding ## v0.9.0-M2 * Added integration with `application` plugin to replace old `OutputSignedJars` task * Fixed bug that resulted in duplicate file entries in the resulting Jar * Changed plugin id to 'com.github.johnrengelman.shadow' to support Gradle 2.x plugin infrastructure. ## v0.9.0-M1 * Rewrite based on Gradle Jar Task * `ShadowJar` now extends `Jar` * Removed `signedCompile` and `signedRuntime` configurations in favor of `shadow` configuration * Removed `OutputSignedJars` task shadow-4.0.3/src/docs/configuration/000077500000000000000000000000001337527402300173775ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/README.md000066400000000000000000000074411337527402300206640ustar00rootroot00000000000000--- api: api/com/github/jengelman/gradle/plugins/shadow --- # Configuring Shadow The [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task type extends from Gradle's [`Jar`](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html) type. This means that all attributes and methods available on `Jar` are also available on [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html). Refer the _Gradle User Guide_ for [Jar](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html) for details. ## Configuring Output Name Shadow configures the default `shadowJar` task to set the output JAR's `destinationDir`, `baseName`, `appendix`, `version`, and `extension` to the same default values as Gradle does for all `Jar` tasks. Additionally, it configures the `classifier` to be `all`. If working with a Gradle project with the name `myApp` and version `1.0`, the default `shadowJar` task will output a file at: `build/libs/myApp-1.0-all.jar` As with all `Jar` tasks in Gradle, these values can be overridden: ```groovy // Output to build/libs/shadow.jar shadowJar { baseName = 'shadow' classifier = null version = null } ``` ## Configuring the Runtime Classpath Each Java JAR file contains a manifest file that provides meta data about the contents of the JAR file itself. When using a shadowed JAR file as an executable JAR, it is assumed that all necessary runtime classes are contained within the JAR itself. There may be situations where the desire is to **not** bundle select dependencies into the shadowed JAR file but they are still required for runtime execution. In these scenarios, Shadow creates a `shadow` configuration to declare these dependencies. Dependencies added to the `shadow` configuration are **not** bundled into the output JAR. Think of `configurations.shadow` as unmerged, runtime dependencies. The integration with the `maven` and `maven-publish` plugins will automatically configure dependencies added to `configurations.shadow` as `RUNTIME` scope dependencies in the resulting POM file. Additionally, Shadow automatically configures the manifest of the `shadowJar` task to contain a `Class-Path` entry in the JAR manifest. The value of the `Class-Path` entry is the name of all dependencies resolved in the `shadow` configuration for the project. ```groovy dependencies { shadow 'junit:junit:3.8.2' } ``` Inspecting the `META-INF/MANIFEST.MF` entry in the JAR file will reveal the following attribute: ```property Class-Path: junit-3.8.2.jar ``` When deploying a shadowed JAR as an execution JAR, it is important to note that any non-bundled runtime dependencies **must** be deployed in the location specified in the `Class-Path` entry in the manifest. ## Configuring the JAR Manifest Beyond the automatic configuration of the `Class-Path` entry, the `shadowJar` manifest is configured in a number of ways. First, the manifest for the `shadowJar` task is configured to __inherit__ from the manifest of the standard `jar` task. This means that any configuration performed on the `jar` task will propagate to the `shadowJar` tasks. ```groovy jar { manifest { attributes 'Class-Path': '/libs/a.jar' } } ``` Inspecting the `META-INF/MANIFEST.MF` entry in the JAR file will revel the following attribute: ```property Class-Path: /libs/a.jar ``` If it is desired to inherit a manifest from a JAR task other than the standard `jar` task, the `inheritFrom` methods on the `shadowJar.manifest` object can be used to configure the upstream. ```groovy task testJar(type: Jar) { manifest { attributes 'Description': 'This is an application JAR' } } shadowJar { manifest { inheritFrom project.tasks.testJar.manifest } } ``` shadow-4.0.3/src/docs/configuration/dependencies/000077500000000000000000000000001337527402300220255ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/dependencies/README.md000066400000000000000000000121321337527402300233030ustar00rootroot00000000000000# Configuring Shadowed Dependencies Shadow configures the default `shadowJar` task to merge all dependencies from the project's `runtime` configuration into the final JAR. The configurations to from which to source dependencies for the merging can be configured using the `configurations` property of the [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task type. ```groovy shadowJar { configurations = [project.configurations.compile] } ``` The above code sample would configure the `shadowJar` task to merge depdencies from only the `compile` configuration. This means any dependency declared in the `runtime` configuration would be **not** be included in the final JAR. > Note the literal use of `project.configurations` when setting the `configurations` attribute of a [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task. This is **required**. It maybe be tempting to specify `configurations = [configurations.compile]` but this will not have the intended effect, as `configurations.compile` will try to delegate to the `configurations` property of the the [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task instead of the `project` ## Embedding Jar Files Inside Your Shadow Jar Because of the way that Gradle handles dependency configuration, from a plugin perspective, shadow is unable to distinguish between a jar file configured as a dependency and a jar file included in the resource folder. This means that any jar found in a resource directory will be merged into the shadow jar the same as any other dependency. If your intention is to embed the jar inside, you must rename the jar as to not end with `.jar` before the shadow task begins. ## Filtering Dependencies Individual dependencies can be filtered from the final JAR by using the `dependencies` block of a [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task. Dependency filtering does **not** apply to transitive dependencies. That is, excluding a dependency does not exclude any of its dependencies from the final JAR. The `dependency` blocks provides a number of methods for resolving dependencies using the notations familiar from Gradle's `configurations` block. ```groovy // Exclude an Module Dependency dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency('org.apache.logging.log4j:log4j-core:2.11.1')) } } ``` ```groovy // Exclude a Project Dependency dependencies { compile project(':api') } shadowJar { dependencies { exclude(project(':api')) } } ``` > While not being able to filter entire transitive dependency graphs might seem like an oversight, it is necessary because it would not be possible to intelligently determine the build author's intended results when there is a common dependency between two 1st level dependencies when one is excluded and the other is not. ### Using Regex Patterns to Filter Dependencies Dependencies can be filtered using regex patterns. Coupled with the `::` notation for dependencies, this allows for excluding/including using any of these individual fields. ```groovy // Exclude Any Version of a Dependency dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency('org.apache.logging.log4j:log4j-core:.*')) } } ``` Any of the individual fields can be safely absent and will function as though a wildcard was specified. ```groovy // Ignore Dependency Version dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency('org.apache.logging.log4j:log4j-core')) } } ``` The above code snippet is functionally equivalent to the previous example. This same patten can be used for any of the dependency notation fields. ```groovy // Ignoring An Artifact Regardless of Group dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency(':log4j-core:2.11.1')) } } ``` ```groovy // Excluding All Artifacts From Group dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency('org.apache.logging.log4j::2.11.1')) } } ``` ### Programmatically Selecting Dependencies to Filter If more complex decisions are needed to select the dependencies to be included, the [`dependencies`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html#dependencies(Action)) block provides a method that accepts a `Closure` for selecting dependencies. ```groovy // Selecting Dependencies to Filter With a Spec dependencies { compile 'org.apache.logging.log4j:log4j-core:2.11.1' } shadowJar { dependencies { exclude(dependency { it.moduleGroup == 'org.apache.logging.log4j' }) } } ``` shadow-4.0.3/src/docs/configuration/filtering/000077500000000000000000000000001337527402300213625ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/filtering/README.md000066400000000000000000000020211337527402300226340ustar00rootroot00000000000000# Filtering Shadow Jar Contents The final contents of a shadow JAR can be filtered using the `exclude` and `include` methods inherited from Gradle's `Jar` task type. Refer to the [Jar](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.bundling.Jar.html) documentation for details on the various versions of the methods and their behavior. When using `exclude`/`include` with a `ShadowJar` task, the resulting copy specs are applied to the _final_ JAR contents. This means that, the configuration is applied to the individual files from both the project source set or _any_ of the dependencies to be merged. ```groovy // Exclude a file from Shadow Jar shadowJar { exclude 'a2.properties' } ``` Excludes and includes can be combined just like a normal `Jar` task, with `excludes` taking precedence over `includes`. Additionally, ANT style patterns can be used to match multiple files. ```groovy // Configuring output using ANT patterns shadowJar { include '*.jar' include '*.properties' exclude 'a2.properties' } ``` shadow-4.0.3/src/docs/configuration/merging/000077500000000000000000000000001337527402300210275ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/merging/README.md000066400000000000000000000177121337527402300223160ustar00rootroot00000000000000# Controlling JAR Content Merging Shadow allows for customizing the process by which the output JAR is generated through the [`Transformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/Transformer.html) interface. This is a concept that has been carried over from the original Maven Shade implementation. A [`Transformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/Transformer.html) is invoked for each entry in the JAR before being written to the final output JAR. This allows a [`Transformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/Transformer.html) to determine if it should process a particular entry and apply any modifications before writing the stream to the output. ```groovy // Adding a Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement class MyTransformer implements Transformer { boolean canTransformResource(FileTreeElement element) { true } void transform(TransformerContext context) {} boolean hasTransformedResource() { true } void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) {} } shadowJar { transform(MyTransformer.class) } ``` Additionally, a `Transformer` can accept a `Closure` to configure the provided `Transformer`. ```groovy // Configuring a Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement class MyTransformer implements Transformer { boolean enabled boolean canTransformResource(FileTreeElement element) { true } void transform(TransformerContext context) {} boolean hasTransformedResource() { true } void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) {} } shadowJar { transform(MyTransformer.class) { enabled = true } } ``` An instantiated instance of a `Transformer` can also be provided. ```groovy // Adding a Transformer Instance import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement class MyTransformer implements Transformer { boolean enabled boolean canTransformResource(FileTreeElement element) { true } void transform(TransformerContext context) {} boolean hasTransformedResource() { true } void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) {} } shadowJar { transform(new MyTransformer(enabled: true)) } ``` ## Merging Service Descriptor Files Java libraries often contain service descriptors files in the `META-INF/services` directory of the JAR. A service descriptor typically contains a line delimited list of classes that are supported for a particular _service_. At runtime, this file is read and used to configure library or application behavior. Multiple dependencies may use the same service descriptor file name. In this case, it is generally desired to merge the content of each instance of the file into a single output file. The [`ServiceFileTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.html) class is used to perform this merging. By default, it will merge each copy of a file under `META-INF/services` into a single file in the output JAR. ```groovy // Merging Service Files shadowJar { mergeServiceFiles() } ``` The above code snippet is a convenience syntax for calling [`transform(ServiceFileTransformer.class)`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html#transform(Class)). > Groovy Extension Module descriptor files (located at `META-INF/services/org.codehaus.groovy.runtime.ExtensionModule`) are ignored by the [`ServiceFileTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.html). This is due to these files having a different syntax than standard service descriptor files. Use the [`mergeGroovyExtensionModules()`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html#mergeGroovyExtensionModules()) method to merge these files if your dependencies contain them. ### Configuring the Location of Service Descriptor Files By default the [`ServiceFileTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.html) is configured to merge files in `META-INF/services`. This directory can be overridden to merge descriptor files in a different location. ```groovy // Merging Service Files in a Specific Directory shadowJar { mergeServiceFiles { path = 'META-INF/custom' } } ``` #### Excluding/Including Specific Service Descriptor Files From Merging The [`ServiceFileTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/ServiceFileTransformer.html) class supports specifying specific files to include or exclude from merging. ```groovy // Excluding a Service Descriptor From Merging shadowJar { mergeServiceFiles { exclude 'META-INF/services/com.acme.*' } } ``` ## Merging Groovy Extension Modules Shadow provides a specific transformer for dealing with Groovy extension module files. This is due to their special syntax and how they need to be merged together. The [`GroovyExtensionModuleTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/GroovyExtensionModuleTransformer.html) will handle these files. The [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task also provides a short syntax method to add this transformer. ```groovy // Merging Groovy Extension Modules shadowJar { mergeGroovyExtensionModules() } ``` ## Appending Text Files Generic text files can be appended together using the [`AppendingTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/AppendingTransformer.html). Each file is appended using new lines to separate content. The [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) task provides a short syntax method of [`append(String)`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html#append(java.lang.String)) to configure this transformer. ```groovy // Appending a Property File shadowJar { append 'test.properties' } ``` ## Appending XML Files XML files require a special transformer for merging. The [`XmlAppendingTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformer.html) reads each XML document and merges each root element into a single document. There is no short syntax method for the [`XmlAppendingTransformer`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/transformers/XmlAppendingTransformer.html). It must be added using the [`transform`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow//tasks/ShadowJar.html#transform(Class)) methods. ```groovy // Appending a XML File import com.github.jengelman.gradle.plugins.shadow.transformers.XmlAppendingTransformer shadowJar { transform(XmlAppendingTransformer.class) { resource = 'properties.xml' } } ```shadow-4.0.3/src/docs/configuration/minimizing/000077500000000000000000000000001337527402300215515ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/minimizing/README.md000066400000000000000000000014031337527402300230260ustar00rootroot00000000000000# Minimizing Shadow can automatically remove all classes of dependencies that are not used by the project, thereby minimizing the resulting shadowed JAR. ```groovy // Minimizing an shadow JAR shadowJar { minimize() } ``` A dependency can be excluded from the minimization process thereby forcing it's inclusion the shadow JAR. This is useful when the dependency analyzer cannot find the usage of a class programmatically, for example if the class is loaded dynamically via `Class.forName(String)`. ```groovy // Force a class to be retained during minimization shadowJar { minimize { exclude(dependency('org.scala-lang:.*:.*')) } } ``` > Dependencies scoped as `api` will automatically excluded from minimization and used as "entry points" on minimization. shadow-4.0.3/src/docs/configuration/relocation/000077500000000000000000000000001337527402300215365ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/relocation/README.md000066400000000000000000000062441337527402300230230ustar00rootroot00000000000000# Relocating Packages Shadow is capable of scanning a project's classes and relocating specific dependencies to a new location. This is often required when one of the dependencies is susceptible to breaking changes in versions or to classpath pollution in a downstream project. > Google's Guava and the ASM library are typical cases where package relocation can come in handy. Shadow uses the ASM library to modify class byte code to replace the package name and any import statements for a class. Any non-class files that are stored within a package structure are also relocated to the new location. ```groovy // Relocating a Package shadowJar { relocate 'junit.framework', 'shadow.junit' } ``` The code snippet will rewrite the location for any class in the `junit.framework` to be `shadow.junit`. For example, the class `junit.textui.TestRunner` becomes `shadow.junit.TestRunner`. In the resulting JAR, the class file is relocated from `junit/textui/TestRunner.class` to `shadow/junit/TestRunner.class`. > Relocation operates at a package level. It is not necessary to specify any patterns for matching, it will operate simply on the prefix provided. > Relocation will be applied globally to all instance of the matched prefix. That is, it does **not** scope to _only_ the dependencies being shadowed. Be specific as possible when configuring relocation as to avoid unintended relocations. ## Filtering Relocation Specific classes or files can be `included`/`excluded` from the relocation operation if necessary. ```groovy // Configuring Filtering for Relocation shadowJar { relocate('junit.textui', 'a') { exclude 'junit.textui.TestRunner' } relocate('junit.framework', 'b') { include 'junit.framework.Test*' } } ``` ## Automatically Relocating Dependencies Shadow ships with a task that can be used to automatically configure all packages from all dependencies to be relocated. This feature was formally shipped into a 2nd plugin (`com.github.johnrengelman.plugin-shadow`) but has been removed for clarity reasons in version 4.0.0. To configure automatic dependency relocation, declare a task of type `ConfigureShadowRelocation` and configure the `target` parameter to be the `ShadowJar` task you wish to auto configure. You will also need to declared a task dependency so the tasks execute in the correct order. ```groovy // Configure Auto Relocation import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation task relocateShadowJar(type: ConfigureShadowRelocation) { target = tasks.shadowJar prefix = "myapp" // Default value is "shadow" } tasks.shadowJar.dependsOn tasks.relocateShadowJar ``` > Configuring package auto relocation can add significant time to the shadow process as it will process all dependencies in the configurations declared to be shadowed. By default, this is the `runtime` or `runtimeClasspath` configurations. Be mindful that some Gradle plugins (such as `java-gradle-plugin` will automatically add dependencies to your class path (e.g. `java-gradle-plugin` automatically adds the full Gradle API to your `compile` configuratinon. You may need to remove these dependencies if you do not intend to shadow them into your library.shadow-4.0.3/src/docs/configuration/reproducible-builds/000077500000000000000000000000001337527402300233365ustar00rootroot00000000000000shadow-4.0.3/src/docs/configuration/reproducible-builds/README.md000066400000000000000000000012721337527402300246170ustar00rootroot00000000000000# Reproducible Builds Because JAR files contain the timestamp of the included files, it is often difficult to create reproducible builds from a source commit that results in a hash identical file. Gradle supports reproducible JAR creation by setting the timestamps of included files to a consistent value. Shadow includes support for overriding file timestamps starting in version 4.0.0. By default, Shadow will preserve the file timestamps when creating the Shadow JAR. To set timestamps to a consistent value (1980/1/1 00:00:00), set the `preserveFileTimestamps` property to `false` on the `ShadowJar` task. ```groovy // Reset file timestamps shadowJar { preserveFileTimestamps = false } ``` shadow-4.0.3/src/docs/custom-tasks/000077500000000000000000000000001337527402300171655ustar00rootroot00000000000000shadow-4.0.3/src/docs/custom-tasks/README.md000066400000000000000000000016401337527402300204450ustar00rootroot00000000000000# Creating a Custom ShadowJar Task The built in `shadowJar` task only provides an output for the `main` source set of the project. It is possible to add arbitrary [`ShadowJar`](http://imperceptiblethoughts.com/shadow/api/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.html) tasks to a project. When doing so, ensure that the `configurations` property is specified to inform Shadow which dependencies to merge into the output. ```groovy // Shadowing Test Sources and Dependencies import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar task testJar(type: ShadowJar) { classifier = 'tests' from sourceSets.test.output configurations = [project.configurations.testRuntime] } ``` The code snippet above will geneated a shadowed JAR contain both the `main` and `test` sources as well as all `runtime` and `testRuntime` dependencies. The file is output to `build/libs/--tests.jar`. shadow-4.0.3/src/docs/getting-started/000077500000000000000000000000001337527402300176355ustar00rootroot00000000000000shadow-4.0.3/src/docs/getting-started/README.md000066400000000000000000000045021337527402300211150ustar00rootroot00000000000000# Getting Started ```groovy no-plugins plugins { id 'com.github.johnrengelman.shadow' version '@version@' id 'java' } ``` Alternatively, the plugin can be added to the buildscript classpath and applied: ```groovy no-run buildscript { repositories { jcenter() } dependencies { classpath 'com.github.jengelman.gradle.plugins:shadow:@version@' } } apply plugin: 'com.github.johnrengelman.shadow' apply plugin: 'java' ``` Shadow is a reactive plugin. This means that applying Shadow by itself will perform no configuration on your project. Instead, Shadow _reacts_ This means, that for most users, the `java` or `groovy` plugins must be _explicitly_ applied to have the desired effect. ## Default Java/Groovy Tasks In the presence of the `java` or `groovy` plugins, Shadow will automatically configure the following behavior: * Adds a `shadowJar` task to the project. * Adds a `shadow` configuration to the project. * Configures the `shadowJar` task to include all sources from the project's `main` sourceSet. * Configures the `shadowJar` task to bundle all dependencies from the `runtime` configuration. * Configures the _classifier_ attribute of the `shadowJar` task to be `'all'` . * Configures the `shadowJar` task to generate a `Manifest` with: * Inheriting all configuration from the standard `jar` task. * Adds a `Class-Path` attribute to the `Manifest` that appends all dependencies from the `shadow` configuration * Configures the `shadowJar` task to _exclude_ any JAR index or cryptographic signature files matching the following patterns: * `META-INF/INDEX.LIST` * `META-INF/*.SF` * `META-INF/*.DSA` * `META-INF/*.RSA` * Creates and registers the `shadow` component in the project (used for integrating with `maven-publish`). * Configures the `uploadShadow` task (as part of the `maven` plugin) with the following behavior: ** Removes the `compile` and `runtime` configurations from the `pom.xml` file mapping. ** Adds the `shadow` configuration to the `pom.xml` file as `RUNTIME` scope. ## Shadowing Gradle Plugins Shadow ships with a companion task that can be used to automatically discover dependency packages and configure them for relocation. This is useful in projects if you want to relocate all dependencies. For more details see the section [Using Shadow to Package Gradle Plugins](/plugins/) shadow-4.0.3/src/docs/introduction/000077500000000000000000000000001337527402300172515ustar00rootroot00000000000000shadow-4.0.3/src/docs/introduction/README.md000066400000000000000000000037651337527402300205430ustar00rootroot00000000000000# Introduction Shadow is a Gradle plugin for combining dependency classes and resources with a project's into a single output Jar. The combined Jar is often referred to a _fat-jar_ or _uber-jar_. Shadow utilizes `JarInputStream` and `JarOutputStream` to efficiently process dependent libraries into the output jar without incurring the I/O overhead of expanding the jars to disk. ## Benefits of Shadow Shadowing a project output has 2 major use cases: 1. Creating an _executable_ JAR distribution 1. Bundling and relocating common dependencies in libraries to avoid classpath conflicts ### Executable Distributions Executable distribution is the main use case for _application_ an be deployed and executed/run in the runtime environment. In the case of Shadow, this is a single _uber_ or _fat_ JAR. The JAR file contains all the application code and dependent libraries to execute (not including the standard JVM libraries). The shadow JAR does **not** include the JRE itself. It must be available on the target system. Executable JARs contain a JAR MANIFEST that specifies the application Main Class. This allows the application to be started with a single command: ```bash $ java -jar application-shadow.jar ``` ### Library Bundling Dependency bundling and relocation is the main use case for _library_ authors. The goal of a bundled library is to create a pre-packaged dependency for other libraries or applications to utilize. Often in these scenarios, a library may contain a dependency that a downstream library or application also uses. In _some_ cases, different versions of this common dependency can cause an issue in either the upstream library or the downstream application. These issues often manifest themselves as binary incompatibilities in either the library or application code. By utilizing Shadow's ability to _relocate_ the package names for dependencies, a library author can ensure that the library's dependencies will not conflict with the same dependency being declared by the downstream application. shadow-4.0.3/src/docs/multi-project/000077500000000000000000000000001337527402300173265ustar00rootroot00000000000000shadow-4.0.3/src/docs/multi-project/README.md000066400000000000000000000013241337527402300206050ustar00rootroot00000000000000# Using Shadow in Multi-Project Builds When using Shadow in a multi-project build, project dependencies will be treated the same as external dependencies. That is a project dependency will be merged into the `shadowJar` output of the project that is applying the Shadow plugin. ## Depending on the Shadow Jar from Another Project In a multi-project build there may be one project that applies Shadow and another that requires the shadowed JAR as a dependency. In this case, use Gradle's normal dependency declaration mechanism to depend on the `shadow` configuration of the shadowed project. ```groovy // Depending On Shadow Output of Project dependencies { compile project(path: ':api', configuration: 'shadow') } ```shadow-4.0.3/src/docs/plugins/000077500000000000000000000000001337527402300162115ustar00rootroot00000000000000shadow-4.0.3/src/docs/plugins/README.md000066400000000000000000000044271337527402300174770ustar00rootroot00000000000000# Using Shadow to Package Gradle Plugins In some scenarios, writing a Gradle plugin can be problematic because your plugin may depend on a version that conflicts with the same dependency provided by the Gradle runtime. If this is the case, then you can utilize Shadow to relocate your dependencies to a different package name to avoid the collision. Configuring the relocation has always been possible, but the build author is required to know all the package names before hand. Shadow v2.0 corrects this by introducing a new task type `ConfigureShadowRelocation`. Tasks of this type are configured to target an instance of a `ShadowJar` task and run immediately before it. The `ConfigureShadowRelocation` task, scans the dependencies from the configurations specified on the associated `ShadowJar` task and collects the package names contained within them. It then configures relocation for these packages using the specified `prefix` on the associated `ShadowJar` task. While this is useful for developing Gradle plugins, nothing about the `ConfigureShadowRelocation` task is tied to Gradle projects. It can be used for standard Java or Groovy projects. A simple Gradle plugin can use this feature by applying the `shadow` plugin and configuring the relocation task to execute before the `shadowJar` tasks: ```groovy no-plugins import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation plugins { id 'com.github.johnrengelman.shadow' version '@version@' id 'java' } dependencies { shadow localGroovy() shadow gradleApi() compile 'org.jdom:jdom2:2.0.6' compile 'org.ow2.asm:asm:6.0' compile 'org.ow2.asm:asm-commons:6.0' compile 'commons-io:commons-io:2.4' compile 'org.apache.ant:ant:1.9.4' compile 'org.codehaus.plexus:plexus-utils:2.0.6' } task relocateShadowJar(type: ConfigureShadowRelocation) { target = tasks.shadowJar } tasks.shadowJar.dependsOn tasks.relocateShadowJar ``` Note that the `localGroovy()` and `gradleApi()` dependencies are added to the `shadow` configuration instead of the normal `compile` configuration. These 2 dependencies are provided by Gradle to compile your project but are ultimately provided by the Gradle runtime when executing the plugin. Thus, it is **not** advisable to bundle these dependencies with your plugin.shadow-4.0.3/src/docs/publishing/000077500000000000000000000000001337527402300166745ustar00rootroot00000000000000shadow-4.0.3/src/docs/publishing/README.md000066400000000000000000000041451337527402300201570ustar00rootroot00000000000000# Publishing Shadow JARs ## Publishing with Maven-Publish Plugin The Shadow plugin will automatically configure the necessary tasks in the presence of Gradle's `maven-publish` plugin. The plugin provides the `component` method from the `shadow` extension to configure the publication with the necessary artifact and dependencies in the POM file. ```groovy // Publishing a Shadow JAR with the Maven-Publish Plugin apply plugin: 'java' apply plugin: 'maven-publish' apply plugin: 'com.github.johnrengelman.shadow' publishing { publications { shadow(MavenPublication) { publication -> project.shadow.component(publication) } } repositories { maven { url "http://repo.myorg.com" } } } ``` ## Publishing with Maven Plugin The Shadow plugin will automatically configure the necessary tasks in the presence of Gradle's `maven` plugin. To publish the JAR, simply configure the publish location for the `uploadShadow` task and execute it. ```groovy // Publishing a Shadow JAR with the Maven Plugin apply plugin: 'java' apply plugin: 'maven' apply plugin: 'com.github.johnrengelman.shadow' uploadShadow { repositories { mavenDeployer { repository(url: "http://repo.myorg.com") } } } ``` ## Shadow Configuration and Publishing The Shadow plugin provides a custom configuration (`configurations.shadow`) to specify runtime dependencies that are **not** merged into the final JAR file. When configuring publishing with the Shadow plugin, the dependencies in the `shadow` configuration, are translated to become `RUNTIME` scoped dependencies of the published artifact. No other dependencies are automatically configured for inclusion in the POM file. For example, excluded dependencies are **not** automatically added to the POM file or if the configuration for merging are modified by specifying `shadowJar.configurations = [configurations.myconfiguration]`, there is no automatic configuration of the POM file. This automatic configuration occurs _only_ when using the above methods for configuring publishing. If this behavior is not desirable, then publishing **must** be manually configured. shadow-4.0.3/src/main/000077500000000000000000000000001337527402300145245ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/000077500000000000000000000000001337527402300160515ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/000077500000000000000000000000001337527402300166275ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/000077500000000000000000000000001337527402300201115ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/000077500000000000000000000000001337527402300220515ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/000077500000000000000000000000001337527402300233075ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/000077500000000000000000000000001337527402300247705ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/000077500000000000000000000000001337527402300262555ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/PluginShadowPlugin.groovy000066400000000000000000000015401337527402300333070ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.Plugin import org.gradle.api.Project class PluginShadowPlugin implements Plugin { @Override void apply(Project project) { project.plugins.apply(ShadowPlugin) project.tasks.withType(ShadowJar) { ShadowJar task -> if (task.name == ShadowJavaPlugin.SHADOW_JAR_TASK_NAME) { ConfigureShadowRelocation relocate = project.tasks.create(ConfigureShadowRelocation.taskName(project.tasks.shadowJar), ConfigureShadowRelocation) relocate.target = (ShadowJar) project.tasks.shadowJar project.tasks.shadowJar.dependsOn relocate } } } } ShadowApplicationPlugin.groovy000066400000000000000000000132241337527402300342370ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadowpackage com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.internal.JavaJarExec import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.distribution.Distribution import org.gradle.api.distribution.DistributionContainer import org.gradle.api.file.CopySpec import org.gradle.api.plugins.ApplicationPlugin import org.gradle.api.plugins.ApplicationPluginConvention import org.gradle.api.tasks.Sync import org.gradle.api.tasks.application.CreateStartScripts class ShadowApplicationPlugin implements Plugin { static final String SHADOW_RUN_TASK_NAME = 'runShadow' static final String SHADOW_SCRIPTS_TASK_NAME = 'startShadowScripts' static final String SHADOW_INSTALL_TASK_NAME = 'installShadowDist' private Project project private ApplicationPluginConvention pluginConvention @Override void apply(Project project) { this.project = project this.pluginConvention = (ApplicationPluginConvention) project.convention.plugins.application DistributionContainer distributions = project.extensions.getByName("distributions") Distribution distribution = distributions.create("shadow") addRunTask(project) addCreateScriptsTask(project) configureDistSpec(project, distribution.contents) configureJarMainClass(project) configureInstallTask(project) } protected void configureJarMainClass(Project project) { ApplicationPluginConvention pluginConvention = ( ApplicationPluginConvention) project.convention.plugins.application jar.inputs.property('mainClassName', { pluginConvention.mainClassName }) jar.doFirst { manifest.attributes 'Main-Class': pluginConvention.mainClassName } } protected void addRunTask(Project project) { ApplicationPluginConvention pluginConvention = ( ApplicationPluginConvention) project.convention.plugins.application def run = project.tasks.create(SHADOW_RUN_TASK_NAME, JavaJarExec) Sync install = project.tasks.getByName(SHADOW_INSTALL_TASK_NAME) run.dependsOn SHADOW_INSTALL_TASK_NAME run.description = 'Runs this project as a JVM application using the shadow jar' run.group = ApplicationPlugin.APPLICATION_GROUP run.conventionMapping.jvmArgs = { pluginConvention.applicationDefaultJvmArgs } run.conventionMapping.jarFile = { project.file("${install.destinationDir.path}/lib/${jar.archivePath.name}") } } protected void addCreateScriptsTask(Project project) { ApplicationPluginConvention pluginConvention = (ApplicationPluginConvention) project.convention.plugins.application def startScripts = project.tasks.create(SHADOW_SCRIPTS_TASK_NAME, CreateStartScripts) startScripts.unixStartScriptGenerator.template = project.resources.text.fromString(this.class.getResource("internal/unixStartScript.txt").text) startScripts.windowsStartScriptGenerator.template = project.resources.text.fromString(this.class.getResource("internal/windowsStartScript.txt").text) startScripts.description = 'Creates OS specific scripts to run the project as a JVM application using the shadow jar' startScripts.group = ApplicationPlugin.APPLICATION_GROUP startScripts.classpath = project.files(jar) startScripts.conventionMapping.mainClassName = { pluginConvention.mainClassName } startScripts.conventionMapping.applicationName = { pluginConvention.applicationName } startScripts.conventionMapping.outputDir = { new File(project.buildDir, 'scriptsShadow') } startScripts.conventionMapping.defaultJvmOpts = { pluginConvention.applicationDefaultJvmArgs } startScripts.inputs.files jar } protected void configureInstallTask(Project project) { ApplicationPluginConvention pluginConvention = (ApplicationPluginConvention) project.convention.plugins.application Sync installTask = project.tasks.getByName(SHADOW_INSTALL_TASK_NAME) installTask.doFirst { Sync task -> if (task.destinationDir.directory) { if (task.destinationDir.listFiles().size() != 0 && (!new File(task.destinationDir, 'lib').directory || !new File(task.destinationDir, 'bin').directory)) { throw new GradleException("The specified installation directory '${task.destinationDir}' is neither empty nor does it contain an installation for '${pluginConvention.applicationName}'.\n" + "If you really want to install to this directory, delete it and run the install task again.\n" + "Alternatively, choose a different installation directory." ) } } } installTask.doLast { Sync task -> project.ant.chmod(file: "${task.destinationDir.absolutePath}/bin/${pluginConvention.applicationName}", perm: 'ugo+x') } } protected CopySpec configureDistSpec(Project project, CopySpec distSpec) { def startScripts = project.tasks.getByName(SHADOW_SCRIPTS_TASK_NAME) distSpec.with { from(project.file("src/dist")) into("lib") { from(jar) from(project.configurations.shadow) } into("bin") { from(startScripts) fileMode = 493 } } distSpec } private ShadowJar getJar() { project.tasks.findByName(ShadowJavaPlugin.SHADOW_JAR_TASK_NAME) } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowBasePlugin.groovy000066400000000000000000000020561337527402300327260ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.KnowsTask import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.util.GradleVersion class ShadowBasePlugin implements Plugin { static final String EXTENSION_NAME = 'shadow' static final String CONFIGURATION_NAME = 'shadow' @Override void apply(Project project) { if (GradleVersion.current() < GradleVersion.version("4.0")) { throw new GradleException("This version of Shadow supports Gradle 4.0+ only. Please upgrade.") } project.extensions.create(EXTENSION_NAME, ShadowExtension, project) createShadowConfiguration(project) KnowsTask knows = project.tasks.create(KnowsTask.NAME, KnowsTask) knows.group = ShadowJavaPlugin.SHADOW_GROUP knows.description = KnowsTask.DESC } private void createShadowConfiguration(Project project) { project.configurations.create(CONFIGURATION_NAME) } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowExtension.groovy000066400000000000000000000024641337527402300326540ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import org.gradle.api.Project import org.gradle.api.artifacts.SelfResolvingDependency import org.gradle.api.file.CopySpec import org.gradle.api.publish.maven.MavenPom import org.gradle.api.publish.maven.MavenPublication class ShadowExtension { CopySpec applicationDistribution Project project ShadowExtension(Project project) { this.project = project applicationDistribution = project.copySpec {} } void component(MavenPublication publication) { publication.artifact(project.tasks.shadowJar) publication.pom { MavenPom pom -> pom.withXml { xml -> def dependenciesNode = xml.asNode().appendNode('dependencies') project.configurations.shadow.allDependencies.each { if (! (it instanceof SelfResolvingDependency)) { def dependencyNode = dependenciesNode.appendNode('dependency') dependencyNode.appendNode('groupId', it.group) dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) dependencyNode.appendNode('scope', 'runtime') } } } } } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowJavaPlugin.groovy000066400000000000000000000070361337527402300327400ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.Action import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.maven.Conf2ScopeMappingContainer import org.gradle.api.artifacts.maven.MavenPom import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.plugins.MavenPlugin import org.gradle.api.tasks.Upload import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.configuration.project.ProjectConfigurationActionContainer import javax.inject.Inject class ShadowJavaPlugin implements Plugin { static final String SHADOW_JAR_TASK_NAME = 'shadowJar' static final String SHADOW_UPLOAD_TASK = 'uploadShadow' static final String SHADOW_GROUP = 'Shadow' private final ProjectConfigurationActionContainer configurationActionContainer; @Inject ShadowJavaPlugin(ProjectConfigurationActionContainer configurationActionContainer) { this.configurationActionContainer = configurationActionContainer } @Override void apply(Project project) { configureShadowTask(project) project.configurations.compileClasspath.extendsFrom project.configurations.shadow } protected void configureShadowTask(Project project) { JavaPluginConvention convention = project.convention.getPlugin(JavaPluginConvention) ShadowJar shadow = project.tasks.create(SHADOW_JAR_TASK_NAME, ShadowJar) shadow.group = SHADOW_GROUP shadow.description = 'Create a combined JAR of project and runtime dependencies' shadow.conventionMapping.with { map('classifier') { 'all' } } shadow.manifest.inheritFrom project.tasks.jar.manifest shadow.doFirst { def files = project.configurations.findByName(ShadowBasePlugin.CONFIGURATION_NAME).files if (files) { def libs = [project.tasks.jar.manifest.attributes.get('Class-Path')] libs.addAll files.collect { "${it.name}" } manifest.attributes 'Class-Path': libs.findAll { it }.join(' ') } } shadow.from(convention.sourceSets.main.output) shadow.configurations = [project.configurations.findByName('runtimeClasspath') ? project.configurations.runtimeClasspath : project.configurations.runtime] shadow.exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'module-info.class') project.artifacts.add(ShadowBasePlugin.CONFIGURATION_NAME, shadow) configureShadowUpload() } private void configureShadowUpload() { configurationActionContainer.add(new Action() { void execute(Project project) { project.plugins.withType(MavenPlugin) { Upload upload = project.tasks.withType(Upload).findByName(SHADOW_UPLOAD_TASK) if (!upload) { return } upload.configuration = project.configurations.shadow MavenPom pom = upload.repositories.mavenDeployer.pom pom.scopeMappings.mappings.remove(project.configurations.compile) pom.scopeMappings.mappings.remove(project.configurations.runtime) pom.scopeMappings.addMapping(MavenPlugin.RUNTIME_PRIORITY, project.configurations.shadow, Conf2ScopeMappingContainer.RUNTIME) } } }) } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowPlugin.groovy000066400000000000000000000024741337527402300321370ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.ApplicationPlugin import org.gradle.api.plugins.JavaPlugin class ShadowPlugin implements Plugin { @Override void apply(Project project) { project.plugins.apply(ShadowBasePlugin) project.plugins.withType(JavaPlugin) { project.plugins.apply(ShadowJavaPlugin) } project.plugins.withType(ApplicationPlugin) { project.plugins.apply(ShadowApplicationPlugin) } def rootProject = project.rootProject rootProject.plugins.withId('com.gradle.build-scan') { rootProject.buildScan.buildFinished { def shadowTasks = project.tasks.withType(ShadowJar) shadowTasks.each { task -> if (task.didWork) { task.stats.buildScanData.each { k, v -> rootProject.buildScan.value "shadow.${task.path}.${k}", v.toString() } rootProject.buildScan.value "shadow.${task.path}.configurations", task.configurations*.name.join(", ") } } } } } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowStats.groovy000066400000000000000000000037531337527402300320000ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import groovy.util.logging.Slf4j import org.gradle.api.GradleException @Slf4j class ShadowStats { long totalTime long jarStartTime long jarEndTime int jarCount = 1 boolean processingJar Map relocations = [:] void relocate(String src, String dst) { relocations[src] = dst } String getRelocationString() { def maxLength = relocations.keySet().collect { it.length() }.max() relocations.collect { k, v -> "${k} ${separator(k, maxLength)} ${v}"}.sort().join("\n") } String separator(String key, int max) { return "→" } void startJar() { if (processingJar) throw new GradleException("Can only time one entry at a time") processingJar = true jarStartTime = System.currentTimeMillis() } void finishJar() { if (processingJar) { jarEndTime = System.currentTimeMillis() jarCount++ totalTime += jarTiming processingJar = false } } void printStats() { println this } long getJarTiming() { jarEndTime - jarStartTime } double getTotalTimeSecs() { totalTime / 1000 } double getAverageTimePerJar() { totalTime / jarCount } double getAverageTimeSecsPerJar() { averageTimePerJar / 1000 } String toString() { StringBuilder sb = new StringBuilder() sb.append "*******************\n" sb.append "GRADLE SHADOW STATS\n" sb.append "\n" sb.append "Total Jars: $jarCount (includes project)\n" sb.append "Total Time: ${totalTimeSecs}s [${totalTime}ms]\n" sb.append "Average Time/Jar: ${averageTimeSecsPerJar}s [${averageTimePerJar}ms]\n" sb.append "*******************" } Map getBuildScanData() { [ dependencies: jarCount, relocations: relocationString ] } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/impl/000077500000000000000000000000001337527402300272165ustar00rootroot00000000000000RelocatorRemapper.groovy000066400000000000000000000073221337527402300340400ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/impl/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.impl import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext import com.github.jengelman.gradle.plugins.shadow.relocation.RelocatePathContext import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowCopyAction.RelativeArchivePath import org.objectweb.asm.commons.Remapper import java.util.regex.Matcher import java.util.regex.Pattern /** * Modified from org.apache.maven.plugins.shade.DefaultShader.java#RelocatorRemapper * * @author John Engelman */ class RelocatorRemapper extends Remapper { private final Pattern classPattern = Pattern.compile("(\\[*)?L(.+)") List relocators ShadowStats stats RelocatorRemapper(List relocators, ShadowStats stats) { this.relocators = relocators this.stats = stats } boolean hasRelocators() { return !relocators.empty } Object mapValue(Object object) { if (object instanceof String) { String name = (String) object String value = name String prefix = "" String suffix = "" Matcher m = classPattern.matcher(name) if (m.matches()) { prefix = m.group(1) + "L" suffix = "" name = m.group(2) } RelocateClassContext classContext = RelocateClassContext.builder().className(name).stats(stats).build() RelocatePathContext pathContext = RelocatePathContext.builder().path(name).stats(stats).build() for (Relocator r : relocators) { if (r.canRelocateClass(classContext)) { value = prefix + r.relocateClass(classContext) + suffix break } else if (r.canRelocatePath(pathContext)) { value = prefix + r.relocatePath(pathContext) + suffix break } } return value } return super.mapValue(object) } String map(String name) { String value = name String prefix = "" String suffix = "" Matcher m = classPattern.matcher(name) if (m.matches()) { prefix = m.group(1) + "L" suffix = "" name = m.group(2) } RelocatePathContext pathContext = RelocatePathContext.builder().path(name).stats(stats).build() for (Relocator r : relocators) { if (r.canRelocatePath(pathContext)) { value = prefix + r.relocatePath(pathContext) + suffix break } } return value } String mapPath(String path) { map(path.substring(0, path.indexOf('.'))) } String mapPath(RelativeArchivePath path) { mapPath(path.pathString) } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internal/000077500000000000000000000000001337527402300300715ustar00rootroot00000000000000DefaultDependencyFilter.groovy000066400000000000000000000102671337527402300360200ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internalpackage com.github.jengelman.gradle.plugins.shadow.internal import groovy.util.logging.Slf4j import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.file.FileCollection import org.gradle.api.specs.Spec import org.gradle.api.specs.Specs @Slf4j class DefaultDependencyFilter implements DependencyFilter { private final Project project private final List> includeSpecs = [] private final List> excludeSpecs = [] DefaultDependencyFilter(Project project) { assert project this.project = project } FileCollection resolve(Configuration configuration) { Set includedDeps = [] Set excludedDeps = [] resolve(configuration.resolvedConfiguration.firstLevelModuleDependencies, includedDeps, excludedDeps) return project.files(configuration.files) - project.files(excludedDeps.collect { it.moduleArtifacts*.file }.flatten()) } FileCollection resolve(Collection configurations) { configurations.collect { resolve(it) }.sum() as FileCollection ?: project.files() } /** * Exclude dependencies that match the provided spec. * * @param spec * @return */ DependencyFilter exclude(Spec spec) { excludeSpecs << spec return this } /** * Include dependencies that match the provided spec. * * @param spec * @return */ DependencyFilter include(Spec spec) { includeSpecs << spec return this } /** * Create a spec that matches the provided project notation on group, name, and version * @param notation * @return */ Spec project(Map notation) { dependency(project.dependencies.project(notation)) } /** * Create a spec that matches the default configuration for the provided project path on group, name, and version * * @param notation * @return */ Spec project(String notation) { dependency(project.dependencies.project(path: notation, configuration: 'default')) } /** * Create a spec that matches dependencies using the provided notation on group, name, and version * @param notation * @return */ Spec dependency(Object notation) { dependency(project.dependencies.create(notation)) } /** * Create a spec that matches the provided dependency on group, name, and version * @param dependency * @return */ Spec dependency(Dependency dependency) { this.dependency({ ResolvedDependency it -> (!dependency.group || it.moduleGroup.matches(dependency.group)) && (!dependency.name || it.moduleName.matches(dependency.name)) && (!dependency.version || it.moduleVersion.matches(dependency.version)) }) } /** * Create a spec that matches the provided closure * @param spec * @return */ Spec dependency(Closure spec) { return Specs.convertClosureToSpec(spec) } protected void resolve(Set dependencies, Set includedDependencies, Set excludedDependencies) { dependencies.each { if (isIncluded(it) ? includedDependencies.add(it) : excludedDependencies.add(it)) { resolve(it.children, includedDependencies, excludedDependencies) } } } protected boolean isIncluded(ResolvedDependency dependency) { boolean include = includeSpecs.empty || includeSpecs.any { it.isSatisfiedBy(dependency) } boolean exclude = !excludeSpecs.empty && excludeSpecs.any { it.isSatisfiedBy(dependency) } return include && !exclude } } DefaultZipCompressor.groovy000066400000000000000000000032231337527402300354050ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internal/* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.jengelman.gradle.plugins.shadow.internal import org.apache.tools.zip.Zip64Mode import org.apache.tools.zip.ZipOutputStream import org.gradle.api.UncheckedIOException class DefaultZipCompressor implements ZipCompressor { private final int entryCompressionMethod private final Zip64Mode zip64Mode DefaultZipCompressor(boolean allowZip64Mode, int entryCompressionMethod) { this.entryCompressionMethod = entryCompressionMethod zip64Mode = allowZip64Mode ? Zip64Mode.AsNeeded : Zip64Mode.Never } ZipOutputStream createArchiveOutputStream(File destination) { try { ZipOutputStream zipOutputStream = new ZipOutputStream(destination) zipOutputStream.setUseZip64(zip64Mode) zipOutputStream.setMethod(entryCompressionMethod) return zipOutputStream } catch (Exception e) { String message = String.format("Unable to create ZIP output stream for file %s.", destination) throw new UncheckedIOException(message, e) } } } DependencyFilter.groovy000066400000000000000000000041731337527402300345120ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internalpackage com.github.jengelman.gradle.plugins.shadow.internal import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.file.FileCollection import org.gradle.api.specs.Spec interface DependencyFilter { /** * Resolve a Configuration against the include/exclude rules in the filter * @param configuration * @return */ FileCollection resolve(Configuration configuration) /** * Resolve all Configurations against the include/exclude ruels in the filter and combine the results * @param configurations * @return */ FileCollection resolve(Collection configurations) /** * Exclude dependencies that match the provided spec. * * @param spec * @return */ DependencyFilter exclude(Spec spec) /** * Include dependencies that match the provided spec. * * @param spec * @return */ DependencyFilter include(Spec spec) /** * Create a spec that matches the provided project notation on group, name, and version * @param notation * @return */ Spec project(Map notation) /** * Create a spec that matches the default configuration for the provided project path on group, name, and version * * @param notation * @return */ Spec project(String notation) /** * Create a spec that matches dependencies using the provided notation on group, name, and version * @param notation * @return */ Spec dependency(Object notation) /** * Create a spec that matches the provided dependency on group, name, and version * @param dependency * @return */ Spec dependency(Dependency dependency) /** * Create a spec that matches the provided closure * @param spec * @return */ Spec dependency(Closure spec) } GradleVersionUtil.groovy000066400000000000000000000030001337527402300346540ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internalpackage com.github.jengelman.gradle.plugins.shadow.internal import org.apache.tools.zip.ZipOutputStream import org.gradle.api.internal.file.copy.CopySpecInternal import org.gradle.api.tasks.WorkResult import org.gradle.api.tasks.bundling.Jar import org.gradle.api.tasks.bundling.ZipEntryCompression import org.gradle.api.tasks.util.PatternSet import org.gradle.util.GradleVersion class GradleVersionUtil { private final GradleVersion version GradleVersionUtil(String version) { this.version = GradleVersion.version(version) } PatternSet getRootPatternSet(CopySpecInternal mainSpec) { return mainSpec.buildRootResolver().getPatternSet() } ZipCompressor getInternalCompressor(ZipEntryCompression entryCompression, Jar jar) { switch (entryCompression) { case ZipEntryCompression.DEFLATED: return new DefaultZipCompressor(jar.zip64, ZipOutputStream.DEFLATED); case ZipEntryCompression.STORED: return new DefaultZipCompressor(jar.zip64, ZipOutputStream.STORED); default: throw new IllegalArgumentException(String.format("Unknown Compression type %s", entryCompression)); } } @SuppressWarnings("deprecation") WorkResult getWorkResult(boolean didWork) { if (version < GradleVersion.version("4.2")) { return new org.gradle.api.internal.tasks.SimpleWorkResult(didWork) } else { org.gradle.api.tasks.WorkResults.didWork(didWork) } } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internal/JavaJarExec.groovy000066400000000000000000000007401337527402300334640ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.internal import org.gradle.api.tasks.InputFile import org.gradle.api.tasks.JavaExec import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction class JavaJarExec extends JavaExec { @InputFile File jarFile @Override @TaskAction public void exec() { setMain('-jar') List allArgs = [getJarFile().path] + getArgs() setArgs(allArgs) super.exec() } } UnusedTracker.groovy000066400000000000000000000053201337527402300340400ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internalpackage com.github.jengelman.gradle.plugins.shadow.internal import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ProjectDependency import org.gradle.api.file.FileCollection import org.gradle.api.tasks.SourceSet import org.vafer.jdependency.Clazz import org.vafer.jdependency.Clazzpath import org.vafer.jdependency.ClazzpathUnit /** Tracks unused classes in the project classpath. */ class UnusedTracker { private final FileCollection toMinimize private final List projectUnits private final Clazzpath cp = new Clazzpath() private UnusedTracker(List classDirs, FileCollection classJars, FileCollection toMinimize) { this.toMinimize = toMinimize projectUnits = classDirs.collect { cp.addClazzpathUnit(it) } projectUnits.addAll(classJars.collect { cp.addClazzpathUnit(it) }) } Set findUnused() { Set unused = cp.clazzes for (cpu in projectUnits) { unused.removeAll(cpu.clazzes) unused.removeAll(cpu.transitiveDependencies) } return unused.collect { it.name }.toSet() } void addDependency(File jarOrDir) { if (toMinimize.contains(jarOrDir)) { cp.addClazzpathUnit(jarOrDir) } } static UnusedTracker forProject(Project project, List configurations, DependencyFilter dependencyFilter) { def apiJars = getApiJarsFromProject(project) FileCollection toMinimize = dependencyFilter.resolve(configurations) - apiJars final List classDirs = new ArrayList<>() for (SourceSet sourceSet in project.sourceSets) { Iterable classesDirs = sourceSet.output.classesDirs classDirs.addAll(classesDirs.findAll { it.isDirectory() }) } return new UnusedTracker(classDirs, apiJars, toMinimize) } private static FileCollection getApiJarsFromProject(Project project) { def apiDependencies = project.configurations.asMap['api']?.dependencies ?: null if (apiDependencies == null) return project.files() def runtimeConfiguration = project.configurations.asMap['runtimeClasspath'] ?: project.configurations.runtime def apiJars = new LinkedList() apiDependencies.each { dep -> if (dep instanceof ProjectDependency) { apiJars.addAll(getApiJarsFromProject(dep.dependencyProject)) apiJars.add(runtimeConfiguration.find { it.name.endsWith("${dep.name}.jar") } as File) } else { apiJars.add(runtimeConfiguration.find { it.name.startsWith("${dep.name}-") } as File) } } return project.files(apiJars) } } ZipCompressor.groovy000066400000000000000000000016551337527402300341070ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/internal/* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.jengelman.gradle.plugins.shadow.internal import org.apache.tools.zip.ZipOutputStream import org.gradle.api.internal.file.archive.compression.ArchiveOutputStreamFactory public interface ZipCompressor extends ArchiveOutputStreamFactory { ZipOutputStream createArchiveOutputStream(File destination) } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/000077500000000000000000000000001337527402300304145ustar00rootroot00000000000000RelocateClassContext.groovy000066400000000000000000000004501337527402300356740ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/relocationpackage com.github.jengelman.gradle.plugins.shadow.relocation import com.github.jengelman.gradle.plugins.shadow.ShadowStats import groovy.transform.Canonical import groovy.transform.builder.Builder @Canonical @Builder class RelocateClassContext { String className ShadowStats stats } RelocatePathContext.groovy000066400000000000000000000004411337527402300355230ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/relocationpackage com.github.jengelman.gradle.plugins.shadow.relocation import com.github.jengelman.gradle.plugins.shadow.ShadowStats import groovy.transform.Canonical import groovy.transform.builder.Builder @Canonical @Builder class RelocatePathContext { String path ShadowStats stats } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/Relocator.groovy000066400000000000000000000025151337527402300336200ustar00rootroot00000000000000/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.relocation /** * Modified from org.apache.maven.plugins.shade.relocation.Relocator.java * * @author Jason van Zyl * @author John Engelman */ interface Relocator { String ROLE = Relocator.class.getName() boolean canRelocatePath(RelocatePathContext context) String relocatePath(RelocatePathContext context) boolean canRelocateClass(RelocateClassContext context) String relocateClass(RelocateClassContext context) String applyToSourceContent(String sourceContent) } SimpleRelocator.groovy000066400000000000000000000140231337527402300347100ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.relocation import org.codehaus.plexus.util.SelectorUtils import java.util.regex.Pattern /** * Modified from org.apache.maven.plugins.shade.relocation.SimpleRelocator.java * * @author Jason van Zyl * @author Mauro Talevi * @author John Engelman */ class SimpleRelocator implements Relocator { private final String pattern private final String pathPattern private final String shadedPattern private final String shadedPathPattern private final Set includes private final Set excludes private final boolean rawString SimpleRelocator() { } SimpleRelocator(String patt, String shadedPattern, List includes, List excludes) { this(patt, shadedPattern, includes, excludes, false) } SimpleRelocator(String patt, String shadedPattern, List includes, List excludes, boolean rawString) { this.rawString = rawString if (rawString) { this.pathPattern = patt this.shadedPathPattern = shadedPattern this.pattern = null // not used for raw string relocator this.shadedPattern = null // not used for raw string relocator } else { if (patt == null) { this.pattern = "" this.pathPattern = "" } else { this.pattern = patt.replace('/', '.') this.pathPattern = patt.replace('.', '/') } if (shadedPattern != null) { this.shadedPattern = shadedPattern.replace('/', '.') this.shadedPathPattern = shadedPattern.replace('.', '/') } else { this.shadedPattern = "hidden." + this.pattern this.shadedPathPattern = "hidden/" + this.pathPattern } } this.includes = normalizePatterns(includes) this.excludes = normalizePatterns(excludes) } SimpleRelocator include(String pattern) { this.includes.addAll normalizePatterns([pattern]) return this } SimpleRelocator exclude(String pattern) { this.excludes.addAll normalizePatterns([pattern]) return this } private static Set normalizePatterns(Collection patterns) { Set normalized = null if (patterns != null && !patterns.isEmpty()) { normalized = new LinkedHashSet() for (String pattern : patterns) { String classPattern = pattern.replace('.', '/') normalized.add(classPattern) if (classPattern.endsWith("/*")) { String packagePattern = classPattern.substring(0, classPattern.lastIndexOf('/')) normalized.add(packagePattern) } } } return normalized ?: [] } private boolean isIncluded(String path) { if (includes != null && !includes.isEmpty()) { for (String include : includes) { if (SelectorUtils.matchPath(include, path, true)) { return true } } return false } return true } private boolean isExcluded(String path) { if (excludes != null && !excludes.isEmpty()) { for (String exclude : excludes) { if (SelectorUtils.matchPath(exclude, path, true)) { return true } } } return false } boolean canRelocatePath(RelocatePathContext context) { String path = context.path if (rawString) { return Pattern.compile(pathPattern).matcher(path).find() } if (path.endsWith(".class")) { path = path.substring(0, path.length() - 6) } if (!isIncluded(path) || isExcluded(path)) { return false } // Allow for annoying option of an extra / on the front of a path. See MSHADE-119 comes from getClass().getResource("/a/b/c.properties"). return path.startsWith(pathPattern) || path.startsWith("/" + pathPattern) } boolean canRelocateClass(RelocateClassContext context) { String clazz = context.className RelocatePathContext pathContext = RelocatePathContext.builder().path(clazz.replace('.', '/')).stats(context.stats).build() return !rawString && clazz.indexOf('/') < 0 && canRelocatePath(pathContext) } String relocatePath(RelocatePathContext context) { String path = context.path context.stats.relocate(pathPattern, shadedPathPattern) if (rawString) { return path.replaceAll(pathPattern, shadedPathPattern) } else { return path.replaceFirst(pathPattern, shadedPathPattern) } } String relocateClass(RelocateClassContext context) { String clazz = context.className context.stats.relocate(pathPattern, shadedPathPattern) return clazz.replaceFirst(pattern, shadedPattern) } String applyToSourceContent(String sourceContent) { if (rawString) { return sourceContent } else { return sourceContent.replaceAll("\\b" + pattern, shadedPattern) } } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/tasks/000077500000000000000000000000001337527402300274025ustar00rootroot00000000000000ConfigureShadowRelocation.groovy000066400000000000000000000024471337527402300357100ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/taskspackage com.github.jengelman.gradle.plugins.shadow.tasks import org.gradle.api.DefaultTask import org.gradle.api.Task import org.gradle.api.artifacts.Configuration import org.gradle.api.tasks.Input import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Optional import org.gradle.api.tasks.TaskAction import java.util.jar.JarFile class ConfigureShadowRelocation extends DefaultTask { @Input ShadowJar target @Input String prefix = "shadow" @InputFiles @Optional List getConfigurations() { return target.configurations } @TaskAction void configureRelocation() { def packages = [] as Set configurations.each { configuration -> configuration.files.each { jar -> JarFile jf = new JarFile(jar) jf.entries().each { entry -> if (entry.name.endsWith(".class")) { packages << entry.name[0..entry.name.lastIndexOf('/')-1].replaceAll('/', '.') } } jf.close() } } packages.each { target.relocate(it, "${prefix}.${it}") } } static String taskName(Task task) { return "configureRelocation${task.name.capitalize()}" } } DefaultInheritManifest.groovy000066400000000000000000000050211337527402300351660ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/taskspackage com.github.jengelman.gradle.plugins.shadow.tasks import org.gradle.api.internal.file.FileResolver import org.gradle.api.java.archives.Attributes import org.gradle.api.java.archives.Manifest import org.gradle.api.java.archives.ManifestException import org.gradle.api.java.archives.internal.DefaultManifest import org.gradle.api.java.archives.internal.DefaultManifestMergeSpec import org.gradle.util.ConfigureUtil class DefaultInheritManifest implements InheritManifest { private List inheritMergeSpecs = [] private final FileResolver fileResolver private final Manifest internalManifest DefaultInheritManifest(FileResolver fileResolver) { this.internalManifest = new DefaultManifest(fileResolver) this.fileResolver = fileResolver } InheritManifest inheritFrom(Object... inheritPaths) { inheritFrom(inheritPaths, null) return this } InheritManifest inheritFrom(Object inheritPaths, Closure closure) { DefaultManifestMergeSpec mergeSpec = new DefaultManifestMergeSpec() mergeSpec.from(inheritPaths) inheritMergeSpecs.add(mergeSpec) ConfigureUtil.configure(closure, mergeSpec) return this } @Override Attributes getAttributes() { return internalManifest.getAttributes() } @Override Map getSections() { return internalManifest.getSections() } @Override Manifest attributes(Map map) throws ManifestException { internalManifest.attributes(map) return this } @Override Manifest attributes(Map map, String s) throws ManifestException { internalManifest.attributes(map, s) return this } @Override public DefaultManifest getEffectiveManifest() { DefaultManifest base = new DefaultManifest(fileResolver) inheritMergeSpecs.each { base = it.merge(base, fileResolver) } base.from internalManifest return base.getEffectiveManifest() } Manifest writeTo(Writer writer) { this.getEffectiveManifest().writeTo((Object) writer) return this } @Override Manifest writeTo(Object o) { this.getEffectiveManifest().writeTo(o) return this } @Override Manifest from(Object... objects) { internalManifest.from(objects) return this } @Override Manifest from(Object o, Closure closure) { internalManifest.from(o, closure) return this } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/tasks/InheritManifest.groovy000066400000000000000000000004271337527402300337450ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.tasks import org.gradle.api.java.archives.Manifest interface InheritManifest extends Manifest { InheritManifest inheritFrom(Object... inheritPaths) InheritManifest inheritFrom(Object inheritPaths, Closure closure) } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/tasks/KnowsTask.groovy000066400000000000000000000007711337527402300326020ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.tasks import org.codehaus.groovy.reflection.ReflectionUtils import org.gradle.api.DefaultTask import org.gradle.api.tasks.TaskAction class KnowsTask extends DefaultTask { static final String NAME = "knows" static final String DESC = "Do you know who knows?" @TaskAction def knows() { println "\nNo, The Shadow Knows...." println ReflectionUtils.getCallingClass(0).getResourceAsStream("/shadowBanner.txt").text } } ShadowCopyAction.groovy000066400000000000000000000477151337527402300340260ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/taskspackage com.github.jengelman.gradle.plugins.shadow.tasks import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.impl.RelocatorRemapper import com.github.jengelman.gradle.plugins.shadow.internal.GradleVersionUtil import com.github.jengelman.gradle.plugins.shadow.internal.UnusedTracker import com.github.jengelman.gradle.plugins.shadow.internal.ZipCompressor import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext import groovy.util.logging.Slf4j import org.apache.commons.io.FilenameUtils import org.apache.commons.io.IOUtils import org.apache.tools.zip.UnixStat import org.apache.tools.zip.Zip64RequiredException import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipFile import org.apache.tools.zip.ZipOutputStream import org.gradle.api.Action import org.gradle.api.GradleException import org.gradle.api.UncheckedIOException import org.gradle.api.file.FileCopyDetails import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath import org.gradle.api.internal.DocumentationRegistry import org.gradle.api.internal.file.CopyActionProcessingStreamAction import org.gradle.api.internal.file.DefaultFileTreeElement import org.gradle.api.internal.file.copy.CopyAction import org.gradle.api.internal.file.copy.CopyActionProcessingStream import org.gradle.api.internal.file.copy.FileCopyDetailsInternal import org.gradle.api.specs.Spec import org.gradle.api.tasks.WorkResult import org.gradle.api.tasks.bundling.Zip import org.gradle.api.tasks.util.PatternSet import org.gradle.internal.UncheckedException import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassVisitor import org.objectweb.asm.ClassWriter import org.objectweb.asm.commons.ClassRemapper import java.util.zip.ZipException @Slf4j class ShadowCopyAction implements CopyAction { static final long CONSTANT_TIME_FOR_ZIP_ENTRIES = (new GregorianCalendar(1980, 1, 1, 0, 0, 0)).getTimeInMillis() private final File zipFile private final ZipCompressor compressor private final DocumentationRegistry documentationRegistry private final List transformers private final List relocators private final PatternSet patternSet private final ShadowStats stats private final String encoding private final GradleVersionUtil versionUtil private final boolean preserveFileTimestamps private final boolean minimizeJar private final UnusedTracker unusedTracker ShadowCopyAction(File zipFile, ZipCompressor compressor, DocumentationRegistry documentationRegistry, String encoding, List transformers, List relocators, PatternSet patternSet, ShadowStats stats, GradleVersionUtil util, boolean preserveFileTimestamps, boolean minimizeJar, UnusedTracker unusedTracker) { this.zipFile = zipFile this.compressor = compressor this.documentationRegistry = documentationRegistry this.transformers = transformers this.relocators = relocators this.patternSet = patternSet this.stats = stats this.encoding = encoding this.versionUtil = util this.preserveFileTimestamps = preserveFileTimestamps this.minimizeJar = minimizeJar this.unusedTracker = unusedTracker } @Override WorkResult execute(CopyActionProcessingStream stream) { Set unusedClasses if (minimizeJar) { stream.process(new BaseStreamAction() { @Override void visitFile(FileCopyDetails fileDetails) { // All project sources are already present, we just need // to deal with JAR dependencies. if (isArchive(fileDetails)) { unusedTracker.addDependency(fileDetails.file) } } }) unusedClasses = unusedTracker.findUnused() } else { unusedClasses = Collections.emptySet() } final ZipOutputStream zipOutStr try { zipOutStr = compressor.createArchiveOutputStream(zipFile) } catch (Exception e) { throw new GradleException("Could not create ZIP '${zipFile.toString()}'", e) } try { withResource(zipOutStr, new Action() { void execute(ZipOutputStream outputStream) { try { stream.process(new StreamAction(outputStream, encoding, transformers, relocators, patternSet, unusedClasses, stats)) processTransformers(outputStream) } catch (Exception e) { log.error('ex', e) //TODO this should not be rethrown throw e } } }) } catch (UncheckedIOException e) { if (e.cause instanceof Zip64RequiredException) { throw new Zip64RequiredException( String.format("%s\n\nTo build this archive, please enable the zip64 extension.\nSee: %s", e.cause.message, documentationRegistry.getDslRefForProperty(Zip, "zip64")) ) } } return versionUtil.getWorkResult(true) } private void processTransformers(ZipOutputStream stream) { transformers.each { Transformer transformer -> if (transformer.hasTransformedResource()) { transformer.modifyOutputStream(stream, preserveFileTimestamps) } } } private long getArchiveTimeFor(long timestamp) { return preserveFileTimestamps ? timestamp : CONSTANT_TIME_FOR_ZIP_ENTRIES } private ZipEntry setArchiveTimes(ZipEntry zipEntry) { if (!preserveFileTimestamps) { zipEntry.setTime(CONSTANT_TIME_FOR_ZIP_ENTRIES) } return zipEntry } private static void withResource(T resource, Action action) { try { action.execute(resource) } catch(Throwable t) { try { resource.close() } catch (IOException e) { // Ignored } throw UncheckedException.throwAsUncheckedException(t) } try { resource.close() } catch (IOException e) { throw new UncheckedIOException(e) } } abstract class BaseStreamAction implements CopyActionProcessingStreamAction { protected boolean isArchive(FileCopyDetails fileDetails) { return fileDetails.relativePath.pathString.endsWith('.jar') } protected boolean isClass(FileCopyDetails fileDetails) { return FilenameUtils.getExtension(fileDetails.path) == 'class' } @Override void processFile(FileCopyDetailsInternal details) { if (details.directory) { visitDir(details) } else { visitFile(details) } } protected void visitDir(FileCopyDetails dirDetails) {} protected abstract void visitFile(FileCopyDetails fileDetails) } private class StreamAction extends BaseStreamAction { private final ZipOutputStream zipOutStr private final List transformers private final List relocators private final RelocatorRemapper remapper private final PatternSet patternSet private final Set unused private final ShadowStats stats private Set visitedFiles = new HashSet() StreamAction(ZipOutputStream zipOutStr, String encoding, List transformers, List relocators, PatternSet patternSet, Set unused, ShadowStats stats) { this.zipOutStr = zipOutStr this.transformers = transformers this.relocators = relocators this.remapper = new RelocatorRemapper(relocators, stats) this.patternSet = patternSet this.unused = unused this.stats = stats if(encoding != null) { this.zipOutStr.setEncoding(encoding) } } private boolean recordVisit(RelativePath path) { return visitedFiles.add(path.pathString) } @Override void visitFile(FileCopyDetails fileDetails) { if (!isArchive(fileDetails)) { try { boolean isClass = isClass(fileDetails) if (!remapper.hasRelocators() || !isClass) { if (!isTransformable(fileDetails)) { String mappedPath = remapper.map(fileDetails.relativePath.pathString) ZipEntry archiveEntry = new ZipEntry(mappedPath) archiveEntry.setTime(getArchiveTimeFor(fileDetails.lastModified)) archiveEntry.unixMode = (UnixStat.FILE_FLAG | fileDetails.mode) zipOutStr.putNextEntry(archiveEntry) fileDetails.copyTo(zipOutStr) zipOutStr.closeEntry() } else { transform(fileDetails) } } else if (isClass && !isUnused(fileDetails.path)) { remapClass(fileDetails) } recordVisit(fileDetails.relativePath) } catch (Exception e) { throw new GradleException(String.format("Could not add %s to ZIP '%s'.", fileDetails, zipFile), e) } } else { processArchive(fileDetails) } } private void processArchive(FileCopyDetails fileDetails) { stats.startJar() ZipFile archive = new ZipFile(fileDetails.file) try { List archiveElements = archive.entries.collect { new ArchiveFileTreeElement(new RelativeArchivePath(it)) } Spec patternSpec = patternSet.getAsSpec() List filteredArchiveElements = archiveElements.findAll { ArchiveFileTreeElement archiveElement -> patternSpec.isSatisfiedBy(archiveElement.asFileTreeElement()) } filteredArchiveElements.each { ArchiveFileTreeElement archiveElement -> if (archiveElement.relativePath.file) { visitArchiveFile(archiveElement, archive) } } } finally { archive.close() } stats.finishJar() } private void visitArchiveDirectory(RelativeArchivePath archiveDir) { if (recordVisit(archiveDir)) { zipOutStr.putNextEntry(archiveDir.entry) zipOutStr.closeEntry() } } private void visitArchiveFile(ArchiveFileTreeElement archiveFile, ZipFile archive) { def archiveFilePath = archiveFile.relativePath if (archiveFile.classFile || !isTransformable(archiveFile)) { if (recordVisit(archiveFilePath) && !isUnused(archiveFilePath.entry.name)) { if (!remapper.hasRelocators() || !archiveFile.classFile) { copyArchiveEntry(archiveFilePath, archive) } else { remapClass(archiveFilePath, archive) } } } else { transform(archiveFile, archive) } } private void addParentDirectories(RelativeArchivePath file) { if (file) { addParentDirectories(file.parent) if (!file.file) { visitArchiveDirectory(file) } } } private boolean isUnused(String classPath) { final String className = FilenameUtils.removeExtension(classPath) .replace('/' as char, '.' as char) final boolean result = unused.contains(className) if (result) { log.debug("Dropping unused class: $className") } return result } private void remapClass(RelativeArchivePath file, ZipFile archive) { if (file.classFile) { ZipEntry zipEntry = setArchiveTimes(new ZipEntry(remapper.mapPath(file) + '.class')) addParentDirectories(new RelativeArchivePath(zipEntry)) InputStream is = archive.getInputStream(file.entry) try { remapClass(is, file.pathString, file.entry.time) } finally { is.close() } } } private void remapClass(FileCopyDetails fileCopyDetails) { if (FilenameUtils.getExtension(fileCopyDetails.name) == 'class') { remapClass(fileCopyDetails.file.newInputStream(), fileCopyDetails.path, fileCopyDetails.lastModified) } } private void remapClass(InputStream classInputStream, String path, long lastModified) { InputStream is = classInputStream ClassReader cr = new ClassReader(is) // We don't pass the ClassReader here. This forces the ClassWriter to rebuild the constant pool. // Copying the original constant pool should be avoided because it would keep references // to the original class names. This is not a problem at runtime (because these entries in the // constant pool are never used), but confuses some tools such as Felix' maven-bundle-plugin // that use the constant pool to determine the dependencies of a class. ClassWriter cw = new ClassWriter(0) ClassVisitor cv = new ClassRemapper(cw, remapper) try { cr.accept(cv, ClassReader.EXPAND_FRAMES) } catch (Throwable ise) { throw new GradleException("Error in ASM processing class " + path, ise) } byte[] renamedClass = cw.toByteArray() // Need to take the .class off for remapping evaluation String mappedName = remapper.mapPath(path) InputStream bis = new ByteArrayInputStream(renamedClass) try { // Now we put it back on so the class file is written out with the right extension. ZipEntry archiveEntry = new ZipEntry(mappedName + ".class") archiveEntry.setTime(getArchiveTimeFor(lastModified)) zipOutStr.putNextEntry(archiveEntry) IOUtils.copyLarge(bis, zipOutStr) zipOutStr.closeEntry() } catch (ZipException e) { log.warn("We have a duplicate " + mappedName + " in source project") } finally { bis.close() } } private void copyArchiveEntry(RelativeArchivePath archiveFile, ZipFile archive) { String mappedPath = remapper.map(archiveFile.entry.name) ZipEntry entry = new ZipEntry(mappedPath) entry.setTime(getArchiveTimeFor(archiveFile.entry.time)) RelativeArchivePath mappedFile = new RelativeArchivePath(entry) addParentDirectories(mappedFile) zipOutStr.putNextEntry(mappedFile.entry) InputStream is = archive.getInputStream(archiveFile.entry) try { IOUtils.copyLarge(is, zipOutStr) } finally { is.close() } zipOutStr.closeEntry() } @Override protected void visitDir(FileCopyDetails dirDetails) { try { // Trailing slash in name indicates that entry is a directory String path = dirDetails.relativePath.pathString + '/' ZipEntry archiveEntry = new ZipEntry(path) archiveEntry.setTime(getArchiveTimeFor(dirDetails.lastModified)) archiveEntry.unixMode = (UnixStat.DIR_FLAG | dirDetails.mode) zipOutStr.putNextEntry(archiveEntry) zipOutStr.closeEntry() recordVisit(dirDetails.relativePath) } catch (Exception e) { throw new GradleException(String.format("Could not add %s to ZIP '%s'.", dirDetails, zipFile), e) } } private void transform(ArchiveFileTreeElement element, ZipFile archive) { transformAndClose(element, archive.getInputStream(element.relativePath.entry)) } private void transform(FileCopyDetails details) { transformAndClose(details, details.file.newInputStream()) } private void transformAndClose(FileTreeElement element, InputStream is) { try { String mappedPath = remapper.map(element.relativePath.pathString) transformers.find { it.canTransformResource(element) }.transform( TransformerContext.builder() .path(mappedPath) .is(is) .relocators(relocators) .stats(stats) .build() ) } finally { is.close() } } private boolean isTransformable(FileTreeElement element) { return transformers.any { it.canTransformResource(element) } } } class RelativeArchivePath extends RelativePath { ZipEntry entry RelativeArchivePath(ZipEntry entry) { super(!entry.directory, entry.name.split('/')) this.entry = entry } boolean isClassFile() { return lastName.endsWith('.class') } RelativeArchivePath getParent() { if (!segments || segments.length == 1) { return null } else { //Parent is always a directory so add / to the end of the path String path = segments[0..-2].join('/') + '/' return new RelativeArchivePath(setArchiveTimes(new ZipEntry(path))) } } } class ArchiveFileTreeElement implements FileTreeElement { private final RelativeArchivePath archivePath ArchiveFileTreeElement(RelativeArchivePath archivePath) { this.archivePath = archivePath } boolean isClassFile() { return archivePath.classFile } @Override File getFile() { return null } @Override boolean isDirectory() { return archivePath.entry.directory } @Override long getLastModified() { return archivePath.entry.lastModifiedDate.time } @Override long getSize() { return archivePath.entry.size } @Override InputStream open() { return null } @Override void copyTo(OutputStream outputStream) { } @Override boolean copyTo(File file) { return false } @Override String getName() { return archivePath.pathString } @Override String getPath() { return archivePath.lastName } @Override RelativeArchivePath getRelativePath() { return archivePath } @Override int getMode() { return archivePath.entry.unixMode } FileTreeElement asFileTreeElement() { return new DefaultFileTreeElement(null, new RelativePath(!isDirectory(), archivePath.segments), null, null) } } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowJar.java000066400000000000000000000276201337527402300321360ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.tasks; import com.github.jengelman.gradle.plugins.shadow.ShadowStats; import com.github.jengelman.gradle.plugins.shadow.internal.*; import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator; import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator; import com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer; import com.github.jengelman.gradle.plugins.shadow.transformers.GroovyExtensionModuleTransformer; import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer; import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer; import groovy.lang.MetaClass; import java.io.File; import java.util.Set; import org.codehaus.groovy.runtime.InvokerHelper; import org.gradle.api.Action; import org.gradle.api.artifacts.Configuration; import org.gradle.api.file.FileCollection; import org.gradle.api.internal.DocumentationRegistry; import org.gradle.api.internal.file.FileResolver; import org.gradle.api.internal.file.copy.CopyAction; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.util.PatternSet; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; public class ShadowJar extends Jar implements ShadowSpec { private List transformers; private List relocators; private List configurations; private DependencyFilter dependencyFilter; private boolean minimizeJar; private DependencyFilter dependencyFilterForMinimize; private final ShadowStats shadowStats = new ShadowStats(); private final GradleVersionUtil versionUtil; public ShadowJar() { super(); versionUtil = new GradleVersionUtil(getProject().getGradle().getGradleVersion()); dependencyFilter = new DefaultDependencyFilter(getProject()); dependencyFilterForMinimize = new DefaultDependencyFilter(getProject()); setManifest(new DefaultInheritManifest(getServices().get(FileResolver.class))); transformers = new ArrayList<>(); relocators = new ArrayList<>(); configurations = new ArrayList<>(); } public ShadowJar minimize() { minimizeJar = true; return this; } public ShadowJar minimize(Action c) { minimize(); if (c != null) { c.execute(dependencyFilterForMinimize); } return this; } @Override @Internal public ShadowStats getStats() { return shadowStats; } @Override public InheritManifest getManifest() { return (InheritManifest) super.getManifest(); } @Override protected CopyAction createCopyAction() { DocumentationRegistry documentationRegistry = getServices().get(DocumentationRegistry.class); final UnusedTracker unusedTracker = UnusedTracker.forProject(getProject(), configurations, dependencyFilterForMinimize); return new ShadowCopyAction(getArchivePath(), getInternalCompressor(), documentationRegistry, this.getMetadataCharset(), transformers, relocators, getRootPatternSet(), shadowStats, versionUtil, isPreserveFileTimestamps(), minimizeJar, unusedTracker); } @Internal protected ZipCompressor getInternalCompressor() { return versionUtil.getInternalCompressor(getEntryCompression(), this); } @TaskAction protected void copy() { from(getIncludedDependencies()); super.copy(); getLogger().info(shadowStats.toString()); } @InputFiles public FileCollection getIncludedDependencies() { return getProject().files(new Callable() { @Override public FileCollection call() throws Exception { return dependencyFilter.resolve(configurations); } }); } /** * Utility method for assisting between changes in Gradle 1.12 and 2.x. * * @return this */ @Internal protected PatternSet getRootPatternSet() { return versionUtil.getRootPatternSet(getMainSpec()); } /** * Configure inclusion/exclusion of module & project dependencies into uber jar. * * @param c the configuration of the filter * @return this */ public ShadowJar dependencies(Action c) { if (c != null) { c.execute(dependencyFilter); } return this; } /** * Add a Transformer instance for modifying JAR resources and configure. * * @param clazz the transformer to add. Must have a no-arg constructor * @return this */ public ShadowJar transform(Class clazz) throws InstantiationException, IllegalAccessException { return transform(clazz, null); } /** * Add a Transformer instance for modifying JAR resources and configure. * * @param clazz the transformer class to add. Must have no-arg constructor * @param c the configuration for the transformer * @return this */ public ShadowJar transform(Class clazz, Action c) throws InstantiationException, IllegalAccessException { T transformer = clazz.newInstance(); if (c != null) { c.execute(transformer); } transformers.add(transformer); return this; } /** * Add a preconfigured transformer instance. * * @param transformer the transformer instance to add * @return this */ public ShadowJar transform(Transformer transformer) { transformers.add(transformer); return this; } /** * Syntactic sugar for merging service files in JARs. * * @return this */ public ShadowJar mergeServiceFiles() { try { transform(ServiceFileTransformer.class); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } return this; } /** * Syntactic sugar for merging service files in JARs. * * @return this */ public ShadowJar mergeServiceFiles(final String rootPath) { try { transform(ServiceFileTransformer.class, new Action() { @Override public void execute(ServiceFileTransformer serviceFileTransformer) { serviceFileTransformer.setPath(rootPath); } }); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } return this; } /** * Syntactic sugar for merging service files in JARs. * * @return this */ public ShadowJar mergeServiceFiles(Action configureClosure) { try { transform(ServiceFileTransformer.class, configureClosure); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } return this; } /** * Syntactic sugar for merging Groovy extension module descriptor files in JARs * * @return this */ public ShadowJar mergeGroovyExtensionModules() { try { transform(GroovyExtensionModuleTransformer.class); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } return this; } /** * Syntax sugar for merging service files in JARs * * @return this */ public ShadowJar append(final String resourcePath) { try { transform(AppendingTransformer.class, new Action() { @Override public void execute(AppendingTransformer transformer) { transformer.setResource(resourcePath); } }); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } return this; } /** * Add a class relocator that maps each class in the pattern to the provided destination. * * @param pattern the source pattern to relocate * @param destination the destination package * @return this */ public ShadowJar relocate(String pattern, String destination) { return relocate(pattern, destination, null); } /** * Add a class relocator that maps each class in the pattern to the provided destination. * * @param pattern the source pattern to relocate * @param destination the destination package * @param configure the configuration of the relocator * @return this */ public ShadowJar relocate(String pattern, String destination, Action configure) { SimpleRelocator relocator = new SimpleRelocator(pattern, destination, new ArrayList(), new ArrayList()); if (configure != null) { configure.execute(relocator); } relocators.add(relocator); return this; } /** * Add a relocator instance. * * @param relocator the relocator instance to add * @return this */ public ShadowJar relocate(Relocator relocator) { relocators.add(relocator); return this; } /** * Add a relocator of the provided class. * * @param relocatorClass the relocator class to add. Must have a no-arg constructor. * @return this */ public ShadowJar relocate(Class relocatorClass) throws InstantiationException, IllegalAccessException { return relocate(relocatorClass, null); } /** * Add a relocator of the provided class and configure. * * @param relocatorClass the relocator class to add. Must have a no-arg constructor * @param configure the configuration for the relocator * @return this */ public ShadowJar relocate(Class relocatorClass, Action configure) throws InstantiationException, IllegalAccessException { R relocator = relocatorClass.newInstance(); if (configure != null) { configure.execute(relocator); } relocators.add(relocator); return this; } @Internal public List getTransformers() { return this.transformers; } public void setTransformers(List transformers) { this.transformers = transformers; } @Internal public List getRelocators() { return this.relocators; } public void setRelocators(List relocators) { this.relocators = relocators; } @InputFiles @Optional public List getConfigurations() { return this.configurations; } public void setConfigurations(List configurations) { this.configurations = configurations; } @Internal public DependencyFilter getDependencyFilter() { return this.dependencyFilter; } public void setDependencyFilter(DependencyFilter filter) { this.dependencyFilter = filter; } // This code is only to make IntelliJ happy. private transient MetaClass metaClass = InvokerHelper.getMetaClass(this.getClass()); public Object getProperty(String property) { return this.getMetaClass().getProperty(this, property); } public void setProperty(String property, Object newValue) { this.getMetaClass().setProperty(this, property, newValue); } public Object invokeMethod(String name, Object args) { return this.getMetaClass().invokeMethod(this, name, args); } public MetaClass getMetaClass() { if(this.metaClass == null) { this.metaClass = InvokerHelper.getMetaClass(this.getClass()); } return this.metaClass; } public void setMetaClass(MetaClass metaClass) { this.metaClass = metaClass; } } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/tasks/ShadowSpec.java000066400000000000000000000034701337527402300323110ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.tasks; import com.github.jengelman.gradle.plugins.shadow.ShadowStats; import com.github.jengelman.gradle.plugins.shadow.internal.DependencyFilter; import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator; import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator; import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer; import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer; import org.gradle.api.Action; import org.gradle.api.file.CopySpec; interface ShadowSpec extends CopySpec { ShadowSpec minimize(); ShadowSpec minimize(Action configureClosure); ShadowSpec dependencies(Action configure); ShadowSpec transform(Class clazz) throws InstantiationException, IllegalAccessException; ShadowSpec transform(Class clazz, Action configure) throws InstantiationException, IllegalAccessException; ShadowSpec transform(Transformer transformer); ShadowSpec mergeServiceFiles(); ShadowSpec mergeServiceFiles(String rootPath); ShadowSpec mergeServiceFiles(Action configureClosure); ShadowSpec mergeGroovyExtensionModules(); ShadowSpec append(String resourcePath); ShadowSpec relocate(String pattern, String destination); ShadowSpec relocate(String pattern, String destination, Action configure); ShadowSpec relocate(Relocator relocator); ShadowSpec relocate(Class clazz) throws InstantiationException, IllegalAccessException; ShadowSpec relocate(Class clazz, Action configure) throws InstantiationException, IllegalAccessException; ShadowStats getStats(); } shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/000077500000000000000000000000001337527402300310025ustar00rootroot00000000000000ApacheLicenseResourceTransformer.groovy000066400000000000000000000034431337527402300406150ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement /** * Prevents duplicate copies of the license *

* Modified from org.apache.maven.plugins.shade.resouce.ApacheLicenseResourceTransformer.java * * @author John Engelman */ class ApacheLicenseResourceTransformer implements Transformer { private static final String LICENSE_PATH = "META-INF/LICENSE" private static final String LICENSE_TXT_PATH = "META-INF/LICENSE.txt" boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString return LICENSE_PATH.equalsIgnoreCase(path) || LICENSE_TXT_PATH.regionMatches(true, 0, path, 0, LICENSE_TXT_PATH.length()) } void transform(TransformerContext context) { } boolean hasTransformedResource() { return false } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { } } ApacheNoticeResourceTransformer.groovy000066400000000000000000000161741337527402300404610ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.codehaus.plexus.util.StringUtils import org.gradle.api.file.FileTreeElement import java.text.SimpleDateFormat /** * Merges META-INF/NOTICE.TXT files. *

* Modified from org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer.java * * @author John Engelman */ class ApacheNoticeResourceTransformer implements Transformer { Set entries = new LinkedHashSet() Map> organizationEntries = new LinkedHashMap>() String projectName = "" // MSHADE-101 :: NullPointerException when projectName is missing boolean addHeader = true String preamble1 = "// ------------------------------------------------------------------\n" + "// NOTICE file corresponding to the section 4d of The Apache License,\n" + "// Version 2.0, in this case for " String preamble2 = "\n// ------------------------------------------------------------------\n" String preamble3 = "This product includes software developed at\n" //defaults overridable via config in pom String organizationName = "The Apache Software Foundation" String organizationURL = "http://www.apache.org/" String inceptionYear = "2006" String copyright /** * The file encoding of the NOTICE file. */ String encoding private static final String NOTICE_PATH = "META-INF/NOTICE" private static final String NOTICE_TXT_PATH = "META-INF/NOTICE.txt" boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (NOTICE_PATH.equalsIgnoreCase(path) || NOTICE_TXT_PATH.equalsIgnoreCase(path)) { return true } return false } void transform(TransformerContext context) { if (entries.isEmpty()) { String year = new SimpleDateFormat("yyyy").format(new Date()) if (!inceptionYear.equals(year)) { year = inceptionYear + "-" + year } //add headers if (addHeader) { entries.add(preamble1 + projectName + preamble2) } else { entries.add("") } //fake second entry, we'll look for a real one later entries.add(projectName + "\nCopyright " + year + " " + organizationName + "\n") entries.add(preamble3 + organizationName + " (" + organizationURL + ").\n") } BufferedReader reader if (StringUtils.isNotEmpty(encoding)) { reader = new BufferedReader(new InputStreamReader(context.is, encoding)) } else { reader = new BufferedReader(new InputStreamReader(context.is)) } String line = reader.readLine() StringBuffer sb = new StringBuffer() Set currentOrg = null int lineCount = 0 while (line != null) { String trimedLine = line.trim() if (!trimedLine.startsWith("//")) { if (trimedLine.length() > 0) { if (trimedLine.startsWith("- ")) { //resource-bundle 1.3 mode if (lineCount == 1 && sb.toString().indexOf("This product includes/uses software(s) developed by") != -1) { currentOrg = organizationEntries.get(sb.toString().trim()) if (currentOrg == null) { currentOrg = new TreeSet() organizationEntries.put(sb.toString().trim(), currentOrg) } sb = new StringBuffer() } else if (sb.length() > 0 && currentOrg != null) { currentOrg.add(sb.toString()) sb = new StringBuffer() } } sb.append(line).append("\n") lineCount++ } else { String ent = sb.toString() if (ent.startsWith(projectName) && ent.indexOf("Copyright ") != -1) { copyright = ent } if (currentOrg == null) { entries.add(ent) } else { currentOrg.add(ent) } sb = new StringBuffer() lineCount = 0 currentOrg = null } } line = reader.readLine() } if (sb.length() > 0) { if (currentOrg == null) { entries.add(sb.toString()) } else { currentOrg.add(sb.toString()) } } } boolean hasTransformedResource() { return true } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { ZipEntry zipEntry = new ZipEntry(NOTICE_PATH) zipEntry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, zipEntry.time) os.putNextEntry(zipEntry) Writer pow if (StringUtils.isNotEmpty(encoding)) { pow = new OutputStreamWriter(os, encoding) } else { pow = new OutputStreamWriter(os) } PrintWriter writer = new PrintWriter(pow) int count = 0 for (String line : entries) { ++count if (line.equals(copyright) && count != 2) { continue } if (count == 2 && copyright != null) { writer.print(copyright) writer.print('\n') } else { writer.print(line) writer.print('\n') } if (count == 3) { //do org stuff for (Map.Entry> entry : organizationEntries.entrySet()) { writer.print(entry.getKey()) writer.print('\n') for (String l : entry.getValue()) { writer.print(l) } writer.print('\n') } } } writer.flush() entries.clear() } } AppendingTransformer.groovy000066400000000000000000000042561337527402300363310ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.codehaus.plexus.util.IOUtil import org.gradle.api.file.FileTreeElement /** * A resource processor that appends content for a resource, separated by a newline. * * Modified from org.apache.maven.plugins.shade.resource.AppendingTransformer.java * * Modifications * @author John Engelman */ class AppendingTransformer implements Transformer { String resource ByteArrayOutputStream data = new ByteArrayOutputStream() boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (resource != null && resource.equalsIgnoreCase(path)) { return true } return false } void transform(TransformerContext context) { IOUtil.copy(context.is, data) data.write('\n'.bytes) context.is.close() } boolean hasTransformedResource() { return data.size() > 0 } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { ZipEntry entry = new ZipEntry(resource) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) IOUtil.copy(new ByteArrayInputStream(data.toByteArray()), os) data.reset() } } ComponentsXmlResourceTransformer.groovy000066400000000000000000000143361337527402300407420ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.codehaus.plexus.util.IOUtil import org.codehaus.plexus.util.ReaderFactory import org.codehaus.plexus.util.WriterFactory import org.codehaus.plexus.util.xml.Xpp3Dom import org.codehaus.plexus.util.xml.Xpp3DomBuilder import org.codehaus.plexus.util.xml.Xpp3DomWriter /** * A resource processor that aggregates plexus components.xml files. *

* Modified from org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformer.java * * @author John Engelman */ class ComponentsXmlResourceTransformer implements Transformer { private Map components = new LinkedHashMap() static final String COMPONENTS_XML_PATH = "META-INF/plexus/components.xml" boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString return COMPONENTS_XML_PATH.equals(path) } void transform(TransformerContext context) { Xpp3Dom newDom try { BufferedInputStream bis = new BufferedInputStream(context.is) { void close() throws IOException { // leave ZIP open } } Reader reader = ReaderFactory.newXmlReader(bis) newDom = Xpp3DomBuilder.build(reader) } catch (Exception e) { throw (IOException) new IOException("Error parsing components.xml in " + context.is).initCause(e) } // Only try to merge in components if there are some elements in the component-set if (newDom.getChild("components") == null) { return } Xpp3Dom[] children = newDom.getChild("components").getChildren("component") for (int i = 0; i < children.length; i++) { Xpp3Dom component = children[i] String role = getValue(component, "role") role = getRelocatedClass(role, context.relocators) setValue(component, "role", role) String roleHint = getValue(component, "role-hint") String impl = getValue(component, "implementation") impl = getRelocatedClass(impl, context.relocators) setValue(component, "implementation", impl) String key = role + ':' + roleHint if (components.containsKey(key)) { // TODO: use the tools in Plexus to merge these properly. For now, I just need an all-or-nothing // configuration carry over Xpp3Dom dom = components.get(key) if (dom.getChild("configuration") != null) { component.addChild(dom.getChild("configuration")) } } Xpp3Dom requirements = component.getChild("requirements") if (requirements != null && requirements.getChildCount() > 0) { for (int r = requirements.getChildCount() - 1; r >= 0; r--) { Xpp3Dom requirement = requirements.getChild(r) String requiredRole = getValue(requirement, "role") requiredRole = getRelocatedClass(requiredRole, context.relocators) setValue(requirement, "role", requiredRole) } } components.put(key, component) } } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { byte[] data = getTransformedResource() ZipEntry entry = new ZipEntry(COMPONENTS_XML_PATH) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) IOUtil.copy(data, os) components.clear() } boolean hasTransformedResource() { return !components.isEmpty() } byte[] getTransformedResource() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 4) Writer writer = WriterFactory.newXmlWriter(baos) try { Xpp3Dom dom = new Xpp3Dom("component-set") Xpp3Dom componentDom = new Xpp3Dom("components") dom.addChild(componentDom) for (Xpp3Dom component : components.values()) { componentDom.addChild(component) } Xpp3DomWriter.write(writer, dom) } finally { IOUtil.close(writer) } return baos.toByteArray() } private String getRelocatedClass(String className, List relocators) { if (className != null && className.length() > 0 && relocators != null) { for (Relocator relocator : relocators) { if (relocator.canRelocateClass(className)) { return relocator.relocateClass(className) } } } return className } private static String getValue(Xpp3Dom dom, String element) { Xpp3Dom child = dom.getChild(element) return (child != null && child.getValue() != null) ? child.getValue() : "" } private static void setValue(Xpp3Dom dom, String element, String value) { Xpp3Dom child = dom.getChild(element) if (child == null || value == null || value.length() <= 0) { return } child.setValue(value) } } DontIncludeResourceTransformer.groovy000066400000000000000000000033151337527402300403370ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement /** * A resource processor that prevents the inclusion of an arbitrary * resource into the shaded JAR. *

* Modified from org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer.java * * @author John Engelman */ class DontIncludeResourceTransformer implements Transformer { String resource boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (path.endsWith(resource)) { return true } return false } void transform(TransformerContext context) { // no op } boolean hasTransformedResource() { return false } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { // no op } } GroovyExtensionModuleTransformer.groovy000066400000000000000000000102471337527402300407510ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.codehaus.plexus.util.IOUtil /** * Modified from eu.appsatori.gradle.fatjar.tasks.PrepareFiles.groovy *

* Resource transformer that merges Groovy extension module descriptor files into a single file. If there are several * META-INF/services/org.codehaus.groovy.runtime.ExtensionModule resources spread across many JARs the individual * entries will all be merged into a single META-INF/services/org.codehaus.groovy.runtime.ExtensionModule resource * packaged into the resultant JAR produced by the shadowing process. */ class GroovyExtensionModuleTransformer implements Transformer { private static final GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATH = "META-INF/services/org.codehaus.groovy.runtime.ExtensionModule" private static final MODULE_NAME_KEY = 'moduleName' private static final MODULE_VERSION_KEY = 'moduleVersion' private static final EXTENSION_CLASSES_KEY = 'extensionClasses' private static final STATIC_EXTENSION_CLASSES_KEY = 'staticExtensionClasses' private static final MERGED_MODULE_NAME = 'MergedByShadowJar' private static final MERGED_MODULE_VERSION = '1.0.0' private final Properties module = new Properties() @Override boolean canTransformResource(FileTreeElement element) { return element.relativePath.pathString == GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATH } @Override void transform(TransformerContext context) { def props = new Properties() props.load(context.is) props.each { String key, String value -> switch (key) { case MODULE_NAME_KEY: handle(key, value) { module.setProperty(key, MERGED_MODULE_NAME) } break case MODULE_VERSION_KEY: handle(key, value) { module.setProperty(key, MERGED_MODULE_VERSION) } break case [EXTENSION_CLASSES_KEY, STATIC_EXTENSION_CLASSES_KEY]: handle(key, value) { String existingValue -> def newValue = "${existingValue},${value}" module.setProperty(key, newValue) } break } } } private handle(String key, String value, Closure mergeValue) { def existingValue = module.getProperty(key) if (existingValue) { mergeValue(existingValue) } else { module.setProperty(key, value) } } @Override boolean hasTransformedResource() { return module.size() > 0 } @Override void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { ZipEntry entry = new ZipEntry(GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATH) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) IOUtil.copy(toInputStream(module), os) os.closeEntry() } private static InputStream toInputStream(Properties props) { def baos = new ByteArrayOutputStream() props.store(baos, null) return new ByteArrayInputStream(baos.toByteArray()) } } IncludeResourceTransformer.groovy000066400000000000000000000037451337527402300375210ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.codehaus.plexus.util.IOUtil /** * A resource processor that allows the addition of an arbitrary file * content into the shaded JAR. *

* Modified from org.apache.maven.plugins.shade.resource.IncludeResourceTransformer.java * * @author John Engelman */ public class IncludeResourceTransformer implements Transformer { File file String resource public boolean canTransformResource(FileTreeElement element) { return false } public void transform(TransformerContext context) { // no op } public boolean hasTransformedResource() { return file != null ? file.exists() : false } public void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { ZipEntry entry = new ZipEntry(resource) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) InputStream is = new FileInputStream(file) IOUtil.copy(is, os) is.close() } } Log4j2PluginsCacheFileTransformer.groovy000066400000000000000000000126361337527402300405540ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import org.apache.commons.io.IOUtils import org.apache.commons.io.output.CloseShieldOutputStream import org.apache.logging.log4j.core.config.plugins.processor.PluginCache import org.apache.logging.log4j.core.config.plugins.processor.PluginEntry import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE; /** * Modified from the maven equivalent to work with gradle * * @author Paul Nelson Baker * @see LinkedIn * @see GitHub * @see edwgiz/maven-shaded-log4j-transformer * @see PluginsCacheFileTransformer.java */ class Log4j2PluginsCacheFileTransformer implements Transformer { private final List temporaryFiles; private final List relocators; public Log4j2PluginsCacheFileTransformer() { temporaryFiles = new ArrayList<>(); relocators = new ArrayList<>(); } @Override boolean canTransformResource(FileTreeElement element) { return PLUGIN_CACHE_FILE == element.name } @Override void transform(TransformerContext context) { def inputStream = context.is def temporaryFile = File.createTempFile("Log4j2Plugins", ".dat") temporaryFile.deleteOnExit() temporaryFiles.add(temporaryFile) IOUtils.copy(inputStream, new FileOutputStream(temporaryFile)) def contextRelocators = context.relocators if (contextRelocators != null) { this.relocators.addAll(contextRelocators) } } @Override boolean hasTransformedResource() { // This functionality matches the original plugin, however, I'm not clear what // the exact logic is. From what I can tell temporaryFiles should be never be empty // if anything has been performed. def hasTransformedMultipleFiles = temporaryFiles.size() > 1 def hasAtLeastOneFileAndRelocator = !temporaryFiles.isEmpty() && !relocators.isEmpty() def hasTransformedResources = hasTransformedMultipleFiles || hasAtLeastOneFileAndRelocator return hasTransformedResources } @Override void modifyOutputStream(ZipOutputStream zipOutputStream, boolean preserveFileTimestamps) { PluginCache pluginCache = new PluginCache() pluginCache.loadCacheFiles(getUrlEnumeration()) relocatePlugins(pluginCache) ZipEntry entry = new ZipEntry(PLUGIN_CACHE_FILE) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) zipOutputStream.putNextEntry(entry) pluginCache.writeCache(new CloseShieldOutputStream(zipOutputStream)) temporaryFiles.clear() } private Enumeration getUrlEnumeration() { def urls = temporaryFiles.collect({ it.toURL() }).asList() return Collections.enumeration(urls) } private void relocatePlugins(PluginCache pluginCache) { for (Map currentMap : pluginCache.getAllCategories().values()) { pluginEntryLoop: for (PluginEntry currentPluginEntry : currentMap.values()) { String className = currentPluginEntry.getClassName(); RelocateClassContext relocateClassContext = new RelocateClassContext(className, new ShadowStats()); for (Relocator currentRelocator : relocators) { // If we have a relocator that can relocate our current entry... boolean canRelocateClass = currentRelocator.canRelocateClass(relocateClassContext); if (canRelocateClass) { // Then we perform that relocation and update the plugin entry to reflect the new value. String relocatedClassName = currentRelocator.relocateClass(relocateClassContext); currentPluginEntry.setClassName(relocatedClassName); continue pluginEntryLoop; } } } } } }ManifestResourceTransformer.groovy000066400000000000000000000067561337527402300377110ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.codehaus.plexus.util.IOUtil import java.util.jar.* import java.util.jar.Attributes.Name /** * A resource processor that allows the arbitrary addition of attributes to * the first MANIFEST.MF that is found in the set of JARs being processed, or * to a newly created manifest for the shaded JAR. *

* Modified from org.apache.maven.plugins.shade.resource.ManifestResourceTransformer * @author Jason van Zyl * @author John Engelman */ class ManifestResourceTransformer implements Transformer { // Configuration private String mainClass private Map manifestEntries // Fields private boolean manifestDiscovered private Manifest manifest boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (JarFile.MANIFEST_NAME.equalsIgnoreCase(path)) { return true } return false } void transform(TransformerContext context) { // We just want to take the first manifest we come across as that's our project's manifest. This is the behavior // now which is situational at best. Right now there is no context passed in with the processing so we cannot // tell what artifact is being processed. if (!manifestDiscovered) { manifest = new Manifest(context.is) manifestDiscovered = true IOUtil.close(context.is) } } boolean hasTransformedResource() { return true } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { // If we didn't find a manifest, then let's create one. if (manifest == null) { manifest = new Manifest() } Attributes attributes = manifest.getMainAttributes() if (mainClass != null) { attributes.put(Name.MAIN_CLASS, mainClass) } if (manifestEntries != null) { for (Map.Entry entry : manifestEntries.entrySet()) { attributes.put(new Name(entry.getKey()), entry.getValue()) } } ZipEntry entry = new ZipEntry(JarFile.MANIFEST_NAME) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) manifest.write(os) } ManifestResourceTransformer attributes(Map attributes) { if (manifestEntries == null) { manifestEntries = [:] } manifestEntries.putAll(attributes) this } } PropertiesFileTransformer.groovy000066400000000000000000000172471337527402300373640ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.codehaus.plexus.util.IOUtil import static groovy.lang.Closure.IDENTITY /** * Resources transformer that merges Properties files. * *

The default merge strategy discards duplicate values coming from additional * resources. This behavior can be changed by setting a value for the mergeStrategy * property, such as 'first' (default), 'latest' or 'append'. If the merge strategy is * 'latest' then the last value of a matching property entry will be used. If the * merge strategy is 'append' then the property values will be combined, using a * merge separator (default value is ','). The merge separator can be changed by * setting a value for the mergeSeparator property.

* * Say there are two properties files A and B with the * following entries: * * A *
    *
  • key1 = value1
  • *
  • key2 = value2
  • *
* * B *
    *
  • key2 = balue2
  • *
  • key3 = value3
  • *
* * With mergeStrategy = first you get * * C *
    *
  • key1 = value1
  • *
  • key2 = value2
  • *
  • key3 = value3
  • *
* * With mergeStrategy = latest you get * * C *
    *
  • key1 = value1
  • *
  • key2 = balue2
  • *
  • key3 = value3
  • *
* * With mergeStrategy = append and mergeSparator = ; you get * * C *
    *
  • key1 = value1
  • *
  • key2 = value2;balue2
  • *
  • key3 = value3
  • *
* *

There are three additional properties that can be set: paths, mappings, * and keyTransformer. * The first contains a list of strings or regexes that will be used to determine if * a path should be transformed or not. The merge strategy and merge separator are * taken from the global settings.

* *

The mappings property allows you to define merge strategy and separator per * path

. If either paths or mappings is defined then no other path * entries will be merged. mappings has precedence over paths if both * are defined.

* *

If you need to transform keys in properties files, e.g. because they contain class * names about to be relocated, you can set the keyTransformer property to a * closure that receives the original key and returns the key name to be used.

* *

Example:

*
 * import org.codehaus.griffon.gradle.shadow.transformers.*
 * shadowJar {
 *     transform(PropertiesFileTransformer) {
 *         paths = [
 *             'META-INF/editors/java.beans.PropertyEditor'
 *         ]
 *         keyTransformer = { key ->
 *             key.replaceAll('^(orig\.package\..*)$', 'new.prefix.$1')
 *         }
 *     }
 * }
 * 
* * @author Andres Almiray * @author Marc Philipp */ class PropertiesFileTransformer implements Transformer { private static final String PROPERTIES_SUFFIX = '.properties' // made public for testing Map propertiesEntries = [:] // Transformer properties List paths = [] Map> mappings = [:] String mergeStrategy = 'first' // latest, append String mergeSeparator = ',' Closure keyTransformer = IDENTITY @Override boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (mappings.containsKey(path)) return true for (key in mappings.keySet()) { if (path =~ /$key/) return true } if (path in paths) return true for (p in paths) { if (path =~ /$p/) return true } !mappings && !paths && path.endsWith(PROPERTIES_SUFFIX) } @Override void transform(TransformerContext context) { Properties props = propertiesEntries[context.path] Properties incoming = loadAndTransformKeys(context.is) if (props == null) { propertiesEntries[context.path] = incoming } else { incoming.each { key, value -> if (props.containsKey(key)) { switch (mergeStrategyFor(context.path).toLowerCase()) { case 'latest': props.put(key, value) break case 'append': props.put(key, props.getProperty(key) + mergeSeparatorFor(context.path) + value) break case 'first': default: // continue break } } else { props.put(key, value) } } } } private Properties loadAndTransformKeys(InputStream is) { Properties props = new Properties() props.load(is) return transformKeys(props) } private Properties transformKeys(Properties properties) { if (keyTransformer == IDENTITY) return properties def result = new Properties() properties.each { key, value -> result.put(keyTransformer.call(key), value) } return result } private String mergeStrategyFor(String path) { if (mappings.containsKey(path)) { return mappings.get(path).mergeStrategy ?: mergeStrategy } for (key in mappings.keySet()) { if (path =~ /$key/) { return mappings.get(key).mergeStrategy ?: mergeStrategy } } return mergeStrategy } private String mergeSeparatorFor(String path) { if (mappings.containsKey(path)) { return mappings.get(path).mergeSeparator ?: mergeSeparator } for (key in mappings.keySet()) { if (path =~ /$key/) { return mappings.get(key).mergeSeparator ?: mergeSeparator } } return mergeSeparator } @Override boolean hasTransformedResource() { propertiesEntries.size() > 0 } @Override void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { propertiesEntries.each { String path, Properties props -> ZipEntry entry = new ZipEntry(path) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) IOUtil.copy(toInputStream(props), os) os.closeEntry() } } private static InputStream toInputStream(Properties props) { ByteArrayOutputStream baos = new ByteArrayOutputStream() props.store(baos, '') new ByteArrayInputStream(baos.toByteArray()) } } ServiceFileTransformer.groovy000066400000000000000000000153501337527402300366210ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.relocation.RelocateClassContext import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowCopyAction import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.gradle.api.specs.Spec import org.gradle.api.tasks.util.PatternFilterable import org.gradle.api.tasks.util.PatternSet import org.codehaus.plexus.util.IOUtil /** * Modified from org.apache.maven.plugins.shade.resource.ServiceResourceTransformer.java *

* Resources transformer that appends entries in META-INF/services resources into * a single resource. For example, if there are several META-INF/services/org.apache.maven.project.ProjectBuilder * resources spread across many JARs the individual entries will all be concatenated into a single * META-INF/services/org.apache.maven.project.ProjectBuilder resource packaged into the resultant JAR produced * by the shading process. * * @author jvanzyl * @author Charlie Knudsen * @author John Engelman */ class ServiceFileTransformer implements Transformer, PatternFilterable { private static final String SERVICES_PATTERN = "META-INF/services/**" private static final String GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATTERN = "META-INF/services/org.codehaus.groovy.runtime.ExtensionModule" Map serviceEntries = [:].withDefault { new ServiceStream() } private final PatternSet patternSet = new PatternSet().include(SERVICES_PATTERN).exclude(GROOVY_EXTENSION_MODULE_DESCRIPTOR_PATTERN) void setPath(String path) { patternSet.setIncludes(["${path}/**"]) } @Override boolean canTransformResource(FileTreeElement element) { FileTreeElement target = element instanceof ShadowCopyAction.ArchiveFileTreeElement ? element.asFileTreeElement() : element return patternSet.asSpec.isSatisfiedBy(target) } @Override void transform(TransformerContext context) { def lines = context.is.readLines() def targetPath = context.path context.relocators.each {rel -> if(rel.canRelocateClass(RelocateClassContext.builder().className(new File(targetPath).name).stats(context.stats).build())) { targetPath = rel.relocateClass(RelocateClassContext.builder().className(targetPath).stats(context.stats).build()) } lines.eachWithIndex { String line, int i -> def lineContext = RelocateClassContext.builder().className(line).stats(context.stats).build() if(rel.canRelocateClass(lineContext)) { lines[i] = rel.relocateClass(lineContext) } } } lines.each {line -> serviceEntries[targetPath].append(new ByteArrayInputStream(line.getBytes()))} } @Override boolean hasTransformedResource() { return serviceEntries.size() > 0 } @Override void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { serviceEntries.each { String path, ServiceStream stream -> ZipEntry entry = new ZipEntry(path) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) IOUtil.copy(stream.toInputStream(), os) os.closeEntry() } } static class ServiceStream extends ByteArrayOutputStream { public ServiceStream(){ super( 1024 ) } public void append( InputStream is ) throws IOException { if ( count > 0 && buf[count - 1] != '\n' && buf[count - 1] != '\r' ) { byte[] newline = '\n'.bytes write(newline, 0, newline.length) } IOUtil.copy(is, this) } public InputStream toInputStream() { return new ByteArrayInputStream( buf, 0, count ) } } /** * {@inheritDoc} */ @Override ServiceFileTransformer include(String... includes) { patternSet.include(includes) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer include(Iterable includes) { patternSet.include(includes) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer include(Spec includeSpec) { patternSet.include(includeSpec) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer include(Closure includeSpec) { patternSet.include(includeSpec) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer exclude(String... excludes) { patternSet.exclude(excludes) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer exclude(Iterable excludes) { patternSet.exclude(excludes) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer exclude(Spec excludeSpec) { patternSet.exclude(excludeSpec) return this } /** * {@inheritDoc} */ @Override ServiceFileTransformer exclude(Closure excludeSpec) { patternSet.exclude(excludeSpec) return this } /** * {@inheritDoc} */ @Override Set getIncludes() { return patternSet.includes } /** * {@inheritDoc} */ @Override ServiceFileTransformer setIncludes(Iterable includes) { patternSet.includes = includes return this } /** * {@inheritDoc} */ @Override Set getExcludes() { return patternSet.excludes } /** * {@inheritDoc} */ @Override ServiceFileTransformer setExcludes(Iterable excludes) { patternSet.excludes = excludes return this } } Transformer.groovy000066400000000000000000000025501337527402300344760ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement /** * Modified from org.apache.maven.plugins.shade.resource.ResourceTransformer.java * * @author Jason van Zyl * @author Charlie Knudsen * @author John Engelman */ interface Transformer { boolean canTransformResource(FileTreeElement element) void transform(TransformerContext context) boolean hasTransformedResource() void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) } TransformerContext.groovy000066400000000000000000000012341337527402300360410ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformerspackage com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowCopyAction import groovy.transform.Canonical import groovy.transform.builder.Builder @Canonical @Builder class TransformerContext { String path InputStream is List relocators ShadowStats stats static long getEntryTimestamp(boolean preserveFileTimestamps, long entryTime) { preserveFileTimestamps ? entryTime : ShadowCopyAction.CONSTANT_TIME_FOR_ZIP_ENTRIES } } XmlAppendingTransformer.groovy000066400000000000000000000071371337527402300370130ustar00rootroot00000000000000shadow-4.0.3/src/main/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.apache.tools.zip.ZipEntry import org.apache.tools.zip.ZipOutputStream import org.gradle.api.file.FileTreeElement import org.jdom2.Attribute import org.jdom2.Content import org.jdom2.Document import org.jdom2.Element import org.jdom2.JDOMException import org.jdom2.input.SAXBuilder import org.jdom2.output.Format import org.jdom2.output.XMLOutputter import org.xml.sax.EntityResolver import org.xml.sax.InputSource import org.xml.sax.SAXException /** * Appends multiple occurrences of some XML file. *

* Modified from org.apache.maven.plugins.shade.resource.XmlAppendingTransformer.java * * @author John Engelman */ class XmlAppendingTransformer implements Transformer { static final String XSI_NS = "http://www.w3.org/2001/XMLSchema-instance" boolean ignoreDtd = true String resource Document doc boolean canTransformResource(FileTreeElement element) { def path = element.relativePath.pathString if (resource != null && resource.equalsIgnoreCase(path)) { return true } return false } void transform(TransformerContext context) { Document r try { SAXBuilder builder = new SAXBuilder(false) builder.setExpandEntities(false) if (ignoreDtd) { builder.setEntityResolver(new EntityResolver() { InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException { return new InputSource(new StringReader("")) } }) } r = builder.build(context.is) } catch (JDOMException e) { throw new RuntimeException("Error processing resource " + resource + ": " + e.getMessage(), e) } if (doc == null) { doc = r } else { Element root = r.getRootElement() root.attributes.each { Attribute a -> Element mergedEl = doc.getRootElement() Attribute mergedAtt = mergedEl.getAttribute(a.getName(), a.getNamespace()) if (mergedAtt == null) { mergedEl.setAttribute(a) } } root.children.each { Content n -> doc.getRootElement().addContent(n.clone()) } } } boolean hasTransformedResource() { return doc != null } void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { ZipEntry entry = new ZipEntry(resource) entry.time = TransformerContext.getEntryTimestamp(preserveFileTimestamps, entry.time) os.putNextEntry(entry) new XMLOutputter(Format.getPrettyFormat()).output(doc, os) doc = null } } shadow-4.0.3/src/main/resources/000077500000000000000000000000001337527402300165365ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/META-INF/000077500000000000000000000000001337527402300176765ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/META-INF/gradle-plugins/000077500000000000000000000000001337527402300226135ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/META-INF/gradle-plugins/com.github.johnrengelman.shadow.properties000066400000000000000000000012451337527402300331040ustar00rootroot00000000000000# # Copyright 2011 the original author or authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # implementation-class=com.github.jengelman.gradle.plugins.shadow.ShadowPlugin shadow-4.0.3/src/main/resources/com/000077500000000000000000000000001337527402300173145ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/000077500000000000000000000000001337527402300205765ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/000077500000000000000000000000001337527402300225365ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/000077500000000000000000000000001337527402300237745ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/plugins/000077500000000000000000000000001337527402300254555ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/plugins/shadow/000077500000000000000000000000001337527402300267425ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/plugins/shadow/internal/000077500000000000000000000000001337527402300305565ustar00rootroot00000000000000unixStartScript.txt000066400000000000000000000123371337527402300344340ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/plugins/shadow/internal#!/usr/bin/env sh ############################################################################## ## ## ${applicationName} start up script for UN*X ## ############################################################################## # Attempt to set APP_HOME # Resolve links: \$0 may be a link 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 SAVED="`pwd`" cd "`dirname \"\$PRG\"`/${appHomeRelativePath}" >/dev/null APP_HOME="`pwd -P`" cd "\$SAVED" >/dev/null APP_NAME="${applicationName}" APP_BASE_NAME=`basename "\$0"` # Add default JVM options here. You can also use JAVA_OPTS and ${optsEnvironmentVar} to pass JVM options to this script. DEFAULT_JVM_OPTS=${defaultJvmOpts} # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn ( ) { echo "\$*" } die ( ) { echo echo "\$*" echo exit 1 } # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "`uname`" in CYGWIN* ) cygwin=true ;; Darwin* ) darwin=true ;; MINGW* ) msys=true ;; NONSTOP* ) nonstop=true ;; esac CLASSPATH=$classpath # Determine the Java command to use to start the JVM. if [ -n "\$JAVA_HOME" ] ; then if [ -x "\$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="\$JAVA_HOME/jre/sh/java" else JAVACMD="\$JAVA_HOME/bin/java" fi if [ ! -x "\$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: \$JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. if [ "\$cygwin" = "false" -a "\$darwin" = "false" -a "\$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ \$? -eq 0 ] ; then if [ "\$MAX_FD" = "maximum" -o "\$MAX_FD" = "max" ] ; then MAX_FD="\$MAX_FD_LIMIT" fi ulimit -n \$MAX_FD if [ \$? -ne 0 ] ; then warn "Could not set maximum file descriptor limit: \$MAX_FD" fi else warn "Could not query maximum file descriptor limit: \$MAX_FD_LIMIT" fi fi # For Darwin, add options to specify how the application appears in the dock if \$darwin; then GRADLE_OPTS="\$GRADLE_OPTS \\"-Xdock:name=\$APP_NAME\\" \\"-Xdock:icon=\$APP_HOME/media/gradle.icns\\"" fi # For Cygwin, switch paths to Windows format before running java if \$cygwin ; then APP_HOME=`cygpath --path --mixed "\$APP_HOME"` CLASSPATH=`cygpath --path --mixed "\$CLASSPATH"` JAVACMD=`cygpath --unix "\$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` SEP="" for dir in \$ROOTDIRSRAW ; do ROOTDIRS="\$ROOTDIRS\$SEP\$dir" SEP="|" done OURCYGPATTERN="(^(\$ROOTDIRS))" # Add a user-defined pattern to the cygpath arguments if [ "\$GRADLE_CYGPATTERN" != "" ] ; then OURCYGPATTERN="\$OURCYGPATTERN|(\$GRADLE_CYGPATTERN)" fi # Now convert the arguments - kludge to limit ourselves to /bin/sh i=0 for arg in "\$@" ; do CHECK=`echo "\$arg"|egrep -c "\$OURCYGPATTERN" -` CHECK2=`echo "\$arg"|egrep -c "^-"` ### Determine if an option if [ \$CHECK -ne 0 ] && [ \$CHECK2 -eq 0 ] ; then ### Added a condition eval `echo args\$i`=`cygpath --path --ignore --mixed "\$arg"` else eval `echo args\$i`="\"\$arg\"" fi i=\$((i+1)) done case \$i in (0) set -- ;; (1) set -- "\$args0" ;; (2) set -- "\$args0" "\$args1" ;; (3) set -- "\$args0" "\$args1" "\$args2" ;; (4) set -- "\$args0" "\$args1" "\$args2" "\$args3" ;; (5) set -- "\$args0" "\$args1" "\$args2" "\$args3" "\$args4" ;; (6) set -- "\$args0" "\$args1" "\$args2" "\$args3" "\$args4" "\$args5" ;; (7) set -- "\$args0" "\$args1" "\$args2" "\$args3" "\$args4" "\$args5" "\$args6" ;; (8) set -- "\$args0" "\$args1" "\$args2" "\$args3" "\$args4" "\$args5" "\$args6" "\$args7" ;; (9) set -- "\$args0" "\$args1" "\$args2" "\$args3" "\$args4" "\$args5" "\$args6" "\$args7" "\$args8" ;; esac fi # Escape application args for s in "\${@}" ; do s=\"\$s\" APP_ARGS=\$APP_ARGS" "\$s done # Collect JVM options JVM_OPTS=\$DEFAULT_JVM_OPTS" "\$JAVA_OPTS" "\$${optsEnvironmentVar} # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong if [ "\$(uname)" = "Darwin" ] && [ "\$HOME" = "\$PWD" ]; then cd "\$(dirname "\$0")" fi eval \"\$JAVACMD\" \$JVM_OPTS <% if ( appNameSystemProperty ) { %>\"-D${appNameSystemProperty}=\$APP_BASE_NAME\" <% } %>-jar \"\$CLASSPATH\" \$APP_ARGSwindowsStartScript.txt000066400000000000000000000042741337527402300351440ustar00rootroot00000000000000shadow-4.0.3/src/main/resources/com/github/jengelman/gradle/plugins/shadow/internal@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem ${applicationName} startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=.\ set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME%${appHomeRelativePath} @rem Add default JVM options here. You can also use JAVA_OPTS and ${optsEnvironmentVar} to pass JVM options to this script. set DEFAULT_JVM_OPTS=${defaultJvmOpts} @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo. echo Please set the JAVA_HOME variable in your environment to match the echo location of your Java installation. goto fail :init @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args :win9xME_args @rem Slurp the command line arguments. set CMD_LINE_ARGS= set _SKIP=2 :win9xME_args_slurp if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* :execute @rem Setup the command line set CLASSPATH=$classpath @rem Execute ${applicationName} "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %${optsEnvironmentVar}% <% if ( appNameSystemProperty ) { %>"-D${appNameSystemProperty}=%APP_BASE_NAME%"<% } %> -jar "%CLASSPATH%" %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable ${exitEnvironmentVar} if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! if not "" == "%${exitEnvironmentVar}%" exit 1 exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal :omegashadow-4.0.3/src/main/resources/shadow-version.txt000066400000000000000000000000061337527402300222430ustar00rootroot000000000000004.0.3 shadow-4.0.3/src/main/resources/shadowBanner.txt000066400000000000000000000050061337527402300217130ustar00rootroot00000000000000 . .MMMMMO .M .MMMMMMMMM. MMMM. .MMMMMMMMMMMMMMM. .MMMMMMMMMMMMM .MMMMMMMMMMMM .+MMMMMMMMM,ZMMM. ...7MM8D8MM.ZMMMMM. .. MMZ..MZZNMMMMM .... MMMMMMMZZZ.MMMMMMOOOOOO.. ... 7MMMMMMMMMZZZMIMMMMOOOOOMMMM.. .. .~. .MMMMMOMZZZMZMMOOOOOMMMM MM. .MMMMM ..MMM.7DOMOMOOOOOOOMM MMMMM Z .. MMMMMMM.. . ...MMMMMMMMMOOOOOOMMMMMMMMMM . .MMMMMMM. .MMMMM MMMMMOMOMMMMMMMMMMM MMMMMMMMM .MMM.MMMMMMMMMMMOMMMMMMMMMMM .MMMMMMMM $MMMM MMMMMMMMMMMMMMMMMM MMM MMMMMMNMMMMMMMM M.MMMMMM.MMMMMMMM MMMMMM ..MMMMMMMMMMMMMMMMMMMMMMMMMMMM.MNMMMMMMM . ...MMMMMMMMMMM MMMMMMMMMMMMM.MMMMMMMM. MMMMMMMMMM.MMMMMMMMMMMMMDMMMMMMMM. ..MMMMMMMMMMMMMMMMMMM M,MMMMMMMMMMMMMMMZMMMMM +D , .:DMM.M. MMMMMMM.MMMMMMMMMMMMMMI:MMMMM :MMO . MMMMMMMMMMMMMMMMMMMM.MMMMM8 NMMMN ..MMMMMMMMMMMMMMMMMMMMM MMMMN. .MMMMMMMMMMMMMMMM. MMM7 , . =. MMMMMMMMMMMM.$MM M . MM7 MMMMMMMMM=MI:M8 . MNOM M MMMMMMMMMM. . MMMMMM . +MM http://2.bp.blogspot.com/-urTvlwNjLeo/UGg5z9lxw5I/AAAAAAAAHRM/RCbSBi4I60s/s1600/The_Shadow_Knows_by_E_Mann.jpegshadow-4.0.3/src/test/000077500000000000000000000000001337527402300145575ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/000077500000000000000000000000001337527402300161045ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/000077500000000000000000000000001337527402300166625ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/000077500000000000000000000000001337527402300201445ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/000077500000000000000000000000001337527402300221045ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/000077500000000000000000000000001337527402300233425ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/000077500000000000000000000000001337527402300250235ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/000077500000000000000000000000001337527402300263105ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/ApplicationSpec.groovy000066400000000000000000000127241337527402300326430ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.util.AppendableMavenFileRepository import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import org.apache.tools.zip.ZipFile import org.gradle.testkit.runner.BuildResult import spock.lang.Issue import java.util.jar.Attributes import java.util.jar.JarFile class ApplicationSpec extends PluginSpecification { AppendableMavenFileRepository repo AppendableMavenFileRepository publishingRepo def setup() { repo = repo() publishingRepo = repo('remote_repo') } def 'integration with application plugin'() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() file('src/main/java/myapp/Main.java') << """ package myapp; public class Main { public static void main(String[] args) { System.out.println("TestApp: Hello World! (" + args[0] + ")"); } } """.stripIndent() buildFile << """ apply plugin: 'application' mainClassName = 'myapp.Main' dependencies { compile 'shadow:a:1.0' } runShadow { args 'foo' } """.stripIndent() settingsFile << "rootProject.name = 'myapp'" when: BuildResult result = runner.withArguments('runShadow', '--stacktrace').build() then: 'tests that runShadow executed and exited' assert result.output.contains('TestApp: Hello World! (foo)') and: 'Check that the proper jar file was installed' File installedJar = file('build/install/myapp-shadow/lib/myapp-1.0-all.jar') assert installedJar.exists() and: 'And that jar file as the correct files in it' contains(installedJar, ['a.properties', 'a2.properties', 'myapp/Main.class']) and: 'Check the manifest attributes in the jar file are correct' JarFile jar = new JarFile(installedJar) Attributes attributes = jar.manifest.mainAttributes assert attributes.getValue('Main-Class') == 'myapp.Main' then: 'Check that the start scripts is written out and has the correct Java invocation' File startScript = file('build/install/myapp-shadow/bin/myapp') assert startScript.exists() assert startScript.text.contains("CLASSPATH=\$APP_HOME/lib/myapp-1.0-all.jar") assert startScript.text.contains("eval \\\"\$JAVACMD\\\" \$JVM_OPTS -jar \\\"\$CLASSPATH\\\" \$APP_ARGS") cleanup: jar?.close() } @Issue('SHADOW-89') def 'shadow application distributions should use shadow jar'() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() file('src/main/java/myapp/Main.java') << """ package myapp; public class Main { public static void main(String[] args) { System.out.println("TestApp: Hello World! (" + args[0] + ")"); } } """.stripIndent() buildFile << """ apply plugin: 'application' mainClassName = 'myapp.Main' dependencies { shadow 'shadow:a:1.0' } runShadow { args 'foo' } """.stripIndent() settingsFile << "rootProject.name = 'myapp'" when: runner.withArguments('shadowDistZip', '--stacktrace').build() then: 'Check that the distribution zip was created' File zip = file('build/distributions/myapp-shadow-1.0.zip') assert zip.exists() and: 'Check that the zip contains the correct library files & scripts' ZipFile zipFile = new ZipFile(zip) println zipFile.entries.collect { it.name } assert zipFile.entries.find { it.name == 'myapp-shadow-1.0/lib/myapp-1.0-all.jar' } assert zipFile.entries.find { it.name == 'myapp-shadow-1.0/lib/a-1.0.jar'} cleanup: zipFile?.close() } @Issue('SHADOW-90') def 'installShadow does not execute dependent shadow task'() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() file('src/main/java/myapp/Main.java') << """ package myapp; public class Main { public static void main(String[] args) { System.out.println("TestApp: Hello World! (" + args[0] + ")"); } } """.stripIndent() buildFile << """ apply plugin: 'application' mainClassName = 'myapp.Main' dependencies { compile 'shadow:a:1.0' } runShadow { args 'foo' } """.stripIndent() settingsFile << "rootProject.name = 'myapp'" when: runner.withArguments(ShadowApplicationPlugin.SHADOW_INSTALL_TASK_NAME).build() then: 'Check that the proper jar file was installed' File installedJar = file('build/install/myapp-shadow/lib/myapp-1.0-all.jar') assert installedJar.exists() } } ConfigureShadowRelocationSpec.groovy000066400000000000000000000032701337527402300354240ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadowpackage com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification class ConfigureShadowRelocationSpec extends PluginSpecification { def "auto relocate plugin dependencies"() { given: buildFile << """ task relocateShadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation) { target = tasks.shadowJar } tasks.shadowJar.dependsOn tasks.relocateShadowJar dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() when: runner.withArguments('shadowJar', '-s').build() then: then: contains(output, [ 'META-INF/MANIFEST.MF', 'shadow/junit/textui/ResultPrinter.class', 'shadow/junit/textui/TestRunner.class', 'shadow/junit/framework/Assert.class', 'shadow/junit/framework/AssertionFailedError.class', 'shadow/junit/framework/ComparisonCompactor.class', 'shadow/junit/framework/ComparisonFailure.class', 'shadow/junit/framework/Protectable.class', 'shadow/junit/framework/Test.class', 'shadow/junit/framework/TestCase.class', 'shadow/junit/framework/TestFailure.class', 'shadow/junit/framework/TestListener.class', 'shadow/junit/framework/TestResult$1.class', 'shadow/junit/framework/TestResult.class', 'shadow/junit/framework/TestSuite$1.class', 'shadow/junit/framework/TestSuite.class' ]) } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/FilteringSpec.groovy000066400000000000000000000272111337527402300323200ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.TaskOutcome import spock.lang.Ignore import spock.lang.IgnoreRest import spock.lang.Issue class FilteringSpec extends PluginSpecification { def setup() { repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() repo.module('shadow', 'b', '1.0') .insertFile('b.properties', 'b') .publish() buildFile << """ dependencies { compile 'shadow:a:1.0' compile 'shadow:b:1.0' } """.stripIndent() } def 'include all dependencies'() { when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties']) } def 'exclude files'() { given: buildFile << """ // tag::excludeFile[] shadowJar { exclude 'a2.properties' } // end::excludeFile[] """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'b.properties']) and: doesNotContain(output, ['a2.properties']) } def "exclude dependency"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() buildFile << ''' // tag::excludeDep[] dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { exclude(dependency('shadow:d:1.0')) } } // end::excludeDep[] '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) and: doesNotContain(output, ['d.properties']) } @Issue('SHADOW-83') def "exclude dependency using wildcard syntax"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() buildFile << ''' // tag::excludeDepWildcard[] dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { exclude(dependency('shadow:d:.*')) } } // end::excludeDepWildcard[] '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) and: doesNotContain(output, ['d.properties']) } @Issue("SHADOW-54") @Ignore("TODO - need to figure out the test pollution here") def "dependency exclusions affect UP-TO-DATE check"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() buildFile << ''' dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { exclude(dependency('shadow:d:1.0')) } } '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) and: doesNotContain(output, ['d.properties']) when: 'Update build file shadowJar dependency exclusion' buildFile.text = buildFile.text.replace('exclude(dependency(\'shadow:d:1.0\'))', 'exclude(dependency(\'shadow:c:1.0\'))') BuildResult result = runner.withArguments('shadowJar').build() then: assert result.task(':shadowJar').outcome == TaskOutcome.SUCCESS and: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'd.properties']) and: doesNotContain(output, ['c.properties']) } @Issue("SHADOW-62") @Ignore def "project exclusions affect UP-TO-DATE check"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() buildFile << ''' dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { exclude(dependency('shadow:d:1.0')) } } '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) and: doesNotContain(output, ['d.properties']) when: 'Update build file shadowJar dependency exclusion' buildFile.text << ''' shadowJar { exclude 'a.properties' } '''.stripIndent() BuildResult result = runner.withArguments('shadowJar').build() then: assert result.task(':shadowJar').outcome == TaskOutcome.SUCCESS and: contains(output, ['a2.properties', 'b.properties', 'd.properties']) and: doesNotContain(output, ['a.properties', 'c.properties']) } def "include dependency, excluding all others"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() file('src/main/java/shadow/Passed.java') << ''' package shadow; public class Passed {} '''.stripIndent() buildFile << ''' dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { include(dependency('shadow:d:1.0')) } } '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['d.properties', 'shadow/Passed.class']) and: doesNotContain(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) } def 'filter project dependencies'() { given: buildFile.text = '' file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ ${defaultBuildScript} dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; public class Server {} """.stripIndent() file('server/build.gradle') << """ ${defaultBuildScript} // tag::excludeProject[] dependencies { compile project(':client') } shadowJar { dependencies { exclude(project(':client')) } } // end::excludeProject[] """.stripIndent() File serverOutput = file('server/build/libs/server-1.0-all.jar') when: runner.withArguments(':server:shadowJar').build() then: doesNotContain(serverOutput, [ 'client/Client.class', ]) and: contains(serverOutput, ['server/Server.class', 'junit/framework/Test.class']) } def 'exclude a transitive project dependency'() { given: buildFile.text = '' file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ ${defaultBuildScript} dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; public class Server {} """.stripIndent() file('server/build.gradle') << """ ${defaultBuildScript} dependencies { compile project(':client') } // tag::excludeSpec[] shadowJar { dependencies { exclude(dependency { it.moduleGroup == 'junit' }) } } // end::excludeSpec[] """.stripIndent() File serverOutput = file('server/build/libs/server-1.0-all.jar') when: runner.withArguments(':server:shadowJar').build() then: doesNotContain(serverOutput, [ 'junit/framework/Test.class' ]) and: contains(serverOutput, [ 'client/Client.class', 'server/Server.class']) } //http://mail-archives.apache.org/mod_mbox/ant-user/200506.mbox/%3C001d01c57756$6dc35da0$dc00a8c0@CTEGDOMAIN.COM%3E def 'verify exclude precedence over include'() { given: buildFile << """ // tag::excludeOverInclude[] shadowJar { include '*.jar' include '*.properties' exclude 'a2.properties' } // end::excludeOverInclude[] """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'b.properties']) and: doesNotContain(output, ['a2.properties']) } @Issue("SHADOW-69") def "handle exclude with circular dependency"() { given: repo.module('shadow', 'c', '1.0') .insertFile('c.properties', 'c') .dependsOn('d') .publish() repo.module('shadow', 'd', '1.0') .insertFile('d.properties', 'd') .dependsOn('c') .publish() buildFile << ''' dependencies { compile 'shadow:d:1.0' } shadowJar { dependencies { exclude(dependency('shadow:d:1.0')) } } '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'a2.properties', 'b.properties', 'c.properties']) and: doesNotContain(output, ['d.properties']) } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/PublishingSpec.groovy000066400000000000000000000104601337527402300324770ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.util.AppendableMavenFileRepository import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification class PublishingSpec extends PluginSpecification { AppendableMavenFileRepository repo AppendableMavenFileRepository publishingRepo def setup() { repo = repo() publishingRepo = repo('remote_repo') } def "publish shadow jar with maven plugin"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() repo.module('shadow', 'b', '1.0') .insertFile('b.properties', 'b') .publish() settingsFile << "rootProject.name = 'maven'" buildFile << """ apply plugin: 'maven' dependencies { compile 'shadow:a:1.0' shadow 'shadow:b:1.0' } shadowJar { baseName = 'maven-all' classifier = null } uploadShadow { repositories { mavenDeployer { repository(url: "${publishingRepo.uri}") } } } """.stripIndent() when: runner.withArguments('uploadShadow').build() then: 'Check that shadow artifact exists' File publishedFile = publishingRepo.rootDir.file('shadow/maven-all/1.0/maven-all-1.0.jar').canonicalFile assert publishedFile.exists() and: 'Check contents of shadow artifact' contains(publishedFile, ['a.properties', 'a2.properties']) and: 'Check that shadow artifact pom exists and contents' File pom = publishingRepo.rootDir.file('shadow/maven-all/1.0/maven-all-1.0.pom').canonicalFile assert pom.exists() def contents = new XmlSlurper().parse(pom) assert contents.dependencies.size() == 1 assert contents.dependencies[0].dependency.size() == 1 def dependency = contents.dependencies[0].dependency[0] assert dependency.groupId.text() == 'shadow' assert dependency.artifactId.text() == 'b' assert dependency.version.text() == '1.0' } def "publish shadow jar with maven-publish plugin"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() repo.module('shadow', 'b', '1.0') .insertFile('b.properties', 'b') .publish() settingsFile << "rootProject.name = 'maven'" buildFile << """ apply plugin: 'maven-publish' dependencies { compile 'shadow:a:1.0' shadow 'shadow:b:1.0' } shadowJar { classifier = '' baseName = 'maven-all' } publishing { publications { shadow(MavenPublication) { publication -> project.shadow.component(publication) artifactId = 'maven-all' } } repositories { maven { url "${publishingRepo.uri}" } } } """.stripIndent() when: runner.withArguments('publish').build() then: File publishedFile = publishingRepo.rootDir.file('shadow/maven-all/1.0/maven-all-1.0.jar').canonicalFile assert publishedFile.exists() and: contains(publishedFile, ['a.properties', 'a2.properties']) and: File pom = publishingRepo.rootDir.file('shadow/maven-all/1.0/maven-all-1.0.pom').canonicalFile assert pom.exists() def contents = new XmlSlurper().parse(pom) assert contents.dependencies.size() == 1 assert contents.dependencies[0].dependency.size() == 1 def dependency = contents.dependencies[0].dependency[0] assert dependency.groupId.text() == 'shadow' assert dependency.artifactId.text() == 'b' assert dependency.version.text() == '1.0' } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/RelocationSpec.groovy000066400000000000000000000235511337527402300324770ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import spock.lang.Issue import java.util.jar.Attributes import java.util.jar.JarFile class RelocationSpec extends PluginSpecification { @Issue('SHADOW-58') def "relocate dependency files"() { given: buildFile << """ dependencies { compile 'junit:junit:3.8.2' } shadowJar { relocate 'junit.textui', 'a' relocate 'junit.framework', 'b' manifest { attributes 'TEST-VALUE': 'FOO' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, [ 'META-INF/MANIFEST.MF', 'a/ResultPrinter.class', 'a/TestRunner.class', 'b/Assert.class', 'b/AssertionFailedError.class', 'b/ComparisonCompactor.class', 'b/ComparisonFailure.class', 'b/Protectable.class', 'b/Test.class', 'b/TestCase.class', 'b/TestFailure.class', 'b/TestListener.class', 'b/TestResult$1.class', 'b/TestResult.class', 'b/TestSuite$1.class', 'b/TestSuite.class' ]) and: doesNotContain(output, [ 'junit/textui/ResultPrinter.class', 'junit/textui/TestRunner.class', 'junit/framework/Assert.class', 'junit/framework/AssertionFailedError.class', 'junit/framework/ComparisonCompactor.class', 'junit/framework/ComparisonFailure.class', 'junit/framework/Protectable.class', 'junit/framework/Test.class', 'junit/framework/TestCase.class', 'junit/framework/TestFailure.class', 'junit/framework/TestListener.class', 'junit/framework/TestResult$1.class', 'junit/framework/TestResult.class', 'junit/framework/TestSuite$1.class', 'junit/framework/TestSuite.class' ]) and: 'Test that manifest file exists with contents' JarFile jar = new JarFile(output) Attributes attributes = jar.manifest.getMainAttributes() String val = attributes.getValue('TEST-VALUE') assert val == 'FOO' } def "relocate dependency files with filtering"() { given: buildFile << """ dependencies { compile 'junit:junit:3.8.2' } // tag::relocateFilter[] shadowJar { relocate('junit.textui', 'a') { exclude 'junit.textui.TestRunner' } relocate('junit.framework', 'b') { include 'junit.framework.Test*' } } // end::relocateFilter[] """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, [ 'a/ResultPrinter.class', 'b/Test.class', 'b/TestCase.class', 'b/TestFailure.class', 'b/TestListener.class', 'b/TestResult$1.class', 'b/TestResult.class', 'b/TestSuite$1.class', 'b/TestSuite.class' ]) and: doesNotContain(output, [ 'a/TestRunner.class', 'b/Assert.class', 'b/AssertionFailedError.class', 'b/ComparisonCompactor.class', 'b/ComparisonFailure.class', 'b/Protectable.class' ]) and: contains(output, [ 'junit/textui/TestRunner.class', 'junit/framework/Assert.class', 'junit/framework/AssertionFailedError.class', 'junit/framework/ComparisonCompactor.class', 'junit/framework/ComparisonFailure.class', 'junit/framework/Protectable.class' ]) } @Issue(['SHADOW-55', 'SHADOW-53']) def "remap class names for relocated files in project source"() { given: buildFile << """ dependencies { compile 'junit:junit:3.8.2' } // tag::relocate[] shadowJar { relocate 'junit.framework', 'shadow.junit' } // end::relocate[] """.stripIndent() file('src/main/java/shadow/ShadowTest.java') << ''' package shadow; import junit.framework.Test; import junit.framework.TestResult; public class ShadowTest implements Test { public int countTestCases() { return 0; } public void run(TestResult result) { } } '''.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, [ 'shadow/ShadowTest.class', 'shadow/junit/Test.class', 'shadow/junit' ]) and: doesNotContain(output, [ 'junit/framework', 'junit/framework/Test.class' ]) and: 'check that the class can be loaded. If the file was not relocated properly, we should get a NoDefClassFound' // Isolated class loader with only the JVM system jars and the output jar from the test project URLClassLoader classLoader = new URLClassLoader([output.toURI().toURL()] as URL[], ClassLoader.systemClassLoader.parent) classLoader.loadClass('shadow.ShadowTest') } @Issue('SHADOW-61') def "relocate does not drop dependency resources"() { given: 'Core project with dependency and resource' file('core/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('core/src/main/resources/TEST') << 'TEST RESOURCE' file('core/src/main/resources/test.properties') << 'name=test' file('core/src/main/java/core/Core.java') << ''' package core; import junit.framework.Test; public class Core {} '''.stripIndent() and: 'App project with shadow, relocation, and project dependency' file('app/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' repositories { maven { url "${repo.uri}" } } dependencies { compile project(':core') } shadowJar { relocate 'core', 'app.core' relocate 'junit.framework', 'app.junit.framework' } """.stripIndent() file('app/src/main/resources/APP-TEST') << 'APP TEST RESOURCE' file('app/src/main/java/app/App.java') << ''' package app; import core.Core; import junit.framework.Test; public class App {} '''.stripIndent() and: 'Configure multi-project build' settingsFile << ''' include 'core', 'app' '''.stripIndent() when: runner.withArguments(':app:shadowJar').build() then: File appOutput = file('app/build/libs/app-all.jar') assert appOutput.exists() and: contains(appOutput, [ 'TEST', 'APP-TEST', 'test.properties', 'app/core/Core.class', 'app/App.class', 'app/junit/framework/Test.class' ]) } @Issue(['SHADOW-93', 'SHADOW-114']) def "relocate resource files"() { given: repo.module('shadow', 'dep', '1.0') .insertFile('foo/dep.properties', 'c') .publish() file('src/main/java/foo/Foo.java') << ''' package foo; class Foo {} '''.stripIndent() file('src/main/resources/foo/foo.properties') << 'name=foo' buildFile << """ dependencies { compile 'shadow:dep:1.0' } shadowJar { relocate 'foo', 'bar' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, [ 'bar/Foo.class', 'bar/foo.properties', 'bar/dep.properties' ]) and: doesNotContain(output, [ 'foo/Foo.class', 'foo/foo.properties', 'foo/dep.properties' ]) } @Issue("SHADOW-294") def "does not error on relocating java9 classes"() { given: buildFile << """ repositories { jcenter() maven { url 'http://repository.mapr.com/nexus/content/groups/mapr-public' } } dependencies { compile 'org.slf4j:slf4j-api:1.7.21' compile group: 'io.netty', name: 'netty-all', version: '4.0.23.Final' compile group: 'com.google.protobuf', name: 'protobuf-java', version: '2.5.0' compile group: 'org.apache.zookeeper', name: 'zookeeper', version: '3.4.6' compile group: 'org.hbase', name: 'asynchbase', version: '1.7.0-mapr-1603' } shadowJar { zip64 true relocate 'com.google.protobuf', 'shaded.com.google.protobuf' relocate 'io.netty', 'shaded.io.netty' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: noExceptionThrown() } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/ShadowPluginSpec.groovy000066400000000000000000000711731337527402300330070ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import org.gradle.api.Project import org.gradle.api.artifacts.Configuration import org.gradle.api.plugins.JavaPlugin import org.gradle.testfixtures.ProjectBuilder import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import spock.lang.Ignore import spock.lang.Issue import spock.lang.Unroll import java.util.jar.Attributes import java.util.jar.JarFile class ShadowPluginSpec extends PluginSpecification { def 'apply plugin'() { given: String projectName = 'myshadow' String version = '1.0.0' Project project = ProjectBuilder.builder().withName(projectName).build() project.version = version when: project.plugins.apply(ShadowPlugin) then: project.plugins.hasPlugin(ShadowPlugin) and: assert !project.tasks.findByName('shadowJar') when: project.plugins.apply(JavaPlugin) then: ShadowJar shadow = project.tasks.findByName('shadowJar') assert shadow assert shadow.baseName == projectName assert shadow.destinationDir == new File(project.buildDir, 'libs') assert shadow.version == version assert shadow.classifier == 'all' assert shadow.extension == 'jar' and: Configuration shadowConfig = project.configurations.findByName('shadow') assert shadowConfig shadowConfig.artifacts.file.contains(shadow.archivePath) } @Unroll def 'Compatible with Gradle #version'() { given: GradleRunner versionRunner = runner .withGradleVersion(version) .withArguments('--stacktrace') .withDebug(true) File one = buildJar('one.jar').insertFile('META-INF/services/shadow.Shadow', 'one # NOTE: No newline terminates this line/file').write() repo.module('shadow', 'two', '1.0').insertFile('META-INF/services/shadow.Shadow', 'two # NOTE: No newline terminates this line/file').publish() buildFile << """ dependencies { compile 'junit:junit:3.8.2' compile files('${escapedPath(one)}') } shadowJar { mergeServiceFiles() } """.stripIndent() when: versionRunner.withArguments('shadowJar', '--stacktrace').build() then: assert output.exists() where: version << ['4.0', '4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9', '4.10', '5.0-rc-4'] } def 'Error in Gradle versions < 4.0'() { given: GradleRunner versionRunner = GradleRunner.create() .withGradleVersion('3.5') .withArguments('--stacktrace') .withProjectDir(dir.root) .forwardOutput() .withDebug(true) .withTestKitDir(getTestKitDir()) buildFile << """ dependencies { compile 'junit:junit:3.8.2' } shadowJar { mergeServiceFiles() } """.stripIndent() expect: versionRunner.withArguments('shadowJar', '--stacktrace').buildAndFail() } def 'shadow copy'() { given: URL artifact = this.class.classLoader.getResource('test-artifact-1.0-SNAPSHOT.jar') URL project = this.class.classLoader.getResource('test-project-1.0-SNAPSHOT.jar') buildFile << """ shadowJar { from('${artifact.path}') from('${project.path}') } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() } def 'include project sources'() { given: file('src/main/java/shadow/Passed.java') << ''' package shadow; public class Passed {} '''.stripIndent() buildFile << """ dependencies { compile 'junit:junit:3.8.2' } // tag::rename[] shadowJar { baseName = 'shadow' classifier = null version = null } // end::rename[] """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output("shadow.jar"), ['shadow/Passed.class', 'junit/framework/Test.class']) and: doesNotContain(output("shadow.jar"), ['/']) } def 'include project dependencies'() { given: file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; public class Server {} """.stripIndent() file('server/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' repositories { maven { url "${repo.uri}" } } dependencies { compile project(':client') } """.stripIndent() File serverOutput = file('server/build/libs/server-all.jar') when: runner.withArguments(':server:shadowJar').build() then: contains(serverOutput, [ 'client/Client.class', 'server/Server.class', 'junit/framework/Test.class' ]) } /** * 'Server' depends on 'Client'. 'junit' is independent. * The minimize shall remove 'junit'. */ def 'minimize by keeping only transitive dependencies'() { given: file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; public class Server { private final String client = Client.class.getName(); } """.stripIndent() file('server/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' shadowJar { minimize() } repositories { maven { url "${repo.uri}" } } dependencies { compile project(':client') } """.stripIndent() File serverOutput = file('server/build/libs/server-all.jar') when: runner.withArguments(':server:shadowJar', '--stacktrace').withDebug(true).build() then: contains(serverOutput, [ 'client/Client.class', 'server/Server.class' ]) doesNotContain(serverOutput, ['junit/framework/Test.class']) } /** * 'Client', 'Server' and 'junit' are independent. * 'junit' is excluded from the minimize. * The minimize shall remove 'Client' but not 'junit'. */ def 'exclude a dependency from minimize'() { given: file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; public class Server {} """.stripIndent() file('server/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' shadowJar { minimize { exclude(dependency('junit:junit:.*')) } } repositories { maven { url "${repo.uri}" } } dependencies { compile project(':client') } """.stripIndent() File serverOutput = file('server/build/libs/server-all.jar') when: runner.withArguments(':server:shadowJar', '--stacktrace').withDebug(true).build() then: contains(serverOutput, [ 'server/Server.class', 'junit/framework/Test.class' ]) doesNotContain(serverOutput, ['client/Client.class']) } /** * 'api' used as api for 'impl', and depended on 'lib'. 'junit' is independent. * The minimize shall remove 'junit', but not 'api'. * Unused classes of 'api' and theirs dependencies also shouldn't be removed. */ def 'use minimize with dependencies with api scope'() { given: file('settings.gradle') << """ include 'api', 'lib', 'impl' """.stripIndent() file('lib/src/main/java/lib/LibEntity.java') << """ package lib; public interface LibEntity {} """.stripIndent() file('lib/src/main/java/lib/UnusedLibEntity.java') << """ package lib; public class UnusedLibEntity implements LibEntity {} """.stripIndent() file('lib/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } """.stripIndent() file('api/src/main/java/api/Entity.java') << """ package api; public interface Entity {} """.stripIndent() file('api/src/main/java/api/UnusedEntity.java') << """ package api; import lib.LibEntity; public class UnusedEntity implements LibEntity {} """.stripIndent() file('api/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' compile project(':lib') } """.stripIndent() file('impl/src/main/java/impl/SimpleEntity.java') << """ package impl; import api.Entity; public class SimpleEntity implements Entity {} """.stripIndent() file('impl/build.gradle') << """ apply plugin: 'java-library' apply plugin: 'com.github.johnrengelman.shadow' shadowJar { minimize() } repositories { maven { url "${repo.uri}" } } dependencies { api project(':api') } """.stripIndent() File serverOutput = file('impl/build/libs/impl-all.jar') when: runner.withArguments(':impl:shadowJar', '--stacktrace').withDebug(true).build() then: contains(serverOutput, [ 'impl/SimpleEntity.class', 'api/Entity.class', 'api/UnusedEntity.class', 'lib/LibEntity.class', ]) doesNotContain(serverOutput, ['junit/framework/Test.class', 'lib/UnusedLibEntity.class']) } /** * 'api' used as api for 'impl', and 'lib' used as api for 'api'. * Unused classes of 'api' and 'lib' shouldn't be removed. */ def 'use minimize with transitive dependencies with api scope'() { given: file('settings.gradle') << """ include 'api', 'lib', 'impl' """.stripIndent() file('lib/src/main/java/lib/LibEntity.java') << """ package lib; public interface LibEntity {} """.stripIndent() file('lib/src/main/java/lib/UnusedLibEntity.java') << """ package lib; public class UnusedLibEntity implements LibEntity {} """.stripIndent() file('lib/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } """.stripIndent() file('api/src/main/java/api/Entity.java') << """ package api; public interface Entity {} """.stripIndent() file('api/src/main/java/api/UnusedEntity.java') << """ package api; import lib.LibEntity; public class UnusedEntity implements LibEntity {} """.stripIndent() file('api/build.gradle') << """ apply plugin: 'java-library' repositories { maven { url "${repo.uri}" } } dependencies { api project(':lib') } """.stripIndent() file('impl/src/main/java/impl/SimpleEntity.java') << """ package impl; import api.Entity; public class SimpleEntity implements Entity {} """.stripIndent() file('impl/build.gradle') << """ apply plugin: 'java-library' apply plugin: 'com.github.johnrengelman.shadow' shadowJar { minimize() } repositories { maven { url "${repo.uri}" } } dependencies { api project(':api') } """.stripIndent() File serverOutput = file('impl/build/libs/impl-all.jar') when: runner.withArguments(':impl:shadowJar', '--stacktrace').withDebug(true).build() then: contains(serverOutput, [ 'impl/SimpleEntity.class', 'api/Entity.class', 'api/UnusedEntity.class', 'lib/LibEntity.class', 'lib/UnusedLibEntity.class' ]) } def 'depend on project shadow jar'() { given: file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } shadowJar { relocate 'junit.framework', 'client.junit.framework' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; import client.junit.framework.Test; public class Server {} """.stripIndent() file('server/build.gradle') << """ apply plugin: 'java' repositories { maven { url "${repo.uri}" } } dependencies { compile project(path: ':client', configuration: 'shadow') } """.stripIndent() File serverOutput = file('server/build/libs/server.jar') when: runner.withArguments(':server:jar').build() then: contains(serverOutput, [ 'server/Server.class' ]) and: doesNotContain(serverOutput, [ 'client/Client.class', 'junit/framework/Test.class', 'client/junit/framework/Test.class' ]) } def 'shadow a project shadow jar'() { given: file('settings.gradle') << """ include 'client', 'server' """.stripIndent() file('client/src/main/java/client/Client.java') << """ package client; public class Client {} """.stripIndent() file('client/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' repositories { maven { url "${repo.uri}" } } dependencies { compile 'junit:junit:3.8.2' } shadowJar { relocate 'junit.framework', 'client.junit.framework' } """.stripIndent() file('server/src/main/java/server/Server.java') << """ package server; import client.Client; import client.junit.framework.Test; public class Server {} """.stripIndent() file('server/build.gradle') << """ apply plugin: 'java' apply plugin: 'com.github.johnrengelman.shadow' repositories { maven { url "${repo.uri}" } } dependencies { compile project(path: ':client', configuration: 'shadow') } """.stripIndent() File serverOutput = file('server/build/libs/server-all.jar') when: runner.withArguments(':server:shadowJar').build() then: contains(serverOutput, [ 'client/Client.class', 'client/junit/framework/Test.class', 'server/Server.class', ]) and: doesNotContain(serverOutput, [ 'junit/framework/Test.class' ]) } def "exclude INDEX.LIST, *.SF, *.DSA, and *.RSA by default"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('META-INF/INDEX.LIST', 'JarIndex-Version: 1.0') .insertFile('META-INF/a.SF', 'Signature File') .insertFile('META-INF/a.DSA', 'DSA Signature Block') .insertFile('META-INF/a.RSA', 'RSA Signature Block') .insertFile('META-INF/a.properties', 'key=value') .publish() file('src/main/java/shadow/Passed.java') << ''' package shadow; public class Passed {} '''.stripIndent() buildFile << """ dependencies { compile 'shadow:a:1.0' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties', 'META-INF/a.properties']) and: doesNotContain(output, ['META-INF/INDEX.LIST', 'META-INF/a.SF', 'META-INF/a.DSA', 'META-INF/a.RSA']) } def "include runtime configuration by default"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .publish() repo.module('shadow', 'b', '1.0') .insertFile('b.properties', 'b') .publish() buildFile << """ dependencies { runtime 'shadow:a:1.0' shadow 'shadow:b:1.0' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties']) and: doesNotContain(output, ['b.properties']) } def "include java-library configurations by default"() { given: GradleRunner versionRunner = runner .withGradleVersion('4.0') .withArguments('--stacktrace') .withDebug(true) repo.module('shadow', 'api', '1.0') .insertFile('api.properties', 'api') .publish() repo.module('shadow', 'implementation-dep', '1.0') .insertFile('implementation-dep.properties', 'implementation-dep') .publish() repo.module('shadow', 'implementation', '1.0') .insertFile('implementation.properties', 'implementation') .dependsOn('implementation-dep') .publish() repo.module('shadow', 'compile', '1.0') .insertFile('compile.properties', 'compile') .publish() repo.module('shadow', 'runtime', '1.0') .insertFile('runtime.properties', 'runtime') .publish() repo.module('shadow', 'runtimeOnly', '1.0') .insertFile('runtimeOnly.properties', 'runtimeOnly') .publish() buildFile.text = defaultBuildScript.replace('java', 'java-library') buildFile << """ dependencies { api 'shadow:api:1.0' implementation 'shadow:implementation:1.0' compile 'shadow:compile:1.0' runtime 'shadow:runtime:1.0' runtimeOnly 'shadow:runtimeOnly:1.0' } """.stripIndent() when: versionRunner.withArguments('shadowJar').build() then: contains(output, ['api.properties', 'implementation.properties', 'compile.properties', 'runtime.properties', 'runtimeOnly.properties', 'implementation-dep.properties']) } def "doesn't include compileOnly configuration by default"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .publish() repo.module('shadow', 'b', '1.0') .insertFile('b.properties', 'b') .publish() buildFile << """ dependencies { runtime 'shadow:a:1.0' compileOnly 'shadow:b:1.0' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: contains(output, ['a.properties']) and: doesNotContain(output, ['b.properties']) } def "default copying strategy"() { given: repo.module('shadow', 'a', '1.0') .insertFile('META-INF/MANIFEST.MF', 'MANIFEST A') .publish() repo.module('shadow', 'b', '1.0') .insertFile('META-INF/MANIFEST.MF', 'MANIFEST B') .publish() buildFile << """ dependencies { runtime 'shadow:a:1.0' runtime 'shadow:b:1.0' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: JarFile jar = new JarFile(output) assert jar.entries().collect().size() == 2 } def "Class-Path in Manifest not added if empty"() { given: buildFile << """ dependencies { compile 'junit:junit:3.8.2' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: JarFile jar = new JarFile(output) Attributes attributes = jar.manifest.getMainAttributes() assert attributes.getValue('Class-Path') == null } @Issue('SHADOW-65') def "add shadow configuration to Class-Path in Manifest"() { given: buildFile << """ // tag::shadowConfig[] dependencies { shadow 'junit:junit:3.8.2' } // end::shadowConfig[] // tag::jarManifest[] jar { manifest { attributes 'Class-Path': '/libs/a.jar' } } // end::jarManifest[] """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: 'SHADOW-65 - combine w/ existing Class-Path' JarFile jar = new JarFile(output) Attributes attributes = jar.manifest.getMainAttributes() String classpath = attributes.getValue('Class-Path') assert classpath == '/libs/a.jar junit-3.8.2.jar' } @Issue('SHADOW-92') def "do not include null value in Class-Path when jar file does not contain Class-Path"() { given: buildFile << """ dependencies { shadow 'junit:junit:3.8.2' } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: JarFile jar = new JarFile(output) Attributes attributes = jar.manifest.getMainAttributes() String classpath = attributes.getValue('Class-Path') assert classpath == 'junit-3.8.2.jar' } @Issue('SHADOW-256') def "allow configuration of non-maven projects with uploads"() { given: buildFile << """ configurations.each { configuration -> def upload = project.getTasks().getByName(configuration.getUploadTaskName()) upload.repositories.ivy { layout 'ivy' url "\$buildDir/repo" } } """ when: runner.withArguments('shadowJar').build() then: assert output.exists() } @Issue('SHADOW-203') def "support ZipCompression.STORED"() { given: buildFile << """ dependencies { shadow 'junit:junit:3.8.2' } shadowJar { zip64 true entryCompression = org.gradle.api.tasks.bundling.ZipEntryCompression.STORED } """.stripIndent() when: runner.withArguments('shadowJar', '--stacktrace').build() then: assert output.exists() } @Issue('SHADOW-143') @Ignore("This spec requires > 15 minutes and > 8GB of disk space to run") def "check large zip files with zip64 enabled"() { given: repo.module('shadow', 'a', '1.0') .insertFile('a.properties', 'a') .insertFile('a2.properties', 'a2') .publish() file('src/main/java/myapp/Main.java') << """ package myapp; public class Main { public static void main(String[] args) { System.out.println("TestApp: Hello World! (" + args[0] + ")"); } } """.stripIndent() buildFile << """ apply plugin: 'application' mainClassName = 'myapp.Main' dependencies { compile 'shadow:a:1.0' } def generatedResourcesDir = new File(project.buildDir, "generated-resources") task generateResources { doLast { def rnd = new Random() def buf = new byte[128 * 1024] for (x in 0..255) { def dir = new File(generatedResourcesDir, x.toString()) dir.mkdirs() for (y in 0..255) { def file = new File(dir, y.toString()) rnd.nextBytes(buf) file.bytes = buf } } } } sourceSets { main { output.dir(generatedResourcesDir, builtBy: generateResources) } } shadowJar { zip64 = true } runShadow { args 'foo' } """.stripIndent() settingsFile << "rootProject.name = 'myapp'" when: BuildResult result = runner.withArguments('runShadow', '--stacktrace').build() then: 'tests that runShadow executed and exited' assert result.output.contains('TestApp: Hello World! (foo)') } @Issue("SHADOW-303") def "doesn't error when adding aspectj plugin"() { given: buildFile.text = """ buildscript { repositories { maven { url "https://maven.eveoh.nl/content/repositories/releases" } } dependencies { classpath "nl.eveoh:gradle-aspectj:2.0" } } """.stripIndent() buildFile << defaultBuildScript buildFile << """ project.ext { aspectjVersion = '1.8.12' } apply plugin: 'aspectj' apply plugin: 'application' mainClassName = 'myapp.Main' repositories { jcenter() } runShadow { args 'foo' } """ file('src/main/java/myapp/Main.java') << """ package myapp; public class Main { public static void main(String[] args) { System.out.println("TestApp: Hello World! (" + args[0] + ")"); } } """.stripIndent() when: BuildResult result = runner.withArguments('runShadow', '--stacktrace').build() then: 'tests that runShadow executed and exited' assert result.output.contains('TestApp: Hello World! (foo)') } private String escapedPath(File file) { file.path.replaceAll('\\\\', '\\\\\\\\') } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/TransformerSpec.groovy000066400000000000000000000554121337527402300327030ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow import com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer import com.github.jengelman.gradle.plugins.shadow.transformers.GroovyExtensionModuleTransformer import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer import com.github.jengelman.gradle.plugins.shadow.transformers.XmlAppendingTransformer import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import spock.lang.Issue import java.util.jar.JarInputStream import java.util.jar.Manifest class TransformerSpec extends PluginSpecification { def 'service resource transformer'() { given: File one = buildJar('one.jar') .insertFile('META-INF/services/org.apache.maven.Shade', 'one # NOTE: No newline terminates this line/file') .insertFile('META-INF/services/com.acme.Foo', 'one') .write() File two = buildJar('two.jar') .insertFile('META-INF/services/org.apache.maven.Shade', 'two # NOTE: No newline terminates this line/file') .insertFile('META-INF/services/com.acme.Foo', 'two') .write() buildFile << """ import ${ServiceFileTransformer.name} shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { transform(ServiceFileTransformer) { exclude 'META-INF/services/com.acme.*' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text1 = getJarFileContents(output, 'META-INF/services/org.apache.maven.Shade') assert text1.split("\\r?\\n").size() == 2 assert text1 == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file'''.stripIndent() and: String text2 = getJarFileContents(output, 'META-INF/services/com.acme.Foo') assert text2.split("\\r?\\n").size() == 1 assert text2 == 'one' } def 'service resource transformer alternate path'() { given: File one = buildJar('one.jar').insertFile('META-INF/foo/org.apache.maven.Shade', 'one # NOTE: No newline terminates this line/file').write() File two = buildJar('two.jar').insertFile('META-INF/foo/org.apache.maven.Shade', 'two # NOTE: No newline terminates this line/file').write() buildFile << """ import ${ServiceFileTransformer.name} shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { transform(ServiceFileTransformer) { path = 'META-INF/foo' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'META-INF/foo/org.apache.maven.Shade') assert text.split("\\r?\\n").size() == 2 assert text == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file'''.stripIndent() } def 'service resource transformer short syntax'() { given: File one = buildJar('one.jar') .insertFile('META-INF/services/org.apache.maven.Shade', 'one # NOTE: No newline terminates this line/file') .insertFile('META-INF/services/com.acme.Foo', 'one') .write() File two = buildJar('two.jar') .insertFile('META-INF/services/org.apache.maven.Shade', 'two # NOTE: No newline terminates this line/file') .insertFile('META-INF/services/com.acme.Foo', 'two') .write() buildFile << """ shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { mergeServiceFiles { exclude 'META-INF/services/com.acme.*' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text1 = getJarFileContents(output, 'META-INF/services/org.apache.maven.Shade') assert text1.split("\\r?\\n").size() == 2 assert text1 == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file'''.stripIndent() and: String text2 = getJarFileContents(output, 'META-INF/services/com.acme.Foo') assert text2.split("\\r?\\n").size() == 1 assert text2 == 'one' } def 'service resource transformer short syntax relocation'() { given: File one = buildJar('one.jar') .insertFile('META-INF/services/java.sql.Driver', '''oracle.jdbc.OracleDriver org.apache.hive.jdbc.HiveDriver'''.stripIndent()) .insertFile('META-INF/services/org.apache.axis.components.compiler.Compiler', 'org.apache.axis.components.compiler.Javac') .insertFile('META-INF/services/org.apache.commons.logging.LogFactory', 'org.apache.commons.logging.impl.LogFactoryImpl') .write() File two = buildJar('two.jar') .insertFile('META-INF/services/java.sql.Driver', '''org.apache.derby.jdbc.AutoloadedDriver com.mysql.jdbc.Driver'''.stripIndent()) .insertFile('META-INF/services/org.apache.axis.components.compiler.Compiler', 'org.apache.axis.components.compiler.Jikes') .insertFile('META-INF/services/org.apache.commons.logging.LogFactory', 'org.mortbay.log.Factory') .write() buildFile << """ shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { mergeServiceFiles() relocate('org.apache', 'myapache') { exclude 'org.apache.axis.components.compiler.Jikes' exclude 'org.apache.commons.logging.LogFactory' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text1 = getJarFileContents(output, 'META-INF/services/java.sql.Driver') assert text1.split("\\r?\\n").size() == 4 assert text1 == '''oracle.jdbc.OracleDriver myapache.hive.jdbc.HiveDriver myapache.derby.jdbc.AutoloadedDriver com.mysql.jdbc.Driver'''.stripIndent() and: String text2 = getJarFileContents(output, 'META-INF/services/myapache.axis.components.compiler.Compiler') assert text2.split("\\r?\\n").size() == 2 assert text2 == '''myapache.axis.components.compiler.Javac org.apache.axis.components.compiler.Jikes'''.stripIndent() and: String text3 = getJarFileContents(output, 'META-INF/services/org.apache.commons.logging.LogFactory') assert text3.split("\\r?\\n").size() == 2 assert text3 == '''myapache.commons.logging.impl.LogFactoryImpl org.mortbay.log.Factory'''.stripIndent() } def 'service resource transformer short syntax alternate path'() { given: File one = buildJar('one.jar').insertFile('META-INF/foo/org.apache.maven.Shade', 'one # NOTE: No newline terminates this line/file').write() File two = buildJar('two.jar').insertFile('META-INF/foo/org.apache.maven.Shade', 'two # NOTE: No newline terminates this line/file').write() buildFile << """ shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { mergeServiceFiles('META-INF/foo') } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'META-INF/foo/org.apache.maven.Shade') assert text.split("\\r?\\n").size() == 2 assert text == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file'''.stripIndent() } @Issue(['SHADOW-70', 'SHADOW-71']) def 'apply transformers to project resources'() { given: File one = buildJar('one.jar').insertFile('META-INF/services/shadow.Shadow', 'one # NOTE: No newline terminates this line/file').write() repo.module('shadow', 'two', '1.0').insertFile('META-INF/services/shadow.Shadow', 'two # NOTE: No newline terminates this line/file').publish() buildFile << """ dependencies { compile 'shadow:two:1.0' compile files('${escapedPath(one)}') } shadowJar { mergeServiceFiles() } """.stripIndent() file('src/main/resources/META-INF/services/shadow.Shadow') << 'three # NOTE: No newline terminates this line/file' when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'META-INF/services/shadow.Shadow') assert text.split("\\r?\\n").size() == 3 assert text == '''three # NOTE: No newline terminates this line/file one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file'''.stripIndent() } def 'appending transformer'() { given: File one = buildJar('one.jar').insertFile('test.properties', 'one # NOTE: No newline terminates this line/file').write() File two = buildJar('two.jar').insertFile('test.properties', 'two # NOTE: No newline terminates this line/file').write() buildFile << """ import ${AppendingTransformer.name} shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { transform(AppendingTransformer) { resource = 'test.properties' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'test.properties') assert text.split("\\r?\\n").size() == 2 assert text == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file '''.stripIndent() } def 'appending transformer short syntax'() { given: File one = buildJar('one.jar').insertFile('test.properties', 'one # NOTE: No newline terminates this line/file').write() File two = buildJar('two.jar').insertFile('test.properties', 'two # NOTE: No newline terminates this line/file').write() buildFile << """ shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { append('test.properties') } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'test.properties') assert text.split("\\r?\\n").size() == 2 assert text == '''one # NOTE: No newline terminates this line/file two # NOTE: No newline terminates this line/file '''.stripIndent() } def 'manifest retained'() { given: File main = file('src/main/java/shadow/Main.java') main << ''' package shadow; public class Main { public static void main(String[] args) { } } '''.stripIndent() buildFile << """ jar { manifest { attributes 'Main-Class': 'shadow.Main' attributes 'Test-Entry': 'PASSED' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: JarInputStream jis = new JarInputStream(output.newInputStream()) Manifest mf = jis.manifest jis.close() assert mf assert mf.mainAttributes.getValue('Test-Entry') == 'PASSED' assert mf.mainAttributes.getValue('Main-Class') == 'shadow.Main' } def 'manifest transformed'() { given: File main = file('src/main/java/shadow/Main.java') main << ''' package shadow; public class Main { public static void main(String[] args) { } } '''.stripIndent() buildFile << """ jar { manifest { attributes 'Main-Class': 'shadow.Main' attributes 'Test-Entry': 'FAILED' } } shadowJar { manifest { attributes 'Test-Entry': 'PASSED' attributes 'New-Entry': 'NEW' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: JarInputStream jis = new JarInputStream(output.newInputStream()) Manifest mf = jis.manifest jis.close() assert mf assert mf.mainAttributes.getValue('Test-Entry') == 'PASSED' assert mf.mainAttributes.getValue('Main-Class') == 'shadow.Main' assert mf.mainAttributes.getValue('New-Entry') == 'NEW' } def 'append xml files'() { given: File xml1 = buildJar('xml1.jar').insertFile('properties.xml', ''' val1 '''.stripIndent() ).write() File xml2 = buildJar('xml2.jar').insertFile('properties.xml', ''' val2 '''.stripIndent() ).write() buildFile << """ import ${XmlAppendingTransformer.name} shadowJar { from('${escapedPath(xml1)}') from('${escapedPath(xml2)}') } shadowJar { transform(XmlAppendingTransformer) { resource = 'properties.xml' } } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: String text = getJarFileContents(output, 'properties.xml') assert text.replaceAll('\r\n', '\n') == ''' val1 val2 '''.stripIndent() } @Issue('SHADOW-82') def 'shadow.manifest leaks to jar.manifest'() { given: File main = file('src/main/java/shadow/Main.java') main << ''' package shadow; public class Main { public static void main(String[] args) { } } '''.stripIndent() buildFile << """ jar { manifest { attributes 'Main-Class': 'shadow.Main' attributes 'Test-Entry': 'FAILED' } } shadowJar { manifest { attributes 'Test-Entry': 'PASSED' attributes 'New-Entry': 'NEW' } } """.stripIndent() when: runner.withArguments('jar', 'shadowJar').build() then: File jar = file('build/libs/shadow-1.0.jar') assert jar.exists() assert output.exists() then: 'Check contents of Shadow jar manifest' JarInputStream jis = new JarInputStream(output.newInputStream()) Manifest mf = jis.manifest assert mf assert mf.mainAttributes.getValue('Test-Entry') == 'PASSED' assert mf.mainAttributes.getValue('Main-Class') == 'shadow.Main' assert mf.mainAttributes.getValue('New-Entry') == 'NEW' then: 'Check contents of jar manifest' JarInputStream jis2 = new JarInputStream(jar.newInputStream()) Manifest mf2 = jis2.manifest assert mf2 assert mf2.mainAttributes.getValue('Test-Entry') == 'FAILED' assert mf2.mainAttributes.getValue('Main-Class') == 'shadow.Main' assert !mf2.mainAttributes.getValue('New-Entry') cleanup: jis?.close() jis2?.close() } @Issue('SHADOW-82') def 'shadow manifest leaks to jar manifest'() { given: File main = file('src/main/java/shadow/Main.java') main << ''' package shadow; public class Main { public static void main(String[] args) { } } '''.stripIndent() buildFile << """ jar { manifest { attributes 'Main-Class': 'shadow.Main' attributes 'Test-Entry': 'FAILED' } } shadowJar { manifest { attributes 'Test-Entry': 'PASSED' attributes 'New-Entry': 'NEW' } } """.stripIndent() when: runner.withArguments('jar', 'shadowJar').build() then: File jar = file('build/libs/shadow-1.0.jar') assert jar.exists() assert output.exists() then: 'Check contents of Shadow jar manifest' JarInputStream jis = new JarInputStream(output.newInputStream()) Manifest mf = jis.manifest assert mf assert mf.mainAttributes.getValue('Test-Entry') == 'PASSED' assert mf.mainAttributes.getValue('Main-Class') == 'shadow.Main' assert mf.mainAttributes.getValue('New-Entry') == 'NEW' then: 'Check contents of jar manifest' JarInputStream jis2 = new JarInputStream(jar.newInputStream()) Manifest mf2 = jis2.manifest assert mf2 assert mf2.mainAttributes.getValue('Test-Entry') == 'FAILED' assert mf2.mainAttributes.getValue('Main-Class') == 'shadow.Main' assert !mf2.mainAttributes.getValue('New-Entry') cleanup: jis?.close() jis2?.close() } def 'Groovy extension module transformer'() { given: def one = buildJar('one.jar') .insertFile('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule', '''moduleName=foo moduleVersion=1.0.5 extensionClasses=com.acme.foo.FooExtension,com.acme.foo.BarExtension staticExtensionClasses=com.acme.foo.FooStaticExtension'''.stripIndent()).write() def two = buildJar('two.jar') .insertFile('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule', '''moduleName=bar moduleVersion=2.3.5 extensionClasses=com.acme.bar.SomeExtension,com.acme.bar.AnotherExtension staticExtensionClasses=com.acme.bar.SomeStaticExtension'''.stripIndent()).write() buildFile << """ import ${GroovyExtensionModuleTransformer.name} shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { transform(GroovyExtensionModuleTransformer) } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: def text = getJarFileContents(output, 'META-INF/services/org.codehaus.groovy.runtime.ExtensionModule') def props = new Properties() props.load(new StringReader(text)) assert props.getProperty('moduleName') == 'MergedByShadowJar' assert props.getProperty('moduleVersion') == '1.0.0' assert props.getProperty('extensionClasses') == 'com.acme.foo.FooExtension,com.acme.foo.BarExtension,com.acme.bar.SomeExtension,com.acme.bar.AnotherExtension' assert props.getProperty('staticExtensionClasses') == 'com.acme.foo.FooStaticExtension,com.acme.bar.SomeStaticExtension' } def 'Groovy extension module transformer short syntax'() { given: def one = buildJar('one.jar') .insertFile('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule', '''moduleName=foo moduleVersion=1.0.5 extensionClasses=com.acme.foo.FooExtension,com.acme.foo.BarExtension staticExtensionClasses=com.acme.foo.FooStaticExtension'''.stripIndent()).write() def two = buildJar('two.jar') .insertFile('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule', '''moduleName=bar moduleVersion=2.3.5 extensionClasses=com.acme.bar.SomeExtension,com.acme.bar.AnotherExtension staticExtensionClasses=com.acme.bar.SomeStaticExtension'''.stripIndent()).write() buildFile << """ shadowJar { from('${escapedPath(one)}') from('${escapedPath(two)}') } shadowJar { mergeGroovyExtensionModules() } """.stripIndent() when: runner.withArguments('shadowJar').build() then: assert output.exists() and: def text = getJarFileContents(output, 'META-INF/services/org.codehaus.groovy.runtime.ExtensionModule') def props = new Properties() props.load(new StringReader(text)) assert props.getProperty('moduleName') == 'MergedByShadowJar' assert props.getProperty('moduleVersion') == '1.0.0' assert props.getProperty('extensionClasses') == 'com.acme.foo.FooExtension,com.acme.foo.BarExtension,com.acme.bar.SomeExtension,com.acme.bar.AnotherExtension' assert props.getProperty('staticExtensionClasses') == 'com.acme.foo.FooStaticExtension,com.acme.bar.SomeStaticExtension' } private String escapedPath(File file) { file.path.replaceAll('\\\\', '\\\\\\\\') } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/000077500000000000000000000000001337527402300272405ustar00rootroot00000000000000ManualCodeSnippetTests.groovy000066400000000000000000000031711337527402300350300ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docspackage com.github.jengelman.gradle.plugins.shadow.docs import com.github.jengelman.gradle.plugins.shadow.docs.executer.GradleBuildExecuter import com.github.jengelman.gradle.plugins.shadow.docs.executer.NoopExecuter import com.github.jengelman.gradle.plugins.shadow.docs.extractor.ManualSnippetExtractor import com.github.jengelman.gradle.plugins.shadow.docs.fixture.GroovyDslFixture import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.CodeSnippetTestCase import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.CodeSnippetTests import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.SnippetExecuter import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture.GroovyScriptFixture import com.google.common.base.StandardSystemProperty class ManualCodeSnippetTests extends CodeSnippetTestCase { public static final LinkedHashMap FIXTURES = [ "groovy": new GradleBuildExecuter("build.gradle", new GroovyDslFixture(), new GroovyDslFixture.ImportsExtractor()), "groovy no-plugins": new GradleBuildExecuter("build.gradle", new GroovyScriptFixture(), new GroovyDslFixture.ImportsExtractor()), "groovy no-run": new NoopExecuter() ] @Override protected void addTests(CodeSnippetTests tests) { File cwd = new File(StandardSystemProperty.USER_DIR.value()) def content = new File(cwd, "src/docs") FIXTURES.each { selector, executer -> ManualSnippetExtractor.extract(content, selector, executer).each { tests.add(it) } } } }shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/executer/000077500000000000000000000000001337527402300310645ustar00rootroot00000000000000GradleBuildExecuter.groovy000066400000000000000000000054371337527402300361500ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/executerpackage com.github.jengelman.gradle.plugins.shadow.docs.executer import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.TestCodeSnippet import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.SnippetExecuter import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture.SnippetFixture import com.github.jengelman.gradle.plugins.shadow.util.PluginSpecification import org.gradle.testkit.runner.GradleRunner import org.junit.rules.TemporaryFolder import java.util.function.Function class GradleBuildExecuter implements SnippetExecuter { private final SnippetFixture fixture private final String buildFile private final Function> importExtractor private List arguments = ["build", "-m"] GradleBuildExecuter(String buildFile, SnippetFixture fixture, Function> importExtractor) { this.buildFile = buildFile this.fixture = fixture this.importExtractor = importExtractor } GradleBuildExecuter(String buildFile, List arguments, SnippetFixture fixture, Function> importExtractor) { this(buildFile, fixture, importExtractor) this.arguments = arguments } @Override SnippetFixture getFixture() { return fixture } @Override void execute(TestCodeSnippet snippet) throws Exception { TemporaryFolder tempDir = new TemporaryFolder() tempDir.create() File dir = tempDir.newFolder() addSubProject(dir) File settings = new File(dir, "settings.gradle") settings.text = """ rootProject.name = 'shadowTest' include 'api', 'main' """ File mainDir = new File(dir, "main") mainDir.mkdirs() File buildFile = new File(mainDir, buildFile) List importsAndSnippet = importExtractor.apply(snippet.getSnippet()) String imports = importsAndSnippet.get(0) String snippetMinusImports = fixture.transform(importsAndSnippet.get(1)) String fullSnippet = imports + fixture.pre() + snippetMinusImports + fixture.post() buildFile.text = replaceTokens(fullSnippet) GradleRunner runner = GradleRunner.create().withProjectDir(dir).withPluginClasspath().forwardOutput() runner.withArguments(":main:build", "-m").build() } private void addSubProject(File dir) { File api = new File(dir, "api") api.mkdirs() File build = new File(api, "build.gradle") build.text = """ plugins { id 'java' id 'com.github.johnrengelman.shadow' } repositories { mavenLocal() jcenter() } """ } private static String replaceTokens(String snippet) { return snippet.replaceAll("@version@", PluginSpecification.SHADOW_VERSION + '-SNAPSHOT') } } NoopExecuter.groovy000066400000000000000000000010561337527402300346760ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/executerpackage com.github.jengelman.gradle.plugins.shadow.docs.executer import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.TestCodeSnippet import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.SnippetExecuter import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture.SnippetFixture class NoopExecuter implements SnippetExecuter { @Override SnippetFixture getFixture() { return null } @Override void execute(TestCodeSnippet snippet) throws Exception { } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/extractor/000077500000000000000000000000001337527402300312535ustar00rootroot00000000000000ManualSnippetExtractor.groovy000066400000000000000000000052201337527402300371160ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/extractorpackage com.github.jengelman.gradle.plugins.shadow.docs.extractor import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.TestCodeSnippet import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.ExceptionTransformer import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.SnippetExecuter import java.util.regex.Pattern class ManualSnippetExtractor { static List extract(File root, String cssClass, SnippetExecuter executer) { List snippets = [] def snippetBlockPattern = Pattern.compile(/(?ims)```$cssClass\n(.*?)\n```/) def filenames = new FileNameFinder().getFileNames(root.absolutePath, "**/*.md") filenames.each { filename -> def file = new File(filename) addSnippets(snippets, file, snippetBlockPattern, executer) } snippets } private static void addSnippets(List snippets, File file, Pattern snippetBlockPattern, SnippetExecuter executer) { def source = file.text String testName = file.parentFile.name + "/" +file.name Map snippetsByLine = findSnippetsByLine(source, snippetBlockPattern) snippetsByLine.each { lineNumber, snippet -> snippets << createSnippet(testName, file, lineNumber, snippet, executer) } } private static List findSnippetBlocks(String code, Pattern snippetTagPattern) { List tags = [] code.eachMatch(snippetTagPattern) { matches -> tags.add(matches[0]) } tags } private static Map findSnippetsByLine(String source, Pattern snippetTagPattern) { List snippetBlocks = findSnippetBlocks(source, snippetTagPattern) Map snippetBlocksByLine = [:] int codeIndex = 0 snippetBlocks.each { block -> codeIndex = source.indexOf(block, codeIndex) def lineNumber = source.substring(0, codeIndex).readLines().size() + 2 snippetBlocksByLine.put(lineNumber, extractSnippetFromBlock(block)) codeIndex += block.size() } snippetBlocksByLine } private static String extractSnippetFromBlock(String tag) { tag.substring(tag.indexOf("\n") + 1, tag.lastIndexOf("\n")) } private static TestCodeSnippet createSnippet(String sourceClassName, File sourceFile, int lineNumber, String snippet, SnippetExecuter executer) { new TestCodeSnippet(snippet, sourceClassName, sourceClassName + ":$lineNumber", executer, new ExceptionTransformer(sourceClassName, sourceFile.name, lineNumber)) } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/fixture/000077500000000000000000000000001337527402300307265ustar00rootroot00000000000000GroovyDslFixture.groovy000066400000000000000000000022521337527402300354160ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/fixturepackage com.github.jengelman.gradle.plugins.shadow.docs.fixture import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture.GroovyScriptFixture import java.util.function.Function class GroovyDslFixture extends GroovyScriptFixture { @Override String pre() { """ plugins { id 'java' id 'com.github.johnrengelman.shadow' id 'application' } version = "1.0" group = 'shadow' repositories { mavenLocal() jcenter() } """ } static class ImportsExtractor implements Function> { @Override List apply(String snippet) { StringBuilder imports = new StringBuilder() StringBuilder scriptMinusImports = new StringBuilder() for (String line : snippet.split("\\n")) { StringBuilder target if (line.trim().startsWith("import ")) { target = imports } else { target = scriptMinusImports } target.append(line).append("\n") } return Arrays.asList(imports.toString(), scriptMinusImports.toString()) } } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/000077500000000000000000000000001337527402300310545ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/Block.java000066400000000000000000000003061337527402300327500ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.docs.internal; public interface Block { /** * Execute the action. * * @throws Exception any */ void execute() throws Exception; }shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/000077500000000000000000000000001337527402300327215ustar00rootroot00000000000000CodeSnippetTestCase.java000066400000000000000000000014371337527402300373630ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetspackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit.DelegatingTestRunner; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit.RunnerProvider; import org.junit.runner.RunWith; import org.junit.runner.Runner; import java.util.LinkedList; import java.util.List; @RunWith(DelegatingTestRunner.class) abstract public class CodeSnippetTestCase implements RunnerProvider { protected abstract void addTests(CodeSnippetTests tests); public final List getRunners() { List runners = new LinkedList<>(); CodeSnippetTests tests = new DefaultCodeSnippetTests(getClass(), runners); addTests(tests); return runners; } } CodeSnippetTests.java000066400000000000000000000002411337527402300367420ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetspackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets; public interface CodeSnippetTests { void add(TestCodeSnippet testCodeSnippet); } DefaultCodeSnippetTests.groovy000066400000000000000000000010441337527402300406550ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetspackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit.SnippetRunner; import org.junit.runner.Runner class DefaultCodeSnippetTests implements CodeSnippetTests { private final Class clazz private final List runners DefaultCodeSnippetTests(Class clazz, List runners) { this.clazz = clazz this.runners = runners } void add(TestCodeSnippet snippet) { runners.add(new SnippetRunner(clazz, snippet)) } } TestCodeSnippet.java000066400000000000000000000022311337527402300365600ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetspackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.ExceptionTransformer; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer.SnippetExecuter; public class TestCodeSnippet { private final String snippet; private final String className; private final String testName; private final SnippetExecuter executer; private final ExceptionTransformer exceptionTransformer; public TestCodeSnippet(String snippet, String className, String testName, SnippetExecuter executer, ExceptionTransformer exceptionTransformer) { this.snippet = snippet; this.className = className; this.testName = testName; this.executer = executer; this.exceptionTransformer = exceptionTransformer; } public String getSnippet() { return snippet; } public String getClassName() { return className; } public String getTestName() { return testName; } public ExceptionTransformer getExceptionTransformer() { return exceptionTransformer; } public SnippetExecuter getExecuter() { return executer; } } executer/000077500000000000000000000000001337527402300344665ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetsCompileException.java000066400000000000000000000005751337527402300406070ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/executerpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer; public class CompileException extends RuntimeException { private static final long serialVersionUID = 0; private final int lineNo; public CompileException(Throwable cause, int lineNo) { super(cause); this.lineNo = lineNo; } public int getLineNo() { return lineNo; } }ExceptionTransformer.groovy000066400000000000000000000024661337527402300421260ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/executerpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer class ExceptionTransformer { final String sourceClassName final String sourceFileName final Integer lineNumber ExceptionTransformer(String sourceClassName, String sourceFileName, Integer lineNumber) { this.sourceClassName = sourceClassName this.sourceFileName = sourceFileName this.lineNumber = lineNumber } Throwable transform(Throwable throwable, Integer offset) throws Exception { def errorLine = 0 if (throwable instanceof CompileException) { errorLine = throwable.lineNo } else { def frame = throwable.getStackTrace().find { it.fileName == sourceClassName } if (frame) { errorLine = frame.lineNumber } else { frame = throwable.getStackTrace().find { it.fileName == "Example.java" } if (frame) { errorLine = frame.lineNumber } } } errorLine = errorLine - offset StackTraceElement[] stack = throwable.getStackTrace() List newStack = new ArrayList(stack.length + 1) newStack.add(new StackTraceElement(sourceClassName, "javadoc", sourceFileName, lineNumber + errorLine)) newStack.addAll(stack) throwable.setStackTrace(newStack as StackTraceElement[]) throwable } } SnippetExecuter.java000066400000000000000000000006221337527402300404600ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/executerpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.executer; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture.SnippetFixture; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.TestCodeSnippet; public interface SnippetExecuter { SnippetFixture getFixture(); void execute(TestCodeSnippet snippet) throws Exception; } fixture/000077500000000000000000000000001337527402300343305ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetsGroovyScriptFixture.groovy000066400000000000000000000002711337527402300416200ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/fixturepackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture; class GroovyScriptFixture extends SnippetFixture { @Override String post() { "\n;0;" } } SnippetFixture.java000066400000000000000000000007571337527402300401750ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/fixturepackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.fixture; import com.github.jengelman.gradle.plugins.shadow.docs.internal.Block; public class SnippetFixture { public void around(Block action) throws Exception { action.execute(); } public String transform(String text) { return text; } public String pre() { return ""; } public String post() { return ""; } public Integer getOffset() { return pre().split("\n").length; } } junit/000077500000000000000000000000001337527402300337735ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippetsDelegatingTestRunner.java000066400000000000000000000033111337527402300407310ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/junitpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit; import org.junit.runner.Runner; import org.junit.runners.Suite; import org.junit.runners.model.InitializationError; import org.junit.runners.model.RunnerScheduler; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class DelegatingTestRunner extends Suite { public DelegatingTestRunner(Class clazz) throws InitializationError { super(clazz, extractRunners(clazz)); setScheduler(new RunnerScheduler() { private final ExecutorService service = Executors.newFixedThreadPool( System.getenv("CI") != null ? 1 : Runtime.getRuntime().availableProcessors() ); public void schedule(Runnable childStatement) { service.submit(childStatement); } public void finished() { try { service.shutdown(); service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(System.err); } } }); } @SuppressWarnings("unchecked") private static List extractRunners(Class clazz) throws InitializationError { if (!RunnerProvider.class.isAssignableFrom(clazz)) { throw new InitializationError(clazz.getName() + " does not implement " + RunnerProvider.class.getName()); } Class asType = (Class) clazz; RunnerProvider instance; try { instance = asType.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new InitializationError(e); } return instance.getRunners(); } } RunnerProvider.java000066400000000000000000000003161337527402300376220ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/junitpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit; import org.junit.runner.Runner; import java.util.List; public interface RunnerProvider { List getRunners(); } SnippetRunner.java000066400000000000000000000030751337527402300374570ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/docs/internal/snippets/junitpackage com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.junit; import com.github.jengelman.gradle.plugins.shadow.docs.internal.snippets.TestCodeSnippet; import org.junit.runner.Description; import org.junit.runner.Runner; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunNotifier; public class SnippetRunner extends Runner { private final Description description; private final TestCodeSnippet snippet; public SnippetRunner(Class testClass, TestCodeSnippet snippet) { this.description = Description.createTestDescription(testClass, snippet.getTestName()); this.snippet = snippet; } @Override public Description getDescription() { return description; } @Override public void run(RunNotifier notifier) { Description description = getDescription(); String filter = System.getProperty("filter"); if (filter != null && !filter.equals(description.getMethodName())) { notifier.fireTestIgnored(description); return; } try { notifier.fireTestStarted(description); snippet.getExecuter().execute(snippet); } catch (Throwable t) { Throwable transform; try { transform = snippet.getExceptionTransformer().transform(t, snippet.getExecuter().getFixture().getOffset()); } catch (Exception e) { throw new RuntimeException(e); } notifier.fireTestFailure(new Failure(description, transform)); } finally { notifier.fireTestFinished(description); } } @Override public int testCount() { return 1; } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/000077500000000000000000000000001337527402300304475ustar00rootroot00000000000000SimpleRelocatorParameterTest.groovy000066400000000000000000000034551337527402300374530ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.relocation import junit.framework.TestCase /** * Modified from org.apache.maven.plugins.shade.relocation.SimpleRelocatorParameterTest.java * * Modifications * @author John Engelman */ class SimpleRelocatorParameterTest extends TestCase { protected void setUp() { super.setUp() } void testThatNullPatternInConstructorShouldNotThrowNullPointerException() { constructThenFailOnNullPointerException(null, "") } void testThatNullShadedPatternInConstructorShouldNotThrowNullPointerException() { constructThenFailOnNullPointerException("", null) } private void constructThenFailOnNullPointerException(String pattern, String shadedPattern) { try { new SimpleRelocator(pattern, shadedPattern, Collections. emptyList(), Collections. emptyList()) } catch (NullPointerException e) { fail("Constructor should not throw null pointer exceptions") } } } SimpleRelocatorTest.groovy000066400000000000000000000172551337527402300356150ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/relocation/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.relocation import com.github.jengelman.gradle.plugins.shadow.ShadowStats import junit.framework.TestCase /** * Test for {@link SimpleRelocator}. * * @author Benjamin Bentmann * @version $Id: SimpleRelocatorTest.java 1342979 2012-05-26 22:05:45Z bimargulies $ * * Modified from org.apache.maven.plugins.shade.relocation.SimpleRelocatorTest.java * * Modifications * @author John Engelman */ class SimpleRelocatorTest extends TestCase { ShadowStats stats @Override protected void setUp() { stats = new ShadowStats() } void testCanRelocatePath() { SimpleRelocator relocator relocator = new SimpleRelocator("org.foo", null, null, null) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/Class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/Class.class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/bar/Class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/bar/Class.class"))) assertEquals(false, relocator.canRelocatePath(pathContext("com/foo/bar/Class"))) assertEquals(false, relocator.canRelocatePath(pathContext("com/foo/bar/Class.class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/Foo/Class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/Foo/Class.class"))) relocator = new SimpleRelocator("org.foo", null, null, Arrays.asList( [ "org.foo.Excluded", "org.foo.public.*", "org.foo.Public*Stuff" ] as String[])) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/Class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/Class.class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/excluded"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/Excluded"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/Excluded.class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/public"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/public/Class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/public/Class.class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/publicRELOC/Class"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/PrivateStuff"))) assertEquals(true, relocator.canRelocatePath(pathContext("org/foo/PrivateStuff.class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/PublicStuff"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/PublicStuff.class"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/PublicUtilStuff"))) assertEquals(false, relocator.canRelocatePath(pathContext("org/foo/PublicUtilStuff.class"))) } void testCanRelocateClass() { SimpleRelocator relocator relocator = new SimpleRelocator("org.foo", null, null, null) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.Class"))) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.bar.Class"))) assertEquals(false, relocator.canRelocateClass(classContext("com.foo.bar.Class"))) assertEquals(false, relocator.canRelocateClass(classContext("org.Foo.Class"))) relocator = new SimpleRelocator("org.foo", null, null, Arrays.asList( [ "org.foo.Excluded", "org.foo.public.*", "org.foo.Public*Stuff" ] as String[])) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.Class"))) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.excluded"))) assertEquals(false, relocator.canRelocateClass(classContext("org.foo.Excluded"))) assertEquals(false, relocator.canRelocateClass(classContext("org.foo.public"))) assertEquals(false, relocator.canRelocateClass(classContext("org.foo.public.Class"))) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.publicRELOC.Class"))) assertEquals(true, relocator.canRelocateClass(classContext("org.foo.PrivateStuff"))) assertEquals(false, relocator.canRelocateClass(classContext("org.foo.PublicStuff"))) assertEquals(false, relocator.canRelocateClass(classContext("org.foo.PublicUtilStuff"))) } void testCanRelocateRawString() { SimpleRelocator relocator relocator = new SimpleRelocator("org/foo", null, null, null, true) assertEquals(true, relocator.canRelocatePath(pathContext("(I)org/foo/bar/Class"))) relocator = new SimpleRelocator("^META-INF/org.foo.xml\$", null, null, null, true) assertEquals(true, relocator.canRelocatePath(pathContext("META-INF/org.foo.xml"))) } //MSHADE-119, make sure that the easy part of this works. void testCanRelocateAbsClassPath() { SimpleRelocator relocator = new SimpleRelocator("org.apache.velocity", "org.apache.momentum", null, null) assertEquals("/org/apache/momentum/mass.properties", relocator.relocatePath(pathContext("/org/apache/velocity/mass.properties"))) } void testRelocatePath() { SimpleRelocator relocator relocator = new SimpleRelocator("org.foo", null, null, null) assertEquals("hidden/org/foo/bar/Class.class", relocator.relocatePath(pathContext("org/foo/bar/Class.class"))) relocator = new SimpleRelocator("org.foo", "private.stuff", null, null) assertEquals("private/stuff/bar/Class.class", relocator.relocatePath(pathContext("org/foo/bar/Class.class"))) } void testRelocateClass() { SimpleRelocator relocator relocator = new SimpleRelocator("org.foo", null, null, null) assertEquals("hidden.org.foo.bar.Class", relocator.relocateClass(classContext("org.foo.bar.Class"))) relocator = new SimpleRelocator("org.foo", "private.stuff", null, null) assertEquals("private.stuff.bar.Class", relocator.relocateClass(classContext("org.foo.bar.Class"))) } void testRelocateRawString() { SimpleRelocator relocator relocator = new SimpleRelocator("Lorg/foo", "Lhidden/org/foo", null, null, true) assertEquals("(I)Lhidden/org/foo/bar/Class", relocator.relocatePath(pathContext("(I)Lorg/foo/bar/Class"))) relocator = new SimpleRelocator("^META-INF/org.foo.xml\$", "META-INF/hidden.org.foo.xml", null, null, true) assertEquals("META-INF/hidden.org.foo.xml", relocator.relocatePath(pathContext("META-INF/org.foo.xml"))) } protected RelocatePathContext pathContext(String path) { return RelocatePathContext.builder().path(path).stats(stats).build() } protected RelocateClassContext classContext(String className) { return RelocateClassContext.builder().className(className).stats(stats).build() } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/000077500000000000000000000000001337527402300310355ustar00rootroot00000000000000ApacheLicenseResourceTransformerTest.groovy000066400000000000000000000042341337527402300415070ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.junit.Before import org.junit.Test import static org.junit.Assert.* /** * Test for {@link ApacheLicenseResourceTransformer}. * * @author Benjamin Bentmann * @version $Id: ApacheLicenseResourceTransformerTest.java 673906 2008-07-04 05:03:20Z brett $ * * Modified from org.apache.maven.plugins.shade.resources.ApacheLicenseResourceTransformerTest.java */ class ApacheLicenseResourceTransformerTest extends TransformerTestSupport { private ApacheLicenseResourceTransformer transformer static { /* * NOTE: The Turkish locale has an usual case transformation for the letters "I" and "i", making it a prime * choice to test for improper case-less string comparisions. */ Locale.setDefault(new Locale("tr")) } @Before void setUp() { this.transformer = new ApacheLicenseResourceTransformer() } @Test void testCanTransformResource() { assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/LICENSE"))) assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/LICENSE.TXT"))) assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/License.txt"))) assertFalse(this.transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))) } } ApacheNoticeResourceTransformerParameterTests.groovy000066400000000000000000000060451337527402300433740ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import junit.framework.TestCase import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator /** * Tests {@link ApacheLicenseResourceTransformer} parameters. * * Modified from org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformerParameterTests.java */ class ApacheNoticeResourceTransformerParameterTests extends TestCase { private static final String NOTICE_RESOURCE = "META-INF/NOTICE" private ApacheNoticeResourceTransformer subject private ShadowStats stats protected void setUp() { super.setUp() subject = new ApacheNoticeResourceTransformer() stats = new ShadowStats() } void testNoParametersShouldNotThrowNullPointerWhenNoInput() { processAndFailOnNullPointer("") } void testNoParametersShouldNotThrowNullPointerWhenNoLinesOfInput() { processAndFailOnNullPointer("Some notice text") } void testNoParametersShouldNotThrowNullPointerWhenOneLineOfInput() { processAndFailOnNullPointer("Some notice text\n") } void testNoParametersShouldNotThrowNullPointerWhenTwoLinesOfInput() { processAndFailOnNullPointer("Some notice text\nSome notice text\n") } void testNoParametersShouldNotThrowNullPointerWhenLineStartsWithSlashSlash() { processAndFailOnNullPointer("Some notice text\n//Some notice text\n") } void testNoParametersShouldNotThrowNullPointerWhenLineIsSlashSlash() { processAndFailOnNullPointer("//\n") } void testNoParametersShouldNotThrowNullPointerWhenLineIsEmpty() { processAndFailOnNullPointer("\n") } private void processAndFailOnNullPointer(final String noticeText) { try { final ByteArrayInputStream noticeInputStream = new ByteArrayInputStream(noticeText.getBytes()) final List emptyList = Collections.emptyList() subject.transform(TransformerContext.builder().path(NOTICE_RESOURCE).is(noticeInputStream).relocators(emptyList).stats(stats).build()) } catch (NullPointerException e) { fail("Null pointer should not be thrown when no parameters are set.") } } } ApacheNoticeResourceTransformerTest.groovy000066400000000000000000000042221337527402300413430ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.junit.Before import org.junit.Test import static org.junit.Assert.* /** * Test for {@link ApacheNoticeResourceTransformer}. * * @author Benjamin Bentmann * @version $Id: ApacheNoticeResourceTransformerTest.java 673906 2008-07-04 05:03:20Z brett $ * * Modified from org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformerTest.java */ class ApacheNoticeResourceTransformerTest extends TransformerTestSupport { private ApacheNoticeResourceTransformer transformer static { /* * NOTE: The Turkish locale has an usual case transformation for the letters "I" and "i", making it a prime * choice to test for improper case-less string comparisions. */ Locale.setDefault(new Locale("tr")) } @Before void setUp() { this.transformer = new ApacheNoticeResourceTransformer() } @Test void testCanTransformResource() { assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/NOTICE"))) assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/NOTICE.TXT"))) assertTrue(this.transformer.canTransformResource(getFileElement("META-INF/Notice.txt"))) assertFalse(this.transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))) } } AppendingTransformerTest.groovy000066400000000000000000000037551337527402300372270ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.junit.Before import org.junit.Test import static org.junit.Assert.* /** * Test for {@link AppendingTransformer}. * * @author Benjamin Bentmann * @version $Id: AppendingTransformerTest.java 673906 2008-07-04 05:03:20Z brett $ */ class AppendingTransformerTest extends TransformerTestSupport { private AppendingTransformer transformer static { /* * NOTE: The Turkish locale has an usual case transformation for the letters "I" and "i", making it a prime * choice to test for improper case-less string comparisions. */ Locale.setDefault(new Locale("tr")) } @Before void setUp() { this.transformer = new AppendingTransformer() } @Test void testCanTransformResource() { this.transformer.resource = "abcdefghijklmnopqrstuvwxyz" assertTrue(this.transformer.canTransformResource(getFileElement("abcdefghijklmnopqrstuvwxyz"))) assertTrue(this.transformer.canTransformResource(getFileElement("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))) assertFalse(this.transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))) } } ComponentsXmlResourceTransformerTest.groovy000066400000000000000000000057651337527402300416430ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import junit.framework.TestCase import org.custommonkey.xmlunit.Diff import org.custommonkey.xmlunit.XMLAssert import org.custommonkey.xmlunit.XMLUnit import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import org.codehaus.plexus.util.IOUtil /** * Test for {@link ComponentsXmlResourceTransformer}. * * @author Brett Porter * @version $Id: ComponentsXmlResourceTransformerTest.java 1379994 2012-09-02 15:22:49Z hboutemy $ * * Modified from org.apache.maven.plugins.shade.resource.ComponentsXmlResourceTransformerTest.java */ class ComponentsXmlResourceTransformerTest extends TestCase { private ComponentsXmlResourceTransformer transformer private ShadowStats stats void setUp() { this.transformer = new ComponentsXmlResourceTransformer() stats = new ShadowStats() } void testConfigurationMerging() { XMLUnit.setNormalizeWhitespace(true) transformer.transform( TransformerContext.builder() .path("components-1.xml") .is(getClass().getResourceAsStream("/components-1.xml")) .relocators(Collections. emptyList()) .stats(stats) .build()) transformer.transform( TransformerContext.builder() .path("components-1.xml") .is(getClass().getResourceAsStream("/components-2.xml")) .relocators(Collections. emptyList()) .stats(stats) .build()) Diff diff = XMLUnit.compareXML( IOUtil.toString(getClass().getResourceAsStream("/components-expected.xml"), "UTF-8"), IOUtil.toString(transformer.getTransformedResource(), "UTF-8")) //assertEquals( IOUtil.toString( getClass().getResourceAsStream( "/components-expected.xml" ), "UTF-8" ), // IOUtil.toString( transformer.getTransformedResource(), "UTF-8" ).replaceAll("\r\n", "\n") ) XMLAssert.assertXMLIdentical(diff, true) } }Log4j2PluginsCacheFileTransformerTest.groovy000066400000000000000000000072331337527402300414440ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformerspackage com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator import com.github.jengelman.gradle.plugins.shadow.relocation.SimpleRelocator import org.apache.tools.zip.ZipOutputStream import org.junit.Before import org.junit.Test import java.util.zip.ZipEntry import java.util.zip.ZipFile import static java.util.Collections.singletonList import static org.apache.logging.log4j.core.config.plugins.processor.PluginProcessor.PLUGIN_CACHE_FILE import static org.junit.Assert.assertFalse import static org.junit.Assert.assertTrue /** * @author Paul Nelson Baker * @since 2018-08 * @see GitHub * @see LinkedIn */ //@RunWith(Parameterized.class) class Log4j2PluginsCacheFileTransformerTest { Log4j2PluginsCacheFileTransformer transformer @Before void setUp() { transformer = new Log4j2PluginsCacheFileTransformer() } @Test void testShouldNotTransform() { transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE), null)) assertFalse(transformer.hasTransformedResource()) } @Test void testShouldTransform() { List relocators = new ArrayList<>() relocators.add(new SimpleRelocator(null, null, null, null)) transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE), relocators)) assertTrue(transformer.hasTransformedResource()) } @Test void testRelocators() { testRelocate("org.apache.logging", "new.location.org.apache.logging", "new.location.org.apache.logging") testRelocate("org.apache.logging", "new.location.org.apache.logging", "org.apache.logging") } void testRelocate(String source, String pattern, String target) throws IOException { List relocators = singletonList((Relocator) new SimpleRelocator(source, pattern, null, null)) transformer.transform(new TransformerContext(PLUGIN_CACHE_FILE, getResourceStream(PLUGIN_CACHE_FILE), relocators)) assertTrue("Transformer didn't transform resources", transformer.hasTransformedResource()) // Write out to a fake jar file def testableZipFile = File.createTempFile("testable-zip-file-", ".jar") def fileOutputStream = new FileOutputStream(testableZipFile) def bufferedOutputStream = new BufferedOutputStream(fileOutputStream) def zipOutputStream = new ZipOutputStream(bufferedOutputStream) transformer.modifyOutputStream(zipOutputStream, true) zipOutputStream.close() bufferedOutputStream.close() fileOutputStream.close() // Pull the data back out and make sure it was transformed ZipFile zipFile = new ZipFile(testableZipFile) ZipEntry zipFileEntry = zipFile.getEntry(PLUGIN_CACHE_FILE) InputStream inputStream = zipFile.getInputStream(zipFileEntry) new Scanner(inputStream).withCloseable { scanner -> boolean hasAtLeastOneTransform = false while (scanner.hasNextLine()) { String nextLine = scanner.nextLine() if (nextLine.contains(source)) { hasAtLeastOneTransform = true assertTrue("Target wasn't included in transform", nextLine.contains(target)) } } assertTrue("There were no transformations inside the file", hasAtLeastOneTransform) } } InputStream getResourceStream(String resource) { return this.class.getClassLoader().getResourceAsStream(resource); } } PropertiesFileTransformerSpec.groovy000066400000000000000000000144271337527402300402270ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import spock.lang.Unroll import static groovy.lang.Closure.IDENTITY @Unroll class PropertiesFileTransformerSpec extends TransformerSpecSupport { void "Path #path #transform transformed"() { given: Transformer transformer = new PropertiesFileTransformer() when: boolean actual = transformer.canTransformResource(getFileElement(path)) then: actual == expected where: path || expected 'foo.properties' || true 'foo/bar.properties' || true 'foo.props' || false transform = expected ? 'can be' : 'can not be' } void exerciseAllTransformConfigurations() { given: def element = getFileElement(path) Transformer transformer = new PropertiesFileTransformer() transformer.mergeStrategy = mergeStrategy transformer.mergeSeparator = mergeSeparator when: if (transformer.canTransformResource(element)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } then: output == toMap(transformer.propertiesEntries[path]) where: path | mergeStrategy | mergeSeparator | input1 | input2 || output 'f.properties' | 'first' | '' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] 'f.properties' | 'latest' | '' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'bar'] 'f.properties' | 'append' | ',' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo,bar'] 'f.properties' | 'append' | ';' | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo;bar'] } void exerciseAllTransformConfigurationsWithPaths() { given: def element = getFileElement(path) Transformer transformer = new PropertiesFileTransformer() transformer.paths = paths transformer.mergeStrategy = 'first' when: if (transformer.canTransformResource(element)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } then: output == toMap(transformer.propertiesEntries[path]) where: path | paths | input1 | input2 || output 'f.properties' | ['f.properties'] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] 'foo.properties' | ['.*.properties'] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] 'foo.properties' | ['.*bar'] | ['foo': 'foo'] | ['foo': 'bar'] || [:] 'foo.properties' | [] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] } void exerciseAllTransformConfigurationsWithMappings() { given: def element = getFileElement(path) Transformer transformer = new PropertiesFileTransformer() transformer.mappings = mappings transformer.mergeStrategy = 'latest' when: if (transformer.canTransformResource(element)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } then: output == toMap(transformer.propertiesEntries[path]) where: path | mappings | input1 | input2 || output 'f.properties' | ['f.properties': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] 'f.properties' | ['f.properties': [mergeStrategy: 'latest']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'bar'] 'f.properties' | ['f.properties': [mergeStrategy: 'append']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo,bar'] 'f.properties' | ['f.properties': [mergeStrategy: 'append', mergeSeparator: ';']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo;bar'] 'foo.properties' | ['.*.properties': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || ['foo': 'foo'] 'foo.properties' | ['.*bar': [mergeStrategy: 'first']] | ['foo': 'foo'] | ['foo': 'bar'] || [:] } void appliesKeyTransformer() { given: def element = getFileElement(path) Transformer transformer = new PropertiesFileTransformer() transformer.keyTransformer = keyTransformer transformer.mergeStrategy = 'append' when: if (transformer.canTransformResource(element)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } then: output == toMap(transformer.propertiesEntries[path]) where: path | keyTransformer | input1 | input2 || output 'foo.properties' | IDENTITY | ['foo': 'bar'] | ['FOO': 'baz'] || ['foo': 'bar', 'FOO': 'baz'] 'foo.properties' | { key -> key.toUpperCase() } | ['foo': 'bar'] | ['FOO': 'baz'] || ['FOO': 'bar,baz'] 'foo.properties' | { key -> 'bar.' + key.toLowerCase() } | ['foo': 'bar'] | ['FOO': 'baz'] || ['bar.foo': 'bar,baz'] 'foo.properties' | { key -> key.replaceAll('^(foo)', 'bar.$1') } | ['foo': 'bar'] | ['FOO': 'baz'] || ['bar.foo': 'bar', 'FOO': 'baz'] } } ServiceFileTransformerSpec.groovy000066400000000000000000000045271337527402300374730ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformerspackage com.github.jengelman.gradle.plugins.shadow.transformers import spock.lang.Unroll @Unroll class ServiceFileTransformerSpec extends TransformerSpecSupport { def "#status path #path #transform transformed"() { given: def transformer = new ServiceFileTransformer() if (exclude) { transformer.exclude(path) } when: def actual = transformer.canTransformResource(getFileElement(path)) then: actual == expected where: path | exclude | expected 'META-INF/services/java.sql.Driver' | false | true 'META-INF/services/io.dropwizard.logging.AppenderFactory' | false | true 'META-INF/services/org.apache.maven.Shade' | true | false 'META-INF/services/foo/bar/moo.goo.Zoo' | false | true 'foo/bar.properties' | false | false 'foo.props' | false | false transform = expected ? 'can be' : 'can not be' status = exclude ? 'excluded' : 'non-excluded' } def "transforms service file"() { given: def element = getFileElement(path) def transformer = new ServiceFileTransformer() when: if (transformer.canTransformResource(element)) { transformer.transform(context(path, input1)) transformer.transform(context(path, input2)) } then: transformer.hasTransformedResource() output == transformer.serviceEntries[path].toInputStream().text where: path | input1 | input2 || output 'META-INF/services/com.acme.Foo' | 'foo' | 'bar' || 'foo\nbar' 'META-INF/services/com.acme.Bar' | 'foo\nbar' | 'zoo' || 'foo\nbar\nzoo' } def "excludes Groovy extension module descriptor files by default"() { given: def transformer = new ServiceFileTransformer() def element = getFileElement('META-INF/services/org.codehaus.groovy.runtime.ExtensionModule') expect: !transformer.canTransformResource(element) } } TransformerSpecSupport.groovy000066400000000000000000000033201337527402300367350ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformerspackage com.github.jengelman.gradle.plugins.shadow.transformers import com.github.jengelman.gradle.plugins.shadow.ShadowStats import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath import org.gradle.api.internal.file.DefaultFileTreeElement import spock.lang.Shared import spock.lang.Specification class TransformerSpecSupport extends Specification { @Shared ShadowStats stats def setup() { stats = new ShadowStats() } protected static FileTreeElement getFileElement(String path) { return new DefaultFileTreeElement(null, RelativePath.parse(true, path), null, null) } protected static InputStream toInputStream(String str) { return new ByteArrayInputStream(str.bytes) } protected static InputStream toInputStream(Properties props) { ByteArrayOutputStream baos = new ByteArrayOutputStream() props.store(baos, '') new ByteArrayInputStream(baos.toByteArray()) } protected static Properties toProperties(Map map) { map.inject(new Properties()) { Properties props, entry -> props.put(entry.key, entry.value) props } } protected static Map toMap(Properties props) { props.inject([:]) { Map map, entry -> map.put(entry.key, entry.value) map } } protected TransformerContext context(String path, Map input) { TransformerContext.builder().path(path).is(toInputStream(toProperties(input))).relocators([]).stats(stats).build() } protected TransformerContext context(String path, String input) { TransformerContext.builder().path(path).is(toInputStream(input)).relocators([]).stats(stats).build() } } TransformerTestSupport.groovy000066400000000000000000000006301337527402300367630ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformerspackage com.github.jengelman.gradle.plugins.shadow.transformers import org.gradle.api.file.FileTreeElement import org.gradle.api.file.RelativePath import org.gradle.api.internal.file.DefaultFileTreeElement class TransformerTestSupport { protected static FileTreeElement getFileElement(String path) { return new DefaultFileTreeElement(null, RelativePath.parse(true, path), null, null) } } XmlAppendingTransformerTest.groovy000066400000000000000000000041021337527402300376730ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/transformers/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License") you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.github.jengelman.gradle.plugins.shadow.transformers import org.junit.Before import org.junit.Test import static org.junit.Assert.* /** * Test for {@link XmlAppendingTransformer}. * * @author Benjamin Bentmann * @version $Id: XmlAppendingTransformerTest.java 673906 2008-07-04 05:03:20Z brett $ * * Modified from org.apache.maven.plugins.shade.resource.XmlAppendingTransformerTest.java */ class XmlAppendingTransformerTest extends TransformerTestSupport { XmlAppendingTransformer transformer static { /* * NOTE: The Turkish locale has an usual case transformation for the letters "I" and "i", making it a prime * choice to test for improper case-less string comparisons. */ Locale.setDefault(new Locale("tr")) } @Before void setUp() { transformer = new XmlAppendingTransformer() } @Test void testCanTransformResource() { transformer.resource = "abcdefghijklmnopqrstuvwxyz" assertTrue(this.transformer.canTransformResource(getFileElement("abcdefghijklmnopqrstuvwxyz"))) assertTrue(this.transformer.canTransformResource(getFileElement("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))) assertFalse(this.transformer.canTransformResource(getFileElement("META-INF/MANIFEST.MF"))) } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/000077500000000000000000000000001337527402300272655ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/AppendableJar.groovy000066400000000000000000000010511337527402300332210ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.util class AppendableJar { Map contents = [:] File file AppendableJar(File file) { this.file = file } AppendableJar insertFile(String path, String content) { contents[path] = content return this } File write() { JarBuilder builder = new JarBuilder(file.newOutputStream()) contents.each { path, contents -> builder.withFile(path, contents) } builder.build() return file } } AppendableMavenFileModule.groovy000066400000000000000000000040651337527402300354520ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/utilpackage com.github.jengelman.gradle.plugins.shadow.util import com.github.jengelman.gradle.plugins.shadow.util.repo.maven.MavenFileModule import groovy.transform.InheritConstructors import org.apache.commons.io.IOUtils @InheritConstructors class AppendableMavenFileModule extends MavenFileModule { Map> contents = [:].withDefault { [:] } Map files = [:] AppendableMavenFileModule use(File file) { return use('', file) } AppendableMavenFileModule use(String classifier, File file) { files[classifier] = file return this } AppendableMavenFileModule insertFile(String path, String content) { insertFile('', path, content) return this } AppendableMavenFileModule insertFile(String classifier, String path, String content) { contents[classifier][path] = content return this } @Override File publishArtifact(Map artifact) { def artifactFile = artifactFile(artifact) if (type == 'pom') { return artifactFile } String classifier = (String) artifact['classifier'] ?: '' if (files.containsKey(classifier)) { publishWithStream(artifactFile) { OutputStream os -> IOUtils.copy(files[classifier].newInputStream(), os) } } else { publishWithStream(artifactFile) { OutputStream os -> writeJar(os, contents[classifier]) } } return artifactFile } void writeJar(OutputStream os, Map contents) { if (contents) { JarBuilder builder = new JarBuilder(os) contents.each { path, content -> builder.withFile(path, content) } builder.build() } } /** * Adds an additional artifact to this module. * @param options Can specify any of: type or classifier */ AppendableMavenFileModule artifact(Map options) { artifacts << options return this } } AppendableMavenFileRepository.groovy000066400000000000000000000011131337527402300363730ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/utilpackage com.github.jengelman.gradle.plugins.shadow.util import com.github.jengelman.gradle.plugins.shadow.util.repo.maven.MavenFileRepository import groovy.transform.InheritConstructors @InheritConstructors class AppendableMavenFileRepository extends MavenFileRepository { @Override AppendableMavenFileModule module(String groupId, String artifactId, Object version = '1.0') { def artifactDir = rootDir.file("${groupId.replace('.', '/')}/$artifactId/$version") return new AppendableMavenFileModule(artifactDir, groupId, artifactId, version as String) } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/JarBuilder.groovy000066400000000000000000000024031337527402300325560ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.util import org.codehaus.plexus.util.IOUtil import java.util.jar.JarEntry import java.util.jar.JarOutputStream class JarBuilder { List entries = [] JarOutputStream jos JarBuilder(OutputStream os) { jos = new JarOutputStream(os) } private void addDirectory(String name) { if (!entries.contains(name)) { if (name.lastIndexOf('/') > 0) { String parent = name.substring(0, name.lastIndexOf('/')) if (!entries.contains(parent)) { addDirectory(parent) } } // directory entries must end in "/" JarEntry entry = new JarEntry(name + "/") jos.putNextEntry(entry) entries.add(name) } } JarBuilder withFile(String path, String data) { def idx = path.lastIndexOf('/') if (idx != -1) { addDirectory(path.substring(0, idx)) } if (!entries.contains(path)) { JarEntry entry = new JarEntry(path) jos.putNextEntry(entry) entries << path IOUtil.copy(data.bytes, jos) } return this } void build() { jos.close() } } PluginSpecification.groovy000066400000000000000000000073001337527402300344140ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/utilpackage com.github.jengelman.gradle.plugins.shadow.util import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile import com.google.common.base.StandardSystemProperty import org.codehaus.plexus.util.IOUtil import org.gradle.testkit.runner.GradleRunner import org.junit.Rule import org.junit.rules.TemporaryFolder import spock.lang.Specification import java.util.jar.JarEntry import java.util.jar.JarFile class PluginSpecification extends Specification { @Rule TemporaryFolder dir static final String SHADOW_VERSION = PluginSpecification.classLoader.getResource("shadow-version.txt").text.trim() AppendableMavenFileRepository repo def setup() { repo = repo() repo.module('junit', 'junit', '3.8.2').use(testJar).publish() buildFile << defaultBuildScript settingsFile << ''' rootProject.name = 'shadow' ''' } def cleanup() { println buildFile.text } String getDefaultBuildScript() { return """ plugins { id 'java' id 'com.github.johnrengelman.shadow' } version = "1.0" group = 'shadow' sourceSets { integTest } repositories { maven { url "${repo.uri}" } } """.stripIndent() } GradleRunner getRunner() { GradleRunner.create() .withProjectDir(dir.root) .forwardOutput() .withPluginClasspath() } File getLocalRepo() { def rootRelative = new File("build/localrepo") rootRelative.directory ? rootRelative : new File(new File(StandardSystemProperty.USER_DIR.value()).parentFile, "build/localrepo") } File getBuildFile() { file('build.gradle') } File getSettingsFile() { file('settings.gradle') } File file(String path) { File f = new File(dir.root, path) if (!f.exists()) { f.parentFile.mkdirs() return dir.newFile(path) } return f } AppendableMavenFileRepository repo(String path = 'maven-repo') { new AppendableMavenFileRepository(new TestFile(dir.root, path)) } void assertJarFileContentsEqual(File f, String path, String contents) { assert getJarFileContents(f, path) == contents } String getJarFileContents(File f, String path) { JarFile jf = new JarFile(f) def is = jf.getInputStream(new JarEntry(path)) StringWriter sw = new StringWriter() IOUtil.copy(is, sw) is.close() jf.close() return sw.toString() } void contains(File f, List paths) { JarFile jar = new JarFile(f) paths.each { path -> assert jar.getJarEntry(path), "${f.path} does not contain [$path]" } jar.close() } void doesNotContain(File f, List paths) { JarFile jar = new JarFile(f) paths.each { path -> assert !jar.getJarEntry(path), "${f.path} contains [$path]" } jar.close() } AppendableJar buildJar(String path) { return new AppendableJar(file(path)) } protected getOutput() { file('build/libs/shadow-1.0-all.jar') } protected output(String name) { file("build/libs/${name}") } protected File getTestJar(String name = 'junit-3.8.2.jar') { return new File(this.class.classLoader.getResource(name).toURI()) } public static File getTestKitDir() { def gradleUserHome = System.getenv("GRADLE_USER_HOME") if (!gradleUserHome) { gradleUserHome = new File(System.getProperty("user.home"), ".gradle").absolutePath } return new File(gradleUserHome, "testkit") } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/file/000077500000000000000000000000001337527402300302045ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/file/ExecOutput.groovy000066400000000000000000000004671337527402300335670ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.util.file class ExecOutput { ExecOutput(String rawOutput, String error) { this.rawOutput = rawOutput this.out = rawOutput.replaceAll("\r\n|\r", "\n") this.error = error } String rawOutput String out String error } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/file/Results.groovy000066400000000000000000000023141337527402300331140ustar00rootroot00000000000000package com.github.jengelman.gradle.plugins.shadow.util.file import org.gradle.tooling.GradleConnectionException import org.gradle.tooling.ResultHandler class Results implements ResultHandler { private final Object lock = new Object() private boolean success = false private GradleConnectionException exception void waitForCompletion() { synchronized(lock) { while(!successful && !failed) { lock.wait() } } } boolean getSuccessful() { return success && !exception } boolean getFailed() { return exception as boolean } GradleConnectionException getException() { return exception } void markComplete() { synchronized(lock) { success = true exception = null lock.notifyAll() } } void markFailed(GradleConnectionException e) { synchronized(lock) { success = false exception = e lock.notifyAll() } } @Override void onComplete(Void aVoid) { markComplete() } @Override void onFailure(GradleConnectionException e) { markFailed(e) } } TestDirectoryProvider.java000066400000000000000000000006241337527402300353110ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/filepackage com.github.jengelman.gradle.plugins.shadow.util.file; /** * Implementations provide a working space to be used in tests. * * The client is not responsible for removing any files. */ public interface TestDirectoryProvider { /** * The directory to use, guaranteed to exist. * * @return The directory to use, guaranteed to exist. */ TestFile getTestDirectory(); } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/file/TestFile.java000066400000000000000000000420501337527402300325670ustar00rootroot00000000000000/* * Copyright 2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.jengelman.gradle.plugins.shadow.util.file; import groovy.lang.Closure; import org.apache.commons.io.FileUtils; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Tar; import org.apache.tools.ant.taskdefs.Zip; import org.apache.tools.ant.types.EnumeratedAttribute; import org.codehaus.groovy.runtime.ResourceGroovyMethods; import org.hamcrest.Matcher; import java.io.*; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.Charset; import java.security.MessageDigest; import java.util.*; import java.util.jar.JarFile; import java.util.jar.Manifest; import static org.junit.Assert.*; public class TestFile extends File { private boolean useNativeTools; public TestFile(File file, Object... path) { super(join(file, path).getAbsolutePath()); } public TestFile(URI uri) { this(new File(uri)); } public TestFile(String path) { this(new File(path)); } public TestFile(URL url) { this(toUri(url)); } public TestFile usingNativeTools() { useNativeTools = true; return this; } Object writeReplace() throws ObjectStreamException { return new File(getAbsolutePath()); } @Override public File getCanonicalFile() throws IOException { return new File(getAbsolutePath()).getCanonicalFile(); } @Override public String getCanonicalPath() throws IOException { return new File(getAbsolutePath()).getCanonicalPath(); } private static URI toUri(URL url) { try { return url.toURI(); } catch (URISyntaxException e) { throw new RuntimeException(e); } } private static File join(File file, Object[] path) { File current = file.getAbsoluteFile(); for (Object p : path) { current = new File(current, p.toString()); } try { return current.getCanonicalFile(); } catch (IOException e) { throw new RuntimeException(String.format("Could not canonicalise '%s'.", current), e); } } public TestFile file(Object... path) { try { return new TestFile(this, path); } catch (RuntimeException e) { throw new RuntimeException(String.format("Could not locate file '%s' relative to '%s'.", Arrays.toString(path), this), e); } } public List files(Object... paths) { List files = new ArrayList(); for (Object path : paths) { files.add(file(path)); } return files; } public TestFile withExtension(String extension) { return getParentFile().file(getName().replaceAll("\\..*$", "." + extension)); } public TestFile writelns(String... lines) { return writelns(Arrays.asList(lines)); } public TestFile write(Object content) { try { FileUtils.writeStringToFile(this, content.toString(), Charset.defaultCharset()); } catch (IOException e) { throw new RuntimeException(String.format("Could not write to test file '%s'", this), e); } return this; } public TestFile leftShift(Object content) { getParentFile().mkdirs(); try { ResourceGroovyMethods.leftShift(this, content); return this; } catch (IOException e) { throw new RuntimeException(String.format("Could not append to test file '%s'", this), e); } } public TestFile[] listFiles() { File[] children = super.listFiles(); TestFile[] files = new TestFile[children.length]; for (int i = 0; i < children.length; i++) { File child = children[i]; files[i] = new TestFile(child); } return files; } public String getText() { assertIsFile(); try { return FileUtils.readFileToString(this, Charset.defaultCharset()); } catch (IOException e) { throw new RuntimeException(String.format("Could not read from test file '%s'", this), e); } } public Map getProperties() { assertIsFile(); Properties properties = new Properties(); try { FileInputStream inStream = new FileInputStream(this); try { properties.load(inStream); } finally { inStream.close(); } } catch (IOException e) { throw new RuntimeException(e); } Map map = new HashMap(); for (Object key : properties.keySet()) { map.put(key.toString(), properties.getProperty(key.toString())); } return map; } public Manifest getManifest() { assertIsFile(); try { JarFile jarFile = new JarFile(this); try { return jarFile.getManifest(); } finally { jarFile.close(); } } catch (IOException e) { throw new RuntimeException(e); } } public List linesThat(Matcher matcher) { try { BufferedReader reader = new BufferedReader(new FileReader(this)); try { List lines = new ArrayList(); String line; while ((line = reader.readLine()) != null) { if (matcher.matches(line)) { lines.add(line); } } return lines; } finally { reader.close(); } } catch (IOException e) { throw new RuntimeException(e); } } public void unzipTo(File target) { assertIsFile(); new TestFileHelper(this).unzipTo(target, useNativeTools); } public void untarTo(File target) { assertIsFile(); new TestFileHelper(this).untarTo(target, useNativeTools); } public void copyTo(File target) { if (isDirectory()) { try { FileUtils.copyDirectory(this, target); } catch (IOException e) { throw new RuntimeException(String.format("Could not copy test directory '%s' to '%s'", this, target), e); } } else { try { FileUtils.copyFile(this, target); } catch (IOException e) { throw new RuntimeException(String.format("Could not copy test file '%s' to '%s'", this, target), e); } } } public void copyFrom(File target) { new TestFile(target).copyTo(this); } public void copyFrom(URL resource) { try { FileUtils.copyURLToFile(resource, this); } catch (IOException e) { throw new RuntimeException(e); } } public void moveToDirectory(File target) { if (target.exists() && !target.isDirectory()) { throw new RuntimeException(String.format("Target '%s' is not a directory", target)); } try { FileUtils.moveFileToDirectory(this, target, true); } catch (IOException e) { throw new RuntimeException(String.format("Could not move test file '%s' to directory '%s'", this, target), e); } } public TestFile touch() { try { FileUtils.touch(this); } catch (IOException e) { throw new RuntimeException(e); } assertIsFile(); return this; } /** * Creates a directory structure specified by the given closure. *

     * dir.create {
     *     subdir1 {
     *        file 'somefile.txt'
     *     }
     *     subdir2 { nested { file 'someFile' } }
     * }
     * 
*/ public TestFile create(Closure structure) { assertTrue(isDirectory() || mkdirs()); new TestWorkspaceBuilder(this).apply(structure); return this; } @Override public TestFile getParentFile() { return super.getParentFile() == null ? null : new TestFile(super.getParentFile()); } @Override public String toString() { return getPath(); } public TestFile writelns(Iterable lines) { Formatter formatter = new Formatter(); for (String line : lines) { formatter.format("%s%n", line); } return write(formatter); } public TestFile assertExists() { assertTrue(String.format("%s does not exist", this), exists()); return this; } public TestFile assertIsFile() { assertTrue(String.format("%s is not a file", this), isFile()); return this; } public TestFile assertIsDir() { assertTrue(String.format("%s is not a directory", this), isDirectory()); return this; } public TestFile assertDoesNotExist() { assertFalse(String.format("%s should not exist", this), exists()); return this; } public TestFile assertContents(Matcher matcher) { assertThat(getText(), matcher); return this; } public TestFile assertIsCopyOf(TestFile other) { assertIsFile(); other.assertIsFile(); assertEquals(String.format("%s is not the same length as %s", this, other), other.length(), this.length()); assertTrue(String.format("%s does not have the same content as %s", this, other), Arrays.equals(getHash("MD5"), other.getHash("MD5"))); return this; } private byte[] getHash(String algorithm) { try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); messageDigest.update(FileUtils.readFileToByteArray(this)); return messageDigest.digest(); } catch (Exception e) { throw new RuntimeException(e); } } public String readLink() { assertExists(); return new TestFileHelper(this).readLink(); } public String getPermissions() { assertExists(); return new TestFileHelper(this).getPermissions(); } public TestFile setPermissions(String permissions) { assertExists(); new TestFileHelper(this).setPermissions(permissions); return this; } public TestFile setMode(int mode) { assertExists(); new TestFileHelper(this).setMode(mode); return this; } public int getMode() { assertExists(); return new TestFileHelper(this).getMode(); } /** * Asserts that this file contains exactly the given set of descendants. */ public TestFile assertHasDescendants(String... descendants) { Set actual = new TreeSet(); assertIsDir(); visit(actual, "", this); Set expected = new TreeSet(Arrays.asList(descendants)); Set extras = new TreeSet(actual); extras.removeAll(expected); Set missing = new TreeSet(expected); missing.removeAll(actual); assertEquals(String.format("For dir: %s, extra files: %s, missing files: %s, expected: %s", this, extras, missing, expected), expected, actual); return this; } public TestFile assertIsEmptyDir() { if (exists()) { assertIsDir(); assertHasDescendants(); } return this; } private void visit(Set names, String prefix, File file) { for (File child : file.listFiles()) { if (child.isFile()) { names.add(prefix + child.getName()); } else if (child.isDirectory()) { visit(names, prefix + child.getName() + "/", child); } } } public boolean isSelfOrDescendent(File file) { if (file.getAbsolutePath().equals(getAbsolutePath())) { return true; } return file.getAbsolutePath().startsWith(getAbsolutePath() + File.separatorChar); } public TestFile createDir() { if (mkdirs()) { return this; } if (isDirectory()) { return this; } throw new AssertionError("Problems creating dir: " + this + ". Diagnostics: exists=" + this.exists() + ", isFile=" + this.isFile() + ", isDirectory=" + this.isDirectory()); } public TestFile createDir(Object path) { return new TestFile(this, path).createDir(); } public TestFile deleteDir() { new TestFileHelper(this).delete(useNativeTools); return this; } /** * Attempts to delete this directory, ignoring failures to do so. * @return this */ public TestFile maybeDeleteDir() { try { deleteDir(); } catch (RuntimeException e) { // Ignore } return this; } public TestFile createFile() { new TestFile(getParentFile()).createDir(); try { assertTrue(isFile() || createNewFile()); } catch (IOException e) { throw new RuntimeException(e); } return this; } public TestFile createFile(Object path) { return file(path).createFile(); } public TestFile createZip(Object path) { Zip zip = new Zip(); zip.setWhenempty((Zip.WhenEmpty) Zip.WhenEmpty.getInstance(Zip.WhenEmpty.class, "create")); TestFile zipFile = file(path); zip.setDestFile(zipFile); zip.setBasedir(this); zip.setExcludes("**"); execute(zip); return zipFile; } public TestFile zipTo(TestFile zipFile){ new TestFileHelper(this).zipTo(zipFile, useNativeTools); return this; } public TestFile tarTo(TestFile tarFile) { new TestFileHelper(this).tarTo(tarFile, useNativeTools); return this; } public TestFile tgzTo(TestFile tarFile) { Tar tar = new Tar(); tar.setBasedir(this); tar.setDestFile(tarFile); tar.setCompression((Tar.TarCompressionMethod) EnumeratedAttribute.getInstance(Tar.TarCompressionMethod.class, "gzip")); execute(tar); return this; } public TestFile tbzTo(TestFile tarFile) { Tar tar = new Tar(); tar.setBasedir(this); tar.setDestFile(tarFile); tar.setCompression((Tar.TarCompressionMethod) EnumeratedAttribute.getInstance(Tar.TarCompressionMethod.class, "bzip2")); execute(tar); return this; } private void execute(Task task) { task.setProject(new Project()); task.execute(); } public Snapshot snapshot() { assertIsFile(); return new Snapshot(lastModified(), getHash("MD5")); } public void assertHasChangedSince(Snapshot snapshot) { Snapshot now = snapshot(); assertTrue(now.modTime != snapshot.modTime || !Arrays.equals(now.hash, snapshot.hash)); } public void assertContentsHaveChangedSince(Snapshot snapshot) { Snapshot now = snapshot(); assertTrue(String.format("contents of %s have not changed", this), !Arrays.equals(now.hash, snapshot.hash)); } public void assertContentsHaveNotChangedSince(Snapshot snapshot) { Snapshot now = snapshot(); assertArrayEquals(String.format("contents of %s has changed", this), snapshot.hash, now.hash); } public void assertHasNotChangedSince(Snapshot snapshot) { Snapshot now = snapshot(); assertEquals(String.format("last modified time of %s has changed", this), snapshot.modTime, now.modTime); assertArrayEquals(String.format("contents of %s has changed", this), snapshot.hash, now.hash); } public void writeProperties(Map properties) { Properties props = new Properties(); props.putAll(properties); try { FileOutputStream stream = new FileOutputStream(this); try { props.store(stream, "comment"); } finally { stream.close(); } } catch (IOException e) { throw new RuntimeException(e); } } public ExecOutput exec(Object... args) { return new TestFileHelper(this).execute(Arrays.asList(args), null); } public ExecOutput execute(List args, List env) { return new TestFileHelper(this).execute(args, env); } public class Snapshot { private final long modTime; private final byte[] hash; public Snapshot(long modTime, byte[] hash) { this.modTime = modTime; this.hash = hash; } } } TestFileHelper.groovy000066400000000000000000000150401337527402300342530ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/filepackage com.github.jengelman.gradle.plugins.shadow.util.file; import org.apache.commons.io.FileUtils import org.apache.commons.lang.StringUtils import org.apache.tools.ant.Project import org.apache.tools.ant.taskdefs.Expand import org.apache.tools.ant.taskdefs.Tar import org.apache.tools.ant.taskdefs.Untar import org.apache.tools.ant.taskdefs.Zip import java.util.zip.ZipInputStream import static org.junit.Assert.assertTrue class TestFileHelper { TestFile file TestFileHelper(TestFile file) { this.file = file } void unzipTo(File target, boolean nativeTools) { // Check that each directory in hierarchy is present file.withInputStream {InputStream instr -> def dirs = [] as Set def zipStr = new ZipInputStream(instr) def entry while (entry = zipStr.getNextEntry()) { if (entry.directory) { assertTrue("Duplicate directory '$entry.name'", dirs.add(entry.name)) } if (!entry.name.contains('/')) { continue } def parent = StringUtils.substringBeforeLast(entry.name, '/') + '/' assertTrue("Missing dir '$parent'", dirs.contains(parent)) } } if (nativeTools && isUnix()) { def process = ['unzip', '-o', file.absolutePath, '-d', target.absolutePath].execute() process.consumeProcessOutput(System.out, System.err) assert process.waitFor() == 0 return } def unzip = new Expand() unzip.src = file unzip.dest = target unzip.project = new Project() unzip.execute() } void untarTo(File target, boolean nativeTools) { if (nativeTools && isUnix()) { target.mkdirs() def builder = new ProcessBuilder(['tar', '-xpf', file.absolutePath]) builder.directory(target) def process = builder.start() process.consumeProcessOutput() assert process.waitFor() == 0 return } def untar = new Untar() untar.setSrc(file) untar.setDest(target) if (file.name.endsWith(".tgz")) { def method = new Untar.UntarCompressionMethod() method.value = "gzip" untar.compression = method } else if (file.name.endsWith(".tbz2")) { def method = new Untar.UntarCompressionMethod() method.value = "bzip2" untar.compression = method } untar.project = new Project() untar.execute() } private boolean isUnix() { return !System.getProperty('os.name').toLowerCase().contains('windows') } String getPermissions() { if (!isUnix()) { return "-rwxr-xr-x" } def process = ["ls", "-ld", file.absolutePath].execute() def result = process.inputStream.text def error = process.errorStream.text def retval = process.waitFor() if (retval != 0) { throw new RuntimeException("Could not list permissions for '$file': $error") } def perms = result.split()[0] assert perms.matches("[d\\-][rwx\\-]{9}[@\\+]?") return perms.substring(1, 10) } void setPermissions(String permissions) { if (!isUnix()) { return } int m = toMode(permissions) setMode(m) } void setMode(int mode) { def process = ["chmod", Integer.toOctalString(mode), file.absolutePath].execute() def error = process.errorStream.text def retval = process.waitFor() if (retval != 0) { throw new RuntimeException("Could not set permissions for '$file': $error") } } private int toMode(String permissions) { int m = [6, 3, 0].inject(0) { mode, pos -> mode |= permissions[9 - pos - 3] == 'r' ? 4 << pos : 0 mode |= permissions[9 - pos - 2] == 'w' ? 2 << pos : 0 mode |= permissions[9 - pos - 1] == 'x' ? 1 << pos : 0 return mode } return m } int getMode() { return toMode(getPermissions()) } void delete(boolean nativeTools) { if (isUnix() && nativeTools) { def process = ["rm", "-rf", file.absolutePath].execute() def error = process.errorStream.text def retval = process.waitFor() if (retval != 0) { throw new RuntimeException("Could not delete '$file': $error") } } else { FileUtils.deleteQuietly(file); } } String readLink() { def process = ["readlink", file.absolutePath].execute() def error = process.errorStream.text def retval = process.waitFor() if (retval != 0) { throw new RuntimeException("Could not read link '$file': $error") } return process.inputStream.text.trim() } ExecOutput exec(List args) { return execute(args, null) } ExecOutput execute(List args, List env) { def process = ([file.absolutePath] + args).execute(env, null) String output = process.inputStream.text String error = process.errorStream.text if (process.waitFor() != 0) { throw new RuntimeException("Could not execute $file. Error: $error, Output: $output") } return new ExecOutput(output, error) } public void zipTo(TestFile zipFile, boolean nativeTools) { if (nativeTools && isUnix()) { def process = ['zip', zipFile.absolutePath, "-r", file.name].execute(null, zipFile.parentFile) process.consumeProcessOutput(System.out, System.err) assert process.waitFor() == 0 } else { Zip zip = new Zip(); zip.setBasedir(file); zip.setDestFile(zipFile); zip.setProject(new Project()); def whenEmpty = new Zip.WhenEmpty() whenEmpty.setValue("create") zip.setWhenempty(whenEmpty); zip.execute(); } } public void tarTo(TestFile tarFile, boolean nativeTools) { if (nativeTools && isUnix()) { def process = ['tar', "-cf", tarFile.absolutePath, file.name].execute(null, tarFile.parentFile) process.consumeProcessOutput(System.out, System.err) assert process.waitFor() == 0 } else { Tar tar = new Tar(); tar.setBasedir(file); tar.setDestFile(tarFile); tar.setProject(new Project()) tar.execute() } } }TestNameTestDirectoryProvider.java000066400000000000000000000103421337527402300367500ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/filepackage com.github.jengelman.gradle.plugins.shadow.util.file; import org.apache.commons.lang.StringUtils; import org.junit.rules.MethodRule; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import java.io.File; import java.util.concurrent.atomic.AtomicInteger; /** * A JUnit rule which provides a unique temporary folder for the test. */ public class TestNameTestDirectoryProvider implements MethodRule, TestRule, TestDirectoryProvider { private TestFile dir; private String prefix; private static TestFile root; private static AtomicInteger testCounter = new AtomicInteger(1); static { // NOTE: the space in the directory name is intentional root = new TestFile(new File("build/tmp/test files")); } private String determinePrefix() { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement element : stackTrace) { if (element.getClassName().endsWith("Test") || element.getClassName().endsWith("Spec")) { return StringUtils.substringAfterLast(element.getClassName(), ".") + "/unknown-test-" + testCounter.getAndIncrement(); } } return "unknown-test-class-" + testCounter.getAndIncrement(); } public Statement apply(final Statement base, final FrameworkMethod method, final Object target) { init(method.getName(), target.getClass().getSimpleName()); return new Statement() { @Override public void evaluate() throws Throwable { base.evaluate(); getTestDirectory().maybeDeleteDir(); // Don't delete on failure } }; } public Statement apply(final Statement base, Description description) { init(description.getMethodName(), description.getTestClass().getSimpleName()); return new Statement() { @Override public void evaluate() throws Throwable { base.evaluate(); getTestDirectory().maybeDeleteDir(); // Don't delete on failure } }; } private void init(String methodName, String className) { if (methodName == null) { // must be a @ClassRule; use the rule's class name instead methodName = getClass().getSimpleName(); } if (prefix == null) { String safeMethodName = methodName.replaceAll("\\s", "_").replace(File.pathSeparator, "_").replace(":", "_"); if (safeMethodName.length() > 64) { safeMethodName = safeMethodName.substring(0, 32) + "..." + safeMethodName.substring(safeMethodName.length() - 32); } prefix = String.format("%s/%s", className, safeMethodName); } } public static TestNameTestDirectoryProvider newInstance() { return new TestNameTestDirectoryProvider(); } public static TestNameTestDirectoryProvider newInstance(FrameworkMethod method, Object target) { TestNameTestDirectoryProvider testDirectoryProvider = new TestNameTestDirectoryProvider(); testDirectoryProvider.init(method.getName(), target.getClass().getSimpleName()); return testDirectoryProvider; } public TestFile getTestDirectory() { if (dir == null) { if (prefix == null) { // This can happen if this is used in a constructor or a @Before method. It also happens when using // @RunWith(SomeRunner) when the runner does not support rules. prefix = determinePrefix(); } for (int counter = 1; true; counter++) { dir = root.file(counter == 1 ? prefix : String.format("%s%d", prefix, counter)); if (dir.mkdirs()) { break; } } } return dir; } public TestFile file(Object... path) { return getTestDirectory().file((Object[]) path); } public TestFile createFile(Object... path) { return file((Object[]) path).createFile(); } public TestFile createDir(Object... path) { return file((Object[]) path).createDir(); } } TestWorkspaceBuilder.groovy000066400000000000000000000016531337527402300355060ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/filepackage com.github.jengelman.gradle.plugins.shadow.util.file /** * Used in TestFile.create(). * * Should be inner class of TestFile, but can't because Groovy has issues with inner classes as delegates. */ class TestWorkspaceBuilder { def TestFile baseDir def TestWorkspaceBuilder(TestFile baseDir) { this.baseDir = baseDir } def apply(Closure cl) { cl.delegate = this cl.resolveStrategy = Closure.DELEGATE_FIRST cl() } def file(String name) { TestFile file = baseDir.file(name) file.write('some content') file } def setMode(int mode) { baseDir.mode = mode } def methodMissing(String name, Object args) { if (args.length == 1 && args[0] instanceof Closure) { baseDir.file(name).create(args[0]) } else { throw new MissingMethodException(name, getClass(), args) } } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/000077500000000000000000000000001337527402300302325ustar00rootroot00000000000000AbstractModule.groovy000066400000000000000000000043561337527402300343430ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repopackage com.github.jengelman.gradle.plugins.shadow.util.repo import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile import org.gradle.internal.hash.HashUtil abstract class AbstractModule { /** * @param cl A closure that is passed a writer to use to generate the content. */ protected void publish(TestFile file, Closure cl) { def hashBefore = file.exists() ? getHash(file, "sha1") : null def tmpFile = file.parentFile.file("${file.name}.tmp") tmpFile.withWriter("utf-8") { cl.call(it) } def hashAfter = getHash(tmpFile, "sha1") if (hashAfter == hashBefore) { // Already published return } assert !file.exists() || file.delete() assert tmpFile.renameTo(file) onPublish(file) } protected void publishWithStream(TestFile file, Closure cl) { def hashBefore = file.exists() ? getHash(file, "sha1") : null def tmpFile = file.parentFile.file("${file.name}.tmp") tmpFile.withOutputStream { cl.call(it) } def hashAfter = getHash(tmpFile, "sha1") if (hashAfter == hashBefore) { // Already published return } assert !file.exists() || file.delete() assert tmpFile.renameTo(file) onPublish(file) } protected abstract onPublish(TestFile file) TestFile getSha1File(TestFile file) { getHashFile(file, "sha1") } TestFile sha1File(TestFile file) { hashFile(file, "sha1", 40) } TestFile getMd5File(TestFile file) { getHashFile(file, "md5") } TestFile md5File(TestFile file) { hashFile(file, "md5", 32) } private TestFile hashFile(TestFile file, String algorithm, int len) { def hashFile = getHashFile(file, algorithm) def hash = getHash(file, algorithm) hashFile.text = String.format("%0${len}x", hash) return hashFile } private TestFile getHashFile(TestFile file, String algorithm) { file.parentFile.file("${file.name}.${algorithm}") } protected BigInteger getHash(TestFile file, String algorithm) { HashUtil.createHash(file, algorithm.toUpperCase()).asBigInteger() } } shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/maven/000077500000000000000000000000001337527402300313405ustar00rootroot00000000000000AbstractMavenModule.groovy000066400000000000000000000246271337527402300364430ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile import com.github.jengelman.gradle.plugins.shadow.util.repo.AbstractModule import groovy.xml.MarkupBuilder import java.text.SimpleDateFormat abstract class AbstractMavenModule extends AbstractModule implements MavenModule { protected static final String MAVEN_METADATA_FILE = "maven-metadata.xml" final TestFile moduleDir final String groupId final String artifactId final String version String parentPomSection String type = 'jar' String packaging int publishCount = 1 private final List dependencies = [] private final List artifacts = [] final updateFormat = new SimpleDateFormat("yyyyMMddHHmmss") final timestampFormat = new SimpleDateFormat("yyyyMMdd.HHmmss") AbstractMavenModule(TestFile moduleDir, String groupId, String artifactId, String version) { this.moduleDir = moduleDir this.groupId = groupId this.artifactId = artifactId this.version = version } MavenModule parent(String group, String artifactId, String version) { parentPomSection = """ ${group} ${artifactId} ${version} """ return this } TestFile getArtifactFile(Map options = [:]) { if (version.endsWith("-SNAPSHOT") && !metaDataFile.exists() && uniqueSnapshots) { def artifact = toArtifact(options) return moduleDir.file("${artifactId}-${version}${artifact.classifier ? "-${artifact.classifier}" : ""}.${artifact.type}") } return artifactFile(options) } abstract boolean getUniqueSnapshots() String getPublishArtifactVersion() { if (uniqueSnapshots && version.endsWith("-SNAPSHOT")) { return "${version.replaceFirst('-SNAPSHOT$', '')}-${getUniqueSnapshotVersion()}" } return version } private String getUniqueSnapshotVersion() { assert uniqueSnapshots && version.endsWith('-SNAPSHOT') if (metaDataFile.isFile()) { def metaData = new XmlParser().parse(metaDataFile.assertIsFile()) def timestamp = metaData.versioning.snapshot.timestamp[0].text().trim() def build = metaData.versioning.snapshot.buildNumber[0].text().trim() return "${timestamp}-${build}" } return "${timestampFormat.format(publishTimestamp)}-${publishCount}" } MavenModule dependsOn(String... dependencyArtifactIds) { for (String id : dependencyArtifactIds) { dependsOn(groupId, id, '1.0') } return this } MavenModule dependsOn(String group, String artifactId, String version, String type = null) { this.dependencies << [groupId: group, artifactId: artifactId, version: version, type: type] return this } MavenModule hasPackaging(String packaging) { this.packaging = packaging return this } /** * Specifies the type of the main artifact. */ MavenModule hasType(String type) { this.type = type return this } /** * Adds an additional artifact to this module. * @param options Can specify any of: type or classifier */ MavenModule artifact(Map options) { artifacts << options return this } String getPackaging() { return packaging } List getDependencies() { return dependencies } List getArtifacts() { return artifacts } void assertNotPublished() { pomFile.assertDoesNotExist() } void assertPublished() { assert pomFile.assertExists() assert parsedPom.groupId == groupId assert parsedPom.artifactId == artifactId assert parsedPom.version == version } void assertPublishedAsPomModule() { assertPublished() assertArtifactsPublished("${artifactId}-${publishArtifactVersion}.pom") assert parsedPom.packaging == "pom" } void assertPublishedAsJavaModule() { assertPublished() assertArtifactsPublished("${artifactId}-${publishArtifactVersion}.jar", "${artifactId}-${publishArtifactVersion}.pom") assert parsedPom.packaging == null } void assertPublishedAsWebModule() { assertPublished() assertArtifactsPublished("${artifactId}-${publishArtifactVersion}.war", "${artifactId}-${publishArtifactVersion}.pom") assert parsedPom.packaging == 'war' } void assertPublishedAsEarModule() { assertPublished() assertArtifactsPublished("${artifactId}-${publishArtifactVersion}.ear", "${artifactId}-${publishArtifactVersion}.pom") assert parsedPom.packaging == 'ear' } /** * Asserts that exactly the given artifacts have been deployed, along with their checksum files */ void assertArtifactsPublished(String... names) { def artifactNames = names as Set if (publishesMetaDataFile()) { artifactNames.add(MAVEN_METADATA_FILE) } assert moduleDir.isDirectory() Set actual = moduleDir.list() as Set for (name in artifactNames) { assert actual.remove(name) if(publishesHashFiles()) { assert actual.remove("${name}.md5" as String) assert actual.remove("${name}.sha1" as String) } } assert actual.isEmpty() } //abstract String getPublishArtifactVersion() MavenPom getParsedPom() { return new MavenPom(pomFile) } DefaultMavenMetaData getRootMetaData() { new DefaultMavenMetaData(rootMetaDataFile) } TestFile getPomFile() { return moduleDir.file("$artifactId-${publishArtifactVersion}.pom") } TestFile getMetaDataFile() { moduleDir.file(MAVEN_METADATA_FILE) } TestFile getRootMetaDataFile() { moduleDir.parentFile.file(MAVEN_METADATA_FILE) } TestFile artifactFile(Map options) { def artifact = toArtifact(options) def fileName = "$artifactId-${publishArtifactVersion}.${artifact.type}" if (artifact.classifier) { fileName = "$artifactId-$publishArtifactVersion-${artifact.classifier}.${artifact.type}" } return moduleDir.file(fileName) } MavenModule publishWithChangedContent() { publishCount++ return publish() } protected Map toArtifact(Map options) { options = new HashMap(options) def artifact = [type: options.remove('type') ?: type, classifier: options.remove('classifier') ?: null] assert options.isEmpty(): "Unknown options : ${options.keySet()}" return artifact } Date getPublishTimestamp() { return new Date(updateFormat.parse("20100101120000").time + publishCount * 1000) } MavenModule publishPom() { moduleDir.createDir() def rootMavenMetaData = getRootMetaDataFile() updateRootMavenMetaData(rootMavenMetaData) if (publishesMetaDataFile()) { publish(metaDataFile) { Writer writer -> writer << getMetaDataFileContent() } } publish(pomFile) { Writer writer -> def pomPackaging = packaging ?: type; writer << """ 4.0.0 $groupId $artifactId $pomPackaging $version Published on $publishTimestamp""" if (parentPomSection) { writer << "\n$parentPomSection\n" } if (!dependencies.empty) { writer << """ """ } dependencies.each { dependency -> def typeAttribute = dependency['type'] == null ? "" : "$dependency.type" writer << """ $dependency.groupId $dependency.artifactId $dependency.version $typeAttribute """ } if (!dependencies.empty) { writer << """ """ } writer << "\n" } return this } private void updateRootMavenMetaData(TestFile rootMavenMetaData) { def allVersions = rootMavenMetaData.exists() ? new XmlParser().parseText(rootMavenMetaData.text).versioning.versions.version*.value().flatten() : [] allVersions << version; publish(rootMavenMetaData) { Writer writer -> def builder = new MarkupBuilder(writer) builder.metadata { groupId(groupId) artifactId(artifactId) version(allVersions.max()) versioning { if (uniqueSnapshots && version.endsWith("-SNAPSHOT")) { snapshot { timestamp(timestampFormat.format(publishTimestamp)) buildNumber(publishCount) lastUpdated(updateFormat.format(publishTimestamp)) } } else { versions { allVersions.each {currVersion -> version(currVersion) } } } } } } } abstract String getMetaDataFileContent() MavenModule publish() { publishPom() artifacts.each { artifact -> publishArtifact(artifact) } publishArtifact([:]) return this } File publishArtifact(Map artifact) { def artifactFile = artifactFile(artifact) if (type == 'pom') { return artifactFile } publish(artifactFile) { Writer writer -> writer << "${artifactFile.name} : $artifactContent" } return artifactFile } protected String getArtifactContent() { // Some content to include in each artifact, so that its size and content varies on each publish return (0..publishCount).join("-") } protected abstract boolean publishesMetaDataFile() protected abstract boolean publishesHashFiles() } DefaultMavenMetaData.groovy000066400000000000000000000014321337527402300365040ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven /** * http://maven.apache.org/ref/3.0.1/maven-repository-metadata/repository-metadata.html */ class DefaultMavenMetaData implements MavenMetaData{ String text String groupId String artifactId String version List versions = [] String lastUpdated DefaultMavenMetaData(File file) { text = file.text def xml = new XmlParser().parseText(text) groupId = xml.groupId[0]?.text() artifactId = xml.artifactId[0]?.text() version = xml.version[0]?.text() def versioning = xml.versioning[0] lastUpdated = versioning.lastUpdated[0]?.text() versioning.versions[0].version.each { versions << it.text() } } } MavenDependency.groovy000066400000000000000000000007071337527402300356010ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven class MavenDependency { String groupId String artifactId String version String classifier String type MavenDependency hasType(def type) { assert this.type == type return this } @Override public String toString() { return String.format("MavenDependency %s:%s:%s:%s@%s", groupId, artifactId, version, classifier, type) } } MavenFileModule.groovy000066400000000000000000000025261337527402300355510ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile class MavenFileModule extends AbstractMavenModule { private boolean uniqueSnapshots = true; MavenFileModule(TestFile moduleDir, String groupId, String artifactId, String version) { super(moduleDir, groupId, artifactId, version) } boolean getUniqueSnapshots() { return uniqueSnapshots } MavenModule withNonUniqueSnapshots() { uniqueSnapshots = false; return this; } @Override String getMetaDataFileContent() { """ $groupId $artifactId $version ${timestampFormat.format(publishTimestamp)} $publishCount ${updateFormat.format(publishTimestamp)} """ } @Override protected onPublish(TestFile file) { sha1File(file) md5File(file) } @Override protected boolean publishesMetaDataFile() { uniqueSnapshots && version.endsWith("-SNAPSHOT") } @Override protected boolean publishesHashFiles() { true } } MavenFileRepository.groovy000066400000000000000000000012731337527402300365010ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile /** * A fixture for dealing with file Maven repositories. */ class MavenFileRepository implements MavenRepository { final TestFile rootDir MavenFileRepository(TestFile rootDir) { this.rootDir = rootDir } URI getUri() { return rootDir.toURI() } MavenFileModule module(String groupId, String artifactId, Object version = '1.0') { def artifactDir = rootDir.file("${groupId.replace('.', '/')}/$artifactId/$version") return new MavenFileModule(artifactDir, groupId, artifactId, version as String) } } MavenMetaData.groovy000066400000000000000000000002101337527402300351700ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven public interface MavenMetaData { List getVersions(); } MavenModule.groovy000066400000000000000000000023111337527402300347410ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven import com.github.jengelman.gradle.plugins.shadow.util.file.TestFile interface MavenModule { /** * Publishes the pom.xml plus main artifact, plus any additional artifacts for this module. Publishes only those artifacts whose content has * changed since the last call to {@code #publish()}. */ MavenModule publish() /** * Publishes the pom.xml only */ MavenModule publishPom() /** * Publishes the pom.xml plus main artifact, plus any additional artifacts for this module, with different content (and size) to any * previous publication. */ MavenModule publishWithChangedContent() MavenModule withNonUniqueSnapshots() MavenModule parent(String group, String artifactId, String version) MavenModule dependsOn(String group, String artifactId, String version) MavenModule hasPackaging(String packaging) /** * Sets the type of the main artifact for this module. */ MavenModule hasType(String type) TestFile getPomFile() TestFile getArtifactFile() TestFile getMetaDataFile() MavenPom getParsedPom() MavenMetaData getRootMetaData() } MavenPom.groovy000066400000000000000000000031631337527402300342550ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven class MavenPom { String groupId String artifactId String version String packaging String description final Map scopes = [:] MavenPom(File pomFile) { if (pomFile.exists()){ def pom = new XmlParser().parse(pomFile) groupId = pom.groupId[0]?.text() artifactId = pom.artifactId[0]?.text() version = pom.version[0]?.text() packaging = pom.packaging[0]?.text() description = pom.description[0]?.text() pom.dependencies.dependency.each { dep -> def scopeElement = dep.scope def scopeName = scopeElement ? scopeElement.text() : "runtime" def scope = scopes[scopeName] if (!scope) { scope = new MavenScope() scopes[scopeName] = scope } MavenDependency mavenDependency = new MavenDependency( groupId: dep.groupId.text(), artifactId: dep.artifactId.text(), version: dep.version.text(), classifier: dep.classifier ? dep.classifier.text() : null, type: dep.type ? dep.type.text() : null ) def key = "${mavenDependency.groupId}:${mavenDependency.artifactId}:${mavenDependency.version}" key += mavenDependency.classifier ? ":${mavenDependency.classifier}" : "" scope.dependencies[key] = mavenDependency } } } } MavenRepository.groovy000066400000000000000000000004631337527402300357010ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven /** * A fixture for dealing with Maven repositories. */ interface MavenRepository { URI getUri() MavenModule module(String groupId, String artifactId) MavenModule module(String groupId, String artifactId, Object version) } MavenScope.groovy000066400000000000000000000016101337527402300345660ustar00rootroot00000000000000shadow-4.0.3/src/test/groovy/com/github/jengelman/gradle/plugins/shadow/util/repo/mavenpackage com.github.jengelman.gradle.plugins.shadow.util.repo.maven import org.apache.commons.lang.StringUtils class MavenScope { Map dependencies = [:] void assertDependsOn(String[] expected) { assert dependencies.size() == expected.length expected.each { String key = StringUtils.substringBefore(it, "@") def dependency = expectDependency(key) String type = null if (it != key) { type = StringUtils.substringAfter(it, "@") } assert dependency.hasType(type) } } MavenDependency expectDependency(String key) { final dependency = dependencies[key] if (dependency == null) { throw new AssertionError("Could not find expected dependency $key. Actual: ${dependencies.values()}") } return dependency } } shadow-4.0.3/src/test/jars/000077500000000000000000000000001337527402300155165ustar00rootroot00000000000000shadow-4.0.3/src/test/resources/000077500000000000000000000000001337527402300165715ustar00rootroot00000000000000shadow-4.0.3/src/test/resources/components-1.xml000066400000000000000000000034361337527402300216440ustar00rootroot00000000000000 org.apache.maven.wagon.Wagon http org.apache.maven.wagon.providers.http.LightweightHttpWagon per-lookup LightweightHttpWagon false org.apache.maven.wagon.Wagon https org.apache.maven.wagon.providers.http.LightweightHttpsWagon per-lookup LIghtweightHttpsWagon false User-Agent Apache Maven/${project.version} shadow-4.0.3/src/test/resources/components-2.xml000066400000000000000000000034361337527402300216450ustar00rootroot00000000000000 org.apache.maven.wagon.Wagon http org.apache.maven.wagon.providers.http.LightweightHttpWagon per-lookup LightweightHttpWagon false User-Agent Apache Maven/${project.version} org.apache.maven.wagon.Wagon https org.apache.maven.wagon.providers.http.LightweightHttpsWagon per-lookup LIghtweightHttpsWagon false shadow-4.0.3/src/test/resources/components-expected.xml000066400000000000000000000037751337527402300233130ustar00rootroot00000000000000 org.apache.maven.wagon.Wagon http org.apache.maven.wagon.providers.http.LightweightHttpWagon per-lookup LightweightHttpWagon false User-Agent Apache Maven/${project.version} org.apache.maven.wagon.Wagon https org.apache.maven.wagon.providers.http.LightweightHttpsWagon per-lookup LIghtweightHttpsWagon false User-Agent Apache Maven/${project.version} shadow-4.0.3/yarn.lock000066400000000000000000006671661337527402300146620ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@babel/code-frame@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz#d18c2f4c4ba8d093a2bcfab5616593bfe2441a27" dependencies: "@babel/highlight" "7.0.0-beta.47" "@babel/core@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.47.tgz#b9c164fb9a1e1083f067c236a9da1d7a7d759271" dependencies: "@babel/code-frame" "7.0.0-beta.47" "@babel/generator" "7.0.0-beta.47" "@babel/helpers" "7.0.0-beta.47" "@babel/template" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" babylon "7.0.0-beta.47" convert-source-map "^1.1.0" debug "^3.1.0" json5 "^0.5.0" lodash "^4.17.5" micromatch "^2.3.11" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" "@babel/generator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.47.tgz#1835709f377cc4d2a4affee6d9258a10bbf3b9d1" dependencies: "@babel/types" "7.0.0-beta.47" jsesc "^2.5.1" lodash "^4.17.5" source-map "^0.5.0" trim-right "^1.0.1" "@babel/helper-annotate-as-pure@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.47.tgz#354fb596055d9db369211bf075f0d5e93904d6f6" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.47.tgz#d5917c29ee3d68abc2c72f604bc043f6e056e907" dependencies: "@babel/helper-explode-assignable-expression" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-call-delegate@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.47.tgz#96b7804397075f722a4030d3876f51ec19d8829b" dependencies: "@babel/helper-hoist-variables" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-define-map@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.47.tgz#43a9def87c5166dc29630d51b3da9cc4320c131c" dependencies: "@babel/helper-function-name" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" lodash "^4.17.5" "@babel/helper-explode-assignable-expression@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.47.tgz#56b688e282a698f4d1cf135453a11ae8af870a19" dependencies: "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-function-name@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.47.tgz#8057d63e951e85c57c02cdfe55ad7608d73ffb7d" dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.47" "@babel/template" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-get-function-arity@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.47.tgz#2de04f97c14b094b55899d3fa83144a16d207510" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-hoist-variables@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.47.tgz#ce295d1d723fe22b2820eaec748ed701aa5ae3d0" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-member-expression-to-functions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.47.tgz#35bfcf1d16dce481ef3dec66d5a1ae6a7d80bb45" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-module-imports@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.47.tgz#5af072029ffcfbece6ffbaf5d9984c75580f3f04" dependencies: "@babel/types" "7.0.0-beta.47" lodash "^4.17.5" "@babel/helper-module-transforms@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.47.tgz#7eff91fc96873bd7b8d816698f1a69bbc01f3c38" dependencies: "@babel/helper-module-imports" "7.0.0-beta.47" "@babel/helper-simple-access" "7.0.0-beta.47" "@babel/helper-split-export-declaration" "7.0.0-beta.47" "@babel/template" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" lodash "^4.17.5" "@babel/helper-optimise-call-expression@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.47.tgz#085d864d0613c5813c1b7c71b61bea36f195929e" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-plugin-utils@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.47.tgz#4f564117ec39f96cf60fafcde35c9ddce0e008fd" "@babel/helper-regex@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.47.tgz#b8e3b53132c4edbb04804242c02ffe4d60316971" dependencies: lodash "^4.17.5" "@babel/helper-remap-async-to-generator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.47.tgz#444dc362f61470bd61a745ebb364431d9ca186c2" dependencies: "@babel/helper-annotate-as-pure" "7.0.0-beta.47" "@babel/helper-wrap-function" "7.0.0-beta.47" "@babel/template" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-replace-supers@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.47.tgz#310b206a302868a792b659455ceba27db686cbb7" dependencies: "@babel/helper-member-expression-to-functions" "7.0.0-beta.47" "@babel/helper-optimise-call-expression" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helper-simple-access@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.47.tgz#234d754acbda9251a10db697ef50181eab125042" dependencies: "@babel/template" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" lodash "^4.17.5" "@babel/helper-split-export-declaration@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.47.tgz#e11277855472d8d83baf22f2d0186c4a2059b09a" dependencies: "@babel/types" "7.0.0-beta.47" "@babel/helper-wrap-function@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.47.tgz#6528b44a3ccb4f3aeeb79add0a88192f7eb81161" dependencies: "@babel/helper-function-name" "7.0.0-beta.47" "@babel/template" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/helpers@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.47.tgz#f9b42ed2e4d5f75ec0fb2e792c173e451e8d40fd" dependencies: "@babel/template" "7.0.0-beta.47" "@babel/traverse" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" "@babel/highlight@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.47.tgz#8fbc83fb2a21f0bd2b95cdbeb238cf9689cad494" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" "@babel/plugin-proposal-async-generator-functions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.47.tgz#571142284708c5ad4ec904d9aa705461a010be53" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-remap-async-to-generator" "7.0.0-beta.47" "@babel/plugin-syntax-async-generators" "7.0.0-beta.47" "@babel/plugin-proposal-class-properties@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.47.tgz#08c1a1dfc92d0f5c37b39096c6fb883e1ca4b0f5" dependencies: "@babel/helper-function-name" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-replace-supers" "7.0.0-beta.47" "@babel/plugin-syntax-class-properties" "7.0.0-beta.47" "@babel/plugin-proposal-decorators@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0-beta.47.tgz#5e8943c8f8eb3301f911ef0dcd3ed64cf28c723e" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-decorators" "7.0.0-beta.47" "@babel/plugin-proposal-export-namespace-from@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.0.0-beta.47.tgz#38171dd0fd5f54aee377d338ed41bb92e25d6720" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-export-namespace-from" "7.0.0-beta.47" "@babel/plugin-proposal-function-sent@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.0.0-beta.47.tgz#3ad46c04a277a887731f21843013292d254f7ba9" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-wrap-function" "7.0.0-beta.47" "@babel/plugin-syntax-function-sent" "7.0.0-beta.47" "@babel/plugin-proposal-numeric-separator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.0.0-beta.47.tgz#3ace5cbacb62c3fa223c3c0b66c0c16e63a8e259" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-numeric-separator" "7.0.0-beta.47" "@babel/plugin-proposal-object-rest-spread@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.47.tgz#e1529fddc88e948868ee1d0edaa27ebd9502322d" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.47" "@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.47.tgz#8c6453919537517ea773bb8f3fceda4250795efa" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.47" "@babel/plugin-proposal-throw-expressions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.0.0-beta.47.tgz#9a67f8b0852b4b0b255eff5d6d25fa436928424f" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-throw-expressions" "7.0.0-beta.47" "@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.47.tgz#34d7e4811bdc4f512400bb29d01051842528c8d5" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-regex" "7.0.0-beta.47" regexpu-core "^4.1.4" "@babel/plugin-syntax-async-generators@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.47.tgz#8ab94852bf348badc866af85bd852221f0961256" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-class-properties@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.47.tgz#de52bed12fd472c848e1562f57dd4a202fe27f11" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-decorators@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0-beta.47.tgz#a42f10fcd651940bc475d93b3ac23432b4a8a293" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-dynamic-import@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0-beta.47.tgz#ee964915014a687701ee8e15c289e31a7c899e60" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-export-namespace-from@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.0.0-beta.47.tgz#fd446c76c59849f15e6cde235b5b8e153413f21e" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-function-sent@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.0.0-beta.47.tgz#8d15536f55b21acdf9bfaa177c46591a589fe8b0" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-import-meta@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.0.0-beta.47.tgz#8ab5174209a954b91e327004a7d16737bcc4774d" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-jsx@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.47.tgz#f3849d94288695d724bd205b4f6c3c99e4ec24a4" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-numeric-separator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.0.0-beta.47.tgz#9f06cb770a94f464b3b2889d2110080bc302fc80" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-object-rest-spread@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.47.tgz#21da514d94c138b2261ca09f0dec9abadce16185" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.47.tgz#0b1c52b066aa36893c41450773a5adb904cd4024" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-syntax-throw-expressions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.0.0-beta.47.tgz#8ca197bab3534f443eecd7eb79da47e199dafaf7" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-arrow-functions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.47.tgz#d6eecda4c652b909e3088f0983ebaf8ec292984b" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-async-to-generator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.47.tgz#5723816ea1e91fa313a84e6ee9cc12ff31d46610" dependencies: "@babel/helper-module-imports" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-remap-async-to-generator" "7.0.0-beta.47" "@babel/plugin-transform-block-scoped-functions@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.47.tgz#e422278e06c797b43c45f459d83c7af9d6237002" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-block-scoping@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.47.tgz#b737cc58a81bea57efd5bda0baef9a43a25859ad" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" lodash "^4.17.5" "@babel/plugin-transform-classes@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.47.tgz#7aff9cbe7b26fd94d7a9f97fa90135ef20c93fb6" dependencies: "@babel/helper-annotate-as-pure" "7.0.0-beta.47" "@babel/helper-define-map" "7.0.0-beta.47" "@babel/helper-function-name" "7.0.0-beta.47" "@babel/helper-optimise-call-expression" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-replace-supers" "7.0.0-beta.47" "@babel/helper-split-export-declaration" "7.0.0-beta.47" globals "^11.1.0" "@babel/plugin-transform-computed-properties@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.47.tgz#56ef2a021769a2b65e90a3e12fd10b791da9f3e0" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-destructuring@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.47.tgz#452b607775fd1c4d10621997837189efc0a6d428" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-dotall-regex@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.47.tgz#d8da9b706d4bfc68dec9d565661f83e6e8036636" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-regex" "7.0.0-beta.47" regexpu-core "^4.1.3" "@babel/plugin-transform-duplicate-keys@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.47.tgz#4aabeda051ca3007e33a207db08f1a0cf9bd253b" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-exponentiation-operator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.47.tgz#930e1abf5db9f4db5b63dbf97f3581ad0be1e907" dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-for-of@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.47.tgz#527d5dc24e4a4ad0fc1d0a3990d29968cb984e76" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-function-name@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.47.tgz#fb443c81cc77f3206a863b730b35c8c553ce5041" dependencies: "@babel/helper-function-name" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-literals@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.47.tgz#448fad196f062163684a38f10f14e83315892e9c" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-modules-amd@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.47.tgz#84564419b11c1be6b9fcd4c7b3a6737f2335aac4" dependencies: "@babel/helper-module-transforms" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-modules-commonjs@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.47.tgz#dfe5c6d867aa9614e55f7616736073edb3aab887" dependencies: "@babel/helper-module-transforms" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-simple-access" "7.0.0-beta.47" "@babel/plugin-transform-modules-systemjs@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.47.tgz#8514dbcdfca3345abd690059e7e8544e16ecbf05" dependencies: "@babel/helper-hoist-variables" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-modules-umd@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.47.tgz#6dcfb9661fdd131b20b721044746a7a309882918" dependencies: "@babel/helper-module-transforms" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-new-target@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.47.tgz#4b5cb7ce30d7bffa105a1f43ed07d6ae206a4155" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-object-super@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.47.tgz#ca8e5f326c5011c879f3a6ed749e58bd10fff05d" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-replace-supers" "7.0.0-beta.47" "@babel/plugin-transform-parameters@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.47.tgz#46a4236040a6552a5f165fb3ddd60368954b0ddd" dependencies: "@babel/helper-call-delegate" "7.0.0-beta.47" "@babel/helper-get-function-arity" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-regenerator@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.47.tgz#86500e1c404055fb98fc82b73b09bd053cacb516" dependencies: regenerator-transform "^0.12.3" "@babel/plugin-transform-runtime@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0-beta.47.tgz#1700938fa8710909cbf28f7dd39f9b40688b09fd" dependencies: "@babel/helper-module-imports" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-shorthand-properties@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.47.tgz#00be44c4fad8fe2c00ed18ea15ea3c88dd519dbb" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-spread@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.47.tgz#3feadb02292ed1e9b75090d651b9df88a7ab5c50" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-sticky-regex@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.47.tgz#c0aa347d76b5dc87d3b37ac016ada3f950605131" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-regex" "7.0.0-beta.47" "@babel/plugin-transform-template-literals@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.47.tgz#5f7b5badf64c4c5da79026aeab03001e62a6ee5f" dependencies: "@babel/helper-annotate-as-pure" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-typeof-symbol@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.47.tgz#03c612ec09213eb386a81d5fa67c234ee4b2034c" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-unicode-regex@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.47.tgz#efed0b2f1dfbf28283502234a95b4be88f7fdcb6" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/helper-regex" "7.0.0-beta.47" regexpu-core "^4.1.3" "@babel/preset-env@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.47.tgz#a3dab3b5fac4de56e3510bdbcb528f1cbdedbe2d" dependencies: "@babel/helper-module-imports" "7.0.0-beta.47" "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.47" "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.47" "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.47" "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.47" "@babel/plugin-syntax-async-generators" "7.0.0-beta.47" "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.47" "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.47" "@babel/plugin-transform-arrow-functions" "7.0.0-beta.47" "@babel/plugin-transform-async-to-generator" "7.0.0-beta.47" "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.47" "@babel/plugin-transform-block-scoping" "7.0.0-beta.47" "@babel/plugin-transform-classes" "7.0.0-beta.47" "@babel/plugin-transform-computed-properties" "7.0.0-beta.47" "@babel/plugin-transform-destructuring" "7.0.0-beta.47" "@babel/plugin-transform-dotall-regex" "7.0.0-beta.47" "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.47" "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.47" "@babel/plugin-transform-for-of" "7.0.0-beta.47" "@babel/plugin-transform-function-name" "7.0.0-beta.47" "@babel/plugin-transform-literals" "7.0.0-beta.47" "@babel/plugin-transform-modules-amd" "7.0.0-beta.47" "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.47" "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.47" "@babel/plugin-transform-modules-umd" "7.0.0-beta.47" "@babel/plugin-transform-new-target" "7.0.0-beta.47" "@babel/plugin-transform-object-super" "7.0.0-beta.47" "@babel/plugin-transform-parameters" "7.0.0-beta.47" "@babel/plugin-transform-regenerator" "7.0.0-beta.47" "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.47" "@babel/plugin-transform-spread" "7.0.0-beta.47" "@babel/plugin-transform-sticky-regex" "7.0.0-beta.47" "@babel/plugin-transform-template-literals" "7.0.0-beta.47" "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.47" "@babel/plugin-transform-unicode-regex" "7.0.0-beta.47" browserslist "^3.0.0" invariant "^2.2.2" semver "^5.3.0" "@babel/preset-stage-2@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/preset-stage-2/-/preset-stage-2-7.0.0-beta.47.tgz#deb930c44d7d6e519a33174bba121a2a630ed654" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-proposal-decorators" "7.0.0-beta.47" "@babel/plugin-proposal-export-namespace-from" "7.0.0-beta.47" "@babel/plugin-proposal-function-sent" "7.0.0-beta.47" "@babel/plugin-proposal-numeric-separator" "7.0.0-beta.47" "@babel/plugin-proposal-throw-expressions" "7.0.0-beta.47" "@babel/preset-stage-3" "7.0.0-beta.47" "@babel/preset-stage-3@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/preset-stage-3/-/preset-stage-3-7.0.0-beta.47.tgz#17028f3b5dddc548d80404c86ed62622f601597b" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.47" "@babel/plugin-proposal-class-properties" "7.0.0-beta.47" "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.47" "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.47" "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.47" "@babel/plugin-syntax-dynamic-import" "7.0.0-beta.47" "@babel/plugin-syntax-import-meta" "7.0.0-beta.47" "@babel/runtime@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0-beta.47.tgz#273f5e71629e80f6cbcd7507503848615e59f7e0" dependencies: core-js "^2.5.3" regenerator-runtime "^0.11.1" "@babel/template@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.47.tgz#0473970a7c0bee7a1a18c1ca999d3ba5e5bad83d" dependencies: "@babel/code-frame" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" babylon "7.0.0-beta.47" lodash "^4.17.5" "@babel/traverse@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.47.tgz#0e57fdbb9ff3a909188b6ebf1e529c641e6c82a4" dependencies: "@babel/code-frame" "7.0.0-beta.47" "@babel/generator" "7.0.0-beta.47" "@babel/helper-function-name" "7.0.0-beta.47" "@babel/helper-split-export-declaration" "7.0.0-beta.47" "@babel/types" "7.0.0-beta.47" babylon "7.0.0-beta.47" debug "^3.1.0" globals "^11.1.0" invariant "^2.2.0" lodash "^4.17.5" "@babel/types@7.0.0-beta.47": version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.47.tgz#e6fcc1a691459002c2671d558a586706dddaeef8" dependencies: esutils "^2.0.2" lodash "^4.17.5" to-fast-properties "^2.0.0" "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" dependencies: call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" "@nodelib/fs.stat@^1.0.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.1.tgz#53f349bb986ab273d601175aa1b25a655ab90ee3" "@shellscape/koa-send@^4.1.0": version "4.1.3" resolved "https://registry.yarnpkg.com/@shellscape/koa-send/-/koa-send-4.1.3.tgz#1a7c8df21f63487e060b7bfd8ed82e1d3c4ae0b0" dependencies: debug "^2.6.3" http-errors "^1.6.1" mz "^2.6.0" resolve-path "^1.3.3" "@shellscape/koa-static@^4.0.4": version "4.0.5" resolved "https://registry.yarnpkg.com/@shellscape/koa-static/-/koa-static-4.0.5.tgz#b329b55bfd41056a6981c584ae6bace30b5b6b3b" dependencies: "@shellscape/koa-send" "^4.1.0" debug "^2.6.8" "@vue/babel-preset-app@3.0.0-beta.11": version "3.0.0-beta.11" resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.0.0-beta.11.tgz#c8b889aa73464050f9cd3f9dc621951d85c24508" dependencies: "@babel/plugin-syntax-jsx" "7.0.0-beta.47" "@babel/plugin-transform-runtime" "7.0.0-beta.47" "@babel/preset-env" "7.0.0-beta.47" "@babel/preset-stage-2" "7.0.0-beta.47" "@babel/runtime" "7.0.0-beta.47" babel-helper-vue-jsx-merge-props "^2.0.3" babel-plugin-dynamic-import-node "^1.2.0" babel-plugin-transform-vue-jsx "^4.0.1" "@vue/component-compiler-utils@^2.0.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz#bbbb7ed38a9a8a7c93abe7ef2e54a90a04b631b4" dependencies: consolidate "^0.15.1" hash-sum "^1.0.2" lru-cache "^4.1.2" merge-source-map "^1.1.0" postcss "^6.0.20" postcss-selector-parser "^3.1.1" prettier "1.13.7" source-map "^0.5.6" vue-template-es2015-compiler "^1.6.0" "@webassemblyjs/ast@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" dependencies: "@webassemblyjs/helper-module-context" "1.5.13" "@webassemblyjs/helper-wasm-bytecode" "1.5.13" "@webassemblyjs/wast-parser" "1.5.13" debug "^3.1.0" mamacro "^0.0.3" "@webassemblyjs/floating-point-hex-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" "@webassemblyjs/helper-api-error@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" "@webassemblyjs/helper-buffer@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" dependencies: debug "^3.1.0" "@webassemblyjs/helper-code-frame@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" dependencies: "@webassemblyjs/wast-printer" "1.5.13" "@webassemblyjs/helper-fsm@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" "@webassemblyjs/helper-module-context@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" dependencies: debug "^3.1.0" mamacro "^0.0.3" "@webassemblyjs/helper-wasm-bytecode@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" "@webassemblyjs/helper-wasm-section@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-buffer" "1.5.13" "@webassemblyjs/helper-wasm-bytecode" "1.5.13" "@webassemblyjs/wasm-gen" "1.5.13" debug "^3.1.0" "@webassemblyjs/ieee754@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" dependencies: ieee754 "^1.1.11" "@webassemblyjs/leb128@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" dependencies: long "4.0.0" "@webassemblyjs/utf8@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" "@webassemblyjs/wasm-edit@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-buffer" "1.5.13" "@webassemblyjs/helper-wasm-bytecode" "1.5.13" "@webassemblyjs/helper-wasm-section" "1.5.13" "@webassemblyjs/wasm-gen" "1.5.13" "@webassemblyjs/wasm-opt" "1.5.13" "@webassemblyjs/wasm-parser" "1.5.13" "@webassemblyjs/wast-printer" "1.5.13" debug "^3.1.0" "@webassemblyjs/wasm-gen@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-wasm-bytecode" "1.5.13" "@webassemblyjs/ieee754" "1.5.13" "@webassemblyjs/leb128" "1.5.13" "@webassemblyjs/utf8" "1.5.13" "@webassemblyjs/wasm-opt@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-buffer" "1.5.13" "@webassemblyjs/wasm-gen" "1.5.13" "@webassemblyjs/wasm-parser" "1.5.13" debug "^3.1.0" "@webassemblyjs/wasm-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-api-error" "1.5.13" "@webassemblyjs/helper-wasm-bytecode" "1.5.13" "@webassemblyjs/ieee754" "1.5.13" "@webassemblyjs/leb128" "1.5.13" "@webassemblyjs/utf8" "1.5.13" "@webassemblyjs/wast-parser@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/floating-point-hex-parser" "1.5.13" "@webassemblyjs/helper-api-error" "1.5.13" "@webassemblyjs/helper-code-frame" "1.5.13" "@webassemblyjs/helper-fsm" "1.5.13" long "^3.2.0" mamacro "^0.0.3" "@webassemblyjs/wast-printer@1.5.13": version "1.5.13" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/wast-parser" "1.5.13" long "^3.2.0" "@webpack-contrib/config-loader@^1.1.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@webpack-contrib/config-loader/-/config-loader-1.2.1.tgz#5b3dd474e207437939d294d200c68b7b00008e04" dependencies: "@webpack-contrib/schema-utils" "^1.0.0-beta.0" chalk "^2.1.0" cosmiconfig "^5.0.2" is-plain-obj "^1.1.0" loud-rejection "^1.6.0" merge-options "^1.0.1" minimist "^1.2.0" resolve "^1.6.0" webpack-log "^1.1.2" "@webpack-contrib/schema-utils@^1.0.0-beta.0": version "1.0.0-beta.0" resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" chalk "^2.3.2" strip-ansi "^4.0.0" text-table "^0.2.0" webpack-log "^1.1.2" abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" accepts@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" dependencies: mime-types "~2.1.18" negotiator "0.6.1" acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" dependencies: acorn "^5.0.0" acorn@^5.0.0, acorn@^5.6.2: version "5.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" agentkeepalive@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef" ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" ajv@^6.0.1, ajv@^6.1.0: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" algoliasearch@^3.24.5: version "3.30.0" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.30.0.tgz#355585e49b672e5f71d45b9c2b371ecdff129cd1" dependencies: agentkeepalive "^2.2.0" debug "^2.6.8" envify "^4.0.0" es6-promise "^4.1.0" events "^1.1.0" foreach "^2.0.5" global "^4.3.2" inherits "^2.0.1" isarray "^2.0.1" load-script "^1.0.0" object-keys "^1.0.11" querystring-es3 "^0.2.1" reduce "^1.0.1" semver "^5.1.0" tunnel-agent "^0.6.0" alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ansi-align@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" dependencies: string-width "^2.0.0" ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: color-convert "^1.9.0" any-promise@^1.0.0, any-promise@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" app-root-path@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" arch@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/arch/-/arch-2.1.1.tgz#8f5c2731aa35a30929221bb0640eed65175ec84e" are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" autocomplete.js@^0.29.0: version "0.29.0" resolved "https://registry.yarnpkg.com/autocomplete.js/-/autocomplete.js-0.29.0.tgz#0185f7375ee9daf068f7d52d794bc90dcd739fd7" dependencies: immediate "^3.2.3" autoprefixer@^6.3.1: version "6.7.7" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" dependencies: browserslist "^1.7.6" caniuse-db "^1.0.30000634" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^5.2.16" postcss-value-parser "^3.2.3" autoprefixer@^8.2.0: version "8.6.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-8.6.5.tgz#343f3d193ed568b3208e00117a1b96eb691d4ee9" dependencies: browserslist "^3.2.8" caniuse-lite "^1.0.30000864" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^6.0.23" postcss-value-parser "^3.2.3" babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" babel-helper-vue-jsx-merge-props@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" babel-loader@8.0.0-beta.3: version "8.0.0-beta.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.3.tgz#49efeea6e8058d5af860a18a6de88b8c1450645b" dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" util.promisify "^1.0.0" babel-plugin-dynamic-import-node@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz#f91631e703e0595e47d4beafbb088576c87fbeee" dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" babel-plugin-transform-vue-jsx@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-4.0.1.tgz#2c8bddce87a6ef09eaa59869ff1bfbeeafc5f88d" dependencies: esutils "^2.0.2" babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" babylon@7.0.0-beta.47: version "7.0.0-beta.47" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.47.tgz#6d1fa44f0abec41ab7c780481e62fd9aafbdea80" balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" dependencies: 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" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" bluebird@^3.1.1, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" chalk "^2.0.1" cli-boxes "^1.0.0" string-width "^2.0.0" term-size "^1.2.0" widest-line "^2.0.0" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" braces@^2.3.0, braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" dependencies: 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" brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.3" inherits "^2.0.1" safe-buffer "^5.0.1" browserify-cipher@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" dependencies: bn.js "^4.1.0" randombytes "^2.0.1" browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" create-hash "^1.1.0" create-hmac "^1.1.2" elliptic "^6.0.0" inherits "^2.0.1" parse-asn1 "^5.0.0" browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" dependencies: pako "~1.0.5" browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: version "1.7.7" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" dependencies: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" browserslist@^3.0.0, browserslist@^3.2.8: version "3.2.8" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" dependencies: caniuse-lite "^1.0.30000844" electron-to-chromium "^1.3.47" buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" dependencies: bluebird "^3.5.1" chownr "^1.0.1" glob "^7.1.2" graceful-fs "^4.1.11" lru-cache "^4.1.1" mississippi "^2.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.2" ssri "^5.2.4" unique-filename "^1.1.0" y18n "^4.0.0" cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" dependencies: 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" cache-content-type@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" dependencies: mime-types "^2.1.18" ylru "^1.2.0" cache-loader@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-1.2.2.tgz#6d5c38ded959a09cc5d58190ab5af6f73bd353f5" dependencies: loader-utils "^1.1.0" mkdirp "^0.5.1" neo-async "^2.5.0" schema-utils "^0.4.2" call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" camel-case@3.0.x: version "3.0.0" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" dependencies: no-case "^2.2.0" upper-case "^1.1.1" camelcase-keys@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" dependencies: camelcase "^4.1.0" map-obj "^2.0.0" quick-lru "^1.0.0" camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" caniuse-api@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" dependencies: browserslist "^1.3.6" caniuse-db "^1.0.30000529" lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000878" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000878.tgz#0d0c6d8500c3aea21441fad059bce4b8f3f509df" caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: version "1.0.30000878" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: 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" chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" chokidar@^2.0.2, chokidar@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" dependencies: anymatch "^2.0.0" async-each "^1.0.0" braces "^2.3.0" glob-parent "^3.1.0" inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^4.0.0" lodash.debounce "^4.0.8" normalize-path "^2.1.1" path-is-absolute "^1.0.0" readdirp "^2.0.0" upath "^1.0.5" optionalDependencies: fsevents "^1.2.2" chownr@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" chrome-trace-event@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" dependencies: tslib "^1.9.0" ci-info@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.4.0.tgz#4841d53cad49f11b827b648ebde27a6e189b412f" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" dependencies: chalk "^1.1.3" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" clean-css@4.2.x: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" dependencies: source-map "~0.6.0" cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" cli-cursor@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: restore-cursor "^2.0.0" clipboard@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.1.tgz#a12481e1c13d8a50f5f036b0560fe5d16d74e46a" dependencies: good-listener "^1.2.2" select "^1.1.2" tiny-emitter "^2.0.0" clipboardy@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" dependencies: arch "^2.1.0" execa "^0.8.0" clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" coa@~1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" dependencies: q "^1.1.2" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.3.0, color-convert@^1.9.0: version "1.9.2" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" dependencies: color-name "1.1.1" color-name@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" color-name@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" color-string@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" dependencies: color-name "^1.0.0" color@^0.11.0: version "0.11.4" resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" dependencies: clone "^1.0.2" color-convert "^1.3.0" color-string "^0.3.0" colormin@^1.0.5: version "1.1.2" resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" dependencies: color "^0.11.0" css-color-names "0.0.4" has "^1.0.1" colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" commander@2.17.x, commander@^2.15.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" commander@~2.16.0: version "2.16.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" common-tags@^1.4.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" configstore@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" dependencies: dot-prop "^4.1.0" graceful-fs "^4.1.2" make-dir "^1.0.0" unique-string "^1.0.0" write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" connect-history-api-fallback@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" consola@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/consola/-/consola-1.4.3.tgz#945e967e05430ddabd3608b37f5fa37fcfacd9dd" dependencies: chalk "^2.3.2" figures "^2.0.0" lodash "^4.17.5" std-env "^1.1.0" console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" consolidate@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7" dependencies: bluebird "^3.1.1" constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" content-disposition@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" content-type@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" convert-source-map@^1.1.0: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" cookies@~0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" dependencies: depd "~1.1.1" keygrip "~1.0.2" copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" iferr "^0.1.5" mkdirp "^0.5.1" rimraf "^2.5.4" run-queue "^1.0.0" copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" copy-webpack-plugin@^4.5.1: version "4.5.2" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" globby "^7.1.1" is-glob "^4.0.0" loader-utils "^1.1.0" minimatch "^3.0.4" p-limit "^1.0.0" serialize-javascript "^1.4.0" core-js@^2.4.0, core-js@^2.5.3: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" cosmiconfig@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" parse-json "^4.0.0" require-from-string "^2.0.1" cosmiconfig@^5.0.2: version "5.0.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" parse-json "^4.0.0" create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: capture-stack-trace "^1.0.0" create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" md5.js "^1.3.4" ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" inherits "^2.0.1" ripemd160 "^2.0.0" safe-buffer "^5.0.1" sha.js "^2.4.8" cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: nice-try "^1.0.4" path-key "^2.0.1" semver "^5.5.0" shebang-command "^1.2.0" which "^1.2.9" crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" create-ecdh "^4.0.0" create-hash "^1.1.0" create-hmac "^1.1.0" diffie-hellman "^5.0.0" inherits "^2.0.1" pbkdf2 "^3.0.3" public-encrypt "^4.0.0" randombytes "^2.0.0" randomfill "^1.0.3" crypto-random-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" css-color-names@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" css-loader@^0.28.11: version "0.28.11" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" dependencies: babel-code-frame "^6.26.0" css-selector-tokenizer "^0.7.0" cssnano "^3.10.0" icss-utils "^2.1.0" loader-utils "^1.0.2" lodash.camelcase "^4.3.0" object-assign "^4.1.1" postcss "^5.0.6" postcss-modules-extract-imports "^1.2.0" postcss-modules-local-by-default "^1.2.0" postcss-modules-scope "^1.1.0" postcss-modules-values "^1.3.0" postcss-value-parser "^3.3.0" source-list-map "^2.0.0" css-parse@1.7.x: version "1.7.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: boolbase "~1.0.0" css-what "2.1" domutils "1.5.1" nth-check "~1.0.1" css-selector-tokenizer@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" dependencies: cssesc "^0.1.0" fastparse "^1.1.1" regexpu-core "^1.0.0" css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" cssesc@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" cssnano@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" dependencies: autoprefixer "^6.3.1" decamelize "^1.1.2" defined "^1.0.0" has "^1.0.1" object-assign "^4.0.1" postcss "^5.0.14" postcss-calc "^5.2.0" postcss-colormin "^2.1.8" postcss-convert-values "^2.3.4" postcss-discard-comments "^2.0.4" postcss-discard-duplicates "^2.0.1" postcss-discard-empty "^2.0.1" postcss-discard-overridden "^0.1.1" postcss-discard-unused "^2.2.1" postcss-filter-plugins "^2.0.0" postcss-merge-idents "^2.1.5" postcss-merge-longhand "^2.0.1" postcss-merge-rules "^2.0.3" postcss-minify-font-values "^1.0.2" postcss-minify-gradients "^1.0.1" postcss-minify-params "^1.0.4" postcss-minify-selectors "^2.0.4" postcss-normalize-charset "^1.1.0" postcss-normalize-url "^3.0.7" postcss-ordered-values "^2.1.0" postcss-reduce-idents "^2.2.2" postcss-reduce-initial "^1.0.0" postcss-reduce-transforms "^1.0.3" postcss-svgo "^2.1.1" postcss-unique-selectors "^2.0.2" postcss-value-parser "^3.2.3" postcss-zindex "^2.0.1" csso@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" dependencies: clap "^1.0.9" source-map "^0.5.3" currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" dependencies: array-find-index "^1.0.1" cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" d@1: version "1.0.0" resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" dependencies: es5-ext "^0.10.9" date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" de-indent@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" debug@*, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.1, debug@^2.6.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" decamelize-keys@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" dependencies: decamelize "^1.1.0" map-obj "^1.0.0" decamelize@^1.1.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" deepmerge@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" depd@^1.1.2, depd@~1.1.1, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" destroy@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" diacritics@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/diacritics/-/diacritics-1.3.0.tgz#3efa87323ebb863e6696cebb0082d48ff3d6f7a1" diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" dependencies: arrify "^1.0.1" path-type "^3.0.0" docsearch.js@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/docsearch.js/-/docsearch.js-2.5.2.tgz#1a3521c92e5f252cc522c57357ef1c47b945b381" dependencies: algoliasearch "^3.24.5" autocomplete.js "^0.29.0" hogan.js "^3.0.2" to-factory "^1.0.0" dom-converter@~0.1: version "0.1.4" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" dependencies: utila "~0.3" dom-serializer@0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" dependencies: domelementtype "~1.1.1" entities "~1.1.1" dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" domelementtype@1: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" domhandler@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594" dependencies: domelementtype "1" domutils@1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" dependencies: domelementtype "1" domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: dom-serializer "0" domelementtype "1" dot-prop@^4.1.0, dot-prop@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" dependencies: is-obj "^1.0.0" duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47: version "1.3.61" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.61.tgz#a8ac295b28d0f03d85e37326fd16b6b6b17a1795" elliptic@^6.0.0: version "6.4.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" dependencies: bn.js "^4.4.0" brorand "^1.0.1" hash.js "^1.0.0" hmac-drbg "^1.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" dependencies: once "^1.4.0" enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" tapable "^1.0.0" entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" envify@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" dependencies: esprima "^4.0.0" through "~2.3.4" errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: prr "~1.0.1" error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" dependencies: is-arrayish "^0.2.1" error-inject@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: es-to-primitive "^1.1.1" function-bind "^1.1.1" has "^1.0.1" is-callable "^1.1.3" is-regex "^1.0.4" es-to-primitive@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" dependencies: is-callable "^1.1.1" is-date-object "^1.0.1" is-symbol "^1.0.1" es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.46" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" next-tick "1" es6-iterator@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" es6-promise@^4.1.0: version "4.2.4" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" es6-symbol@^3.1.1, es6-symbol@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" dependencies: d "1" es5-ext "~0.10.14" escape-html@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" eslint-scope@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" events@^1.0.0, events@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" signal-exit "^3.0.0" strip-eof "^1.0.0" execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" signal-exit "^3.0.0" strip-eof "^1.0.0" expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" dependencies: 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" expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: 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" fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" fast-glob@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.0.1" glob-parent "^3.1.0" is-glob "^4.0.0" merge2 "^1.2.1" micromatch "^3.1.10" fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" file-loader@^1.1.11: version "1.1.11" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" dependencies: loader-utils "^1.0.2" schema-utils "^0.4.5" filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" dependencies: is-number "^2.1.0" isobject "^2.0.0" randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" dependencies: commondir "^1.0.1" make-dir "^1.0.0" pkg-dir "^2.0.0" find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: locate-path "^2.0.0" flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" dependencies: inherits "^2.0.1" readable-stream "^2.0.4" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: for-in "^1.0.1" foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" dependencies: map-cache "^0.2.2" fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" dependencies: inherits "^2.0.1" readable-stream "^2.0.0" fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" fs-extra@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" dependencies: minipass "^2.2.1" fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" imurmurhash "^0.1.4" readable-stream "1 || 2" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.2.2: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: 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" get-port@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" glob@7.0.x: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.0.2" once "^1.3.0" path-is-absolute "^1.0.0" glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: 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" global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" dependencies: ini "^1.3.4" global@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" dependencies: min-document "^2.19.0" process "~0.5.1" globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" dependencies: array-union "^1.0.1" dir-glob "^2.0.0" glob "^7.1.2" ignore "^3.3.5" pify "^3.0.0" slash "^1.0.0" globby@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50" dependencies: array-union "^1.0.1" dir-glob "^2.0.0" fast-glob "^2.0.2" glob "^7.1.2" ignore "^3.3.5" pify "^3.0.0" slash "^1.0.0" good-listener@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" dependencies: delegate "^3.1.2" got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" get-stream "^3.0.0" is-redirect "^1.0.0" is-retry-allowed "^1.0.0" is-stream "^1.0.0" lowercase-keys "^1.0.0" safe-buffer "^5.0.1" timed-out "^4.0.0" unzip-response "^2.0.1" url-parse-lax "^1.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" gray-matter@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.1.tgz#375263c194f0d9755578c277e41b1c1dfdf22c7d" dependencies: js-yaml "^3.11.0" kind-of "^6.0.2" section-matter "^1.0.0" strip-bom-string "^1.0.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" dependencies: get-value "^2.0.3" has-values "^0.1.4" isobject "^2.0.0" has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" dependencies: get-value "^2.0.6" has-values "^1.0.0" isobject "^3.0.0" has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" dependencies: is-number "^3.0.0" kind-of "^4.0.0" has@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" dependencies: function-bind "^1.1.1" hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" hash-sum@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.5" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" he@1.1.x, he@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" hogan.js@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/hogan.js/-/hogan.js-3.0.2.tgz#4cd9e1abd4294146e7679e41d7898732b02c7bfd" dependencies: mkdirp "0.3.0" nopt "1.0.10" hosted-git-info@^2.1.4: version "2.7.1" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" html-comment-regex@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" html-minifier@^3.2.3: version "3.5.20" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" dependencies: camel-case "3.0.x" clean-css "4.2.x" commander "2.17.x" he "1.1.x" param-case "2.1.x" relateurl "0.2.x" uglify-js "3.4.x" htmlparser2@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe" dependencies: domelementtype "1" domhandler "2.1" domutils "1.1" readable-stream "1.0" http-assert@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" dependencies: deep-equal "~1.0.1" http-errors "~1.6.1" http-errors@^1.6.1, http-errors@^1.6.3: version "1.7.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.0.tgz#b6d36492a201c7888bdcb5dd0471140423c4ad2a" dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.5.0 < 2" toidentifier "1.0.0" http-errors@~1.6.1, http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: depd "~1.1.2" inherits "2.0.3" setprototypeof "1.1.0" statuses ">= 1.4.0 < 2" https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" dependencies: safer-buffer ">= 2.1.2 < 3" icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" icss-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" dependencies: postcss "^6.0.1" ieee754@^1.1.11, ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" dependencies: minimatch "^3.0.4" ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" immediate@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" dependencies: import-from "^2.1.0" import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" dependencies: resolve-from "^3.0.0" import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" dependencies: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" invariant@^2.2.0, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" is-callable@^1.1.1, is-callable@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10, is-ci@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.0.tgz#3f4a08d6303a09882cef3f0fb97439c5f5ce2d53" dependencies: ci-info "^1.3.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" dependencies: kind-of "^6.0.0" is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" kind-of "^5.0.0" is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" is-generator-function@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" dependencies: is-extglob "^2.1.1" is-installed-globally@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" dependencies: global-dirs "^0.1.0" is-path-inside "^1.0.0" is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" is-plain-obj@^1.0.0, is-plain-obj@^1.1, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" dependencies: has "^1.0.1" is-retry-allowed@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" dependencies: html-comment-regex "^1.1.0" is-symbol@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" isarray@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" isemail@3.x.x: version "3.1.3" resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.3.tgz#64f37fc113579ea12523165c3ebe3a71a56ce571" dependencies: punycode "2.x.x" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" javascript-stringify@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3" joi@^11.1.1: version "11.4.0" resolved "https://registry.yarnpkg.com/joi/-/joi-11.4.0.tgz#f674897537b625e9ac3d0b7e1604c828ad913ccb" dependencies: hoek "4.x.x" isemail "3.x.x" topo "2.x.x" js-base64@^2.1.9: version "2.4.8" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" js-yaml@^3.11.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" dependencies: argparse "^1.0.7" esprima "^2.6.0" jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" optionalDependencies: graceful-fs "^4.1.6" keygrip@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" killable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" koa-compose@^3.0.0, koa-compose@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" dependencies: any-promise "^1.1.0" koa-compose@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" koa-connect@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/koa-connect/-/koa-connect-2.0.1.tgz#2acad159c33862de1d73aa4562a48de13f137c0f" koa-convert@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" dependencies: co "^4.6.0" koa-compose "^3.0.0" koa-is-json@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" koa-mount@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/koa-mount/-/koa-mount-3.0.0.tgz#08cab3b83d31442ed8b7e75c54b1abeb922ec197" dependencies: debug "^2.6.1" koa-compose "^3.2.1" koa-range@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/koa-range/-/koa-range-0.3.0.tgz#3588e3496473a839a1bd264d2a42b1d85bd7feac" dependencies: stream-slice "^0.1.2" koa-send@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-4.1.3.tgz#0822207bbf5253a414c8f1765ebc29fa41353cb6" dependencies: debug "^2.6.3" http-errors "^1.6.1" mz "^2.6.0" resolve-path "^1.4.0" koa-static@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-4.0.3.tgz#5f93ad00fb1905db9ce46667c0e8bb7d22abfcd8" dependencies: debug "^3.1.0" koa-send "^4.1.3" koa-webpack@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/koa-webpack/-/koa-webpack-4.0.0.tgz#1d9b83c109db106d8ef65db376f910a45ba964c7" dependencies: app-root-path "^2.0.1" merge-options "^1.0.0" webpack-dev-middleware "^3.0.0" webpack-hot-client "^3.0.0" webpack-log "^1.1.1" koa@^2.4.1: version "2.5.2" resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.2.tgz#f2bda7f3e70be54924e7e5e9789a249f77256fe3" dependencies: accepts "^1.3.5" cache-content-type "^1.0.0" content-disposition "~0.5.2" content-type "^1.0.4" cookies "~0.7.1" debug "^3.1.0" delegates "^1.0.0" depd "^1.1.2" destroy "^1.0.4" error-inject "^1.0.0" escape-html "^1.0.3" fresh "~0.5.2" http-assert "^1.3.0" http-errors "^1.6.3" is-generator-function "^1.0.7" koa-compose "^4.1.0" koa-convert "^1.2.0" koa-is-json "^1.0.0" on-finished "^2.3.0" only "~0.0.2" parseurl "^1.3.2" statuses "^1.5.0" type-is "^1.6.16" vary "^1.1.2" last-call-webpack-plugin@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" dependencies: lodash "^4.17.5" webpack-sources "^1.1.0" latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" dependencies: package-json "^4.0.0" linkify-it@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" dependencies: uc.micro "^1.0.1" load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" pify "^3.0.0" strip-bom "^3.0.0" load-script@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" loader-utils@^0.2.16: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" dependencies: big.js "^3.1.3" emojis-list "^2.0.0" json5 "^0.5.0" object-assign "^4.0.1" loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" dependencies: big.js "^3.1.3" emojis-list "^2.0.0" json5 "^0.5.0" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" dependencies: p-locate "^2.0.0" path-exists "^3.0.0" lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" dependencies: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" dependencies: lodash._reinterpolate "~3.0.0" lodash.throttle@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" lodash@^4.17.10, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" log-symbols@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: chalk "^2.0.1" log-update@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" dependencies: ansi-escapes "^3.0.0" cli-cursor "^2.0.0" wrap-ansi "^3.0.1" loglevelnext@^1.0.1, loglevelnext@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" dependencies: es6-symbol "^3.1.1" object.assign "^4.1.0" long@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0, loud-rejection@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" dependencies: pify "^3.0.0" mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" map-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" dependencies: object-visit "^1.0.0" markdown-it-anchor@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.0.2.tgz#cdd917a05b7bf92fb736a6dae3385c6d0d0fa552" markdown-it-container@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-2.0.0.tgz#0019b43fd02eefece2f1960a2895fba81a404695" markdown-it-emoji@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc" markdown-it-table-of-contents@^0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.3.tgz#6453925a76e49b9b3d9569a0d89f1c2168b46982" markdown-it@^8.4.1: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" dependencies: argparse "^1.0.7" entities "~1.1.1" linkify-it "^2.0.0" mdurl "^1.0.1" uc.micro "^1.0.5" math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" dependencies: hash-base "^3.0.0" inherits "^2.0.1" mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: errno "^0.1.3" readable-stream "^2.0.1" meow@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" dependencies: camelcase-keys "^4.0.0" decamelize-keys "^1.0.0" loud-rejection "^1.0.0" minimist-options "^3.0.1" normalize-package-data "^2.3.4" read-pkg-up "^3.0.0" redent "^2.0.0" trim-newlines "^2.0.0" yargs-parser "^10.0.0" merge-options@^1.0.0, merge-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32" dependencies: is-plain-obj "^1.1" merge-source-map@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" dependencies: source-map "^0.6.1" merge2@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" braces "^1.8.2" expand-brackets "^0.1.4" extglob "^0.3.1" filename-regex "^2.0.0" is-extglob "^1.0.0" is-glob "^2.0.1" kind-of "^3.0.2" normalize-path "^2.0.1" object.omit "^2.0.0" parse-glob "^3.0.4" regex-cache "^0.4.2" micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: 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" miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" dependencies: bn.js "^4.0.0" brorand "^1.0.1" mime-db@~1.35.0: version "1.35.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" mime-types@^2.1.18, mime-types@~2.1.18: version "2.1.19" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" dependencies: mime-db "~1.35.0" mime@^2.0.3, mime@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" dependencies: dom-walk "^0.1.0" mini-css-extract-plugin@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz#b3ecc0d6b1bbe5ff14add42b946a7b200cf78651" dependencies: loader-utils "^1.1.0" schema-utils "^1.0.0" webpack-sources "^1.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minipass@^2.2.1, minipass@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" minizlib@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" dependencies: minipass "^2.2.1" mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" end-of-stream "^1.1.0" flush-write-stream "^1.0.0" from2 "^2.1.0" parallel-transform "^1.1.0" pump "^2.0.1" pumpify "^1.3.3" stream-each "^1.1.0" through2 "^2.0.0" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" dependencies: for-in "^1.0.2" is-extendable "^1.0.1" mkdirp@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" fs-write-stream-atomic "^1.0.8" mkdirp "^0.5.1" rimraf "^2.5.4" run-queue "^1.0.3" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" dependencies: any-promise "^1.0.0" object-assign "^4.0.1" thenify-all "^1.0.0" nan@^2.9.2: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" nanoassert@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-1.1.0.tgz#4f3152e09540fde28c76f44b19bbcd1d5a42478d" nanobus@^4.3.1: version "4.3.3" resolved "https://registry.yarnpkg.com/nanobus/-/nanobus-4.3.3.tgz#a9635d38c687853641e2646bb2be6510cf966233" dependencies: nanotiming "^7.2.0" remove-array-items "^1.0.0" nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" dependencies: 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" nanoscheduler@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/nanoscheduler/-/nanoscheduler-1.0.3.tgz#6ca027941bf3e04139ea4bab6227ea6ad803692f" dependencies: nanoassert "^1.1.0" nanotiming@^7.2.0: version "7.3.1" resolved "https://registry.yarnpkg.com/nanotiming/-/nanotiming-7.3.1.tgz#dc5cf8d9d8ad401a4394d1a9b7a16714bccfefda" dependencies: nanoassert "^1.1.0" nanoscheduler "^1.0.2" needle@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.2.tgz#1120ca4c41f2fcc6976fd28a8968afe239929418" dependencies: debug "^2.1.2" iconv-lite "^0.4.4" sax "^1.2.4" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" neo-async@^2.5.0: version "2.5.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" nice-try@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" no-case@^2.2.0: version "2.3.2" resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" dependencies: lower-case "^1.1.1" node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" events "^1.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" path-browserify "0.0.0" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" readable-stream "^2.3.3" stream-browserify "^2.0.1" stream-http "^2.7.2" string_decoder "^1.0.0" timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" util "^0.10.3" vm-browserify "0.0.4" node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" dependencies: 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@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" osenv "^0.1.4" normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" normalize-url@^1.4.0: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" dependencies: object-assign "^4.0.1" prepend-http "^1.0.0" query-string "^4.1.0" sort-keys "^1.0.0" npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-packlist@^1.1.6: version "1.1.11" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: path-key "^2.0.0" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" nprogress@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" dependencies: boolbase "~1.0.0" num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@~1.0.0: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" dependencies: isobject "^3.0.0" object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" dependencies: define-properties "^1.1.2" function-bind "^1.1.1" has-symbols "^1.0.0" object-keys "^1.0.11" object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" dependencies: define-properties "^1.1.2" es-abstract "^1.5.1" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" dependencies: for-own "^0.1.4" is-extendable "^0.1.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: isobject "^3.0.1" on-finished@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" dependencies: ee-first "1.1.1" once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" dependencies: mimic-fn "^1.0.0" only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" opn@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" dependencies: is-wsl "^1.1.0" optimize-css-assets-webpack-plugin@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-4.0.3.tgz#4f714e276b279700892c4a6202b7e22812d6f683" dependencies: cssnano "^3.10.0" last-call-webpack-plugin "^3.0.0" os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" p-limit@^1.0.0, p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" dependencies: got "^6.7.1" registry-auth-token "^3.0.1" registry-url "^3.0.3" semver "^5.1.0" pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" dependencies: cyclist "~0.2.2" inherits "^2.0.3" readable-stream "^2.1.5" param-case@2.1.x: version "2.1.1" resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" dependencies: no-case "^2.2.0" parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" is-extglob "^1.0.0" is-glob "^2.0.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" parseurl@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" path-is-absolute@1.0.1, path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" dependencies: pify "^3.0.0" pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" ripemd160 "^2.0.1" safe-buffer "^5.0.1" sha.js "^2.4.8" pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" dependencies: find-up "^2.1.0" portfinder@^1.0.13: version "1.0.17" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" dependencies: async "^1.5.2" debug "^2.2.0" mkdirp "0.5.x" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" postcss-calc@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" dependencies: postcss "^5.0.2" postcss-message-helpers "^2.0.0" reduce-css-calc "^1.2.6" postcss-colormin@^2.1.8: version "2.2.2" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" dependencies: colormin "^1.0.5" postcss "^5.0.13" postcss-value-parser "^3.2.3" postcss-convert-values@^2.3.4: version "2.6.1" resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" dependencies: postcss "^5.0.11" postcss-value-parser "^3.1.2" postcss-discard-comments@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" dependencies: postcss "^5.0.14" postcss-discard-duplicates@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" dependencies: postcss "^5.0.4" postcss-discard-empty@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" dependencies: postcss "^5.0.14" postcss-discard-overridden@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" dependencies: postcss "^5.0.16" postcss-discard-unused@^2.2.1: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" dependencies: postcss "^5.0.14" uniqs "^2.0.0" postcss-filter-plugins@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec" dependencies: postcss "^5.0.4" postcss-load-config@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" dependencies: cosmiconfig "^4.0.0" import-cwd "^2.0.0" postcss-loader@^2.1.5: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.1.6.tgz#1d7dd7b17c6ba234b9bed5af13e0bea40a42d740" dependencies: loader-utils "^1.1.0" postcss "^6.0.0" postcss-load-config "^2.0.0" schema-utils "^0.4.0" postcss-merge-idents@^2.1.5: version "2.1.7" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" dependencies: has "^1.0.1" postcss "^5.0.10" postcss-value-parser "^3.1.1" postcss-merge-longhand@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" dependencies: postcss "^5.0.4" postcss-merge-rules@^2.0.3: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" dependencies: browserslist "^1.5.2" caniuse-api "^1.5.2" postcss "^5.0.4" postcss-selector-parser "^2.2.2" vendors "^1.0.0" postcss-message-helpers@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" postcss-minify-font-values@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" dependencies: object-assign "^4.0.1" postcss "^5.0.4" postcss-value-parser "^3.0.2" postcss-minify-gradients@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" dependencies: postcss "^5.0.12" postcss-value-parser "^3.3.0" postcss-minify-params@^1.0.4: version "1.2.2" resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" dependencies: alphanum-sort "^1.0.1" postcss "^5.0.2" postcss-value-parser "^3.0.2" uniqs "^2.0.0" postcss-minify-selectors@^2.0.4: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" dependencies: alphanum-sort "^1.0.2" has "^1.0.1" postcss "^5.0.14" postcss-selector-parser "^2.0.0" postcss-modules-extract-imports@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" dependencies: postcss "^6.0.1" postcss-modules-local-by-default@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" postcss-modules-scope@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" dependencies: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" postcss-modules-values@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" dependencies: icss-replace-symbols "^1.1.0" postcss "^6.0.1" postcss-normalize-charset@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" dependencies: postcss "^5.0.5" postcss-normalize-url@^3.0.7: version "3.0.8" resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" dependencies: is-absolute-url "^2.0.0" normalize-url "^1.4.0" postcss "^5.0.14" postcss-value-parser "^3.2.3" postcss-ordered-values@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.1" postcss-reduce-idents@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" dependencies: postcss "^5.0.4" postcss-value-parser "^3.0.2" postcss-reduce-initial@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" dependencies: postcss "^5.0.4" postcss-reduce-transforms@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" dependencies: has "^1.0.1" postcss "^5.0.8" postcss-value-parser "^3.0.1" postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: version "2.2.3" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" dependencies: flatten "^1.0.2" indexes-of "^1.0.1" uniq "^1.0.1" postcss-selector-parser@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865" dependencies: dot-prop "^4.1.1" indexes-of "^1.0.1" uniq "^1.0.1" postcss-svgo@^2.1.1: version "2.1.6" resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" dependencies: is-svg "^2.0.0" postcss "^5.0.14" postcss-value-parser "^3.2.3" svgo "^0.7.0" postcss-unique-selectors@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" dependencies: alphanum-sort "^1.0.1" postcss "^5.0.4" uniqs "^2.0.0" postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" postcss-zindex@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" dependencies: has "^1.0.1" postcss "^5.0.4" uniqs "^2.0.0" postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: version "5.2.18" resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" dependencies: chalk "^1.1.3" js-base64 "^2.1.9" source-map "^0.5.6" supports-color "^3.2.3" postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.20, postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" dependencies: chalk "^2.4.1" source-map "^0.6.1" supports-color "^5.4.0" prepend-http@^1.0.0, prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@1.13.7: version "1.13.7" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281" pretty-bytes@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" dependencies: renderkid "^2.0.1" utila "~0.4" pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" prismjs@^1.13.0, prismjs@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" optionalDependencies: clipboard "^2.0.0" private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" process@~0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" public-encrypt@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" dependencies: end-of-stream "^1.1.0" once "^1.3.1" pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" dependencies: duplexify "^3.6.0" inherits "^2.0.3" pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" punycode@2.x.x, punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" dependencies: object-assign "^4.1.0" strict-uri-encode "^1.0.0" querystring-es3@^0.2.0, querystring-es3@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" randomatic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" dependencies: is-number "^4.0.0" kind-of "^6.0.0" math-random "^1.0.1" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" dependencies: safe-buffer "^5.1.0" randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" dependencies: randombytes "^2.0.5" safe-buffer "^5.1.0" range-parser@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" dependencies: find-up "^2.0.0" read-pkg "^3.0.0" read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" path-type "^3.0.0" "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: 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" readable-stream@1.0: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" readable-stream "^2.0.2" set-immediate-shim "^1.0.1" redent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" dependencies: indent-string "^3.0.0" strip-indent "^2.0.0" reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" dependencies: balanced-match "^0.4.2" math-expression-evaluator "^1.2.14" reduce-function-call "^1.0.1" reduce-function-call@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" dependencies: balanced-match "^0.4.2" reduce@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/reduce/-/reduce-1.0.1.tgz#14fa2e5ff1fc560703a020cbb5fbaab691565804" dependencies: object-keys "~1.0.0" regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" dependencies: regenerate "^1.4.0" regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.12.3: version "0.12.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.12.4.tgz#aa9b6c59f4b97be080e972506c560b3bccbfcff0" dependencies: private "^0.1.6" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" dependencies: regenerate "^1.2.1" regjsgen "^0.2.0" regjsparser "^0.1.4" regexpu-core@^4.1.3, regexpu-core@^4.1.4: version "4.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" dependencies: regenerate "^1.4.0" regenerate-unicode-properties "^7.0.0" regjsgen "^0.4.0" regjsparser "^0.3.0" unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.0.2" register-service-worker@^1.5.1: version "1.5.2" resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.5.2.tgz#a4631896c38d6ec5597358f44988cc46a911912d" registry-auth-token@^3.0.1: version "3.3.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" dependencies: rc "^1.1.6" safe-buffer "^5.0.1" registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" dependencies: rc "^1.0.1" regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" regjsgen@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" dependencies: jsesc "~0.5.0" regjsparser@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" dependencies: jsesc "~0.5.0" relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" remove-array-items@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/remove-array-items/-/remove-array-items-1.0.0.tgz#07bf42cb332f4cf6e85ead83b5e4e896d2326b21" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" renderkid@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" dependencies: css-select "^1.1.0" dom-converter "~0.1" htmlparser2 "~3.3.0" strip-ansi "^3.0.0" utila "~0.3" repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" dependencies: resolve-from "^3.0.0" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" resolve-path@^1.3.3, resolve-path@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" dependencies: http-errors "~1.6.2" path-is-absolute "1.0.1" resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" resolve@^1.2.0, resolve@^1.3.2, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: path-parse "^1.0.5" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" dependencies: onetime "^2.0.0" signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" dependencies: hash-base "^3.0.0" inherits "^2.0.1" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" dependencies: aproba "^1.1.1" safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" dependencies: ret "~0.1.10" "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" sax@0.5.x: version "0.5.8" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.4, schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" dependencies: ajv "^6.1.0" ajv-errors "^1.0.0" ajv-keywords "^3.1.0" section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" dependencies: extend-shallow "^2.0.1" kind-of "^6.0.0" select@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" dependencies: semver "^5.0.3" "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" serialize-javascript@^1.3.0, serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.1" to-object-path "^0.3.0" set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" dependencies: is-fullwidth-code-point "^2.0.0" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" dependencies: define-property "^1.0.0" isobject "^3.0.0" snapdragon-util "^3.0.1" snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" dependencies: 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" sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" dependencies: is-plain-obj "^1.0.0" source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" dependencies: 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@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" source-map@0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: amdefine ">=0.0.4" source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" ssri@^5.2.4: version "5.3.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" dependencies: safe-buffer "^5.1.1" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" dependencies: define-property "^0.2.5" object-copy "^0.1.0" "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" std-env@^1.1.0, std-env@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/std-env/-/std-env-1.3.1.tgz#4e1758412439e9ece1d437b1b098551911aa44ee" dependencies: is-ci "^1.1.0" stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" stream-slice@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/stream-slice/-/stream-slice-0.1.2.tgz#2dc4f4e1b936fb13f3eb39a2def1932798d07a4b" strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" string_decoder@^1.0.0, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: safe-buffer "~5.1.0" string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: ansi-regex "^3.0.0" strip-bom-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" stylus-loader@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" dependencies: loader-utils "^1.0.2" lodash.clonedeep "^4.5.0" when "~3.6.x" stylus@^0.54.5: version "0.54.5" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" dependencies: css-parse "1.7.x" debug "*" glob "7.0.x" mkdirp "0.5.x" sax "0.5.x" source-map "0.1.x" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: has-flag "^1.0.0" supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" dependencies: has-flag "^3.0.0" svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" dependencies: coa "~1.0.1" colors "~1.1.2" csso "~2.3.1" js-yaml "~3.7.0" mkdirp "~0.5.1" sax "~1.2.1" whet.extend "~0.9.9" table@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" dependencies: ajv "^6.0.1" ajv-keywords "^3.0.0" chalk "^2.1.0" lodash "^4.17.4" slice-ansi "1.0.0" string-width "^2.1.1" tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" minipass "^2.3.3" minizlib "^1.1.0" mkdirp "^0.5.0" safe-buffer "^5.1.2" yallist "^3.0.2" term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" dependencies: execa "^0.7.0" text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.0" resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" dependencies: any-promise "^1.0.0" through2@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: readable-stream "^2.1.5" xtend "~4.0.1" through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" time-fix-plugin@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/time-fix-plugin/-/time-fix-plugin-2.0.3.tgz#b6b1ead519099bc621e28edb77dac7531918b7e1" timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" dependencies: setimmediate "^1.0.4" tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" to-factory@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-factory/-/to-factory-1.0.0.tgz#8738af8bd97120ad1d4047972ada5563bf9479b1" to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" dependencies: is-number "^3.0.0" repeat-string "^1.6.1" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" toml@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" topo@2.x.x: version "2.0.2" resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" dependencies: hoek "4.x.x" toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" trim-newlines@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" dependencies: safe-buffer "^5.0.1" type-is@^1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: media-typer "0.3.0" mime-types "~2.1.18" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" uglify-es@^3.3.4: version "3.3.9" resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" dependencies: commander "~2.13.0" source-map "~0.6.1" uglify-js@3.4.x: version "3.4.7" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.7.tgz#4df6b92e54789aa921a254cb1e33704d6ec12b89" dependencies: commander "~2.16.0" source-map "~0.6.1" uglifyjs-webpack-plugin@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" schema-utils "^0.4.5" serialize-javascript "^1.4.0" source-map "^0.6.1" uglify-es "^3.3.4" webpack-sources "^1.1.0" worker-farm "^1.5.2" unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" unicode-match-property-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" unicode-property-aliases-ecmascript "^1.0.4" unicode-match-property-value-ecmascript@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" set-value "^0.4.3" uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" uniqs@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" unique-filename@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" dependencies: imurmurhash "^0.1.4" unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" dependencies: crypto-random-string "^1.0.0" universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" dependencies: has-value "^0.3.1" isobject "^3.0.0" unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" update-notifier@^2.3.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" dependencies: boxen "^1.2.1" chalk "^2.0.1" configstore "^3.0.0" import-lazy "^2.1.0" is-ci "^1.0.10" is-installed-globally "^0.1.0" is-npm "^1.0.0" latest-version "^3.0.0" semver-diff "^2.0.0" xdg-basedir "^3.0.0" upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" url-join@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-3.0.0.tgz#26e8113ace195ea30d0fc38186e45400f9cea672" url-join@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" url-loader@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.1.tgz#4d1f3b4f90dde89f02c008e662d604d7511167c1" dependencies: loader-utils "^1.1.0" mime "^2.0.3" schema-utils "^1.0.0" url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" dependencies: prepend-http "^1.0.1" url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" dependencies: punycode "1.3.2" querystring "0.2.0" use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" util.promisify@1.0.0, util.promisify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" dependencies: define-properties "^1.1.2" object.getownpropertydescriptors "^2.0.3" util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: inherits "2.0.1" util@^0.10.3: version "0.10.4" resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" dependencies: inherits "2.0.3" utila@~0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" uuid@^3.1.0: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" v8-compile-cache@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" vendors@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" dependencies: indexof "0.0.1" vue-hot-reload-api@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" vue-loader@^15.2.4: version "15.4.0" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.4.0.tgz#8c90f94ece61c6b4707e87b4a58617f97faa125b" dependencies: "@vue/component-compiler-utils" "^2.0.0" hash-sum "^1.0.2" loader-utils "^1.1.0" vue-hot-reload-api "^2.3.0" vue-style-loader "^4.1.0" vue-router@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" vue-server-renderer@^2.5.16: version "2.5.17" resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.5.17.tgz#c1f24815a4b12a2797c154549b29b44b6be004b5" dependencies: chalk "^1.1.3" hash-sum "^1.0.2" he "^1.1.0" lodash.template "^4.4.0" lodash.uniq "^4.5.0" resolve "^1.2.0" serialize-javascript "^1.3.0" source-map "0.5.6" vue-style-loader@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8" dependencies: hash-sum "^1.0.2" loader-utils "^1.0.2" vue-template-compiler@^2.5.16: version "2.5.17" resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.17.tgz#52a4a078c327deb937482a509ae85c06f346c3cb" dependencies: de-indent "^1.0.2" he "^1.1.0" vue-template-es2015-compiler@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" vue@^2.5.16: version "2.5.17" resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.17.tgz#0f8789ad718be68ca1872629832ed533589c6ada" vuepress-html-webpack-plugin@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz#219be272ad510faa8750d2d4e70fd028bfd1c16e" dependencies: html-minifier "^3.2.3" loader-utils "^0.2.16" lodash "^4.17.3" pretty-error "^2.0.2" tapable "^1.0.0" toposort "^1.0.0" util.promisify "1.0.0" vuepress@^0.14.2: version "0.14.2" resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-0.14.2.tgz#48e5e102178370980d1408e230c0263d768435b7" dependencies: "@babel/core" "7.0.0-beta.47" "@vue/babel-preset-app" "3.0.0-beta.11" autoprefixer "^8.2.0" babel-loader "8.0.0-beta.3" cache-loader "^1.2.2" chalk "^2.3.2" chokidar "^2.0.3" commander "^2.15.1" connect-history-api-fallback "^1.5.0" copy-webpack-plugin "^4.5.1" cross-spawn "^6.0.5" css-loader "^0.28.11" diacritics "^1.3.0" docsearch.js "^2.5.2" escape-html "^1.0.3" file-loader "^1.1.11" fs-extra "^5.0.0" globby "^8.0.1" gray-matter "^4.0.1" js-yaml "^3.11.0" koa-connect "^2.0.1" koa-mount "^3.0.0" koa-range "^0.3.0" koa-static "^4.0.2" loader-utils "^1.1.0" lodash.throttle "^4.1.1" lru-cache "^4.1.2" markdown-it "^8.4.1" markdown-it-anchor "^5.0.2" markdown-it-container "^2.0.0" markdown-it-emoji "^1.4.0" markdown-it-table-of-contents "^0.4.0" mini-css-extract-plugin "^0.4.1" nprogress "^0.2.0" optimize-css-assets-webpack-plugin "^4.0.0" portfinder "^1.0.13" postcss-loader "^2.1.5" prismjs "^1.13.0" register-service-worker "^1.5.1" semver "^5.5.0" stylus "^0.54.5" stylus-loader "^3.0.2" toml "^2.3.3" url-loader "^1.0.1" vue "^2.5.16" vue-loader "^15.2.4" vue-router "^3.0.1" vue-server-renderer "^2.5.16" vue-template-compiler "^2.5.16" vuepress-html-webpack-plugin "^3.2.0" webpack "^4.8.1" webpack-chain "^4.6.0" webpack-merge "^4.1.2" webpack-serve "^1.0.2" webpackbar "^2.6.1" workbox-build "^3.1.0" watchpack@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" webpack-chain@^4.6.0: version "4.9.0" resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.9.0.tgz#2f0794d34d79a7cc5db1416f497b76ad33df30ee" dependencies: deepmerge "^1.5.2" javascript-stringify "^1.6.0" webpack-dev-middleware@^3.0.0: version "3.1.3" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz#8b32aa43da9ae79368c1bf1183f2b6cf5e1f39ed" dependencies: loud-rejection "^1.6.0" memory-fs "~0.4.1" mime "^2.1.0" path-is-absolute "^1.0.0" range-parser "^1.0.3" url-join "^4.0.0" webpack-log "^1.0.1" webpack-hot-client@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/webpack-hot-client/-/webpack-hot-client-3.0.0.tgz#b714f257a264001275bc1491741685779cde12f2" dependencies: json-stringify-safe "^5.0.1" loglevelnext "^1.0.2" strip-ansi "^4.0.0" uuid "^3.1.0" webpack-log "^1.1.1" ws "^4.0.0" webpack-log@^1.0.1, webpack-log@^1.1.1, webpack-log@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" dependencies: chalk "^2.1.0" log-symbols "^2.1.0" loglevelnext "^1.0.1" uuid "^3.1.0" webpack-merge@^4.1.2: version "4.1.4" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" dependencies: lodash "^4.17.5" webpack-serve@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/webpack-serve/-/webpack-serve-1.0.4.tgz#d1c83955926969ba195e5032f978da92ef07829c" dependencies: "@shellscape/koa-static" "^4.0.4" "@webpack-contrib/config-loader" "^1.1.1" chalk "^2.3.0" clipboardy "^1.2.2" cosmiconfig "^5.0.2" debug "^3.1.0" find-up "^2.1.0" get-port "^3.2.0" import-local "^1.0.0" killable "^1.0.0" koa "^2.4.1" koa-webpack "^4.0.0" lodash "^4.17.5" loud-rejection "^1.6.0" meow "^5.0.0" nanobus "^4.3.1" opn "^5.1.0" resolve "^1.6.0" time-fix-plugin "^2.0.0" update-notifier "^2.3.0" url-join "3.0.0" v8-compile-cache "^2.0.0" webpack-hot-client "^3.0.0" webpack-log "^1.1.2" webpack-sources@^1.0.1, webpack-sources@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" webpack@^4.8.1: version "4.17.1" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.17.1.tgz#0f026e3d823f3fc604f811ed3ea8f0d9b267fb1e" dependencies: "@webassemblyjs/ast" "1.5.13" "@webassemblyjs/helper-module-context" "1.5.13" "@webassemblyjs/wasm-edit" "1.5.13" "@webassemblyjs/wasm-opt" "1.5.13" "@webassemblyjs/wasm-parser" "1.5.13" acorn "^5.6.2" acorn-dynamic-import "^3.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" enhanced-resolve "^4.1.0" eslint-scope "^4.0.0" json-parse-better-errors "^1.0.2" loader-runner "^2.3.0" loader-utils "^1.1.0" memory-fs "~0.4.1" micromatch "^3.1.8" mkdirp "~0.5.0" neo-async "^2.5.0" node-libs-browser "^2.0.0" schema-utils "^0.4.4" tapable "^1.0.0" uglifyjs-webpack-plugin "^1.2.4" watchpack "^1.5.0" webpack-sources "^1.0.1" webpackbar@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-2.6.3.tgz#4f2d0078375acfe95c0e55227771a2ed98ecc5c9" dependencies: chalk "^2.4.1" consola "^1.4.3" figures "^2.0.0" loader-utils "^1.1.0" lodash "^4.17.10" log-update "^2.3.0" pretty-time "^1.1.0" schema-utils "^1.0.0" std-env "^1.3.1" table "^4.0.3" when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" dependencies: string-width "^1.0.2 || 2" widest-line@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" dependencies: string-width "^2.1.1" workbox-background-sync@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-3.4.1.tgz#6957a0ff622ee08b7af958d561cf2d4821edb640" dependencies: workbox-core "^3.4.1" workbox-broadcast-cache-update@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-broadcast-cache-update/-/workbox-broadcast-cache-update-3.4.1.tgz#9861cd2b6d874d41be26a34bc5bdd7a794d3badf" dependencies: workbox-core "^3.4.1" workbox-build@^3.1.0: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-3.4.1.tgz#65af4c81b05dac6a1819c88b8a2a944ddf5cec04" dependencies: babel-runtime "^6.26.0" common-tags "^1.4.0" fs-extra "^4.0.2" glob "^7.1.2" joi "^11.1.1" lodash.template "^4.4.0" pretty-bytes "^4.0.2" workbox-background-sync "^3.4.1" workbox-broadcast-cache-update "^3.4.1" workbox-cache-expiration "^3.4.1" workbox-cacheable-response "^3.4.1" workbox-core "^3.4.1" workbox-google-analytics "^3.4.1" workbox-navigation-preload "^3.4.1" workbox-precaching "^3.4.1" workbox-range-requests "^3.4.1" workbox-routing "^3.4.1" workbox-strategies "^3.4.1" workbox-streams "^3.4.1" workbox-sw "^3.4.1" workbox-cache-expiration@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-cache-expiration/-/workbox-cache-expiration-3.4.1.tgz#6c92317ca43be7e3030662ffbb3fd413c1689f18" dependencies: workbox-core "^3.4.1" workbox-cacheable-response@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-3.4.1.tgz#5517b4d5a86c2ad5d48000109335c5af23f47e40" dependencies: workbox-core "^3.4.1" workbox-core@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-3.4.1.tgz#dd6d8ad7398a0e6224c04b079841045af0c62e1f" workbox-google-analytics@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-3.4.1.tgz#98f407b7d157be68087e0f3edb432cba291fd614" dependencies: workbox-background-sync "^3.4.1" workbox-core "^3.4.1" workbox-routing "^3.4.1" workbox-strategies "^3.4.1" workbox-navigation-preload@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-3.4.1.tgz#d3eb75239cc4eed9314b25e233da2ba282dcc84d" dependencies: workbox-core "^3.4.1" workbox-precaching@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-3.4.1.tgz#2d4a3f6ae8d825e17ef51dddc51aae5ef2876fb5" dependencies: workbox-core "^3.4.1" workbox-range-requests@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-3.4.1.tgz#098474efecce49148ba925c75753e0ac96a8dd9a" dependencies: workbox-core "^3.4.1" workbox-routing@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-3.4.1.tgz#c5ac213480869da29a91a88db57b679ba7ddf58a" dependencies: workbox-core "^3.4.1" workbox-strategies@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-3.4.1.tgz#96f7947a9611ea599fcb71d44a5abab503fbe288" dependencies: workbox-core "^3.4.1" workbox-streams@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-3.4.1.tgz#b639843431ea38825909a557e54108fdc469f0eb" dependencies: workbox-core "^3.4.1" workbox-sw@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-3.4.1.tgz#7b51fc14c44b4e880c369f97681472cf6e117113" worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: errno "~0.1.7" wrap-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" signal-exit "^3.0.2" ws@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" dependencies: async-limiter "~1.0.0" safe-buffer "~5.1.0" xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" dependencies: camelcase "^4.1.0" ylru@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"