From cd8ff57cf4a528798f0f82021c3c7857b1e81b07 Mon Sep 17 00:00:00 2001 From: Mark Allen Date: Thu, 16 Jan 2025 13:38:12 +0000 Subject: [PATCH 1/2] Sorbet: add strict typing for GemfileUpdater and GemspecDependencyNameFinder --- .../bundler/file_updater/gemfile_updater.rb | 38 ++++++++++++++----- .../gemspec_dependency_name_finder.rb | 11 +++++- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/bundler/lib/dependabot/bundler/file_updater/gemfile_updater.rb b/bundler/lib/dependabot/bundler/file_updater/gemfile_updater.rb index b8eeb8965e..c889b64722 100644 --- a/bundler/lib/dependabot/bundler/file_updater/gemfile_updater.rb +++ b/bundler/lib/dependabot/bundler/file_updater/gemfile_updater.rb @@ -1,4 +1,4 @@ -# typed: true +# typed: strict # frozen_string_literal: true require "dependabot/bundler/file_updater" @@ -7,19 +7,23 @@ module Dependabot module Bundler class FileUpdater class GemfileUpdater + extend T::Sig + GEMFILE_FILENAMES = %w(Gemfile gems.rb).freeze require_relative "git_pin_replacer" require_relative "git_source_remover" require_relative "requirement_replacer" + sig { params(dependencies: T::Array[Dependabot::Dependency], gemfile: Dependabot::DependencyFile).void } def initialize(dependencies:, gemfile:) @dependencies = dependencies @gemfile = gemfile end + sig { returns(String) } def updated_gemfile_content - content = gemfile.content + content = T.must(gemfile.content) dependencies.each do |dependency| content = replace_gemfile_version_requirement( @@ -38,21 +42,27 @@ def updated_gemfile_content private + sig { returns(T::Array[Dependabot::Dependency]) } attr_reader :dependencies + + sig { returns(Dependabot::DependencyFile) } attr_reader :gemfile + sig do + params(dependency: Dependabot::Dependency, file: Dependabot::DependencyFile, content: String).returns(String) + end def replace_gemfile_version_requirement(dependency, file, content) return content unless requirement_changed?(file, dependency) updated_requirement = dependency.requirements .find { |r| r[:file] == file.name } - .fetch(:requirement) + &.fetch(:requirement) previous_requirement = dependency.previous_requirements - .find { |r| r[:file] == file.name } - .fetch(:requirement) + &.find { |r| r[:file] == file.name } + &.fetch(:requirement) RequirementReplacer.new( dependency: dependency, @@ -62,17 +72,19 @@ def replace_gemfile_version_requirement(dependency, file, content) ).rewrite(content) end + sig { params(file: Dependabot::DependencyFile, dependency: Dependabot::Dependency).returns(T::Boolean) } def requirement_changed?(file, dependency) changed_requirements = - dependency.requirements - dependency.previous_requirements + dependency.requirements - T.must(dependency.previous_requirements) changed_requirements.any? { |f| f[:file] == file.name } end + sig { params(dependency: Dependabot::Dependency).returns(T::Boolean) } def remove_git_source?(dependency) old_gemfile_req = dependency.previous_requirements - .find { |f| GEMFILE_FILENAMES.include?(f[:file]) } + &.find { |f| GEMFILE_FILENAMES.include?(f[:file]) } return false unless old_gemfile_req&.dig(:source, :type) == "git" @@ -80,9 +92,10 @@ def remove_git_source?(dependency) dependency.requirements .find { |f| GEMFILE_FILENAMES.include?(f[:file]) } - new_gemfile_req[:source].nil? + T.must(new_gemfile_req)[:source].nil? end + sig { params(dependency: Dependabot::Dependency, file: Dependabot::DependencyFile).returns(T::Boolean) } def update_git_pin?(dependency, file) new_gemfile_req = dependency.requirements @@ -91,18 +104,23 @@ def update_git_pin?(dependency, file) # If the new requirement is a git dependency with a ref then there's # no harm in doing an update - new_gemfile_req.dig(:source, :ref) + !T.must(new_gemfile_req).dig(:source, :ref).nil? end + sig { params(dependency: Dependabot::Dependency, content: String).returns(String) } def remove_gemfile_git_source(dependency, content) GitSourceRemover.new(dependency: dependency).rewrite(content) end + sig do + params(dependency: Dependabot::Dependency, file: Dependabot::DependencyFile, content: String).returns(String) + end def update_gemfile_git_pin(dependency, file, content) new_pin = dependency.requirements .find { |f| f[:file] == file.name } - .fetch(:source).fetch(:ref) + &.fetch(:source) + &.fetch(:ref) GitPinReplacer .new(dependency: dependency, new_pin: new_pin) diff --git a/bundler/lib/dependabot/bundler/file_updater/gemspec_dependency_name_finder.rb b/bundler/lib/dependabot/bundler/file_updater/gemspec_dependency_name_finder.rb index 587586a268..6fd44a04d2 100644 --- a/bundler/lib/dependabot/bundler/file_updater/gemspec_dependency_name_finder.rb +++ b/bundler/lib/dependabot/bundler/file_updater/gemspec_dependency_name_finder.rb @@ -1,4 +1,4 @@ -# typed: true +# typed: strict # frozen_string_literal: true require "parser/current" @@ -8,13 +8,20 @@ module Dependabot module Bundler class FileUpdater class GemspecDependencyNameFinder + extend T::Sig + + ChildNode = T.type_alias { T.nilable(T.any(Parser::AST::Node, Symbol, String)) } + + sig { returns(String) } attr_reader :gemspec_content + sig { params(gemspec_content: String).void } def initialize(gemspec_content:) @gemspec_content = gemspec_content end # rubocop:disable Security/Eval + sig { returns(T.nilable(String)) } def dependency_name ast = Parser::CurrentRuby.parse(gemspec_content) dependency_name_node = find_dependency_name_node(ast) @@ -30,6 +37,7 @@ def dependency_name private + sig { params(node: ChildNode).returns(T.nilable(Parser::AST::Node)) } def find_dependency_name_node(node) return unless node.is_a?(Parser::AST::Node) return node if declares_dependency_name?(node) @@ -40,6 +48,7 @@ def find_dependency_name_node(node) end end + sig { params(node: ChildNode).returns(T::Boolean) } def declares_dependency_name?(node) return false unless node.is_a?(Parser::AST::Node) From 66caeefc0ae0207797d0eb71e3e8776556d907c9 Mon Sep 17 00:00:00 2001 From: "S.Sandhu" <167903774+sachin-sandhu@users.noreply.github.com> Date: Thu, 16 Jan 2025 11:50:44 -0500 Subject: [PATCH 2/2] Fixes [1.3k weekly errors] [JS] Adds error handlers for PNPM exceptions (#11316) Adds error handlers for pnpm exceptions --- .../file_updater/pnpm_lockfile_updater.rb | 74 +- .../npm_and_yarn/pnpm_error_handler_spec.rb | 74 ++ .../git_dependency_local_file/package.json | 15 + .../pnpm/git_dependency_local_file/pnpm.lock | 639 ++++++++++++++++++ 4 files changed, 796 insertions(+), 6 deletions(-) create mode 100644 npm_and_yarn/spec/dependabot/npm_and_yarn/pnpm_error_handler_spec.rb create mode 100644 npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/package.json create mode 100644 npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/pnpm.lock diff --git a/npm_and_yarn/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb b/npm_and_yarn/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb index bba17e2593..a7d1ffc725 100644 --- a/npm_and_yarn/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb +++ b/npm_and_yarn/lib/dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater.rb @@ -18,6 +18,10 @@ def initialize(dependencies:, dependency_files:, repo_contents_path:, credential @dependency_files = dependency_files @repo_contents_path = repo_contents_path @credentials = credentials + @error_handler = PnpmErrorHandler.new( + dependencies: dependencies, + dependency_files: dependency_files + ) end def updated_pnpm_lock_content(pnpm_lock) @@ -36,6 +40,7 @@ def updated_pnpm_lock_content(pnpm_lock) attr_reader :dependency_files attr_reader :repo_contents_path attr_reader :credentials + attr_reader :error_handler IRRESOLVABLE_PACKAGE = "ERR_PNPM_NO_MATCHING_VERSION" INVALID_REQUIREMENT = "ERR_PNPM_SPEC_NOT_SUPPORTED_BY_ANY_RESOLVER" @@ -46,12 +51,12 @@ def updated_pnpm_lock_content(pnpm_lock) UNAUTHORIZED_PACKAGE = /ERR_PNPM_FETCH_401[ [^:print:]]+GET (?.*): Unauthorized - 401/ # ERR_PNPM_FETCH ERROR CODES - ERR_PNPM_FETCH_401 = /ERR_PNPM_FETCH_401.*GET (?.*): - 401/ - ERR_PNPM_FETCH_403 = /ERR_PNPM_FETCH_403.*GET (?.*): - 403/ - ERR_PNPM_FETCH_404 = /ERR_PNPM_FETCH_404.*GET (?.*): - 404/ - ERR_PNPM_FETCH_500 = /ERR_PNPM_FETCH_500.*GET (?.*): - 500/ - ERR_PNPM_FETCH_502 = /ERR_PNPM_FETCH_502.*GET (?.*): - 502/ - ERR_PNPM_FETCH_503 = /ERR_PNPM_FETCH_503.*GET (?.*): - 503/ + ERR_PNPM_FETCH_401 = /ERR_PNPM_FETCH_401.*GET (?.*):/ + ERR_PNPM_FETCH_403 = /ERR_PNPM_FETCH_403.*GET (?.*):/ + ERR_PNPM_FETCH_404 = /ERR_PNPM_FETCH_404.*GET (?.*):/ + ERR_PNPM_FETCH_500 = /ERR_PNPM_FETCH_500.*GET (?.*):/ + ERR_PNPM_FETCH_502 = /ERR_PNPM_FETCH_502.*GET (?.*):/ + ERR_PNPM_FETCH_503 = /ERR_PNPM_FETCH_503.*GET (?.*):/ # ERR_PNPM_UNSUPPORTED_ENGINE ERR_PNPM_UNSUPPORTED_ENGINE = /ERR_PNPM_UNSUPPORTED_ENGINE/ @@ -251,6 +256,8 @@ def handle_pnpm_lock_updater_error(error, pnpm_lock) pnpm_lock) end + error_handler.handle_pnpm_error(error) + raise end # rubocop:enable Metrics/AbcSize @@ -360,5 +367,60 @@ def sanitize_message(message) end end end + + class PnpmErrorHandler + extend T::Sig + + # remote connection closed + ECONNRESET_ERROR = /ECONNRESET/ + + # socket hang up error code + SOCKET_HANG_UP = /socket hang up/ + + # ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC error + ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC = /ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC/ + + # duplicate package error code + DUPLICATE_PACKAGE = /Found duplicates/ + + ERR_PNPM_NO_VERSIONS = /ERR_PNPM_NO_VERSIONS/ + + # Initializes the YarnErrorHandler with dependencies and dependency files + sig do + params( + dependencies: T::Array[Dependabot::Dependency], + dependency_files: T::Array[Dependabot::DependencyFile] + ).void + end + def initialize(dependencies:, dependency_files:) + @dependencies = dependencies + @dependency_files = dependency_files + end + + private + + sig { returns(T::Array[Dependabot::Dependency]) } + attr_reader :dependencies + + sig { returns(T::Array[Dependabot::DependencyFile]) } + attr_reader :dependency_files + + public + + # Handles errors with specific to yarn error codes + sig { params(error: SharedHelpers::HelperSubprocessFailed).void } + def handle_pnpm_error(error) + if error.message.match?(DUPLICATE_PACKAGE) || error.message.match?(ERR_PNPM_NO_VERSIONS) || + error.message.match?(ERR_PNPM_CATALOG_ENTRY_NOT_FOUND_FOR_SPEC) + + raise DependencyFileNotResolvable, "Error resolving dependency" + end + + ## Clean error message from ANSI escape codes + return unless error.message.match?(ECONNRESET_ERROR) || error.message.match?(SOCKET_HANG_UP) + + raise InconsistentRegistryResponse, "Inconsistent registry response while resolving dependency" + end + end end end diff --git a/npm_and_yarn/spec/dependabot/npm_and_yarn/pnpm_error_handler_spec.rb b/npm_and_yarn/spec/dependabot/npm_and_yarn/pnpm_error_handler_spec.rb new file mode 100644 index 0000000000..9ad11efa09 --- /dev/null +++ b/npm_and_yarn/spec/dependabot/npm_and_yarn/pnpm_error_handler_spec.rb @@ -0,0 +1,74 @@ +# typed: false +# frozen_string_literal: true + +require "spec_helper" +require "dependabot/npm_and_yarn/file_updater/pnpm_lockfile_updater" +require "dependabot/npm_and_yarn/dependency_files_filterer" +require "dependabot/dependency" +require "dependabot/dependency_file" +require "dependabot/shared_helpers" +require "dependabot/errors" + +RSpec.describe Dependabot::NpmAndYarn::PnpmErrorHandler do + subject(:error_handler) { described_class.new(dependencies: dependencies, dependency_files: dependency_files) } + + let(:dependencies) { [dependency] } + let(:error) { instance_double(Dependabot::SharedHelpers::HelperSubprocessFailed, message: error_message) } + + let(:dependency) do + Dependabot::Dependency.new( + name: dependency_name, + version: version, + requirements: [], + previous_requirements: [], + package_manager: "npm_and_yarn" + ) + end + let(:dependency_files) { project_dependency_files("pnpm/git_dependency_local_file") } + + let(:credentials) do + [Dependabot::Credential.new({ + "type" => "git_source", + "host" => "github.com" + })] + end + + let(:dependency_name) { "@segment/analytics.js-integration-facebook-pixel" } + let(:version) { "github:segmentio/analytics.js-integrations#2.4.1" } + let(:yarn_lock) do + dependency_files.find { |f| f.name == "pnpm.lock" } + end + + describe "#initialize" do + it "initializes with dependencies and dependency files" do + expect(error_handler.send(:dependencies)).to eq(dependencies) + expect(error_handler.send(:dependency_files)).to eq(dependency_files) + end + end + + describe "#handle_error" do + context "when the error message contains Inconsistent Registry Response" do + let(:error_message) do + "ECONNRESET  request to https://artifactory.schaeffler.com/as.zip failed, reason: socket hang up" + end + + it "raises a InconsistentRegistryResponse error with the correct message" do + expect do + error_handler.handle_pnpm_error(error) + end.to raise_error(Dependabot::InconsistentRegistryResponse) + end + end + + context "when the error message contains package error" do + let(:error_message) do + "ERR_PNPM_NO_VERSIONS  No versions available for prosemirror-gapcursor. The package may be unpublished." + end + + it "raises a DependencyFileNotResolvable error with the correct message" do + expect do + error_handler.handle_pnpm_error(error) + end.to raise_error(Dependabot::DependencyFileNotResolvable) + end + end + end +end diff --git a/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/package.json b/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/package.json new file mode 100644 index 0000000000..9c9882a037 --- /dev/null +++ b/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/package.json @@ -0,0 +1,15 @@ +{ + "name": "test", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@segment/analytics.js-integration-facebook-pixel": "github:segmentio/analytics.js-integrations#2.4.1" + } +} diff --git a/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/pnpm.lock b/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/pnpm.lock new file mode 100644 index 0000000000..e1e6422a00 --- /dev/null +++ b/npm_and_yarn/spec/fixtures/projects/pnpm/git_dependency_local_file/pnpm.lock @@ -0,0 +1,639 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ndhoule/after@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/after/-/after-1.0.0.tgz#e6d86d121448247ac742ff3a61c63fae83ee1191" + integrity sha1-5thtEhRIJHrHQv86YcY/roPuEZE= + dependencies: + "@ndhoule/arity" "^2.0.0" + +"@ndhoule/arity@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/arity/-/arity-2.0.0.tgz#26bfa0b9755ced9aea819d4e6e7a93db27a5b658" + integrity sha1-Jr+guXVc7ZrqgZ1ObnqT2yeltlg= + +"@ndhoule/clone@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/clone/-/clone-1.0.0.tgz#0f68394a95008cf360370e101924564a70927afc" + integrity sha1-D2g5SpUAjPNgNw4QGSRWSnCSevw= + dependencies: + component-type "^1.2.1" + +"@ndhoule/defaults@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/defaults/-/defaults-2.0.1.tgz#704aae3c601a4e4a1a10f0876a2d3253bc7d4d9b" + integrity sha1-cEquPGAaTkoaEPCHai0yU7x9TZs= + dependencies: + "@ndhoule/drop" "^2.0.0" + "@ndhoule/rest" "^2.0.0" + +"@ndhoule/drop@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/drop/-/drop-2.0.0.tgz#bcab1f3041555eaf84ce84e16475ff42ee949c8c" + integrity sha1-vKsfMEFVXq+EzoThZHX/Qu6UnIw= + +"@ndhoule/each@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/each/-/each-2.0.1.tgz#bbed372a603e0713a3193c706a73ddebc5b426a9" + integrity sha1-u+03KmA+BxOjGTxwanPd68W0Jqk= + dependencies: + "@ndhoule/keys" "^2.0.0" + +"@ndhoule/every@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/every/-/every-2.0.1.tgz#3907d8b6c430493dbb619c18071ce9055f8a106d" + integrity sha1-OQfYtsQwST27YZwYBxzpBV+KEG0= + dependencies: + "@ndhoule/each" "^2.0.1" + +"@ndhoule/extend@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/extend/-/extend-2.0.0.tgz#8c9aa5c9b2f0a012104ffe214cd9746572b9aeb6" + integrity sha1-jJqlybLwoBIQT/4hTNl0ZXK5rrY= + +"@ndhoule/foldl@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/foldl/-/foldl-2.0.1.tgz#788acedfa2cfd12ecb0b84d2beaf650d97be84f2" + integrity sha1-eIrO36LP0S7LC4TSvq9lDZe+hPI= + dependencies: + "@ndhoule/each" "^2.0.1" + +"@ndhoule/includes@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/includes/-/includes-2.0.1.tgz#051ff5eb042c8fa17e7158f0a8a70172e1affaa5" + integrity sha1-BR/16wQsj6F+cVjwqKcBcuGv+qU= + dependencies: + "@ndhoule/each" "^2.0.1" + +"@ndhoule/keys@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/keys/-/keys-2.0.0.tgz#3d64ae677c65a261747bf3a457c62eb292a4e0ce" + integrity sha1-PWSuZ3xlomF0e/OkV8YuspKk4M4= + +"@ndhoule/map@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@ndhoule/map/-/map-2.0.1.tgz#f5ca0a47424ea67f46e2a6d499b9e9bc886aefa8" + integrity sha1-9coKR0JOpn9G4qbUmbnpvIhq76g= + dependencies: + "@ndhoule/each" "^2.0.1" + +"@ndhoule/rest@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@ndhoule/rest/-/rest-2.0.0.tgz#0346b02a964a513ed2ba24d164f01d34f2107a0f" + integrity sha1-A0awKpZKUT7SuiTRZPAdNPIQeg8= + +"@segment/analytics.js-integration-facebook-pixel@segmentio/analytics.js-integrations#2.4.1": + version "2.4.1" + resolved "https://codeload.github.com/segmentio/analytics.js-integrations/tar.gz/3b1bb80b302c2e552685dc8a029797ec832ea7c9" + dependencies: + "@ndhoule/each" "^2.0.1" + "@ndhoule/foldl" "^2.0.1" + "@segment/analytics.js-integration" "^3.1.0" + dateformat "^1.0.12" + is "^3.2.1" + reject "0.0.1" + segmentio-facade "^3.1.0" + to-camel-case "^1.0.0" + +"@segment/analytics.js-integration@^3.1.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@segment/analytics.js-integration/-/analytics.js-integration-3.3.0.tgz#a44eac133e0ba1a26dc7387adc59c84b0ab15178" + integrity sha512-xDwQ6xQKYFMIaZd+I9SYIZNAWUk806mU18JeGpo1wj84bqKjwi8WaFYTk+keuh+B8GtIOTkH16S/orzvzmBDxw== + dependencies: + "@ndhoule/after" "^1.0.0" + "@ndhoule/clone" "^1.0.0" + "@ndhoule/defaults" "^2.0.1" + "@ndhoule/each" "^2.0.1" + "@ndhoule/every" "^2.0.1" + "@ndhoule/extend" "^2.0.0" + "@ndhoule/foldl" "^2.0.1" + "@ndhoule/includes" "^2.0.1" + "@segment/fmt" "^1.0.0" + "@segment/load-script" "^1.0.1" + analytics-events "^2.0.2" + component-bind "^1.0.0" + component-emitter "^1.2.0" + debug "^2.2.0" + domify "^1.4.0" + extend "3.0.1" + is "^3.1.0" + load-iframe "^1.0.0" + next-tick "^0.2.2" + slug-component "^1.1.0" + to-no-case "^0.1.3" + +"@segment/fmt@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@segment/fmt/-/fmt-1.0.0.tgz#7b2db58a12d8420b0a004889af048ab22765557f" + integrity sha1-ey21ihLYQgsKAEiJrwSKsidlVX8= + +"@segment/isodate-traverse@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@segment/isodate-traverse/-/isodate-traverse-1.1.0.tgz#4fb36f30d94c2c5a3c8a75d25c1504822a1bb9ab" + integrity sha1-T7NvMNlMLFo8inXSXBUEgiobuas= + dependencies: + "@segment/isodate" "^1.0.0" + component-each "^0.2.6" + component-type "^1.2.1" + +"@segment/isodate@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@segment/isodate/-/isodate-1.0.2.tgz#71fef69e816b77593a80b4cfbf2d22443222eafe" + integrity sha1-cf72noFrd1k6gLTPvy0iRDIi6v4= + +"@segment/isodate@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@segment/isodate/-/isodate-1.0.3.tgz#f44e8202d5edd277ce822785239474b2c9411d4a" + integrity sha512-BtanDuvJqnACFkeeYje7pWULVv8RgZaqKHWwGFnL/g/TH/CcZjkIVTfGDp/MAxmilYHUkrX70SqwnYSTNEaN7A== + +"@segment/load-script@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@segment/load-script/-/load-script-1.0.1.tgz#adb7a2def2c99ac248cc8e2c154fb4bb03094399" + integrity sha1-rbei3vLJmsJIzI4sFU+0uwMJQ5k= + dependencies: + component-type "^1.2.0" + next-tick "^0.2.2" + script-onload "^1.0.2" + +analytics-events@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/analytics-events/-/analytics-events-2.2.0.tgz#f00f55946940a6357809582f6fded6ab80034b84" + integrity sha1-8A9VlGlApjV4CVgvb97Wq4ADS4Q= + dependencies: + "@ndhoule/foldl" "^2.0.1" + "@ndhoule/map" "^2.0.1" + +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" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + +component-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-each@^0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/component-each/-/component-each-0.2.6.tgz#991faf31ef4fcafbad04237124d381b3394941d5" + integrity sha1-mR+vMe9PyvutBCNxJNOBszlJQdU= + dependencies: + component-type "1.0.0" + to-function "2.0.6" + +component-emitter@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-props@*: + version "1.1.1" + resolved "https://registry.yarnpkg.com/component-props/-/component-props-1.1.1.tgz#f9b7df9b9927b6e6d97c9bd272aa867670f34944" + integrity sha1-+bffm5kntubZfJvScqqGdnDzSUQ= + +component-type@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.0.0.tgz#1ed8812e32dd65099d433570757f111ea3d3d871" + integrity sha1-HtiBLjLdZQmdQzVwdX8RHqPT2HE= + +component-type@^1.2.0, component-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-type/-/component-type-1.2.1.tgz#8a47901700238e4fc32269771230226f24b415a9" + integrity sha1-ikeQFwAjjk/DIml3EjAibyS0Fak= + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +dateformat@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +domify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/domify/-/domify-1.4.0.tgz#11483617f764f8695975b4bdc79b14f0803b629b" + integrity sha1-EUg2F/dk+GlZdbS9x5sU8IA7Yps= + +error-ex@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +extend@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + +graceful-fs@^4.1.2: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +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" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +inherits@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-email@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-email/-/is-email-0.1.0.tgz#e7eb1aefe8d4a3183980a7172b851272ebd04a95" + integrity sha1-5+sa7+jUoxg5gKcXK4UScuvQSpU= + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= + dependencies: + number-is-nan "^1.0.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is@^3.0.1, is@^3.1.0, is@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" + integrity sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg== + +load-iframe@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/load-iframe/-/load-iframe-1.0.0.tgz#b2c111f1a2b982897463232f5286191343bbdbd8" + integrity sha1-ssER8aK5gol0YyMvUoYZE0O729g= + dependencies: + is "^3.0.1" + next-tick "^0.2.2" + script-onload "^1.0.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +minimist@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +new-date@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/new-date/-/new-date-1.0.1.tgz#0044981b1739161e653099c44e6e9e4ff72e02d2" + integrity sha1-AESYGxc5Fh5lMJnETm6eT/cuAtI= + dependencies: + "@segment/isodate" "1.0.2" + is "^3.1.0" + +next-tick@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" + integrity sha1-ddpKkn7liH45BliABltzNkE7MQ0= + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +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" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +obj-case@0.x: + version "0.2.0" + resolved "https://registry.yarnpkg.com/obj-case/-/obj-case-0.2.0.tgz#841c0b26784fc329968396fd871f830255c1ff2d" + integrity sha1-hBwLJnhPwymWg5b9hx+DAlXB/y0= + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +reject@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/reject/-/reject-0.0.1.tgz#9fa05ad126ef2ad22ef79cfe088eb96a1a116eaf" + integrity sha1-n6Ba0SbvKtIu95z+CI65ahoRbq8= + dependencies: + type-component "0.0.1" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +resolve@^1.10.0: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" + integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== + dependencies: + path-parse "^1.0.6" + +script-onload@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/script-onload/-/script-onload-1.0.2.tgz#6bdca122875487192ccaf4e6884fcfdd0c7fde32" + integrity sha1-a9yhIodUhxksyvTmiE/P3Qx/3jI= + +segmentio-facade@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/segmentio-facade/-/segmentio-facade-3.2.3.tgz#7ddc6971801a482475b6a768184696a847e9197d" + integrity sha1-fdxpcYAaSCR1tqdoGEaWqEfpGX0= + dependencies: + "@ndhoule/clone" "^1.0.0" + "@segment/isodate-traverse" "^1.0.0" + inherits "^2.0.1" + is-email "0.1.0" + new-date "^1.0.0" + obj-case "0.x" + trim "0.0.1" + type-component "0.0.1" + +"semver@2 || 3 || 4 || 5": + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +slug-component@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/slug-component/-/slug-component-1.1.0.tgz#224290a04591bf9ac08b9c622d3a14f43e3a0df7" + integrity sha1-IkKQoEWRv5rAi5xiLToU9D46Dfc= + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +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" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +to-camel-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-camel-case/-/to-camel-case-1.0.0.tgz#1a56054b2f9d696298ce66a60897322b6f423e46" + integrity sha1-GlYFSy+daWKYzmamCJcyK29CPkY= + dependencies: + to-space-case "^1.0.0" + +to-function@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/to-function/-/to-function-2.0.6.tgz#7d56cd9c3b92fa8dbd7b22e83d51924de740ebc5" + integrity sha1-fVbNnDuS+o29eyLoPVGSTedA68U= + dependencies: + component-props "*" + +to-no-case@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-0.1.3.tgz#f761b1ea1931680967b79886a3303106d966e061" + integrity sha1-92Gx6hkxaAlnt5iGozAxBtlm4GE= + +to-no-case@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-no-case/-/to-no-case-1.0.2.tgz#c722907164ef6b178132c8e69930212d1b4aa16a" + integrity sha1-xyKQcWTvaxeBMsjmmTAhLRtKoWo= + +to-space-case@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-space-case/-/to-space-case-1.0.0.tgz#b052daafb1b2b29dc770cea0163e5ec0ebc9fc17" + integrity sha1-sFLar7Gysp3HcM6gFj5ewOvJ/Bc= + dependencies: + to-no-case "^1.0.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= + +trim@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" + integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0= + +type-component@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/type-component/-/type-component-0.0.1.tgz#952a6c81c21efd24d13d811d0c8498cb860e1956" + integrity sha1-lSpsgcIe/STRPYEdDISYy4YOGVY= + +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" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0"