diff --git a/.github/workflows/prepare_raven_release.yml b/.github/workflows/prepare_raven_release.yml deleted file mode 100644 index 871401fcf..000000000 --- a/.github/workflows/prepare_raven_release.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Prepare Raven Release -on: - workflow_dispatch: - inputs: - version: - description: Version to release - required: true - force: - description: Force a release even when there are release-blockers (optional) - required: false -jobs: - release: - runs-on: ubuntu-latest - name: "Release a new version" - steps: - - name: Get auth token - id: token - uses: actions/create-github-app-token@5d869da34e18e7287c1daad50e0b8ea0f506ce69 # v1.11.0 - with: - app-id: ${{ vars.SENTRY_RELEASE_BOT_CLIENT_ID }} - private-key: ${{ secrets.SENTRY_RELEASE_BOT_PRIVATE_KEY }} - - uses: actions/checkout@v4 - with: - token: ${{ steps.token.outputs.token }} - fetch-depth: 0 - - name: Prepare release - uses: getsentry/action-prepare-release@v1 - env: - GITHUB_TOKEN: ${{ steps.token.outputs.token }} - with: - path: sentry-raven - version: ${{ github.event.inputs.version }} - force: ${{ github.event.inputs.force }} diff --git a/.github/workflows/sentry_rails_test.yml b/.github/workflows/sentry_rails_test.yml index 3084ff8e4..30d9ea4da 100644 --- a/.github/workflows/sentry_rails_test.yml +++ b/.github/workflows/sentry_rails_test.yml @@ -31,36 +31,6 @@ jobs: ruby_version: ${{ fromJson(inputs.versions) }} rails_version: [6.1.0, 7.0.0, 7.1.0] include: - - ruby_version: "2.4" - rails_version: 5.0.0 - - ruby_version: "2.4" - rails_version: 5.1.0 - - ruby_version: "2.4" - rails_version: 5.2.0 - - ruby_version: "2.5" - rails_version: 5.0.0 - - ruby_version: "2.5" - rails_version: 5.1.0 - - ruby_version: "2.5" - rails_version: 5.2.0 - - ruby_version: "2.5" - rails_version: 6.0.0 - - ruby_version: "2.5" - rails_version: 6.1.0 - - ruby_version: "2.6" - rails_version: 5.0.0 - - ruby_version: "2.6" - rails_version: 5.1.0 - - ruby_version: "2.6" - rails_version: 5.2.0 - - ruby_version: "2.6" - rails_version: 6.0.0 - - ruby_version: "2.6" - rails_version: 6.1.0 - - ruby_version: "2.7" - rails_version: 5.0.0 - - ruby_version: "2.7" - rails_version: 5.1.0 - ruby_version: "2.7" rails_version: 5.2.0 - ruby_version: "2.7" diff --git a/.github/workflows/sentry_raven_test.yml b/.github/workflows/sentry_raven_test.yml deleted file mode 100644 index 5e9cff21a..000000000 --- a/.github/workflows/sentry_raven_test.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: sentry-raven Test - -on: - workflow_dispatch: - push: - branches: - - master - pull_request: - paths: - - "sentry-raven/**" - - ".github/workflows/sentry_raven_test.yml" -# Cancel in progress workflows on pull_requests. -# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value -concurrency: - group: sentry-raven-test-${{ github.head_ref || github.run_id }} - cancel-in-progress: true -jobs: - test: - defaults: - run: - working-directory: sentry-raven - name: Test on ruby ${{ matrix.ruby_version }} and rails ${{ matrix.rails_version }} - runs-on: ubuntu-latest - strategy: - matrix: - rails_version: [0, 4.2, 5.2, 6.0.0] - ruby_version: [2.3, 2.4, 2.5, 2.6, 2.7, "3.0", jruby-9.3] - include: - - ruby_version: "3.0" - rails_version: 0 - - ruby_version: 2.7 - rails_version: 6.0.0 - env: RUBYOPT="--enable-frozen-string-literal --debug=frozen-string-literal" - exclude: - - ruby_version: 2.3 - rails_version: 6.0.0 - - ruby_version: 2.4 - rails_version: 6.0.0 - - ruby_version: 2.7 - rails_version: 4.2 - - ruby_version: jruby-9.3 - rails_version: 4.2 - - ruby_version: "3.0" - rails_version: 4.2 - - ruby_version: "3.0" - rails_version: 5.2 - - ruby_version: "3.0" - rails_version: 6.0.0 - - steps: - - uses: actions/checkout@v4 - - - name: Set up Ruby ${{ matrix.ruby_version }} - uses: ruby/setup-ruby@v1 - with: - bundler: 1 - ruby-version: ${{ matrix.ruby_version }} - - - name: Start Redis - uses: supercharge/redis-github-action@1.1.0 - with: - redis-version: 5 - - - name: Build with Rails ${{ matrix.rails_version }} - env: - RAILS_VERSION: ${{ matrix.rails_version }} - run: | - bundle install --jobs 4 --retry 3 - bundle exec rake diff --git a/.github/workflows/sentry_sidekiq_test.yml b/.github/workflows/sentry_sidekiq_test.yml index 34904339c..322acbee8 100644 --- a/.github/workflows/sentry_sidekiq_test.yml +++ b/.github/workflows/sentry_sidekiq_test.yml @@ -35,16 +35,6 @@ jobs: ruby_version: ${{ fromJson(inputs.versions) }} sidekiq_version: ["5.0", "6.5", "7.0"] include: - - ruby_version: 2.4 - sidekiq_version: 5.0 - - ruby_version: 2.5 - sidekiq_version: 5.0 - - ruby_version: 2.5 - sidekiq_version: 6.0 - - ruby_version: 2.6 - sidekiq_version: 5.0 - - ruby_version: 2.6 - sidekiq_version: 6.0 - ruby_version: jruby-9.4.12.0 sidekiq_version: 5.0 - ruby_version: jruby-9.4.12.0 diff --git a/.gitignore b/.gitignore index 83704eaa9..f5a971c3b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ Gemfile.lock .idea *.rdb .rgignore +.claude node_modules .vite diff --git a/.rubocop.yml b/.rubocop.yml index 90aa1da71..3ffbe4177 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -15,7 +15,6 @@ Style/RedundantFreeze: AllCops: Exclude: - - "sentry-raven/**/*" - "sentry-*/tmp/**/*" - "sentry-*/examples/**/*" - "sentry-*/spec/versioned/2.7/**/*" diff --git a/.scripts/bump-version.rb b/.scripts/bump-version.rb deleted file mode 100755 index 57a0b6fc2..000000000 --- a/.scripts/bump-version.rb +++ /dev/null @@ -1,20 +0,0 @@ -ref_name = `git branch --show-current` -sdk_name_capture_regex = /release-(sentry-\w+)\/.*/ - -file_name = - if sdk_name_match = ref_name.match(sdk_name_capture_regex) - case sdk_name = sdk_name_match[1] - when "sentry-ruby" - "lib/sentry/version.rb" - else - integration_name = sdk_name.sub("sentry-", "") - "lib/sentry/#{integration_name}/version.rb" - end - else - # old SDK - "lib/raven/version.rb" - end - -text = File.read(file_name) -new_contents = text.gsub(/VERSION = ".*"/, "VERSION = \"#{ARGV[1]}\"") -File.open(file_name, "w") {|file| file.puts new_contents } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6451cefc9..f39b0baa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,56 @@ +## Unreleased (6.0.0) + +### Breaking Changes + +- Drop support for rubies below 2.7 [#2743](https://github.com/getsentry/sentry-ruby/pull/2743) + - Drop support for Rails below 5.2.0 + - Drop support for Sidekiq below 5.0 +- Remove deprecated `config.async` [#1894](https://github.com/getsentry/sentry-ruby/pull/1894) +- Remove deprecated `Sentry::Metrics` and `config.metrics` and all metrics related code ([#2729](https://github.com/getsentry/sentry-ruby/pull/2729)) +- Remove deprecated `config.capture_exception_frame_locals`, use `include_local_variables` instead ([#2730](https://github.com/getsentry/sentry-ruby/pull/2730)) +- Remove deprecated `config.enable_tracing`, use `config.traces_sample_rate = 1.0` instead ([#2731](https://github.com/getsentry/sentry-ruby/pull/2731)) +- Remove deprecated `config.logger=`, use `config.sdk_logger=` instead ([#2732](https://github.com/getsentry/sentry-ruby/pull/2732)) +- `Sentry.logger` now always points to the `StructuredLogger` ([#2752](https://github.com/getsentry/sentry-ruby/pull/2752)) +- Remove deprecated `Sentry::Rails::Tracing::ActionControllerSubscriber` ([#2733](https://github.com/getsentry/sentry-ruby/pull/2733)) +- Remove deprecated `Event#configuration` ([#2740](https://github.com/getsentry/sentry-ruby/pull/2740)) +- Remove deprecated `Sentry::Client#generate_sentry_trace` and `Sentry::Client#generate_baggage` ([#2741](https://github.com/getsentry/sentry-ruby/pull/2741)) +- Remove `Transaction` deprecations ([#2736](https://github.com/getsentry/sentry-ruby/pull/2736)) + - Remove deprecated constant `Sentry::Transaction::SENTRY_TRACE_REGEXP`, use `Sentry::PropagationContext::SENTRY_TRACE_REGEXP` instead + - Remove deprecated method `Sentry::Transaction.from_sentry_trace`, use `Sentry.continue_trace` instead + - Remove deprecated method `Sentry::Transaction.extract_sentry_trace`, use `Sentry::PropagationContext.extract_sentry_trace` instead + - Remove deprecated attribute `Sentry::Transaction.configuration` + - Remove deprecated attribute `Sentry::Transaction.hub` + - Remove deprecated argument `hub` to `Sentry::Transaction.finish` + - Remove deprecated argument `hub` to `Sentry::Transaction#initialize` ([#2739](https://github.com/getsentry/sentry-ruby/pull/2739)) +- Remove `:monotonic_active_support_logger` from `config.breadcrumbs_logger` ([#2717](https://github.com/getsentry/sentry-ruby/pull/2717)) +- Migrate from to_hash to to_h ([#2351](https://github.com/getsentry/sentry-ruby/pull/2351)) +- Add `before_send_check_in` for applying to `CheckInEvent` ([#2703](https://github.com/getsentry/sentry-ruby/pull/2703)) +- Returning a hash from `before_send` and `before_send_transaction` is no longer supported and will drop the event. +- Remove stacktrace trimming ([#2714](https://github.com/getsentry/sentry-ruby/pull/2714)) +- `config.enabled_environments` now defaults to `nil` instead of `[]` for sending to all environments ([#2716](https://github.com/getsentry/sentry-ruby/pull/2716)) +- Requests which have response status codes in the inclusive ranges `[(301..303), (305..399), (401..404)]` will no longer create transactions by default. See `config.trace_ignore_status_codes` below to control what gets traced. + +### Features + +- Add `config.trace_ignore_status_codes` to control which response codes to ignore for tracing ([#2725](https://github.com/getsentry/sentry-ruby/pull/2725)) + + You can pass in an Array of individual status codes or ranges of status codes. + + ```ruby + Sentry.init do |config| + # ... + # will ignore 404, 501, 502, 503 + config.trace_ignore_status_codes = [404, (501..503)] + end + ``` +- Add `config.profiles_sample_interval` to control sampling frequency ([#2745](https://github.com/getsentry/sentry-ruby/pull/2745)) + - Both `stackprof` and `vernier` now get sampled at a default frequency of 101 Hz. + +### Internal + +- Archive [`sentry-raven`](https://github.com/getsentry/raven-ruby) ([#2708](https://github.com/getsentry/sentry-ruby/pull/2708)) +- Don't send `sample_rate` client reports for profiles if profiling is disabled ([#2728](https://github.com/getsentry/sentry-ruby/pull/2728)) + ## 5.28.0 ### Features @@ -7,7 +60,7 @@ ### Miscellaneous - Deprecate all Metrics related APIs [#2726](https://github.com/getsentry/sentry-ruby/pull/2726) - + Sentry [no longer has the Metrics Beta offering](https://sentry.zendesk.com/hc/en-us/articles/26369339769883-Metrics-Beta-Ended-on-October-7th) so all the following APIs linked to Metrics have been deprecated and will be removed in the next major. diff --git a/Gemfile.dev b/Gemfile.dev index 4280e09b7..7e0265ba2 100644 --- a/Gemfile.dev +++ b/Gemfile.dev @@ -10,14 +10,9 @@ gem "rake", "~> 12.0" ruby_version = Gem::Version.new(RUBY_VERSION) # Development tools -if ruby_version >= Gem::Version.new("2.7.0") - gem "debug", github: "ruby/debug", platform: :ruby - gem "irb" -end - -if ruby_version >= Gem::Version.new("2.5") - gem "cgi" -end +gem "debug", github: "ruby/debug", platform: :ruby +gem "irb" +gem "cgi" if ruby_version >= Gem::Version.new("3.4") gem "drb" @@ -40,13 +35,8 @@ gem "simplecov" # Do not change it without checking that `CI=true COVERAGE=true bundle exec rake` # passes in all projects -if ruby_version >= Gem::Version.new("2.5") - gem "rexml", "3.4.1" - gem "simplecov-cobertura", "~> 3.0" -else - gem "rexml", "3.2.5" - gem "simplecov-cobertura", "~> 1.4.0" -end +gem "rexml", "3.4.1" +gem "simplecov-cobertura", "~> 3.0" group :rubocop do gem "rubocop-rails-omakase" diff --git a/sentry-delayed_job/Gemfile b/sentry-delayed_job/Gemfile index ff1d677e2..7d0c1550c 100644 --- a/sentry-delayed_job/Gemfile +++ b/sentry-delayed_job/Gemfile @@ -13,7 +13,7 @@ gem "sentry-rails", path: "../sentry-rails" gem "delayed_job" gem "delayed_job_active_record" -gem "rails", "> 5.0.0" +gem "rails", "> 5.2.0" platform :jruby do gem "activerecord-jdbcmysql-adapter" @@ -22,9 +22,7 @@ end ruby_version = Gem::Version.new(RUBY_VERSION) -if ruby_version < Gem::Version.new("2.5.0") - gem "sqlite3", "~> 1.3.0", platform: :ruby -elsif ruby_version < Gem::Version.new("3.0.0") +if ruby_version < Gem::Version.new("3.0.0") gem "sqlite3", "~> 1.6.0", platform: :ruby elsif ruby_version >= Gem::Version.new("3.0.0") && ruby_version < Gem::Version.new("3.1.0") gem "sqlite3", "~> 1.7.0", platform: :ruby diff --git a/sentry-delayed_job/example/Gemfile b/sentry-delayed_job/example/Gemfile deleted file mode 100644 index d138c16d5..000000000 --- a/sentry-delayed_job/example/Gemfile +++ /dev/null @@ -1,12 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "rails" -gem "sqlite3" -gem "delayed_job" -gem 'delayed_job_active_record' -gem "sentry-delayed_job", path: "../" -gem "sentry-ruby", path: "../../sentry-ruby" - -gem "debug", github: "ruby/debug" diff --git a/sentry-delayed_job/example/app.rb b/sentry-delayed_job/example/app.rb deleted file mode 100644 index 04f391468..000000000 --- a/sentry-delayed_job/example/app.rb +++ /dev/null @@ -1,67 +0,0 @@ -# frozen_string_literal: true - -require "active_job" -require "active_record" -require "delayed_job" -require "delayed_job_active_record" -require "sentry-delayed_job" -# require "logger" - -# This connection will do for database-independent bug reports. -ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") -# ActiveRecord::Base.logger = Logger.new(STDOUT) - -ActiveRecord::Schema.define do - create_table :delayed_jobs do |table| - table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue - table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually. - table.text :handler, null: false # YAML-encoded string of the object that will do work - table.text :last_error # reason for last failure (See Note below) - table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. - table.datetime :locked_at # Set when a client is working on this object - table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) - table.string :locked_by # Who is working on this object (if locked) - table.string :queue # The name of the queue this job is in - table.timestamps null: true - end -end - -Sentry.init do |config| - config.breadcrumbs_logger = [:sentry_logger] - # replace it with your sentry dsn - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -class MyJob < ActiveJob::Base - self.queue_adapter = :delayed_job - - def perform - raise "foo" - end -end - -MyJob.perform_later - -enqueued_job = Delayed::Backend::ActiveRecord::Job.last - -begin - enqueued_job.invoke_job -rescue => e - puts("active job failed because of \"#{e.message}\"") -end - -class Foo - def bar - 1 / 0 - end -end - -Foo.new.delay.bar - -enqueued_job = Delayed::Backend::ActiveRecord::Job.last - -begin - enqueued_job.invoke_job -rescue => e - puts("inline job failed because of \"#{e.message}\"") -end diff --git a/sentry-delayed_job/sentry-delayed_job.gemspec b/sentry-delayed_job/sentry-delayed_job.gemspec index dfb14e7f0..9078a0dec 100644 --- a/sentry-delayed_job/sentry-delayed_job.gemspec +++ b/sentry-delayed_job/sentry-delayed_job.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") diff --git a/sentry-delayed_job/spec/sentry/delayed_job_spec.rb b/sentry-delayed_job/spec/sentry/delayed_job_spec.rb index 24a1de77d..4d4febe58 100644 --- a/sentry-delayed_job/spec/sentry/delayed_job_spec.rb +++ b/sentry-delayed_job/spec/sentry/delayed_job_spec.rb @@ -46,7 +46,7 @@ def do_nothing_with_args(a) enqueued_job.invoke_job expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("report") expect(event[:contexts][:"Delayed-Job"][:id]).to eq(enqueued_job.id.to_s) expect(event[:tags]).to eq({ "delayed_job.id" => enqueued_job.id.to_s, "delayed_job.queue" => nil }) @@ -68,7 +68,7 @@ def do_nothing_with_args(a) enqueued_job.invoke_job expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("tagged report") expect(event[:tags]).to eq({ "delayed_job.id" => enqueued_job.id.to_s, "delayed_job.queue" => nil, number: 1 }) @@ -77,7 +77,7 @@ def do_nothing_with_args(a) enqueued_job.invoke_job expect(transport.events.count).to eq(2) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "delayed_job.id" => enqueued_job.id.to_s, "delayed_job.queue" => nil }) end @@ -93,7 +93,7 @@ def do_nothing_with_args(a) end.to raise_error(ZeroDivisionError) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.delayed_job", version: described_class::VERSION }) expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") @@ -109,7 +109,7 @@ def do_nothing_with_args(a) end.to raise_error(RuntimeError) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "delayed_job.id" => enqueued_job.id.to_s, "delayed_job.queue" => nil, number: 1 }) expect(Sentry.get_current_scope.extra).to eq({}) @@ -123,7 +123,7 @@ def do_nothing_with_args(a) end.to raise_error(ZeroDivisionError) expect(transport.events.count).to eq(2) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "delayed_job.id" => enqueued_job.id.to_s, "delayed_job.queue" => nil }) expect(Sentry.get_current_scope.extra).to eq({}) expect(Sentry.get_current_scope.tags).to eq({}) @@ -228,7 +228,7 @@ def perform it "injects ActiveJob information to the event" do expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("report from ActiveJob") expect(event[:tags]).to match({ "delayed_job.id" => anything, "delayed_job.queue" => "default", number: 1 }) expect(event[:contexts][:"Active-Job"][:job_class]).to eq("ReportingJob") @@ -255,7 +255,7 @@ def perform it "injects ActiveJob information to the event" do expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") expect(event[:tags]).to match({ "delayed_job.id" => anything, "delayed_job.queue" => "default", number: 2 }) expect(event[:contexts][:"Active-Job"][:job_class]).to eq("FailedJob") diff --git a/sentry-opentelemetry/lib/sentry/opentelemetry/propagator.rb b/sentry-opentelemetry/lib/sentry/opentelemetry/propagator.rb index 51045e209..c43002ca7 100644 --- a/sentry-opentelemetry/lib/sentry/opentelemetry/propagator.rb +++ b/sentry-opentelemetry/lib/sentry/opentelemetry/propagator.rb @@ -34,7 +34,7 @@ def extract( sentry_trace = getter.get(carrier, SENTRY_TRACE_HEADER_NAME) return context unless sentry_trace - sentry_trace_data = Transaction.extract_sentry_trace(sentry_trace) + sentry_trace_data = PropagationContext.extract_sentry_trace(sentry_trace) return context unless sentry_trace_data context = context.set_value(SENTRY_TRACE_KEY, sentry_trace_data) diff --git a/sentry-opentelemetry/sentry-opentelemetry.gemspec b/sentry-opentelemetry/sentry-opentelemetry.gemspec index 180d20557..70922f4e6 100644 --- a/sentry-opentelemetry/sentry-opentelemetry.gemspec +++ b/sentry-opentelemetry/sentry-opentelemetry.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") diff --git a/sentry-rails/Gemfile b/sentry-rails/Gemfile index 8e94076b7..b4059bf4f 100644 --- a/sentry-rails/Gemfile +++ b/sentry-rails/Gemfile @@ -21,10 +21,8 @@ rails_version = ENV.fetch("RAILS_VERSION") do "8.0" elsif ruby_version >= Gem::Version.new("3.1") "7.2" - elsif ruby_version >= Gem::Version.new("2.7") + else "7.1" - elsif ruby_version >= Gem::Version.new("2.4") - "5.2" end end @@ -42,11 +40,7 @@ elsif rails_version >= Gem::Version.new("7.1.0") elsif rails_version >= Gem::Version.new("6.1.0") gem "rspec-rails", "~> 4.0" - if ruby_version >= Gem::Version.new("2.7.0") - gem "sqlite3", "~> 1.7.3", platform: :ruby - else - gem "sqlite3", "~> 1.6.9", platform: :ruby - end + gem "sqlite3", "~> 1.7.3", platform: :ruby else gem "psych", "~> 3.0.0" gem "rspec-rails", "~> 4.0" @@ -58,12 +52,6 @@ else end end -if ruby_version < Gem::Version.new("2.5.0") - # https://github.com/flavorjones/loofah/pull/267 - # loofah changed the required ruby version in a patch so we need to explicitly pin it - gem "loofah", "2.20.0" -end - gem "mini_magick" gem "sprockets-rails" diff --git a/sentry-rails/benchmarks/allocation_comparison.rb b/sentry-rails/benchmarks/allocation_comparison.rb index 15b1e3c4a..4e96eda35 100644 --- a/sentry-rails/benchmarks/allocation_comparison.rb +++ b/sentry-rails/benchmarks/allocation_comparison.rb @@ -11,7 +11,7 @@ end app = create_app do |config| - config.logger = ::Logger.new(STDOUT) + config.sdk_logger = ::Logger.new(STDOUT) config.transport.transport_class = Sentry::BenchmarkTransport config.breadcrumbs_logger = [:active_support_logger] end diff --git a/sentry-rails/benchmarks/allocation_report.rb b/sentry-rails/benchmarks/allocation_report.rb index 9bc691a26..6e0bc1d02 100644 --- a/sentry-rails/benchmarks/allocation_report.rb +++ b/sentry-rails/benchmarks/allocation_report.rb @@ -11,7 +11,7 @@ end app = create_app do |config| - config.logger = ::Logger.new(STDOUT) + config.sdk_logger = ::Logger.new(STDOUT) config.transport.transport_class = Sentry::BenchmarkTransport config.breadcrumbs_logger = [:active_support_logger] end diff --git a/sentry-rails/examples/minimum-rails/app.rb b/sentry-rails/examples/minimum-rails/app.rb deleted file mode 100644 index e100e5395..000000000 --- a/sentry-rails/examples/minimum-rails/app.rb +++ /dev/null @@ -1,66 +0,0 @@ -require "bundler/inline" - -gemfile(true) do - source 'https://rubygems.org' - git_source(:github) { |repo| "https://github.com/#{repo}.git" } - - ruby '> 2.6' - gem 'sentry-rails', path: "../../" - gem 'railties', '~> 6.0.0' -end - -require "action_view/railtie" -require "action_controller/railtie" -require 'sentry-rails' - -Sentry.init do |config| - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.logger = Logger.new($stdout) -end - -ActiveSupport::Deprecation.silenced = true - -class TestApp < Rails::Application -end - -class TestController < ActionController::Base - include Rails.application.routes.url_helpers - - def exception - raise "foo" - end -end - -def app - return @app if @app - - app = Class.new(TestApp) do - def self.name - "RailsTestApp" - end - end - - app.config.root = __dir__ - app.config.hosts = nil - app.config.consider_all_requests_local = false - - app.config.logger = Logger.new($stdout) - app.config.log_level = :debug - Rails.logger = app.config.logger - - app.routes.append do - get "/exception" => "test#exception" - end - - app.initialize! - Rails.application = app - @app = app - app -end - -require "rack/test" -include Rack::Test::Methods - -get "/exception" - -sleep(2) # wait for the background_worker diff --git a/sentry-rails/examples/rails-5.2/.gitignore b/sentry-rails/examples/rails-5.2/.gitignore deleted file mode 100644 index bab620de0..000000000 --- a/sentry-rails/examples/rails-5.2/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile '~/.gitignore_global' - -# Ignore bundler config. -/.bundle - -# Ignore the default SQLite database. -/db/*.sqlite3 -/db/*.sqlite3-journal - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore Byebug command history file. -.byebug_history diff --git a/sentry-rails/examples/rails-5.2/Gemfile b/sentry-rails/examples/rails-5.2/Gemfile deleted file mode 100644 index 2c0bc5bee..000000000 --- a/sentry-rails/examples/rails-5.2/Gemfile +++ /dev/null @@ -1,47 +0,0 @@ -source 'https://rubygems.org' - - -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 5.2.0' -# Use sqlite3 as the database for Active Record -gem 'sqlite3' -# Use Puma as the app server -gem 'puma', '~> 3.0' -# Use SCSS for stylesheets -gem 'sass-rails', '~> 5.0' -# Use Uglifier as compressor for JavaScript assets -gem 'uglifier', '>= 1.3.0' -# Use CoffeeScript for .coffee assets and views -gem 'coffee-rails', '~> 4.2' -# See https://github.com/rails/execjs#readme for more supported runtimes -# gem 'therubyracer', platforms: :ruby -gem 'sentry-rails', path: "../../" -gem "sentry-ruby", path: "../../../" - -# Use jquery as the JavaScript library -gem 'jquery-rails' -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.5' -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 3.0' -# Use ActiveModel has_secure_password -# gem 'bcrypt', '~> 3.1.7' - -# Use Capistrano for deployment -# gem 'capistrano-rails', group: :development - -group :development, :test do - # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platform: :mri -end - -group :development do - # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. - gem 'web-console' - gem 'listen', '~> 3.0.5' -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/sentry-rails/examples/rails-5.2/README.md b/sentry-rails/examples/rails-5.2/README.md deleted file mode 100644 index 7db80e4ca..000000000 --- a/sentry-rails/examples/rails-5.2/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# README - -This README would normally document whatever steps are necessary to get the -application up and running. - -Things you may want to cover: - -* Ruby version - -* System dependencies - -* Configuration - -* Database creation - -* Database initialization - -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions - -* ... diff --git a/sentry-rails/examples/rails-5.2/Rakefile b/sentry-rails/examples/rails-5.2/Rakefile deleted file mode 100644 index e85f91391..000000000 --- a/sentry-rails/examples/rails-5.2/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require_relative 'config/application' - -Rails.application.load_tasks diff --git a/sentry-rails/examples/rails-5.2/app/assets/javascripts/posts.coffee b/sentry-rails/examples/rails-5.2/app/assets/javascripts/posts.coffee deleted file mode 100644 index 24f83d18b..000000000 --- a/sentry-rails/examples/rails-5.2/app/assets/javascripts/posts.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/sentry-rails/examples/rails-5.2/app/assets/stylesheets/posts.scss b/sentry-rails/examples/rails-5.2/app/assets/stylesheets/posts.scss deleted file mode 100644 index 1a7e15390..000000000 --- a/sentry-rails/examples/rails-5.2/app/assets/stylesheets/posts.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the posts controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/sentry-rails/examples/rails-5.2/app/assets/stylesheets/scaffolds.scss b/sentry-rails/examples/rails-5.2/app/assets/stylesheets/scaffolds.scss deleted file mode 100644 index 604518803..000000000 --- a/sentry-rails/examples/rails-5.2/app/assets/stylesheets/scaffolds.scss +++ /dev/null @@ -1,84 +0,0 @@ -body { - background-color: #fff; - color: #333; - margin: 33px; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, ol, ul, td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #eee; - padding: 10px; - font-size: 11px; -} - -a { - color: #000; - - &:visited { - color: #666; - } - - &:hover { - color: #fff; - background-color: #000; - } -} - -th { - padding-bottom: 5px; -} - -td { - padding: 0 5px 7px; -} - -div { - &.field, &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - padding: 2px; - background-color: red; - display: table; -} - -#error_explanation { - width: 450px; - border: 2px solid red; - padding: 7px 7px 0; - margin-bottom: 20px; - background-color: #f0f0f0; - - h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px -7px 0; - background-color: #c00; - color: #fff; - } - - ul li { - font-size: 12px; - list-style: square; - } -} - -label { - display: block; -} diff --git a/sentry-rails/examples/rails-5.2/app/channels/application_cable/channel.rb b/sentry-rails/examples/rails-5.2/app/channels/application_cable/channel.rb deleted file mode 100644 index d67269728..000000000 --- a/sentry-rails/examples/rails-5.2/app/channels/application_cable/channel.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Channel < ActionCable::Channel::Base - end -end diff --git a/sentry-rails/examples/rails-5.2/app/channels/application_cable/connection.rb b/sentry-rails/examples/rails-5.2/app/channels/application_cable/connection.rb deleted file mode 100644 index 0ff5442f4..000000000 --- a/sentry-rails/examples/rails-5.2/app/channels/application_cable/connection.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Connection < ActionCable::Connection::Base - end -end diff --git a/sentry-rails/examples/rails-5.2/app/controllers/application_controller.rb b/sentry-rails/examples/rails-5.2/app/controllers/application_controller.rb deleted file mode 100644 index 1c07694e9..000000000 --- a/sentry-rails/examples/rails-5.2/app/controllers/application_controller.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationController < ActionController::Base - protect_from_forgery with: :exception -end diff --git a/sentry-rails/examples/rails-5.2/app/controllers/concerns/.keep b/sentry-rails/examples/rails-5.2/app/controllers/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-5.2/app/controllers/posts_controller.rb b/sentry-rails/examples/rails-5.2/app/controllers/posts_controller.rb deleted file mode 100644 index 1e1e11ccf..000000000 --- a/sentry-rails/examples/rails-5.2/app/controllers/posts_controller.rb +++ /dev/null @@ -1,74 +0,0 @@ -class PostsController < ApplicationController - before_action :set_post, only: [:show, :edit, :update, :destroy] - - # GET /posts - # GET /posts.json - def index - @posts = Post.all - end - - # GET /posts/1 - # GET /posts/1.json - def show - end - - # GET /posts/new - def new - @post = Post.new - end - - # GET /posts/1/edit - def edit - end - - # POST /posts - # POST /posts.json - def create - @post = Post.new(post_params) - - respond_to do |format| - if @post.save - format.html { redirect_to @post, notice: 'Post was successfully created.' } - format.json { render :show, status: :created, location: @post } - else - format.html { render :new } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # PATCH/PUT /posts/1 - # PATCH/PUT /posts/1.json - def update - respond_to do |format| - if @post.update(post_params) - format.html { redirect_to @post, notice: 'Post was successfully updated.' } - format.json { render :show, status: :ok, location: @post } - else - format.html { render :edit } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # DELETE /posts/1 - # DELETE /posts/1.json - def destroy - @post.destroy - respond_to do |format| - format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } - format.json { head :no_content } - end - end - - private - # Use callbacks to share common setup or constraints between actions. - def set_post - @post = Post.find(params[:id]) - end - - # Only allow a list of trusted parameters through. - def post_params - params.require(:post).permit(:title, :content) - end -end diff --git a/sentry-rails/examples/rails-5.2/app/controllers/welcome_controller.rb b/sentry-rails/examples/rails-5.2/app/controllers/welcome_controller.rb deleted file mode 100644 index ee536baae..000000000 --- a/sentry-rails/examples/rails-5.2/app/controllers/welcome_controller.rb +++ /dev/null @@ -1,9 +0,0 @@ -class WelcomeController < ApplicationController - def index - 1 / 0 - end - - def report_demo - render(status: 500) - end -end diff --git a/sentry-rails/examples/rails-5.2/app/helpers/posts_helper.rb b/sentry-rails/examples/rails-5.2/app/helpers/posts_helper.rb deleted file mode 100644 index a7b8cec89..000000000 --- a/sentry-rails/examples/rails-5.2/app/helpers/posts_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module PostsHelper -end diff --git a/sentry-rails/examples/rails-5.2/app/jobs/application_job.rb b/sentry-rails/examples/rails-5.2/app/jobs/application_job.rb deleted file mode 100644 index a009ace51..000000000 --- a/sentry-rails/examples/rails-5.2/app/jobs/application_job.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ApplicationJob < ActiveJob::Base -end diff --git a/sentry-rails/examples/rails-5.2/app/models/application_record.rb b/sentry-rails/examples/rails-5.2/app/models/application_record.rb deleted file mode 100644 index 10a4cba84..000000000 --- a/sentry-rails/examples/rails-5.2/app/models/application_record.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true -end diff --git a/sentry-rails/examples/rails-5.2/app/models/concerns/.keep b/sentry-rails/examples/rails-5.2/app/models/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-5.2/app/models/post.rb b/sentry-rails/examples/rails-5.2/app/models/post.rb deleted file mode 100644 index b2a8b4630..000000000 --- a/sentry-rails/examples/rails-5.2/app/models/post.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Post < ApplicationRecord -end diff --git a/sentry-rails/examples/rails-5.2/app/views/layouts/application.html.erb b/sentry-rails/examples/rails-5.2/app/views/layouts/application.html.erb deleted file mode 100644 index 9336e290a..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/layouts/application.html.erb +++ /dev/null @@ -1,20 +0,0 @@ - - - - Rails50 - <%= csrf_meta_tags %> - - - - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.html.erb b/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.html.erb deleted file mode 100644 index cbd34d2e9..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.text.erb b/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.text.erb deleted file mode 100644 index 37f0bddbd..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/layouts/mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/_form.html.erb b/sentry-rails/examples/rails-5.2/app/views/posts/_form.html.erb deleted file mode 100644 index 43b94f1e6..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/_form.html.erb +++ /dev/null @@ -1,27 +0,0 @@ -<%= form_with(model: post, local: true) do |form| %> - <% if post.errors.any? %> -
-

<%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:

- - -
- <% end %> - -
- <%= form.label :title %> - <%= form.text_field :title %> -
- -
- <%= form.label :content %> - <%= form.text_area :content %> -
- -
- <%= form.submit %> -
-<% end %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/_post.json.jbuilder b/sentry-rails/examples/rails-5.2/app/views/posts/_post.json.jbuilder deleted file mode 100644 index bdfe92fd2..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/_post.json.jbuilder +++ /dev/null @@ -1,2 +0,0 @@ -json.extract! post, :id, :title, :content, :created_at, :updated_at -json.url post_url(post, format: :json) diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/edit.html.erb b/sentry-rails/examples/rails-5.2/app/views/posts/edit.html.erb deleted file mode 100644 index ded33f77a..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/edit.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -

Editing Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Show', @post %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/index.html.erb b/sentry-rails/examples/rails-5.2/app/views/posts/index.html.erb deleted file mode 100644 index ad63fbf79..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/index.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -

<%= notice %>

- -

Posts

- - - - - - - - - - - - <% @posts.each do |post| %> - - - - - - - - <% end %> - -
TitleContent
<%= post.title %><%= post.content %><%= link_to 'Show', post %><%= link_to 'Edit', edit_post_path(post) %><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>
- -
- -<%= link_to 'New Post', new_post_path %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/index.json.jbuilder b/sentry-rails/examples/rails-5.2/app/views/posts/index.json.jbuilder deleted file mode 100644 index a3c6f4a0b..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/index.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.array! @posts, partial: "posts/post", as: :post diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/new.html.erb b/sentry-rails/examples/rails-5.2/app/views/posts/new.html.erb deleted file mode 100644 index fb1e2a128..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/new.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

New Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/show.html.erb b/sentry-rails/examples/rails-5.2/app/views/posts/show.html.erb deleted file mode 100644 index e03ead584..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/show.html.erb +++ /dev/null @@ -1,14 +0,0 @@ -

<%= notice %>

- -

- Title: - <%= @post.title %> -

- -

- Content: - <%= @post.content %> -

- -<%= link_to 'Edit', edit_post_path(@post) %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-5.2/app/views/posts/show.json.jbuilder b/sentry-rails/examples/rails-5.2/app/views/posts/show.json.jbuilder deleted file mode 100644 index 52744820e..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/posts/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! "posts/post", post: @post diff --git a/sentry-rails/examples/rails-5.2/app/views/welcome/report_demo.html.erb b/sentry-rails/examples/rails-5.2/app/views/welcome/report_demo.html.erb deleted file mode 100644 index 4a9c19cb8..000000000 --- a/sentry-rails/examples/rails-5.2/app/views/welcome/report_demo.html.erb +++ /dev/null @@ -1,22 +0,0 @@ - - - - Internal Server Error - - - -

Internal Server Error

- -

='(

- - <% if @sentry_event_id %> - - <% end %> - - - diff --git a/sentry-rails/examples/rails-5.2/bin/bundle b/sentry-rails/examples/rails-5.2/bin/bundle deleted file mode 100755 index 66e9889e8..000000000 --- a/sentry-rails/examples/rails-5.2/bin/bundle +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) -load Gem.bin_path('bundler', 'bundle') diff --git a/sentry-rails/examples/rails-5.2/bin/rails b/sentry-rails/examples/rails-5.2/bin/rails deleted file mode 100755 index 5badb2fde..000000000 --- a/sentry-rails/examples/rails-5.2/bin/rails +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/sentry-rails/examples/rails-5.2/bin/rake b/sentry-rails/examples/rails-5.2/bin/rake deleted file mode 100755 index d87d5f578..000000000 --- a/sentry-rails/examples/rails-5.2/bin/rake +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/sentry-rails/examples/rails-5.2/bin/setup b/sentry-rails/examples/rails-5.2/bin/setup deleted file mode 100755 index e620b4dad..000000000 --- a/sentry-rails/examples/rails-5.2/bin/setup +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env ruby -require 'pathname' -require 'fileutils' -include FileUtils - -# path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -chdir APP_ROOT do - # This script is a starting point to setup your application. - # Add necessary setup steps to this file. - - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - # puts "\n== Copying sample files ==" - # unless File.exist?('config/database.yml') - # cp 'config/database.yml.sample', 'config/database.yml' - # end - - puts "\n== Preparing database ==" - system! 'bin/rails db:setup' - - puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' - - puts "\n== Restarting application server ==" - system! 'bin/rails restart' -end diff --git a/sentry-rails/examples/rails-5.2/bin/spring b/sentry-rails/examples/rails-5.2/bin/spring deleted file mode 100755 index 7fe232c3a..000000000 --- a/sentry-rails/examples/rails-5.2/bin/spring +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require 'rubygems' - require 'bundler' - - if (match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)) - Gem.paths = { 'GEM_PATH' => [Bundler.bundle_path.to_s, *Gem.path].uniq.join(Gem.path_separator) } - gem 'spring', match[1] - require 'spring/binstub' - end -end diff --git a/sentry-rails/examples/rails-5.2/bin/update b/sentry-rails/examples/rails-5.2/bin/update deleted file mode 100755 index a8e4462f2..000000000 --- a/sentry-rails/examples/rails-5.2/bin/update +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env ruby -require 'pathname' -require 'fileutils' -include FileUtils - -# path to your application root. -APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -chdir APP_ROOT do - # This script is a way to update your development environment automatically. - # Add necessary update steps to this file. - - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - puts "\n== Updating database ==" - system! 'bin/rails db:migrate' - - puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' - - puts "\n== Restarting application server ==" - system! 'bin/rails restart' -end diff --git a/sentry-rails/examples/rails-5.2/config.ru b/sentry-rails/examples/rails-5.2/config.ru deleted file mode 100644 index f7ba0b527..000000000 --- a/sentry-rails/examples/rails-5.2/config.ru +++ /dev/null @@ -1,5 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require_relative 'config/environment' - -run Rails.application diff --git a/sentry-rails/examples/rails-5.2/config/application.rb b/sentry-rails/examples/rails-5.2/config/application.rb deleted file mode 100644 index 9d93dfb8b..000000000 --- a/sentry-rails/examples/rails-5.2/config/application.rb +++ /dev/null @@ -1,18 +0,0 @@ -require_relative 'boot' - -require 'rails/all' - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) - -module Rails50 - class Application < Rails::Application - # https://github.com/getsentry/raven-ruby/issues/494 - config.exceptions_app = self.routes - - # With this enabled 'exceptions_app' isnt executed, so instead we - # set ``config.consider_all_requests_local = false`` in development. - # config.action_dispatch.show_exceptions = false - end -end diff --git a/sentry-rails/examples/rails-5.2/config/boot.rb b/sentry-rails/examples/rails-5.2/config/boot.rb deleted file mode 100644 index 30f5120df..000000000 --- a/sentry-rails/examples/rails-5.2/config/boot.rb +++ /dev/null @@ -1,3 +0,0 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/sentry-rails/examples/rails-5.2/config/cable.yml b/sentry-rails/examples/rails-5.2/config/cable.yml deleted file mode 100644 index 0bbde6f74..000000000 --- a/sentry-rails/examples/rails-5.2/config/cable.yml +++ /dev/null @@ -1,9 +0,0 @@ -development: - adapter: async - -test: - adapter: async - -production: - adapter: redis - url: redis://localhost:6379/1 diff --git a/sentry-rails/examples/rails-5.2/config/database.yml b/sentry-rails/examples/rails-5.2/config/database.yml deleted file mode 100644 index 1c1a37ca8..000000000 --- a/sentry-rails/examples/rails-5.2/config/database.yml +++ /dev/null @@ -1,25 +0,0 @@ -# SQLite version 3.x -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem 'sqlite3' -# -default: &default - adapter: sqlite3 - pool: 5 - timeout: 5000 - -development: - <<: *default - database: db/development.sqlite3 - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: db/test.sqlite3 - -production: - <<: *default - database: db/production.sqlite3 diff --git a/sentry-rails/examples/rails-5.2/config/environment.rb b/sentry-rails/examples/rails-5.2/config/environment.rb deleted file mode 100644 index 426333bb4..000000000 --- a/sentry-rails/examples/rails-5.2/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the Rails application. -require_relative 'application' - -# Initialize the Rails application. -Rails.application.initialize! diff --git a/sentry-rails/examples/rails-5.2/config/environments/development.rb b/sentry-rails/examples/rails-5.2/config/environments/development.rb deleted file mode 100644 index b7aa1e711..000000000 --- a/sentry-rails/examples/rails-5.2/config/environments/development.rb +++ /dev/null @@ -1,51 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Enable/disable caching. By default caching is disabled. - if Rails.root.join('tmp/caching-dev.txt').exist? - config.action_controller.perform_caching = true - - config.cache_store = :memory_store - config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=172800' - } - else - config.action_controller.perform_caching = false - - config.cache_store = :null_store - end - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - config.action_mailer.perform_caching = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true - - # Suppress logger output for asset requests. - config.assets.quiet = true - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true - - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - config.file_watcher = ActiveSupport::EventedFileUpdateChecker -end diff --git a/sentry-rails/examples/rails-5.2/config/environments/production.rb b/sentry-rails/examples/rails-5.2/config/environments/production.rb deleted file mode 100644 index ce3c78f7e..000000000 --- a/sentry-rails/examples/rails-5.2/config/environments/production.rb +++ /dev/null @@ -1,86 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - - # Compress JavaScripts and CSS. - config.assets.js_compressor = :uglifier - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false - - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - - # Mount Action Cable outside main process or domain - # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug - - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Use a real queuing backend for Active Job (and separate queues per environment) - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "rails-5_0_#{Rails.env}" - config.action_mailer.perform_caching = false - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false -end diff --git a/sentry-rails/examples/rails-5.2/config/environments/test.rb b/sentry-rails/examples/rails-5.2/config/environments/test.rb deleted file mode 100644 index 30587ef6d..000000000 --- a/sentry-rails/examples/rails-5.2/config/environments/test.rb +++ /dev/null @@ -1,42 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # The test environment is used exclusively to run your application's - # test suite. You never need to work with it otherwise. Remember that - # your test database is "scratch space" for the test suite and is wiped - # and recreated between test runs. Don't rely on the data there! - config.cache_classes = true - - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false - - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - 'Cache-Control' => 'public, max-age=3600' - } - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false - - # Disable request forgery protection in test environment. - config.action_controller.allow_forgery_protection = false - config.action_mailer.perform_caching = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Print deprecation notices to the stderr. - config.active_support.deprecation = :stderr - - # Raises error for missing translations - # config.action_view.raise_on_missing_translations = true -end diff --git a/sentry-rails/examples/rails-5.2/config/initializers/application_controller_renderer.rb b/sentry-rails/examples/rails-5.2/config/initializers/application_controller_renderer.rb deleted file mode 100644 index 51639b67a..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/application_controller_renderer.rb +++ /dev/null @@ -1,6 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# ApplicationController.renderer.defaults.merge!( -# http_host: 'example.org', -# https: false -# ) diff --git a/sentry-rails/examples/rails-5.2/config/initializers/assets.rb b/sentry-rails/examples/rails-5.2/config/initializers/assets.rb deleted file mode 100644 index 01ef3e663..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/assets.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' - -# Add additional assets to the asset load path -# Rails.application.config.assets.paths << Emoji.images_path - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. -# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/sentry-rails/examples/rails-5.2/config/initializers/backtrace_silencers.rb b/sentry-rails/examples/rails-5.2/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cdf3..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/sentry-rails/examples/rails-5.2/config/initializers/cookies_serializer.rb b/sentry-rails/examples/rails-5.2/config/initializers/cookies_serializer.rb deleted file mode 100644 index 5a6a32d37..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/cookies_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Specify a serializer for the signed and encrypted cookie jars. -# Valid options are :json, :marshal, and :hybrid. -Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/sentry-rails/examples/rails-5.2/config/initializers/filter_parameter_logging.rb b/sentry-rails/examples/rails-5.2/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index 4a994e1e7..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] diff --git a/sentry-rails/examples/rails-5.2/config/initializers/inflections.rb b/sentry-rails/examples/rails-5.2/config/initializers/inflections.rb deleted file mode 100644 index ac033bf9d..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/inflections.rb +++ /dev/null @@ -1,16 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' -# end diff --git a/sentry-rails/examples/rails-5.2/config/initializers/mime_types.rb b/sentry-rails/examples/rails-5.2/config/initializers/mime_types.rb deleted file mode 100644 index dc1899682..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/mime_types.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new mime types for use in respond_to blocks: -# Mime::Type.register "text/richtext", :rtf diff --git a/sentry-rails/examples/rails-5.2/config/initializers/new_framework_defaults.rb b/sentry-rails/examples/rails-5.2/config/initializers/new_framework_defaults.rb deleted file mode 100644 index 9359584fe..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/new_framework_defaults.rb +++ /dev/null @@ -1,21 +0,0 @@ -# Be sure to restart your server when you modify this file. -# -# This file contains migration options to ease your Rails 5.0 upgrade. -# -# Read the Rails 5.0 release notes for more info on each option. - -# Enable per-form CSRF tokens. Previous versions had false. -Rails.application.config.action_controller.per_form_csrf_tokens = true - -# Enable origin-checking CSRF mitigation. Previous versions had false. -Rails.application.config.action_controller.forgery_protection_origin_check = true - -# Make Ruby 2.4 preserve the timezone of the receiver when calling `to_time`. -# Previous versions had false. -ActiveSupport.to_time_preserves_timezone = true - -# Require `belongs_to` associations by default. Previous versions had false. -Rails.application.config.active_record.belongs_to_required_by_default = true - -# Configure SSL options to enable HSTS with subdomains. Previous versions had false. -Rails.application.config.ssl_options = { hsts: { subdomains: true } } diff --git a/sentry-rails/examples/rails-5.2/config/initializers/sentry.rb b/sentry-rails/examples/rails-5.2/config/initializers/sentry.rb deleted file mode 100644 index b764e808a..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/sentry.rb +++ /dev/null @@ -1,7 +0,0 @@ -Sentry.init do |config| - config.breadcrumbs_logger = [:active_support_logger] - config.send_default_pii = true - config.traces_sample_rate = 1.0 # set a float between 0.0 and 1.0 to enable performance monitoring - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.release = `git branch --show-current` -end diff --git a/sentry-rails/examples/rails-5.2/config/initializers/session_store.rb b/sentry-rails/examples/rails-5.2/config/initializers/session_store.rb deleted file mode 100644 index 93864da9d..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/session_store.rb +++ /dev/null @@ -1,3 +0,0 @@ -# Be sure to restart your server when you modify this file. - -Rails.application.config.session_store :cookie_store, key: '_rails-5_0_session' diff --git a/sentry-rails/examples/rails-5.2/config/initializers/wrap_parameters.rb b/sentry-rails/examples/rails-5.2/config/initializers/wrap_parameters.rb deleted file mode 100644 index bbfc3961b..000000000 --- a/sentry-rails/examples/rails-5.2/config/initializers/wrap_parameters.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# This file contains settings for ActionController::ParamsWrapper which -# is enabled by default. - -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. -ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] -end - -# To enable root element in JSON for ActiveRecord objects. -# ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true -# end diff --git a/sentry-rails/examples/rails-5.2/config/locales/en.yml b/sentry-rails/examples/rails-5.2/config/locales/en.yml deleted file mode 100644 index 065395716..000000000 --- a/sentry-rails/examples/rails-5.2/config/locales/en.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Files in the config/locales directory are used for internationalization -# and are automatically loaded by Rails. If you want to use locales other -# than English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t 'hello' -# -# In views, this is aliased to just `t`: -# -# <%= t('hello') %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# To learn more, please read the Rails Internationalization guide -# available at http://guides.rubyonrails.org/i18n.html. - -en: - hello: "Hello world" diff --git a/sentry-rails/examples/rails-5.2/config/puma.rb b/sentry-rails/examples/rails-5.2/config/puma.rb deleted file mode 100644 index c7f311f81..000000000 --- a/sentry-rails/examples/rails-5.2/config/puma.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum, this matches the default thread size of Active Record. -# -threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i -threads threads_count, threads_count - -# Specifies the `port` that Puma will listen on to receive requests, default is 3000. -# -port ENV.fetch("PORT") { 3000 } - -# Specifies the `environment` that Puma will run in. -# -environment ENV.fetch("RAILS_ENV") { "development" } - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked webserver processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. If you use this option -# you need to make sure to reconnect any threads in the `on_worker_boot` -# block. -# -# preload_app! - -# The code in the `on_worker_boot` will be called if you are using -# clustered mode by specifying a number of `workers`. After each worker -# process is booted this block will be run, if you are using `preload_app!` -# option you will want to use this block to reconnect to any threads -# or connections that may have been created at application boot, Ruby -# cannot share connections between processes. -# -# on_worker_boot do -# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) -# end - -# Allow puma to be restarted by `rails restart` command. -plugin :tmp_restart diff --git a/sentry-rails/examples/rails-5.2/config/routes.rb b/sentry-rails/examples/rails-5.2/config/routes.rb deleted file mode 100644 index 5cfe47544..000000000 --- a/sentry-rails/examples/rails-5.2/config/routes.rb +++ /dev/null @@ -1,4 +0,0 @@ -Rails.application.routes.draw do - resources :posts - root to: "welcome#index" -end diff --git a/sentry-rails/examples/rails-5.2/config/secrets.yml b/sentry-rails/examples/rails-5.2/config/secrets.yml deleted file mode 100644 index e3739b59a..000000000 --- a/sentry-rails/examples/rails-5.2/config/secrets.yml +++ /dev/null @@ -1,22 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rails secret` to generate a secure secret key. - -# Make sure the secrets in this file are kept private -# if you're sharing your code publicly. - -development: - secret_key_base: d91733e434c05e6905d6a0db58f91befa539464342558770b43c8acb11959cd3749bb196869a98ac8e82feeb9faafe9d6d92b2462a9e8c0642a1c881f0bbe608 - -test: - secret_key_base: b35e5485b128e991295e7649d4ba0b466d56208414ca842de01e38908a55b53442c33753a02898949883743d68c82bb039ee5adede75a7c9d400b05b76746e47 - -# Do not keep production secrets in the repository, -# instead read values from the environment. -production: - secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/sentry-rails/examples/rails-5.2/db/migrate/20210112160711_create_posts.rb b/sentry-rails/examples/rails-5.2/db/migrate/20210112160711_create_posts.rb deleted file mode 100644 index 50e4fcbac..000000000 --- a/sentry-rails/examples/rails-5.2/db/migrate/20210112160711_create_posts.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreatePosts < ActiveRecord::Migration[5.2] - def change - create_table :posts do |t| - t.string :title - t.text :content - - t.timestamps - end - end -end diff --git a/sentry-rails/examples/rails-5.2/db/schema.rb b/sentry-rails/examples/rails-5.2/db/schema.rb deleted file mode 100644 index 4e215786c..000000000 --- a/sentry-rails/examples/rails-5.2/db/schema.rb +++ /dev/null @@ -1,20 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2021_01_12_160711) do - create_table "posts", force: :cascade do |t| - t.string "title" - t.text "content" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end -end diff --git a/sentry-rails/examples/rails-5.2/db/seeds.rb b/sentry-rails/examples/rails-5.2/db/seeds.rb deleted file mode 100644 index 1beea2acc..000000000 --- a/sentry-rails/examples/rails-5.2/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) diff --git a/sentry-rails/examples/rails-5.2/public/404.html b/sentry-rails/examples/rails-5.2/public/404.html deleted file mode 100644 index b612547fc..000000000 --- a/sentry-rails/examples/rails-5.2/public/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - - -
-
-

The page you were looking for doesn't exist.

-

You may have mistyped the address or the page may have moved.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-5.2/public/422.html b/sentry-rails/examples/rails-5.2/public/422.html deleted file mode 100644 index a21f82b3b..000000000 --- a/sentry-rails/examples/rails-5.2/public/422.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - - -
-
-

The change you wanted was rejected.

-

Maybe you tried to change something you didn't have access to.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-5.2/public/apple-touch-icon-precomposed.png b/sentry-rails/examples/rails-5.2/public/apple-touch-icon-precomposed.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-5.2/public/apple-touch-icon.png b/sentry-rails/examples/rails-5.2/public/apple-touch-icon.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-5.2/public/favicon.ico b/sentry-rails/examples/rails-5.2/public/favicon.ico deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-5.2/public/robots.txt b/sentry-rails/examples/rails-5.2/public/robots.txt deleted file mode 100644 index 3c9c7c01f..000000000 --- a/sentry-rails/examples/rails-5.2/public/robots.txt +++ /dev/null @@ -1,5 +0,0 @@ -# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file -# -# To ban all spiders from the entire site uncomment the next two lines: -# User-agent: * -# Disallow: / diff --git a/sentry-rails/examples/rails-5.2/test/controllers/posts_controller_test.rb b/sentry-rails/examples/rails-5.2/test/controllers/posts_controller_test.rb deleted file mode 100644 index c1b83587f..000000000 --- a/sentry-rails/examples/rails-5.2/test/controllers/posts_controller_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'test_helper' - -class PostsControllerTest < ActionDispatch::IntegrationTest - setup do - @post = posts(:one) - end - - test "should get index" do - get posts_url - assert_response :success - end - - test "should get new" do - get new_post_url - assert_response :success - end - - test "should create post" do - assert_difference('Post.count') do - post posts_url, params: { post: { content: @post.content, title: @post.title } } - end - - assert_redirected_to post_url(Post.last) - end - - test "should show post" do - get post_url(@post) - assert_response :success - end - - test "should get edit" do - get edit_post_url(@post) - assert_response :success - end - - test "should update post" do - patch post_url(@post), params: { post: { content: @post.content, title: @post.title } } - assert_redirected_to post_url(@post) - end - - test "should destroy post" do - assert_difference('Post.count', -1) do - delete post_url(@post) - end - - assert_redirected_to posts_url - end -end diff --git a/sentry-rails/examples/rails-5.2/test/fixtures/posts.yml b/sentry-rails/examples/rails-5.2/test/fixtures/posts.yml deleted file mode 100644 index 19db4509b..000000000 --- a/sentry-rails/examples/rails-5.2/test/fixtures/posts.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - title: MyString - content: MyText - -two: - title: MyString - content: MyText diff --git a/sentry-rails/examples/rails-5.2/test/models/post_test.rb b/sentry-rails/examples/rails-5.2/test/models/post_test.rb deleted file mode 100644 index 6d9d463a7..000000000 --- a/sentry-rails/examples/rails-5.2/test/models/post_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class PostTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/sentry-rails/examples/rails-5.2/test/system/posts_test.rb b/sentry-rails/examples/rails-5.2/test/system/posts_test.rb deleted file mode 100644 index 4cf73670a..000000000 --- a/sentry-rails/examples/rails-5.2/test/system/posts_test.rb +++ /dev/null @@ -1,45 +0,0 @@ -require "application_system_test_case" - -class PostsTest < ApplicationSystemTestCase - setup do - @post = posts(:one) - end - - test "visiting the index" do - visit posts_url - assert_selector "h1", text: "Posts" - end - - test "creating a Post" do - visit posts_url - click_on "New Post" - - fill_in "Content", with: @post.content - fill_in "Title", with: @post.title - click_on "Create Post" - - assert_text "Post was successfully created" - click_on "Back" - end - - test "updating a Post" do - visit posts_url - click_on "Edit", match: :first - - fill_in "Content", with: @post.content - fill_in "Title", with: @post.title - click_on "Update Post" - - assert_text "Post was successfully updated" - click_on "Back" - end - - test "destroying a Post" do - visit posts_url - page.accept_confirm do - click_on "Destroy", match: :first - end - - assert_text "Post was successfully destroyed" - end -end diff --git a/sentry-rails/examples/rails-6.0/.browserslistrc b/sentry-rails/examples/rails-6.0/.browserslistrc deleted file mode 100644 index e94f8140c..000000000 --- a/sentry-rails/examples/rails-6.0/.browserslistrc +++ /dev/null @@ -1 +0,0 @@ -defaults diff --git a/sentry-rails/examples/rails-6.0/.gitignore b/sentry-rails/examples/rails-6.0/.gitignore deleted file mode 100644 index 757f720fa..000000000 --- a/sentry-rails/examples/rails-6.0/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile '~/.gitignore_global' - -# Ignore bundler config. -/.bundle - -# Ignore the default SQLite database. -/db/*.sqlite3 -/db/*.sqlite3-journal - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore uploaded files in development. -/storage/* -!/storage/.keep - -/public/assets -.byebug_history - -# Ignore master key for decrypting credentials and more. -/config/master.key - -/public/packs -/public/packs-test -/node_modules -/yarn-error.log -yarn-debug.log* -.yarn-integrity diff --git a/sentry-rails/examples/rails-6.0/Gemfile b/sentry-rails/examples/rails-6.0/Gemfile deleted file mode 100644 index 2a113d7af..000000000 --- a/sentry-rails/examples/rails-6.0/Gemfile +++ /dev/null @@ -1,56 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '> 2.6' - -# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 6.1.0' -# Use sqlite3 as the database for Active Record -gem 'sqlite3', '~> 1.4' -# Use Puma as the app server -gem 'puma', '5.4.0' -gem 'unicorn' -# Use SCSS for stylesheets -gem 'sass-rails', '~> 5' -# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker -gem 'webpacker', '~> 4.0' -# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks -gem 'turbolinks', '~> 5' -# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.7' -# Use Redis adapter to run Action Cable in production -# gem 'redis', '~> 4.0' -# Use Active Model has_secure_password -# gem 'bcrypt', '~> 3.1.7' - -gem 'image_processing', '~> 1.2' - -gem 'sentry-ruby', path: "../../../sentry-ruby" -gem 'sentry-sidekiq', path: "../../../sentry-sidekiq" -gem 'sentry-resque', path: "../../../sentry-resque" -gem 'sentry-delayed_job', path: "../../../sentry-delayed_job" -gem 'sentry-rails', path: "../../" - -gem "resque" -gem "sidekiq" -gem 'delayed_job_active_record' -gem "daemons" - -# Use Active Storage variant -# gem 'image_processing', '~> 1.2' - -# Reduces boot times through caching; required in config/boot.rb -gem 'bootsnap', '>= 1.4.2', require: false - -group :development, :test do - gem "debug", github: "ruby/debug", require: false -end - -group :development do - # Access an interactive console on exception pages or by calling 'console' anywhere in the code. - gem 'web-console', '>= 3.3.0' - gem 'listen' -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/sentry-rails/examples/rails-6.0/README.md b/sentry-rails/examples/rails-6.0/README.md deleted file mode 100644 index 48fc23392..000000000 --- a/sentry-rails/examples/rails-6.0/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Rails 6 Example For Sentry's Ruby SDK - -## Setup - -1. `bundle install` -2. Set your own Sentry DSN in `config/initializers/sentry.rb` - -## Send Some Events To Sentry - -### Normal Rails Exception - -1. Start the Rails server - `bundle exec rails s` -2. Visit `localhost:3000/` - -### Rails View Exception - -1. Start the Rails server - `bundle exec rails s` -2. Visit `localhost:3000/view_error` - -### Performance Monitoring - -1. Start the Rails server - `bundle exec rails s` -2. Visit `/posts` and do some CRUD actions - -### Sidekiq Worker Exception - -1. Start `sidekiq` server - `bundle exec sidekiq` -2. Run the job with Rails runner - `bundle exec rails runner "ErrorWorker.perform_async"` - diff --git a/sentry-rails/examples/rails-6.0/Rakefile b/sentry-rails/examples/rails-6.0/Rakefile deleted file mode 100644 index e85f91391..000000000 --- a/sentry-rails/examples/rails-6.0/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require_relative 'config/application' - -Rails.application.load_tasks diff --git a/sentry-rails/examples/rails-6.0/app/assets/config/manifest.js b/sentry-rails/examples/rails-6.0/app/assets/config/manifest.js deleted file mode 100644 index 591819335..000000000 --- a/sentry-rails/examples/rails-6.0/app/assets/config/manifest.js +++ /dev/null @@ -1,2 +0,0 @@ -//= link_tree ../images -//= link_directory ../stylesheets .css diff --git a/sentry-rails/examples/rails-6.0/app/assets/images/.keep b/sentry-rails/examples/rails-6.0/app/assets/images/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/application.css b/sentry-rails/examples/rails-6.0/app/assets/stylesheets/application.css deleted file mode 100644 index d05ea0f51..000000000 --- a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/application.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's - * vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS - * files in this directory. Styles in this file should be added after the last require_* statement. - * It is generally better to create a new file per style scope. - * - *= require_tree . - *= require_self - */ diff --git a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/posts.scss b/sentry-rails/examples/rails-6.0/app/assets/stylesheets/posts.scss deleted file mode 100644 index 1a7e15390..000000000 --- a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/posts.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the posts controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/scaffolds.scss b/sentry-rails/examples/rails-6.0/app/assets/stylesheets/scaffolds.scss deleted file mode 100644 index 604518803..000000000 --- a/sentry-rails/examples/rails-6.0/app/assets/stylesheets/scaffolds.scss +++ /dev/null @@ -1,84 +0,0 @@ -body { - background-color: #fff; - color: #333; - margin: 33px; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, ol, ul, td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #eee; - padding: 10px; - font-size: 11px; -} - -a { - color: #000; - - &:visited { - color: #666; - } - - &:hover { - color: #fff; - background-color: #000; - } -} - -th { - padding-bottom: 5px; -} - -td { - padding: 0 5px 7px; -} - -div { - &.field, &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - padding: 2px; - background-color: red; - display: table; -} - -#error_explanation { - width: 450px; - border: 2px solid red; - padding: 7px 7px 0; - margin-bottom: 20px; - background-color: #f0f0f0; - - h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px -7px 0; - background-color: #c00; - color: #fff; - } - - ul li { - font-size: 12px; - list-style: square; - } -} - -label { - display: block; -} diff --git a/sentry-rails/examples/rails-6.0/app/channels/appearance_channel.rb b/sentry-rails/examples/rails-6.0/app/channels/appearance_channel.rb deleted file mode 100644 index d84cf4640..000000000 --- a/sentry-rails/examples/rails-6.0/app/channels/appearance_channel.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AppearanceChannel < ApplicationCable::Channel - def subscribed - end - - def unsubscribed - end - - def hello - end - - def goodbye(data) - 1 / 0 - end -end diff --git a/sentry-rails/examples/rails-6.0/app/channels/application_cable/channel.rb b/sentry-rails/examples/rails-6.0/app/channels/application_cable/channel.rb deleted file mode 100644 index d67269728..000000000 --- a/sentry-rails/examples/rails-6.0/app/channels/application_cable/channel.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Channel < ActionCable::Channel::Base - end -end diff --git a/sentry-rails/examples/rails-6.0/app/channels/application_cable/connection.rb b/sentry-rails/examples/rails-6.0/app/channels/application_cable/connection.rb deleted file mode 100644 index ccf8bec21..000000000 --- a/sentry-rails/examples/rails-6.0/app/channels/application_cable/connection.rb +++ /dev/null @@ -1,6 +0,0 @@ -module ApplicationCable - class Connection < ActionCable::Connection::Base - def connect - end - end -end diff --git a/sentry-rails/examples/rails-6.0/app/controllers/application_controller.rb b/sentry-rails/examples/rails-6.0/app/controllers/application_controller.rb deleted file mode 100644 index 09705d12a..000000000 --- a/sentry-rails/examples/rails-6.0/app/controllers/application_controller.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ApplicationController < ActionController::Base -end diff --git a/sentry-rails/examples/rails-6.0/app/controllers/concerns/.keep b/sentry-rails/examples/rails-6.0/app/controllers/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/app/controllers/posts_controller.rb b/sentry-rails/examples/rails-6.0/app/controllers/posts_controller.rb deleted file mode 100644 index 15888b5c2..000000000 --- a/sentry-rails/examples/rails-6.0/app/controllers/posts_controller.rb +++ /dev/null @@ -1,80 +0,0 @@ -class PostsController < ApplicationController - before_action :set_post, only: [:show, :edit, :update, :destroy] - - # GET /posts - # GET /posts.json - def index - @posts = Post.all - end - - # GET /posts/1 - # GET /posts/1.json - def show - @post.cover.attach( - io: File.open(File.join(Rails.root, 'public', 'favicon.ico')), - filename: 'favicon.ico', - identify: false - ) - @post - end - - # GET /posts/new - def new - @post = Post.new - end - - # GET /posts/1/edit - def edit - end - - # POST /posts - # POST /posts.json - def create - @post = Post.new(post_params) - - respond_to do |format| - if @post.save - format.html { redirect_to @post, notice: 'Post was successfully created.' } - format.json { render :show, status: :created, location: @post } - else - format.html { render :new } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # PATCH/PUT /posts/1 - # PATCH/PUT /posts/1.json - def update - respond_to do |format| - if @post.update(post_params) - format.html { redirect_to @post, notice: 'Post was successfully updated.' } - format.json { render :show, status: :ok, location: @post } - else - format.html { render :edit } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # DELETE /posts/1 - # DELETE /posts/1.json - def destroy - @post.destroy - respond_to do |format| - format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } - format.json { head :no_content } - end - end - - private - # Use callbacks to share common setup or constraints between actions. - def set_post - @post = Post.find(params[:id]) - end - - # Only allow a list of trusted parameters through. - def post_params - params.require(:post).permit(:title, :content, :cover) - end -end diff --git a/sentry-rails/examples/rails-6.0/app/controllers/welcome_controller.rb b/sentry-rails/examples/rails-6.0/app/controllers/welcome_controller.rb deleted file mode 100644 index 4375f7511..000000000 --- a/sentry-rails/examples/rails-6.0/app/controllers/welcome_controller.rb +++ /dev/null @@ -1,54 +0,0 @@ -class WelcomeController < ApplicationController - before_action :set_sentry_context - - def index - a = 1 - b = 0 - a / b - end - - def connect_trace - # see the sinatra example under the `sentry-ruby` folder - response = Net::HTTP.get_response(URI("http://localhost:4567/connect_trace")) - - render plain: response.code - end - - def appearance - end - - def view_error - end - - def sidekiq_error - ErrorWorker.perform_async - render plain: "Remember to start sidekiq worker with '$ bundle exec sidekiq'" - end - - def resque_error - Resque.enqueue(RaiseError) - render plain: "Remember to start resque worker with '$ QUEUE=* bundle exec rake resque:work'" - end - - def delayed_job_error - ErrorDelayedJob.delay.perform - render plain: "Remember to start delayed_job worker with '$ bundle exec rake jobs:work'" - end - - def job_error - ErrorJob.perform_later - render plain: "success" - end - - def report_demo - # @sentry_event_id = Raven.last_event_id - render(status: 500) - end - - private - - def set_sentry_context - counter = (Sentry.get_current_scope.tags[:counter] || 0) + 1 - Sentry.set_tags(counter: counter) - end -end diff --git a/sentry-rails/examples/rails-6.0/app/delayed_jobs/error_delayed_job.rb b/sentry-rails/examples/rails-6.0/app/delayed_jobs/error_delayed_job.rb deleted file mode 100644 index b23b0c3ae..000000000 --- a/sentry-rails/examples/rails-6.0/app/delayed_jobs/error_delayed_job.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ErrorDelayedJob - def self.perform - 1/0 - end -end diff --git a/sentry-rails/examples/rails-6.0/app/helpers/application_helper.rb b/sentry-rails/examples/rails-6.0/app/helpers/application_helper.rb deleted file mode 100644 index de6be7945..000000000 --- a/sentry-rails/examples/rails-6.0/app/helpers/application_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module ApplicationHelper -end diff --git a/sentry-rails/examples/rails-6.0/app/helpers/posts_helper.rb b/sentry-rails/examples/rails-6.0/app/helpers/posts_helper.rb deleted file mode 100644 index a7b8cec89..000000000 --- a/sentry-rails/examples/rails-6.0/app/helpers/posts_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module PostsHelper -end diff --git a/sentry-rails/examples/rails-6.0/app/javascript/channels/appearance_channel.js b/sentry-rails/examples/rails-6.0/app/javascript/channels/appearance_channel.js deleted file mode 100644 index fc5feb9a6..000000000 --- a/sentry-rails/examples/rails-6.0/app/javascript/channels/appearance_channel.js +++ /dev/null @@ -1,26 +0,0 @@ -import consumer from './consumer'; - -consumer.subscriptions.create('AppearanceChannel', { - initialized() { - this.hello = this.hello.bind(this); - this.goodbye = this.goodbye.bind(this); - }, - - connected() { - document.querySelector('button#hello').addEventListener('click', this.hello); - document.querySelector('button#goodbye').addEventListener('click', this.goodbye); - }, - - disconnect() { - document.querySelector('button#hello').removeEventListener('click', this.hello); - document.querySelector('button#goodbye').removeEventListener('click', this.goodbye); - }, - - hello() { - this.perform('hello'); - }, - - goodbye() { - this.perform('goodbye', { forever: true }); - } -}); diff --git a/sentry-rails/examples/rails-6.0/app/javascript/channels/consumer.js b/sentry-rails/examples/rails-6.0/app/javascript/channels/consumer.js deleted file mode 100644 index 0eceb59b1..000000000 --- a/sentry-rails/examples/rails-6.0/app/javascript/channels/consumer.js +++ /dev/null @@ -1,6 +0,0 @@ -// Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the `rails generate channel` command. - -import { createConsumer } from "@rails/actioncable" - -export default createConsumer() diff --git a/sentry-rails/examples/rails-6.0/app/javascript/channels/index.js b/sentry-rails/examples/rails-6.0/app/javascript/channels/index.js deleted file mode 100644 index 0cfcf7491..000000000 --- a/sentry-rails/examples/rails-6.0/app/javascript/channels/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Load all the channels within this directory and all subdirectories. -// Channel files must be named *_channel.js. - -const channels = require.context('.', true, /_channel\.js$/) -channels.keys().forEach(channels) diff --git a/sentry-rails/examples/rails-6.0/app/javascript/packs/application.js b/sentry-rails/examples/rails-6.0/app/javascript/packs/application.js deleted file mode 100644 index 9cd55d4b9..000000000 --- a/sentry-rails/examples/rails-6.0/app/javascript/packs/application.js +++ /dev/null @@ -1,17 +0,0 @@ -// This file is automatically compiled by Webpack, along with any other files -// present in this directory. You're encouraged to place your actual application logic in -// a relevant structure within app/javascript and only use these pack files to reference -// that code so it'll be compiled. - -require("@rails/ujs").start() -require("turbolinks").start() -require("@rails/activestorage").start() -require("channels") - - -// Uncomment to copy all static images under ../images to the output folder and reference -// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) -// or the `imagePath` JavaScript helper below. -// -// const images = require.context('../images', true) -// const imagePath = (name) => images(name, true) diff --git a/sentry-rails/examples/rails-6.0/app/jobs/application_job.rb b/sentry-rails/examples/rails-6.0/app/jobs/application_job.rb deleted file mode 100644 index d394c3d10..000000000 --- a/sentry-rails/examples/rails-6.0/app/jobs/application_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class ApplicationJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError -end diff --git a/sentry-rails/examples/rails-6.0/app/jobs/error_job.rb b/sentry-rails/examples/rails-6.0/app/jobs/error_job.rb deleted file mode 100644 index f0bb41848..000000000 --- a/sentry-rails/examples/rails-6.0/app/jobs/error_job.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ErrorJob < ApplicationJob - self.queue_adapter = :async - - def perform - a = 1 - b = 2 - raise "Job failed" - end -end diff --git a/sentry-rails/examples/rails-6.0/app/mailers/application_mailer.rb b/sentry-rails/examples/rails-6.0/app/mailers/application_mailer.rb deleted file mode 100644 index 286b2239d..000000000 --- a/sentry-rails/examples/rails-6.0/app/mailers/application_mailer.rb +++ /dev/null @@ -1,4 +0,0 @@ -class ApplicationMailer < ActionMailer::Base - default from: 'from@example.com' - layout 'mailer' -end diff --git a/sentry-rails/examples/rails-6.0/app/models/application_record.rb b/sentry-rails/examples/rails-6.0/app/models/application_record.rb deleted file mode 100644 index 10a4cba84..000000000 --- a/sentry-rails/examples/rails-6.0/app/models/application_record.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true -end diff --git a/sentry-rails/examples/rails-6.0/app/models/concerns/.keep b/sentry-rails/examples/rails-6.0/app/models/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/app/models/post.rb b/sentry-rails/examples/rails-6.0/app/models/post.rb deleted file mode 100644 index f735d001b..000000000 --- a/sentry-rails/examples/rails-6.0/app/models/post.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Post < ApplicationRecord - has_one_attached :cover -end diff --git a/sentry-rails/examples/rails-6.0/app/resque_jobs/raise_error.rb b/sentry-rails/examples/rails-6.0/app/resque_jobs/raise_error.rb deleted file mode 100644 index 596ac0715..000000000 --- a/sentry-rails/examples/rails-6.0/app/resque_jobs/raise_error.rb +++ /dev/null @@ -1,7 +0,0 @@ -class RaiseError - @queue = :default - - def self.perform - 1/0 - end -end diff --git a/sentry-rails/examples/rails-6.0/app/views/layouts/application.html.erb b/sentry-rails/examples/rails-6.0/app/views/layouts/application.html.erb deleted file mode 100644 index 60ee8159f..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/layouts/application.html.erb +++ /dev/null @@ -1,15 +0,0 @@ - - - - Rails60 - <%= csrf_meta_tags %> - <%= csp_meta_tag %> - - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> - <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.html.erb b/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.html.erb deleted file mode 100644 index cbd34d2e9..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.text.erb b/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.text.erb deleted file mode 100644 index 37f0bddbd..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/layouts/mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/_form.html.erb b/sentry-rails/examples/rails-6.0/app/views/posts/_form.html.erb deleted file mode 100644 index b88a3e593..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/_form.html.erb +++ /dev/null @@ -1,32 +0,0 @@ -<%= form_with(model: post, local: true) do |form| %> - <% if post.errors.any? %> -
-

<%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:

- - -
- <% end %> - -
- <%= form.label :title %> - <%= form.text_field :title %> -
- -
- <%= form.label :content %> - <%= form.text_area :content %> -
- -
- <%= form.label :cover %> - <%= form.file_field :cover %> -
- -
- <%= form.submit %> -
-<% end %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/_post.json.jbuilder b/sentry-rails/examples/rails-6.0/app/views/posts/_post.json.jbuilder deleted file mode 100644 index bdfe92fd2..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/_post.json.jbuilder +++ /dev/null @@ -1,2 +0,0 @@ -json.extract! post, :id, :title, :content, :created_at, :updated_at -json.url post_url(post, format: :json) diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/edit.html.erb b/sentry-rails/examples/rails-6.0/app/views/posts/edit.html.erb deleted file mode 100644 index ded33f77a..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/edit.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -

Editing Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Show', @post %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/index.html.erb b/sentry-rails/examples/rails-6.0/app/views/posts/index.html.erb deleted file mode 100644 index ad63fbf79..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/index.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -

<%= notice %>

- -

Posts

- - - - - - - - - - - - <% @posts.each do |post| %> - - - - - - - - <% end %> - -
TitleContent
<%= post.title %><%= post.content %><%= link_to 'Show', post %><%= link_to 'Edit', edit_post_path(post) %><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>
- -
- -<%= link_to 'New Post', new_post_path %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/index.json.jbuilder b/sentry-rails/examples/rails-6.0/app/views/posts/index.json.jbuilder deleted file mode 100644 index a3c6f4a0b..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/index.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.array! @posts, partial: "posts/post", as: :post diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/new.html.erb b/sentry-rails/examples/rails-6.0/app/views/posts/new.html.erb deleted file mode 100644 index fb1e2a128..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/new.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

New Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/show.html.erb b/sentry-rails/examples/rails-6.0/app/views/posts/show.html.erb deleted file mode 100644 index 2d94bc731..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/show.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -

<%= notice %>

- -

- Title: - <%= @post.title %> -

- -

- Content: - <%= @post.content %> -

- -

- Cover: - <%= image_tag @post.cover.variant(resize_to_limit: [100, 100]) %> -

- -<%= link_to 'Edit', edit_post_path(@post) %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-6.0/app/views/posts/show.json.jbuilder b/sentry-rails/examples/rails-6.0/app/views/posts/show.json.jbuilder deleted file mode 100644 index 52744820e..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/posts/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! "posts/post", post: @post diff --git a/sentry-rails/examples/rails-6.0/app/views/welcome/appearance.html.erb b/sentry-rails/examples/rails-6.0/app/views/welcome/appearance.html.erb deleted file mode 100644 index e99fe8b2c..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/welcome/appearance.html.erb +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/sentry-rails/examples/rails-6.0/app/views/welcome/report_demo.html.erb b/sentry-rails/examples/rails-6.0/app/views/welcome/report_demo.html.erb deleted file mode 100644 index 4a9c19cb8..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/welcome/report_demo.html.erb +++ /dev/null @@ -1,22 +0,0 @@ - - - - Internal Server Error - - - -

Internal Server Error

- -

='(

- - <% if @sentry_event_id %> - - <% end %> - - - diff --git a/sentry-rails/examples/rails-6.0/app/views/welcome/view_error.html.erb b/sentry-rails/examples/rails-6.0/app/views/welcome/view_error.html.erb deleted file mode 100644 index 9ba7b5ad1..000000000 --- a/sentry-rails/examples/rails-6.0/app/views/welcome/view_error.html.erb +++ /dev/null @@ -1 +0,0 @@ -hey <%= foo %> diff --git a/sentry-rails/examples/rails-6.0/app/workers/error_worker.rb b/sentry-rails/examples/rails-6.0/app/workers/error_worker.rb deleted file mode 100644 index 9edbf87c3..000000000 --- a/sentry-rails/examples/rails-6.0/app/workers/error_worker.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ErrorWorker - include Sidekiq::Worker - sidekiq_options retry: false - - def perform - a = 1 - raise "Worker failed" - end -end diff --git a/sentry-rails/examples/rails-6.0/babel.config.js b/sentry-rails/examples/rails-6.0/babel.config.js deleted file mode 100644 index 12f98da5a..000000000 --- a/sentry-rails/examples/rails-6.0/babel.config.js +++ /dev/null @@ -1,72 +0,0 @@ -module.exports = function(api) { - var validEnv = ['development', 'test', 'production'] - var currentEnv = api.env() - var isDevelopmentEnv = api.env('development') - var isProductionEnv = api.env('production') - var isTestEnv = api.env('test') - - if (!validEnv.includes(currentEnv)) { - throw new Error( - 'Please specify a valid `NODE_ENV` or ' + - '`BABEL_ENV` environment variables. Valid values are "development", ' + - '"test", and "production". Instead, received: ' + - JSON.stringify(currentEnv) + - '.' - ) - } - - return { - presets: [ - isTestEnv && [ - '@babel/preset-env', - { - targets: { - node: 'current' - } - } - ], - (isProductionEnv || isDevelopmentEnv) && [ - '@babel/preset-env', - { - forceAllTransforms: true, - useBuiltIns: 'entry', - corejs: 3, - modules: false, - exclude: ['transform-typeof-symbol'] - } - ] - ].filter(Boolean), - plugins: [ - 'babel-plugin-macros', - '@babel/plugin-syntax-dynamic-import', - isTestEnv && 'babel-plugin-dynamic-import-node', - '@babel/plugin-transform-destructuring', - [ - '@babel/plugin-proposal-class-properties', - { - loose: true - } - ], - [ - '@babel/plugin-proposal-object-rest-spread', - { - useBuiltIns: true - } - ], - [ - '@babel/plugin-transform-runtime', - { - helpers: false, - regenerator: true, - corejs: false - } - ], - [ - '@babel/plugin-transform-regenerator', - { - async: false - } - ] - ].filter(Boolean) - } -} diff --git a/sentry-rails/examples/rails-6.0/bin/bundle b/sentry-rails/examples/rails-6.0/bin/bundle deleted file mode 100755 index a71368e32..000000000 --- a/sentry-rails/examples/rails-6.0/bin/bundle +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'bundle' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require "rubygems" - -m = Module.new do - module_function - - def invoked_as_script? - File.expand_path($0) == File.expand_path(__FILE__) - end - - def env_var_version - ENV["BUNDLER_VERSION"] - end - - def cli_arg_version - return unless invoked_as_script? # don't want to hijack other binstubs - return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` - bundler_version = nil - update_index = nil - ARGV.each_with_index do |a, i| - if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN - bundler_version = a - end - next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ - bundler_version = $1 - update_index = i - end - bundler_version - end - - def gemfile - gemfile = ENV["BUNDLE_GEMFILE"] - return gemfile if gemfile && !gemfile.empty? - - File.expand_path("../../Gemfile", __FILE__) - end - - def lockfile - lockfile = - case File.basename(gemfile) - when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) - else "#{gemfile}.lock" - end - File.expand_path(lockfile) - end - - def lockfile_version - return unless File.file?(lockfile) - lockfile_contents = File.read(lockfile) - return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ - Regexp.last_match(1) - end - - def bundler_version - @bundler_version ||= - env_var_version || cli_arg_version || - lockfile_version - end - - def bundler_requirement - return "#{Gem::Requirement.default}.a" unless bundler_version - - bundler_gem_version = Gem::Version.new(bundler_version) - - requirement = bundler_gem_version.approximate_recommendation - - return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") - - requirement += ".a" if bundler_gem_version.prerelease? - - requirement - end - - def load_bundler! - ENV["BUNDLE_GEMFILE"] ||= gemfile - - activate_bundler - end - - def activate_bundler - gem_error = activation_error_handling do - gem "bundler", bundler_requirement - end - return if gem_error.nil? - require_error = activation_error_handling do - require "bundler/version" - end - return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) - warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" - exit 42 - end - - def activation_error_handling - yield - nil - rescue StandardError, LoadError => e - e - end -end - -m.load_bundler! - -if m.invoked_as_script? - load Gem.bin_path("bundler", "bundle") -end diff --git a/sentry-rails/examples/rails-6.0/bin/delayed_job b/sentry-rails/examples/rails-6.0/bin/delayed_job deleted file mode 100755 index edf195985..000000000 --- a/sentry-rails/examples/rails-6.0/bin/delayed_job +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env ruby - -require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) -require 'delayed/command' -Delayed::Command.new(ARGV).daemonize diff --git a/sentry-rails/examples/rails-6.0/bin/rails b/sentry-rails/examples/rails-6.0/bin/rails deleted file mode 100755 index 5badb2fde..000000000 --- a/sentry-rails/examples/rails-6.0/bin/rails +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -APP_PATH = File.expand_path('../config/application', __dir__) -require_relative '../config/boot' -require 'rails/commands' diff --git a/sentry-rails/examples/rails-6.0/bin/rake b/sentry-rails/examples/rails-6.0/bin/rake deleted file mode 100755 index d87d5f578..000000000 --- a/sentry-rails/examples/rails-6.0/bin/rake +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end -require_relative '../config/boot' -require 'rake' -Rake.application.run diff --git a/sentry-rails/examples/rails-6.0/bin/setup b/sentry-rails/examples/rails-6.0/bin/setup deleted file mode 100755 index 5853b5ea8..000000000 --- a/sentry-rails/examples/rails-6.0/bin/setup +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env ruby -require 'fileutils' - -# path to your application root. -APP_ROOT = File.expand_path('..', __dir__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -FileUtils.chdir APP_ROOT do - # This script is a way to setup or update your development environment automatically. - # This script is idempotent, so that you can run it at anytime and get an expectable outcome. - # Add necessary setup steps to this file. - - puts '== Installing dependencies ==' - system! 'gem install bundler --conservative' - system('bundle check') || system!('bundle install') - - # Install JavaScript dependencies - # system('bin/yarn') - - # puts "\n== Copying sample files ==" - # unless File.exist?('config/database.yml') - # FileUtils.cp 'config/database.yml.sample', 'config/database.yml' - # end - - puts "\n== Preparing database ==" - system! 'bin/rails db:prepare' - - puts "\n== Removing old logs and tempfiles ==" - system! 'bin/rails log:clear tmp:clear' - - puts "\n== Restarting application server ==" - system! 'bin/rails restart' -end diff --git a/sentry-rails/examples/rails-6.0/bin/spring b/sentry-rails/examples/rails-6.0/bin/spring deleted file mode 100755 index d89ee495f..000000000 --- a/sentry-rails/examples/rails-6.0/bin/spring +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env ruby - -# This file loads Spring without using Bundler, in order to be fast. -# It gets overwritten when you run the `spring binstub` command. - -unless defined?(Spring) - require 'rubygems' - require 'bundler' - - lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) - spring = lockfile.specs.detect { |spec| spec.name == 'spring' } - if spring - Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path - gem 'spring', spring.version - require 'spring/binstub' - end -end diff --git a/sentry-rails/examples/rails-6.0/bin/webpack b/sentry-rails/examples/rails-6.0/bin/webpack deleted file mode 100755 index 1031168d0..000000000 --- a/sentry-rails/examples/rails-6.0/bin/webpack +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby - -ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= "development" - -require "pathname" -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -require "bundler/setup" - -require "webpacker" -require "webpacker/webpack_runner" - -APP_ROOT = File.expand_path("..", __dir__) -Dir.chdir(APP_ROOT) do - Webpacker::WebpackRunner.run(ARGV) -end diff --git a/sentry-rails/examples/rails-6.0/bin/webpack-dev-server b/sentry-rails/examples/rails-6.0/bin/webpack-dev-server deleted file mode 100755 index dd9662737..000000000 --- a/sentry-rails/examples/rails-6.0/bin/webpack-dev-server +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env ruby - -ENV["RAILS_ENV"] ||= ENV["RACK_ENV"] || "development" -ENV["NODE_ENV"] ||= "development" - -require "pathname" -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", - Pathname.new(__FILE__).realpath) - -require "bundler/setup" - -require "webpacker" -require "webpacker/dev_server_runner" - -APP_ROOT = File.expand_path("..", __dir__) -Dir.chdir(APP_ROOT) do - Webpacker::DevServerRunner.run(ARGV) -end diff --git a/sentry-rails/examples/rails-6.0/bin/yarn b/sentry-rails/examples/rails-6.0/bin/yarn deleted file mode 100755 index 460dd565b..000000000 --- a/sentry-rails/examples/rails-6.0/bin/yarn +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env ruby -APP_ROOT = File.expand_path('..', __dir__) -Dir.chdir(APP_ROOT) do - begin - exec "yarnpkg", *ARGV - rescue Errno::ENOENT - $stderr.puts "Yarn executable was not detected in the system." - $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" - exit 1 - end -end diff --git a/sentry-rails/examples/rails-6.0/config.ru b/sentry-rails/examples/rails-6.0/config.ru deleted file mode 100644 index f7ba0b527..000000000 --- a/sentry-rails/examples/rails-6.0/config.ru +++ /dev/null @@ -1,5 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require_relative 'config/environment' - -run Rails.application diff --git a/sentry-rails/examples/rails-6.0/config/application.rb b/sentry-rails/examples/rails-6.0/config/application.rb deleted file mode 100644 index f5310f618..000000000 --- a/sentry-rails/examples/rails-6.0/config/application.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative 'boot' - -require 'rails/all' - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) - -module Rails60 - class Application < Rails::Application - # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 6.0 - - # Settings in config/environments/* take precedence over those specified here. - # Application configuration can go into files in config/initializers - # -- all .rb files in that directory are automatically loaded after loading - # the framework and any gems in your application. - config.consider_all_requests_local = false - - # https://github.com/getsentry/raven-ruby/issues/494 - config.exceptions_app = self.routes - - config.webpacker.check_yarn_integrity = false - config.active_job.queue_adapter = :sidekiq - end -end diff --git a/sentry-rails/examples/rails-6.0/config/boot.rb b/sentry-rails/examples/rails-6.0/config/boot.rb deleted file mode 100644 index b9e460cef..000000000 --- a/sentry-rails/examples/rails-6.0/config/boot.rb +++ /dev/null @@ -1,4 +0,0 @@ -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) - -require 'bundler/setup' # Set up gems listed in the Gemfile. -require 'bootsnap/setup' # Speed up boot time by caching expensive operations. diff --git a/sentry-rails/examples/rails-6.0/config/cable.yml b/sentry-rails/examples/rails-6.0/config/cable.yml deleted file mode 100644 index e320cade2..000000000 --- a/sentry-rails/examples/rails-6.0/config/cable.yml +++ /dev/null @@ -1,10 +0,0 @@ -development: - adapter: async - -test: - adapter: test - -production: - adapter: redis - url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> - channel_prefix: rails_6_0_production diff --git a/sentry-rails/examples/rails-6.0/config/credentials.yml.enc b/sentry-rails/examples/rails-6.0/config/credentials.yml.enc deleted file mode 100644 index ad208d37a..000000000 --- a/sentry-rails/examples/rails-6.0/config/credentials.yml.enc +++ /dev/null @@ -1 +0,0 @@ -hDXHlKlYVp8a2hbUQivxYb2pDDtIRbzhkcRR0Xj8a3AYwFdRYHQ3DHqyvKsUGKZAddX8M9cEZ7RdPOZ2OO5szycKkecUKsgXgMjk645FdklX8p+oLAXgTkobTJZ90B6Bhkwm+Rf5of8cPSFDRwC+G0DwmiRnKy833BXFm2kxpiOmjtl8f9nzHmaT8ojK34ZdNiOOQOnr7MAjZwF0uGq6hYNqIbCF9Gz1v7+iICFM26mPOU+K3Fo9KVGQ23nx5m0VENpv97Dvo0cklrto3DEK6E9lH2FPecBD1sdIn/bYkIST7jhxT8JRYs3JwEdt8PyTYOBhH2WiZVNcJiBzTsbt5iCj7ggLscVyGe8/99GmY3/L/ZP+7bhFztZP/yF30oW61xy/jE8W+kkfguAV3i6KeMNFRj5YmSusRSxu--2uC96PHVlR9eYeAb--vADqgojfdxPaeOcD4js7xA== \ No newline at end of file diff --git a/sentry-rails/examples/rails-6.0/config/database.yml b/sentry-rails/examples/rails-6.0/config/database.yml deleted file mode 100644 index 4a8a1b26f..000000000 --- a/sentry-rails/examples/rails-6.0/config/database.yml +++ /dev/null @@ -1,25 +0,0 @@ -# SQLite. Versions 3.8.0 and up are supported. -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem 'sqlite3' -# -default: &default - adapter: sqlite3 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - timeout: 5000 - -development: - <<: *default - database: db/development.sqlite3 - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: db/test.sqlite3 - -production: - <<: *default - database: db/production.sqlite3 diff --git a/sentry-rails/examples/rails-6.0/config/environment.rb b/sentry-rails/examples/rails-6.0/config/environment.rb deleted file mode 100644 index 426333bb4..000000000 --- a/sentry-rails/examples/rails-6.0/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the Rails application. -require_relative 'application' - -# Initialize the Rails application. -Rails.application.initialize! diff --git a/sentry-rails/examples/rails-6.0/config/environments/development.rb b/sentry-rails/examples/rails-6.0/config/environments/development.rb deleted file mode 100644 index 66df51f6f..000000000 --- a/sentry-rails/examples/rails-6.0/config/environments/development.rb +++ /dev/null @@ -1,62 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded on - # every request. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports. - config.consider_all_requests_local = true - - # Enable/disable caching. By default caching is disabled. - # Run rails dev:cache to toggle caching. - if Rails.root.join('tmp', 'caching-dev.txt').exist? - config.action_controller.perform_caching = true - config.action_controller.enable_fragment_cache_logging = true - - config.cache_store = :memory_store - config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{2.days.to_i}" - } - else - config.action_controller.perform_caching = false - - config.cache_store = :null_store - end - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - config.action_mailer.perform_caching = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Highlight code that triggered database queries in logs. - config.active_record.verbose_query_logs = true - - # Debug mode disables concatenation and preprocessing of assets. - # This option may cause significant delays in view rendering with a large - # number of complex assets. - config.assets.debug = true - - # Suppress logger output for asset requests. - config.assets.quiet = true - - # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true - - # Use an evented file watcher to asynchronously detect changes in source code, - # routes, locales, etc. This feature depends on the listen gem. - config.file_watcher = ActiveSupport::EventedFileUpdateChecker -end diff --git a/sentry-rails/examples/rails-6.0/config/environments/production.rb b/sentry-rails/examples/rails-6.0/config/environments/production.rb deleted file mode 100644 index e685e0e25..000000000 --- a/sentry-rails/examples/rails-6.0/config/environments/production.rb +++ /dev/null @@ -1,112 +0,0 @@ -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). - # config.require_master_key = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - - # Compress CSS using a preprocessor. - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.action_controller.asset_host = 'http://assets.example.com' - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache - # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Mount Action Cable outside main process or domain. - # config.action_cable.mount_path = nil - # config.action_cable.url = 'wss://example.com/cable' - # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # Use the lowest log level to ensure availability of diagnostic information - # when problems arise. - config.log_level = :debug - - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Use a real queuing backend for Active Job (and separate queues per environment). - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "rails_6_0_production" - - config.action_mailer.perform_caching = false - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Send deprecation notices to registered listeners. - config.active_support.deprecation = :notify - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require 'syslog/logger' - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false - - # Inserts middleware to perform automatic connection switching. - # The `database_selector` hash is used to pass options to the DatabaseSelector - # middleware. The `delay` is used to determine how long to wait after a write - # to send a subsequent read to the primary. - # - # The `database_resolver` class is used by the middleware to determine which - # database is appropriate to use based on the time delay. - # - # The `database_resolver_context` class is used by the middleware to set - # timestamps for the last write to the primary. The resolver uses the context - # class timestamps to determine how long to wait before reading from the - # replica. - # - # By default Rails will store a last write timestamp in the session. The - # DatabaseSelector middleware is designed as such you can define your own - # strategy for connection switching and pass that into the middleware through - # these configuration options. - # config.active_record.database_selector = { delay: 2.seconds } - # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver - # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session -end diff --git a/sentry-rails/examples/rails-6.0/config/environments/test.rb b/sentry-rails/examples/rails-6.0/config/environments/test.rb deleted file mode 100644 index 1d62e91b3..000000000 --- a/sentry-rails/examples/rails-6.0/config/environments/test.rb +++ /dev/null @@ -1,48 +0,0 @@ -# The test environment is used exclusively to run your application's -# test suite. You never need to work with it otherwise. Remember that -# your test database is "scratch space" for the test suite and is wiped -# and recreated between test runs. Don't rely on the data there! - -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - config.cache_classes = false - - # Do not eager load code on boot. This avoids loading your whole application - # just for the purpose of running a single test. If you are using a tool that - # preloads Rails for running tests, you may have to set it to true. - config.eager_load = false - - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - 'Cache-Control' => "public, max-age=#{1.hour.to_i}" - } - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - config.cache_store = :null_store - - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = false - - # Disable request forgery protection in test environment. - config.action_controller.allow_forgery_protection = false - - # Store uploaded files on the local file system in a temporary directory. - config.active_storage.service = :test - - config.action_mailer.perform_caching = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Print deprecation notices to the stderr. - config.active_support.deprecation = :stderr - - # Raises error for missing translations. - # config.action_view.raise_on_missing_translations = true -end diff --git a/sentry-rails/examples/rails-6.0/config/initializers/application_controller_renderer.rb b/sentry-rails/examples/rails-6.0/config/initializers/application_controller_renderer.rb deleted file mode 100644 index 89d2efab2..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/application_controller_renderer.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# ActiveSupport::Reloader.to_prepare do -# ApplicationController.renderer.defaults.merge!( -# http_host: 'example.org', -# https: false -# ) -# end diff --git a/sentry-rails/examples/rails-6.0/config/initializers/assets.rb b/sentry-rails/examples/rails-6.0/config/initializers/assets.rb deleted file mode 100644 index 4b828e80c..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/assets.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = '1.0' - -# Add additional assets to the asset load path. -# Rails.application.config.assets.paths << Emoji.images_path -# Add Yarn node_modules folder to the asset load path. -Rails.application.config.assets.paths << Rails.root.join('node_modules') - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in the app/assets -# folder are already added. -# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/sentry-rails/examples/rails-6.0/config/initializers/backtrace_silencers.rb b/sentry-rails/examples/rails-6.0/config/initializers/backtrace_silencers.rb deleted file mode 100644 index 59385cdf3..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/backtrace_silencers.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. -# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } - -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. -# Rails.backtrace_cleaner.remove_silencers! diff --git a/sentry-rails/examples/rails-6.0/config/initializers/content_security_policy.rb b/sentry-rails/examples/rails-6.0/config/initializers/content_security_policy.rb deleted file mode 100644 index 35d0f26fc..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/content_security_policy.rb +++ /dev/null @@ -1,30 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy - -# Rails.application.config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https -# # If you are using webpack-dev-server then specify webpack-dev-server host -# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development? - -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" -# end - -# If you are using UJS then enable automatic nonce generation -# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) } - -# Set the nonce only to specific directives -# Rails.application.config.content_security_policy_nonce_directives = %w(script-src) - -# Report CSP violations to a specified URI -# For further information see the following documentation: -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only -# Rails.application.config.content_security_policy_report_only = true diff --git a/sentry-rails/examples/rails-6.0/config/initializers/cookies_serializer.rb b/sentry-rails/examples/rails-6.0/config/initializers/cookies_serializer.rb deleted file mode 100644 index 5a6a32d37..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/cookies_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Specify a serializer for the signed and encrypted cookie jars. -# Valid options are :json, :marshal, and :hybrid. -Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/sentry-rails/examples/rails-6.0/config/initializers/delayed_job.rb b/sentry-rails/examples/rails-6.0/config/initializers/delayed_job.rb deleted file mode 100644 index f9cb5abe9..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/delayed_job.rb +++ /dev/null @@ -1 +0,0 @@ -Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log')) diff --git a/sentry-rails/examples/rails-6.0/config/initializers/filter_parameter_logging.rb b/sentry-rails/examples/rails-6.0/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index 4a994e1e7..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure sensitive parameters which will be filtered from the log file. -Rails.application.config.filter_parameters += [:password] diff --git a/sentry-rails/examples/rails-6.0/config/initializers/inflections.rb b/sentry-rails/examples/rails-6.0/config/initializers/inflections.rb deleted file mode 100644 index ac033bf9d..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/inflections.rb +++ /dev/null @@ -1,16 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, '\1en' -# inflect.singular /^(ox)en/i, '\1' -# inflect.irregular 'person', 'people' -# inflect.uncountable %w( fish sheep ) -# end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym 'RESTful' -# end diff --git a/sentry-rails/examples/rails-6.0/config/initializers/mime_types.rb b/sentry-rails/examples/rails-6.0/config/initializers/mime_types.rb deleted file mode 100644 index dc1899682..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/mime_types.rb +++ /dev/null @@ -1,4 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new mime types for use in respond_to blocks: -# Mime::Type.register "text/richtext", :rtf diff --git a/sentry-rails/examples/rails-6.0/config/initializers/resque.rb b/sentry-rails/examples/rails-6.0/config/initializers/resque.rb deleted file mode 100644 index 1ddd65155..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/resque.rb +++ /dev/null @@ -1,2 +0,0 @@ -Resque.logger = Logger.new("#{Rails.root}/log/resque.log") -Resque.logger.level = Logger::DEBUG diff --git a/sentry-rails/examples/rails-6.0/config/initializers/sentry.rb b/sentry-rails/examples/rails-6.0/config/initializers/sentry.rb deleted file mode 100644 index c0b0d08fb..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/sentry.rb +++ /dev/null @@ -1,14 +0,0 @@ -Sentry.init do |config| - config.breadcrumbs_logger = [:active_support_logger] - config.background_worker_threads = 0 - config.send_default_pii = true - config.traces_sample_rate = 1.0 # set a float between 0.0 and 1.0 to enable performance monitoring - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.release = `git branch --show-current` - config.capture_exception_frame_locals = true - # you can use the pre-defined job for the async callback - # - # config.async = lambda do |event, hint| - # Sentry::SendEventJob.perform_later(event, hint) - # end -end diff --git a/sentry-rails/examples/rails-6.0/config/initializers/wrap_parameters.rb b/sentry-rails/examples/rails-6.0/config/initializers/wrap_parameters.rb deleted file mode 100644 index bbfc3961b..000000000 --- a/sentry-rails/examples/rails-6.0/config/initializers/wrap_parameters.rb +++ /dev/null @@ -1,14 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# This file contains settings for ActionController::ParamsWrapper which -# is enabled by default. - -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. -ActiveSupport.on_load(:action_controller) do - wrap_parameters format: [:json] -end - -# To enable root element in JSON for ActiveRecord objects. -# ActiveSupport.on_load(:active_record) do -# self.include_root_in_json = true -# end diff --git a/sentry-rails/examples/rails-6.0/config/locales/en.yml b/sentry-rails/examples/rails-6.0/config/locales/en.yml deleted file mode 100644 index cf9b342d0..000000000 --- a/sentry-rails/examples/rails-6.0/config/locales/en.yml +++ /dev/null @@ -1,33 +0,0 @@ -# Files in the config/locales directory are used for internationalization -# and are automatically loaded by Rails. If you want to use locales other -# than English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t 'hello' -# -# In views, this is aliased to just `t`: -# -# <%= t('hello') %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# The following keys must be escaped otherwise they will not be retrieved by -# the default I18n backend: -# -# true, false, on, off, yes, no -# -# Instead, surround them with single quotes. -# -# en: -# 'true': 'foo' -# -# To learn more, please read the Rails Internationalization guide -# available at https://guides.rubyonrails.org/i18n.html. - -en: - hello: "Hello world" diff --git a/sentry-rails/examples/rails-6.0/config/puma.rb b/sentry-rails/examples/rails-6.0/config/puma.rb deleted file mode 100644 index 5ed443774..000000000 --- a/sentry-rails/examples/rails-6.0/config/puma.rb +++ /dev/null @@ -1,38 +0,0 @@ -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum; this matches the default thread size of Active Record. -# -max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } -min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } -threads min_threads_count, max_threads_count - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. -# -port ENV.fetch("PORT") { 3000 } - -# Specifies the `environment` that Puma will run in. -# -environment ENV.fetch("RAILS_ENV") { "development" } - -# Specifies the `pidfile` that Puma will use. -pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked web server processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. -# -# preload_app! - -# Allow puma to be restarted by `rails restart` command. -plugin :tmp_restart diff --git a/sentry-rails/examples/rails-6.0/config/routes.rb b/sentry-rails/examples/rails-6.0/config/routes.rb deleted file mode 100644 index 71b6a5f73..000000000 --- a/sentry-rails/examples/rails-6.0/config/routes.rb +++ /dev/null @@ -1,20 +0,0 @@ -require "resque/server" - -Rails.application.routes.draw do - resources :posts - get '500', to: 'welcome#report_demo' - root to: "welcome#index" - - get 'appearance', to: 'welcome#appearance' - get 'connect_trace', to: 'welcome#connect_trace' - get 'view_error', to: 'welcome#view_error' - get 'sidekiq_error', to: 'welcome#sidekiq_error' - get 'resque_error', to: 'welcome#resque_error' - get 'delayed_job_error', to: 'welcome#delayed_job_error' - get 'job_error', to: 'welcome#job_error' - - require 'sidekiq/web' - - mount Sidekiq::Web => '/sidekiq' - mount Resque::Server.new, at: "/resque" -end diff --git a/sentry-rails/examples/rails-6.0/config/spring.rb b/sentry-rails/examples/rails-6.0/config/spring.rb deleted file mode 100644 index db5bf1307..000000000 --- a/sentry-rails/examples/rails-6.0/config/spring.rb +++ /dev/null @@ -1,6 +0,0 @@ -Spring.watch( - ".ruby-version", - ".rbenv-vars", - "tmp/restart.txt", - "tmp/caching-dev.txt" -) diff --git a/sentry-rails/examples/rails-6.0/config/storage.yml b/sentry-rails/examples/rails-6.0/config/storage.yml deleted file mode 100644 index d32f76e8f..000000000 --- a/sentry-rails/examples/rails-6.0/config/storage.yml +++ /dev/null @@ -1,34 +0,0 @@ -test: - service: Disk - root: <%= Rails.root.join("tmp/storage") %> - -local: - service: Disk - root: <%= Rails.root.join("storage") %> - -# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) -# amazon: -# service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> -# region: us-east-1 -# bucket: your_own_bucket - -# Remember not to checkin your GCS keyfile to a repository -# google: -# service: GCS -# project: your_project -# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> -# bucket: your_own_bucket - -# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) -# microsoft: -# service: AzureStorage -# storage_account_name: your_account_name -# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> -# container: your_container_name - -# mirror: -# service: Mirror -# primary: local -# mirrors: [ amazon, google, microsoft ] diff --git a/sentry-rails/examples/rails-6.0/config/unicorn.rb b/sentry-rails/examples/rails-6.0/config/unicorn.rb deleted file mode 100644 index 5b4396f52..000000000 --- a/sentry-rails/examples/rails-6.0/config/unicorn.rb +++ /dev/null @@ -1,22 +0,0 @@ -worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3) -timeout 200 -preload_app true - -before_fork do |server, worker| - Signal.trap 'TERM' do - puts 'Unicorn master intercepting TERM and sending myself QUIT instead' - Process.kill 'QUIT', Process.pid - end - - defined?(ActiveRecord::Base) and - ActiveRecord::Base.connection.disconnect! -end - -after_fork do |server, worker| - Signal.trap 'TERM' do - puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' - end - - defined?(ActiveRecord::Base) and - ActiveRecord::Base.establish_connection -end diff --git a/sentry-rails/examples/rails-6.0/config/webpack/development.js b/sentry-rails/examples/rails-6.0/config/webpack/development.js deleted file mode 100644 index c5edff94a..000000000 --- a/sentry-rails/examples/rails-6.0/config/webpack/development.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/sentry-rails/examples/rails-6.0/config/webpack/environment.js b/sentry-rails/examples/rails-6.0/config/webpack/environment.js deleted file mode 100644 index d16d9af74..000000000 --- a/sentry-rails/examples/rails-6.0/config/webpack/environment.js +++ /dev/null @@ -1,3 +0,0 @@ -const { environment } = require('@rails/webpacker') - -module.exports = environment diff --git a/sentry-rails/examples/rails-6.0/config/webpack/production.js b/sentry-rails/examples/rails-6.0/config/webpack/production.js deleted file mode 100644 index be0f53aac..000000000 --- a/sentry-rails/examples/rails-6.0/config/webpack/production.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'production' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/sentry-rails/examples/rails-6.0/config/webpack/test.js b/sentry-rails/examples/rails-6.0/config/webpack/test.js deleted file mode 100644 index c5edff94a..000000000 --- a/sentry-rails/examples/rails-6.0/config/webpack/test.js +++ /dev/null @@ -1,5 +0,0 @@ -process.env.NODE_ENV = process.env.NODE_ENV || 'development' - -const environment = require('./environment') - -module.exports = environment.toWebpackConfig() diff --git a/sentry-rails/examples/rails-6.0/config/webpacker.yml b/sentry-rails/examples/rails-6.0/config/webpacker.yml deleted file mode 100644 index 8581ac047..000000000 --- a/sentry-rails/examples/rails-6.0/config/webpacker.yml +++ /dev/null @@ -1,96 +0,0 @@ -# Note: You must restart bin/webpack-dev-server for changes to take effect - -default: &default - source_path: app/javascript - source_entry_path: packs - public_root_path: public - public_output_path: packs - cache_path: tmp/cache/webpacker - check_yarn_integrity: false - webpack_compile_output: true - - # Additional paths webpack should lookup modules - # ['app/assets', 'engine/foo/app/assets'] - resolved_paths: [] - - # Reload manifest.json on all requests so we reload latest compiled packs - cache_manifest: false - - # Extract and emit a css file - extract_css: false - - static_assets_extensions: - - .jpg - - .jpeg - - .png - - .gif - - .tiff - - .ico - - .svg - - .eot - - .otf - - .ttf - - .woff - - .woff2 - - extensions: - - .mjs - - .js - - .sass - - .scss - - .css - - .module.sass - - .module.scss - - .module.css - - .png - - .svg - - .gif - - .jpeg - - .jpg - -development: - <<: *default - compile: true - - # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules - check_yarn_integrity: true - - # Reference: https://webpack.js.org/configuration/dev-server/ - dev_server: - https: false - host: localhost - port: 3035 - public: localhost:3035 - hmr: false - # Inline should be set to true if using HMR - inline: true - overlay: true - compress: true - disable_host_check: true - use_local_ip: false - quiet: false - pretty: false - headers: - 'Access-Control-Allow-Origin': '*' - watch_options: - ignored: '**/node_modules/**' - - -test: - <<: *default - compile: true - - # Compile test packs to a separate directory - public_output_path: packs-test - -production: - <<: *default - - # Production depends on precompilation of packs prior to booting for performance. - compile: false - - # Extract and emit a css file - extract_css: true - - # Cache manifest.json for performance - cache_manifest: true diff --git a/sentry-rails/examples/rails-6.0/db/migrate/20201120074001_create_posts.rb b/sentry-rails/examples/rails-6.0/db/migrate/20201120074001_create_posts.rb deleted file mode 100644 index a23882f27..000000000 --- a/sentry-rails/examples/rails-6.0/db/migrate/20201120074001_create_posts.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreatePosts < ActiveRecord::Migration[6.0] - def change - create_table :posts do |t| - t.string :title - t.text :content - - t.timestamps - end - end -end diff --git a/sentry-rails/examples/rails-6.0/db/migrate/20211002044752_create_active_storage_tables.active_storage.rb b/sentry-rails/examples/rails-6.0/db/migrate/20211002044752_create_active_storage_tables.active_storage.rb deleted file mode 100644 index 87798267b..000000000 --- a/sentry-rails/examples/rails-6.0/db/migrate/20211002044752_create_active_storage_tables.active_storage.rb +++ /dev/null @@ -1,36 +0,0 @@ -# This migration comes from active_storage (originally 20170806125915) -class CreateActiveStorageTables < ActiveRecord::Migration[5.2] - def change - create_table :active_storage_blobs do |t| - t.string :key, null: false - t.string :filename, null: false - t.string :content_type - t.text :metadata - t.string :service_name, null: false - t.bigint :byte_size, null: false - t.string :checksum, null: false - t.datetime :created_at, null: false - - t.index [ :key ], unique: true - end - - create_table :active_storage_attachments do |t| - t.string :name, null: false - t.references :record, null: false, polymorphic: true, index: false - t.references :blob, null: false - - t.datetime :created_at, null: false - - t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true - t.foreign_key :active_storage_blobs, column: :blob_id - end - - create_table :active_storage_variant_records do |t| - t.belongs_to :blob, null: false, index: false - t.string :variation_digest, null: false - - t.index %i[ blob_id variation_digest ], name: "index_active_storage_variant_records_uniqueness", unique: true - t.foreign_key :active_storage_blobs, column: :blob_id - end - end -end diff --git a/sentry-rails/examples/rails-6.0/db/migrate/20211219212232_create_delayed_jobs.rb b/sentry-rails/examples/rails-6.0/db/migrate/20211219212232_create_delayed_jobs.rb deleted file mode 100644 index d55c28bc2..000000000 --- a/sentry-rails/examples/rails-6.0/db/migrate/20211219212232_create_delayed_jobs.rb +++ /dev/null @@ -1,22 +0,0 @@ -class CreateDelayedJobs < ActiveRecord::Migration[6.1] - def self.up - create_table :delayed_jobs do |table| - table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue - table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually. - table.text :handler, null: false # YAML-encoded string of the object that will do work - table.text :last_error # reason for last failure (See Note below) - table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. - table.datetime :locked_at # Set when a client is working on this object - table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) - table.string :locked_by # Who is working on this object (if locked) - table.string :queue # The name of the queue this job is in - table.timestamps null: true - end - - add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority" - end - - def self.down - drop_table :delayed_jobs - end -end diff --git a/sentry-rails/examples/rails-6.0/db/schema.rb b/sentry-rails/examples/rails-6.0/db/schema.rb deleted file mode 100644 index 253a19189..000000000 --- a/sentry-rails/examples/rails-6.0/db/schema.rb +++ /dev/null @@ -1,66 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# This file is the source Rails uses to define your schema when running `bin/rails -# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to -# be faster and is potentially less error prone than running all of your -# migrations from scratch. Old migrations may fail to apply correctly if those -# migrations use external dependencies or application code. -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema.define(version: 2021_12_19_212232) do - create_table "active_storage_attachments", force: :cascade do |t| - t.string "name", null: false - t.string "record_type", null: false - t.integer "record_id", null: false - t.integer "blob_id", null: false - t.datetime "created_at", null: false - t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id" - t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true - end - - create_table "active_storage_blobs", force: :cascade do |t| - t.string "key", null: false - t.string "filename", null: false - t.string "content_type" - t.text "metadata" - t.string "service_name", null: false - t.bigint "byte_size", null: false - t.string "checksum", null: false - t.datetime "created_at", null: false - t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true - end - - create_table "active_storage_variant_records", force: :cascade do |t| - t.integer "blob_id", null: false - t.string "variation_digest", null: false - t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true - end - - create_table "delayed_jobs", force: :cascade do |t| - t.integer "priority", default: 0, null: false - t.integer "attempts", default: 0, null: false - t.text "handler", null: false - t.text "last_error" - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by" - t.string "queue" - t.datetime "created_at", precision: 6 - t.datetime "updated_at", precision: 6 - t.index ["priority", "run_at"], name: "delayed_jobs_priority" - end - - create_table "posts", force: :cascade do |t| - t.string "title" - t.text "content" - t.datetime "created_at", precision: 6, null: false - t.datetime "updated_at", precision: 6, null: false - end - - add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id" - add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id" -end diff --git a/sentry-rails/examples/rails-6.0/db/seeds.rb b/sentry-rails/examples/rails-6.0/db/seeds.rb deleted file mode 100644 index 1beea2acc..000000000 --- a/sentry-rails/examples/rails-6.0/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) -# Character.create(name: 'Luke', movie: movies.first) diff --git a/sentry-rails/examples/rails-6.0/lib/assets/.keep b/sentry-rails/examples/rails-6.0/lib/assets/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/lib/tasks/.keep b/sentry-rails/examples/rails-6.0/lib/tasks/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/lib/tasks/resque.rake b/sentry-rails/examples/rails-6.0/lib/tasks/resque.rake deleted file mode 100644 index 6295b59fc..000000000 --- a/sentry-rails/examples/rails-6.0/lib/tasks/resque.rake +++ /dev/null @@ -1,2 +0,0 @@ -require 'resque/tasks' -task "resque:setup" => :environment diff --git a/sentry-rails/examples/rails-6.0/package.json b/sentry-rails/examples/rails-6.0/package.json deleted file mode 100644 index 9ff0f0afb..000000000 --- a/sentry-rails/examples/rails-6.0/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "rails_6_0", - "private": true, - "dependencies": { - "@rails/actioncable": "^6.0.0-alpha", - "@rails/activestorage": "^6.0.0-alpha", - "@rails/ujs": "^6.0.0-alpha", - "@rails/webpacker": "4.2.2", - "turbolinks": "^5.2.0" - }, - "version": "0.1.0", - "devDependencies": { - "webpack-dev-server": "^3.11.0" - } -} diff --git a/sentry-rails/examples/rails-6.0/postcss.config.js b/sentry-rails/examples/rails-6.0/postcss.config.js deleted file mode 100644 index aa5998a80..000000000 --- a/sentry-rails/examples/rails-6.0/postcss.config.js +++ /dev/null @@ -1,12 +0,0 @@ -module.exports = { - plugins: [ - require('postcss-import'), - require('postcss-flexbugs-fixes'), - require('postcss-preset-env')({ - autoprefixer: { - flexbox: 'no-2009' - }, - stage: 3 - }) - ] -} diff --git a/sentry-rails/examples/rails-6.0/public/404.html b/sentry-rails/examples/rails-6.0/public/404.html deleted file mode 100644 index 2be3af26f..000000000 --- a/sentry-rails/examples/rails-6.0/public/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - - -
-
-

The page you were looking for doesn't exist.

-

You may have mistyped the address or the page may have moved.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-6.0/public/422.html b/sentry-rails/examples/rails-6.0/public/422.html deleted file mode 100644 index c08eac0d1..000000000 --- a/sentry-rails/examples/rails-6.0/public/422.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - - -
-
-

The change you wanted was rejected.

-

Maybe you tried to change something you didn't have access to.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-6.0/public/500.html b/sentry-rails/examples/rails-6.0/public/500.html deleted file mode 100644 index 78a030af2..000000000 --- a/sentry-rails/examples/rails-6.0/public/500.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - - - - -
-
-

We're sorry, but something went wrong.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-6.0/public/apple-touch-icon-precomposed.png b/sentry-rails/examples/rails-6.0/public/apple-touch-icon-precomposed.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/public/apple-touch-icon.png b/sentry-rails/examples/rails-6.0/public/apple-touch-icon.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/public/favicon.ico b/sentry-rails/examples/rails-6.0/public/favicon.ico deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/public/robots.txt b/sentry-rails/examples/rails-6.0/public/robots.txt deleted file mode 100644 index c19f78ab6..000000000 --- a/sentry-rails/examples/rails-6.0/public/robots.txt +++ /dev/null @@ -1 +0,0 @@ -# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/sentry-rails/examples/rails-6.0/storage/.keep b/sentry-rails/examples/rails-6.0/storage/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/application_system_test_case.rb b/sentry-rails/examples/rails-6.0/test/application_system_test_case.rb deleted file mode 100644 index d19212abd..000000000 --- a/sentry-rails/examples/rails-6.0/test/application_system_test_case.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :chrome, screen_size: [1400, 1400] -end diff --git a/sentry-rails/examples/rails-6.0/test/channels/application_cable/connection_test.rb b/sentry-rails/examples/rails-6.0/test/channels/application_cable/connection_test.rb deleted file mode 100644 index 800405f15..000000000 --- a/sentry-rails/examples/rails-6.0/test/channels/application_cable/connection_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require "test_helper" - -class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase - # test "connects with cookies" do - # cookies.signed[:user_id] = 42 - # - # connect - # - # assert_equal connection.user_id, "42" - # end -end diff --git a/sentry-rails/examples/rails-6.0/test/controllers/.keep b/sentry-rails/examples/rails-6.0/test/controllers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/controllers/posts_controller_test.rb b/sentry-rails/examples/rails-6.0/test/controllers/posts_controller_test.rb deleted file mode 100644 index c1b83587f..000000000 --- a/sentry-rails/examples/rails-6.0/test/controllers/posts_controller_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'test_helper' - -class PostsControllerTest < ActionDispatch::IntegrationTest - setup do - @post = posts(:one) - end - - test "should get index" do - get posts_url - assert_response :success - end - - test "should get new" do - get new_post_url - assert_response :success - end - - test "should create post" do - assert_difference('Post.count') do - post posts_url, params: { post: { content: @post.content, title: @post.title } } - end - - assert_redirected_to post_url(Post.last) - end - - test "should show post" do - get post_url(@post) - assert_response :success - end - - test "should get edit" do - get edit_post_url(@post) - assert_response :success - end - - test "should update post" do - patch post_url(@post), params: { post: { content: @post.content, title: @post.title } } - assert_redirected_to post_url(@post) - end - - test "should destroy post" do - assert_difference('Post.count', -1) do - delete post_url(@post) - end - - assert_redirected_to posts_url - end -end diff --git a/sentry-rails/examples/rails-6.0/test/fixtures/.keep b/sentry-rails/examples/rails-6.0/test/fixtures/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/fixtures/files/.keep b/sentry-rails/examples/rails-6.0/test/fixtures/files/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/fixtures/posts.yml b/sentry-rails/examples/rails-6.0/test/fixtures/posts.yml deleted file mode 100644 index 4854ae742..000000000 --- a/sentry-rails/examples/rails-6.0/test/fixtures/posts.yml +++ /dev/null @@ -1,9 +0,0 @@ -# Read about fixtures at https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - -one: - title: MyString - content: MyText - -two: - title: MyString - content: MyText diff --git a/sentry-rails/examples/rails-6.0/test/helpers/.keep b/sentry-rails/examples/rails-6.0/test/helpers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/integration/.keep b/sentry-rails/examples/rails-6.0/test/integration/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/mailers/.keep b/sentry-rails/examples/rails-6.0/test/mailers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/models/.keep b/sentry-rails/examples/rails-6.0/test/models/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/models/post_test.rb b/sentry-rails/examples/rails-6.0/test/models/post_test.rb deleted file mode 100644 index 6d9d463a7..000000000 --- a/sentry-rails/examples/rails-6.0/test/models/post_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class PostTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/sentry-rails/examples/rails-6.0/test/system/.keep b/sentry-rails/examples/rails-6.0/test/system/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/test/system/posts_test.rb b/sentry-rails/examples/rails-6.0/test/system/posts_test.rb deleted file mode 100644 index 4cf73670a..000000000 --- a/sentry-rails/examples/rails-6.0/test/system/posts_test.rb +++ /dev/null @@ -1,45 +0,0 @@ -require "application_system_test_case" - -class PostsTest < ApplicationSystemTestCase - setup do - @post = posts(:one) - end - - test "visiting the index" do - visit posts_url - assert_selector "h1", text: "Posts" - end - - test "creating a Post" do - visit posts_url - click_on "New Post" - - fill_in "Content", with: @post.content - fill_in "Title", with: @post.title - click_on "Create Post" - - assert_text "Post was successfully created" - click_on "Back" - end - - test "updating a Post" do - visit posts_url - click_on "Edit", match: :first - - fill_in "Content", with: @post.content - fill_in "Title", with: @post.title - click_on "Update Post" - - assert_text "Post was successfully updated" - click_on "Back" - end - - test "destroying a Post" do - visit posts_url - page.accept_confirm do - click_on "Destroy", match: :first - end - - assert_text "Post was successfully destroyed" - end -end diff --git a/sentry-rails/examples/rails-6.0/test/test_helper.rb b/sentry-rails/examples/rails-6.0/test/test_helper.rb deleted file mode 100644 index d5300f88c..000000000 --- a/sentry-rails/examples/rails-6.0/test/test_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -ENV['RAILS_ENV'] ||= 'test' -require_relative '../config/environment' -require 'rails/test_help' - -class ActiveSupport::TestCase - # Run tests in parallel with specified workers - parallelize(workers: :number_of_processors) - - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/sentry-rails/examples/rails-6.0/vendor/.keep b/sentry-rails/examples/rails-6.0/vendor/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-6.0/yarn.lock b/sentry-rails/examples/rails-6.0/yarn.lock deleted file mode 100644 index 69a35be67..000000000 --- a/sentry-rails/examples/rails-6.0/yarn.lock +++ /dev/null @@ -1,7724 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== - dependencies: - "@babel/highlight" "^7.22.13" - chalk "^2.4.2" - -"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" - integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== - dependencies: - browserslist "^4.12.0" - invariant "^2.2.4" - semver "^5.5.0" - -"@babel/core@^7.7.2": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.11.0" - "@babel/types" "^7.11.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz#5bf0d495a3f757ac3bda48b5bf3b3ba309c72ba3" - integrity sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-compilation-targets@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz#804ae8e3f04376607cc791b9d47d540276332bd2" - integrity sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ== - dependencies: - "@babel/compat-data" "^7.10.4" - browserslist "^4.12.0" - invariant "^2.2.4" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/helper-create-class-features-plugin@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz#9f61446ba80e8240b0a5c85c6fdac8459d6f259d" - integrity sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.10.5" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - -"@babel/helper-create-regexp-features-plugin@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz#fdd60d88524659a0b6959c0579925e425714f3b8" - integrity sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - regexpu-core "^4.7.0" - -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" - integrity sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A== - dependencies: - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" - integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-get-function-arity@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" - integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.10.4", "@babel/helper-member-expression-to-functions@^7.10.5": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz#ae69c83d84ee82f4b42f96e2a09410935a8f26df" - integrity sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-module-imports@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620" - integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" - integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/template" "^7.10.4" - "@babel/types" "^7.11.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" - integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== - dependencies: - "@babel/types" "^7.10.4" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-regex@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.5.tgz#32dfbb79899073c415557053a19bd055aae50ae0" - integrity sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg== - dependencies: - lodash "^4.17.19" - -"@babel/helper-remap-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz#fce8bea4e9690bbe923056ded21e54b4e8b68ed5" - integrity sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-replace-supers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf" - integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-simple-access@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461" - integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw== - dependencies: - "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" - integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" - integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== - dependencies: - "@babel/types" "^7.11.0" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-validator-identifier@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" - integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-wrap-function@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" - integrity sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/helpers@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044" - integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA== - dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/highlight@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" - integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" - chalk "^2.4.2" - js-tokens "^4.0.0" - -"@babel/parser@^7.10.4", "@babel/parser@^7.11.1": - version "7.11.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.3.tgz#9e1eae46738bcd08e23e867bab43e7b95299a8f9" - integrity sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA== - -"@babel/parser@^7.22.15", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== - -"@babel/plugin-proposal-async-generator-functions@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz#3491cabf2f7c179ab820606cec27fed15e0e8558" - integrity sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" - -"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.7.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz#a33bf632da390a59c7a8c570045d1115cd778807" - integrity sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-dynamic-import@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz#ba57a26cb98b37741e9d5bca1b8b0ddf8291f17e" - integrity sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - -"@babel/plugin-proposal-export-namespace-from@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" - integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" - integrity sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.0" - -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" - integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" - integrity sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - -"@babel/plugin-proposal-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz#ce1590ff0a65ad12970a609d78855e9a4c1aef06" - integrity sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.6.2": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" - integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.10.4" - -"@babel/plugin-proposal-optional-catch-binding@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz#31c938309d24a78a49d68fdabffaa863758554dd" - integrity sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - -"@babel/plugin-proposal-optional-chaining@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" - integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - -"@babel/plugin-proposal-private-methods@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz#b160d972b8fdba5c7d111a145fc8c421fc2a6909" - integrity sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz#4483cda53041ce3413b7fe2f00022665ddfaa75d" - integrity sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-async-generators@^7.8.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz#6644e6a0baa55a61f9e3231f6c9eeb6ee46c124c" - integrity sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-dynamic-import@^7.2.0", "@babel/plugin-syntax-dynamic-import@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz#4bbeb8917b54fcf768364e0a81f560e33a3ef57d" - integrity sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-arrow-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz#e22960d77e697c74f41c501d44d73dbf8a6a64cd" - integrity sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-async-to-generator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz#41a5017e49eb6f3cda9392a51eef29405b245a37" - integrity sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.10.4" - -"@babel/plugin-transform-block-scoped-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz#1afa595744f75e43a91af73b0d998ecfe4ebc2e8" - integrity sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-block-scoping@^7.10.4": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz#5b7efe98852bef8d652c0b28144cd93a9e4b5215" - integrity sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-classes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz#405136af2b3e218bc4a1926228bc917ab1a0adc7" - integrity sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz#9ded83a816e82ded28d52d4b4ecbdd810cdfc0eb" - integrity sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.6.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz#70ddd2b3d1bea83d01509e9bb25ddb3a74fc85e5" - integrity sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz#469c2062105c1eb6a040eaf4fac4b488078395ee" - integrity sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-duplicate-keys@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz#697e50c9fee14380fe843d1f306b295617431e47" - integrity sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-exponentiation-operator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz#5ae338c57f8cf4001bdb35607ae66b92d665af2e" - integrity sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-for-of@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz#c08892e8819d3a5db29031b115af511dbbfebae9" - integrity sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-function-name@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz#6a467880e0fc9638514ba369111811ddbe2644b7" - integrity sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg== - dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz#9f42ba0841100a135f22712d0e391c462f571f3c" - integrity sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz#b1ec44fcf195afcb8db2c62cd8e551c881baf8b7" - integrity sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-modules-amd@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz#1b9cddaf05d9e88b3aad339cb3e445c4f020a9b1" - integrity sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw== - dependencies: - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz#66667c3eeda1ebf7896d41f1f16b17105a2fbca0" - integrity sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w== - dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz#6270099c854066681bae9e05f87e1b9cadbe8c85" - integrity sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw== - dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.5" - "@babel/helper-plugin-utils" "^7.10.4" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz#9a8481fe81b824654b3a0b65da3df89f3d21839e" - integrity sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA== - dependencies: - "@babel/helper-module-transforms" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz#78b4d978810b6f3bcf03f9e318f2fc0ed41aecb6" - integrity sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - -"@babel/plugin-transform-new-target@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz#9097d753cb7b024cb7381a3b2e52e9513a9c6888" - integrity sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-object-super@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz#d7146c4d139433e7a6526f888c667e314a093894" - integrity sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.10.4" - -"@babel/plugin-transform-parameters@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz#59d339d58d0b1950435f4043e74e2510005e2c4a" - integrity sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw== - dependencies: - "@babel/helper-get-function-arity" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-property-literals@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz#f6fe54b6590352298785b83edd815d214c42e3c0" - integrity sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.7.0": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz#2015e59d839074e76838de2159db421966fd8b63" - integrity sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz#8f2682bcdcef9ed327e1b0861585d7013f8a54dd" - integrity sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-runtime@^7.6.2": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" - integrity sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-spread@^7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" - integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" - -"@babel/plugin-transform-sticky-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz#8f3889ee8657581130a29d9cc91d7c73b7c4a28d" - integrity sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-regex" "^7.10.4" - -"@babel/plugin-transform-template-literals@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz#78bc5d626a6642db3312d9d0f001f5e7639fde8c" - integrity sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-typeof-symbol@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz#9509f1a7eec31c4edbffe137c16cc33ff0bc5bfc" - integrity sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-unicode-escapes@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz#feae523391c7651ddac115dae0a9d06857892007" - integrity sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-transform-unicode-regex@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz#e56d71f9282fac6db09c82742055576d5e6d80a8" - integrity sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/preset-env@^7.7.1": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" - integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== - dependencies: - "@babel/compat-data" "^7.11.0" - "@babel/helper-compilation-targets" "^7.10.4" - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-proposal-async-generator-functions" "^7.10.4" - "@babel/plugin-proposal-class-properties" "^7.10.4" - "@babel/plugin-proposal-dynamic-import" "^7.10.4" - "@babel/plugin-proposal-export-namespace-from" "^7.10.4" - "@babel/plugin-proposal-json-strings" "^7.10.4" - "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" - "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.11.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.11.0" - "@babel/plugin-proposal-private-methods" "^7.10.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.10.4" - "@babel/plugin-syntax-dynamic-import" "^7.8.0" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.0" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.10.4" - "@babel/plugin-transform-arrow-functions" "^7.10.4" - "@babel/plugin-transform-async-to-generator" "^7.10.4" - "@babel/plugin-transform-block-scoped-functions" "^7.10.4" - "@babel/plugin-transform-block-scoping" "^7.10.4" - "@babel/plugin-transform-classes" "^7.10.4" - "@babel/plugin-transform-computed-properties" "^7.10.4" - "@babel/plugin-transform-destructuring" "^7.10.4" - "@babel/plugin-transform-dotall-regex" "^7.10.4" - "@babel/plugin-transform-duplicate-keys" "^7.10.4" - "@babel/plugin-transform-exponentiation-operator" "^7.10.4" - "@babel/plugin-transform-for-of" "^7.10.4" - "@babel/plugin-transform-function-name" "^7.10.4" - "@babel/plugin-transform-literals" "^7.10.4" - "@babel/plugin-transform-member-expression-literals" "^7.10.4" - "@babel/plugin-transform-modules-amd" "^7.10.4" - "@babel/plugin-transform-modules-commonjs" "^7.10.4" - "@babel/plugin-transform-modules-systemjs" "^7.10.4" - "@babel/plugin-transform-modules-umd" "^7.10.4" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.10.4" - "@babel/plugin-transform-new-target" "^7.10.4" - "@babel/plugin-transform-object-super" "^7.10.4" - "@babel/plugin-transform-parameters" "^7.10.4" - "@babel/plugin-transform-property-literals" "^7.10.4" - "@babel/plugin-transform-regenerator" "^7.10.4" - "@babel/plugin-transform-reserved-words" "^7.10.4" - "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.11.0" - "@babel/plugin-transform-sticky-regex" "^7.10.4" - "@babel/plugin-transform-template-literals" "^7.10.4" - "@babel/plugin-transform-typeof-symbol" "^7.10.4" - "@babel/plugin-transform-unicode-escapes" "^7.10.4" - "@babel/plugin-transform-unicode-regex" "^7.10.4" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.11.0" - browserslist "^4.12.0" - core-js-compat "^3.6.2" - invariant "^2.2.2" - levenary "^1.1.1" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz#13242b53b5ef8c883c3cf7dddd55b36ce80fbc72" - integrity sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.4.4": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" - integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@rails/actioncable@^6.0.0-alpha": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.0.3.tgz#722b4b639936129307ddbab3a390f6bcacf3e7bc" - integrity sha512-I01hgqxxnOgOtJTGlq0ZsGJYiTEEiSGVEGQn3vimZSqEP1HqzyFNbzGTq14Xdyeow2yGJjygjoFF1pmtE+SQaw== - -"@rails/activestorage@^6.0.0-alpha": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/activestorage/-/activestorage-6.0.3.tgz#401d2a28ecb7167cdb5e830ffddaa17c308c31aa" - integrity sha512-YdNwyfryHlcKj7Ruix89wZ2aiN3KTYULdW1Y/hNlHJlrY2/PXjT2YBTzZiVd+dcjrwHBsXV2rExdy+Z/lsrlEg== - dependencies: - spark-md5 "^3.0.0" - -"@rails/ujs@^6.0.0-alpha": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3.tgz#e68a03278e30daea6a110aac5dfa33c60c53055d" - integrity sha512-CM9OEvoN9eXkaX7PXEnbsQLULJ97b9rVmwliZbz/iBOERLJ68Rk3ClJe+fQEMKU4CBZfky2lIRnfslOdUs9SLQ== - -"@rails/webpacker@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@rails/webpacker/-/webpacker-4.2.2.tgz#b9dd3235fdf4d0badbda8e33f6ebee742a9f3abb" - integrity sha512-jzw7qMfSCLdrt9j1X+2IvXjf63huXYqeIPwLujXa9pYFvxtEstbVYRDivuLhiDokzih+PrYpB+dLTGBNgVsnpw== - dependencies: - "@babel/core" "^7.7.2" - "@babel/plugin-proposal-class-properties" "^7.7.0" - "@babel/plugin-proposal-object-rest-spread" "^7.6.2" - "@babel/plugin-syntax-dynamic-import" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.6.0" - "@babel/plugin-transform-regenerator" "^7.7.0" - "@babel/plugin-transform-runtime" "^7.6.2" - "@babel/preset-env" "^7.7.1" - "@babel/runtime" "^7.7.2" - babel-loader "^8.0.6" - babel-plugin-dynamic-import-node "^2.3.0" - babel-plugin-macros "^2.6.1" - case-sensitive-paths-webpack-plugin "^2.2.0" - compression-webpack-plugin "^3.0.0" - core-js "^3.4.0" - css-loader "^3.2.0" - file-loader "^4.2.0" - flatted "^2.0.1" - glob "^7.1.6" - js-yaml "^3.13.1" - mini-css-extract-plugin "^0.8.0" - node-sass "^4.13.0" - optimize-css-assets-webpack-plugin "^5.0.3" - path-complete-extname "^1.0.0" - pnp-webpack-plugin "^1.5.0" - postcss-flexbugs-fixes "^4.1.0" - postcss-import "^12.0.1" - postcss-loader "^3.0.0" - postcss-preset-env "^6.7.0" - postcss-safe-parser "^4.0.1" - regenerator-runtime "^0.13.3" - sass-loader "7.3.1" - style-loader "^1.0.0" - terser-webpack-plugin "^2.2.1" - webpack "^4.41.2" - webpack-assets-manifest "^3.1.1" - webpack-cli "^3.3.10" - webpack-sources "^1.4.3" - -"@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/json-schema@^7.0.4": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" - integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "14.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" - integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" - integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== - -aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3: - version "6.12.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" - integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -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" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - 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" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -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= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - 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" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - 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" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@^9.6.1: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" - integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== - -babel-loader@^8.0.6: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== - dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.0, babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-macros@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" - integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg== - dependencies: - "@babel/runtime" "^7.7.2" - cosmiconfig "^6.0.0" - resolve "^1.12.0" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - 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" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" - integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: - version "4.11.9" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" - integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== - -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - 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" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -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" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - 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" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - 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" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - 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" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-rsa@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.2.tgz#e78d4b69816d6e3dd1c747e64e9947f9ad79bc7e" - integrity sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.4" - inherits "^2.0.4" - parse-asn1 "^5.1.6" - readable-stream "^3.6.2" - safe-buffer "^5.2.1" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.6.4, browserslist@^4.8.5: - version "4.14.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" - integrity sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ== - dependencies: - caniuse-lite "^1.0.30001111" - electron-to-chromium "^1.3.523" - escalade "^3.0.2" - node-releases "^1.1.60" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -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" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - 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" - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -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= - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001111: - version "1.0.30001113" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001113.tgz#22016ab55b5a8b04fa00ca342d9ee1b98df48065" - integrity sha512-qMvjHiKH21zzM/VDZr6oosO6Ri3U0V2tC015jRXjOecwQCJtsU5zklTNTk31jQbIOP8gha0h1ccM/g0ECP+4BA== - -case-sensitive-paths-webpack-plugin@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - 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, chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.4.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.4.0" - optionalDependencies: - fsevents "~2.1.2" - -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -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" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - 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" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.3" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc" - integrity sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10" - integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colorette@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - 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== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression-webpack-plugin@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz#9f510172a7b5fae5aad3b670652e8bd7997aeeca" - integrity sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.0.0" - neo-async "^2.5.0" - schema-utils "^2.6.1" - serialize-javascript "^2.1.2" - webpack-sources "^1.0.1" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -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" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - 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" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js-compat@^3.6.2: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" - integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== - dependencies: - browserslist "^4.8.5" - semver "7.0.0" - -core-js@^3.4.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" - integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== - -core-util-is@1.0.2, 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" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - 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.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - 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@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - 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" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - 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" - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@0.0.4, 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" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@^3.2.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645" - integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^6.3.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@1.0.0-alpha.39: - version "1.0.0-alpha.39" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" - integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== - dependencies: - mdn-data "2.0.6" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39" - integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg== - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" - integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== - dependencies: - css-tree "1.0.0-alpha.39" - -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" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - 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" - -debug@^3.1.1, debug@^3.2.5: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.2, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - 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" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - 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" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - 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" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" - integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" - integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== - dependencies: - is-obj "^2.0.0" - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.3.523: - version "1.3.533" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz#d7e5ca4d57e9bc99af87efbe13e7be5dde729b0f" - integrity sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A== - -elliptic@^6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" - integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== - 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" - -elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.1, enhanced-resolve@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -entities@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" - integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0, error-ex@^1.3.1: - 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" - -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4" - integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -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" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -events@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== - dependencies: - original "^1.0.0" - -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" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - 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-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -express@^4.17.1: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - 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" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - 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" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== - dependencies: - websocket-driver ">=0.5.1" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-loader@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af" - integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -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" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@^1.0.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - 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" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -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" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - 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" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - 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" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -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= - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -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" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.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" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@~5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - 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-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.2: - version "4.2.4" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.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" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - 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" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - 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" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - -html-entities@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" - integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" - integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ== - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy@^1.17.0: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.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" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ== - -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" - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, ini@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -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" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -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" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - 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" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - -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-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -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" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.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" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - 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" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - 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" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - 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" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -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" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -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" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== - -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" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - 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" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -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" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regex@^1.0.4, is-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" - integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== - dependencies: - has-symbols "^1.0.1" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -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-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -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" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - 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" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -jest-worker@^25.4.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" - integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -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" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -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" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -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" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json3@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== - dependencies: - minimist "^1.2.5" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -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" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - 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" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - 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" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -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" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -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" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.0.1, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.1.tgz#278ad7006660bccc4d2c0c1578e17c5c78d5c0e0" - integrity sha512-1Qo97Y2oKaU+Ro2xnDMR26g1BwMT29jNbem1EvcujW2jqt+j5COXyscjM7bLQkM9HaxI7pkWeW7gnI072yMI9Q== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.get@^4.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.has@^4.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862" - integrity sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.5, lodash@~4.17.10: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loglevel@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" - integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.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" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -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= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -mdn-data@2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" - integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.7.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" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - 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" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": - version "1.44.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19: - version "2.1.27" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== - -mini-css-extract-plugin@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161" - integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - 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" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -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" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.3, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - 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 "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -"mkdirp@>=0.5 0", mkdirp@^0.5, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - 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" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -nan@^2.12.1, nan@^2.13.2: - version "2.14.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" - integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - 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" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-forge@0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" - integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - 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 "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-releases@^1.1.60: - version "1.1.60" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" - integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== - -node-sass@^4.13.0: - version "4.14.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -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" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -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" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - 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" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -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= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -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" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-is@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" - integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - 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" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" - integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - has "^1.0.3" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -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" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimize-css-assets-webpack-plugin@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz#e2f1d4d94ad8c0af8967ebd7cf138dcb1ef14572" - integrity sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@0: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - 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" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -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" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" - integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-complete-extname@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-complete-extname/-/path-complete-extname-1.0.0.tgz#f889985dc91000c815515c0bfed06c5acda0752b" - integrity sha512-CVjiWcMRdGU8ubs08YQVzhutOR5DEfO97ipRIlOGMK5Bek5nQySknBpuxVAVJ36hseTNs+vdIcv57ZrWxH7zvg== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -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-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -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" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -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" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -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-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -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" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== - 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" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -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= - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pnp-webpack-plugin@^1.5.0: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -portfinder@^1.0.26: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -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" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-calc@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.3.tgz#d65cca92a3c52bf27ad37a5f732e0587b74f1623" - integrity sha512-IB/EAEmZhIMEIhG7Ov4x+l47UaXOS1n2f4FBUk/aKllQhtSCxWhTzn0nJgkqN7fo/jcWySvWTSB6Syk9L+31bA== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-flexbugs-fixes@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== - dependencies: - postcss "^7.0.26" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz#71dd3c6c10a0d846c5eda07803439617bbbabacc" - integrity sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-import@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== - dependencies: - postcss "^7.0.1" - postcss-value-parser "^3.2.3" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== - dependencies: - lodash.template "^4.5.0" - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-load-config@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" - integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-local-by-default@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@^6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" - -postcss-safe-parser@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" - integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== - dependencies: - postcss "^7.0.26" - -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz#c68ff7ba96527499e832724a2674d65603b645c0" - integrity sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" - integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== - dependencies: - cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== - dependencies: - is-svg "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - 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" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - 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" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - 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" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - 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" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= - dependencies: - pify "^2.3.0" - -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" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, 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, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - 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@^3.0.6, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== - dependencies: - picomatch "^2.2.1" - -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" - -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== - dependencies: - regenerate "^1.4.0" - -regenerate@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" - integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== - -regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -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" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" - integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - -regexpu-core@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" - integrity sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== - dependencies: - jsesc "~0.5.0" - -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" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -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" - -request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.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" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - 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" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.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" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - -sass-loader@7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.3.1.tgz#a5bf68a04bcea1c13ff842d747150f7ab7d0d23f" - integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA== - dependencies: - clone-deep "^4.0.1" - loader-utils "^1.0.1" - neo-async "^2.5.0" - pify "^4.0.1" - semver "^6.3.0" - -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selfsigned@^1.10.7: - version "1.10.7" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" - integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== - dependencies: - node-forge "0.9.0" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - 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" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -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" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - 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" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - 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" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - 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" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - 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" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - debug "^3.2.5" - eventsource "^1.0.7" - faye-websocket "~0.11.1" - inherits "^2.0.3" - json3 "^3.3.2" - url-parse "^1.4.3" - -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.4.0" - websocket-driver "0.6.5" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.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" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spark-md5@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d" - integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -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" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - 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" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d" - integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - 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" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - 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" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - 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.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -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" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - 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": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -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" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - 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" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -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-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -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" - -style-loader@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" - integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.6" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== - dependencies: - has-flag "^4.0.0" - -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser-webpack-plugin@^2.2.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" - integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.3.1" - jest-worker "^25.4.0" - p-limit "^2.3.0" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.6.12" - webpack-sources "^1.4.3" - -terser@^4.1.2, terser@^4.6.12: - version "4.8.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f" - integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -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" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -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" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - 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" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -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" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -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= - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tslib@^1.9.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -turbolinks@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/turbolinks/-/turbolinks-5.2.0.tgz#e6877a55ea5c1cb3bb225f0a4ae303d6d32ff77c" - integrity sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -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" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== - -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" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== - dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" - -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== - -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - 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" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse@^1.4.3: - version "1.5.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.7.tgz#00780f60dbdae90181f51ed85fb24109422c932a" - integrity sha512-HxWkieX+STA38EDk7CE9MEryFeHCKzgagxlGvsdS7WBImq9Mk+PGwiT56w82WI3aicwJA8REp42Cxo98c8FZMA== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - 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" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -v8-compile-cache@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== - -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" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack-chokidar2@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" - integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" - integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.0" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-assets-manifest@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz#39bbc3bf2ee57fcd8ba07cda51c9ba4a3c6ae1de" - integrity sha512-JV9V2QKc5wEWQptdIjvXDUL1ucbPLH2f27toAY3SNdGZp+xSaStAgpoMcvMZmqtFrBc9a5pTS1058vxyMPOzRQ== - dependencies: - chalk "^2.0" - lodash.get "^4.0" - lodash.has "^4.0" - mkdirp "^0.5" - schema-utils "^1.0.0" - tapable "^1.0.0" - webpack-sources "^1.0.0" - -webpack-cli@^3.3.10: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== - dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" - -webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.7" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "0.3.20" - sockjs-client "1.4.0" - spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.41.2: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" - -websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - 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" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.7.2: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" - integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" diff --git a/sentry-rails/examples/rails-7.0/.gitattributes b/sentry-rails/examples/rails-7.0/.gitattributes deleted file mode 100644 index 31eeee0b6..000000000 --- a/sentry-rails/examples/rails-7.0/.gitattributes +++ /dev/null @@ -1,7 +0,0 @@ -# See https://git-scm.com/docs/gitattributes for more about git attribute files. - -# Mark the database schema as having been generated. -db/schema.rb linguist-generated - -# Mark any vendored files as having been vendored. -vendor/* linguist-vendored diff --git a/sentry-rails/examples/rails-7.0/.gitignore b/sentry-rails/examples/rails-7.0/.gitignore deleted file mode 100644 index 886f714b4..000000000 --- a/sentry-rails/examples/rails-7.0/.gitignore +++ /dev/null @@ -1,35 +0,0 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile '~/.gitignore_global' - -# Ignore bundler config. -/.bundle - -# Ignore the default SQLite database. -/db/*.sqlite3 -/db/*.sqlite3-* - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore pidfiles, but keep the directory. -/tmp/pids/* -!/tmp/pids/ -!/tmp/pids/.keep - -# Ignore uploaded files in development. -/storage/* -!/storage/.keep -/tmp/storage/* -!/tmp/storage/ -!/tmp/storage/.keep - -/public/assets - -# Ignore master key for decrypting credentials and more. -/config/master.key diff --git a/sentry-rails/examples/rails-7.0/.rspec b/sentry-rails/examples/rails-7.0/.rspec deleted file mode 100644 index c99d2e739..000000000 --- a/sentry-rails/examples/rails-7.0/.rspec +++ /dev/null @@ -1 +0,0 @@ ---require spec_helper diff --git a/sentry-rails/examples/rails-7.0/Gemfile b/sentry-rails/examples/rails-7.0/Gemfile deleted file mode 100644 index beba23f0f..000000000 --- a/sentry-rails/examples/rails-7.0/Gemfile +++ /dev/null @@ -1,76 +0,0 @@ -source "https://rubygems.org" -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" -gem "rails", "~> 7.0.1" - -# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails] -gem "sprockets-rails" - -# Use sqlite3 as the database for Active Record -gem "sqlite3", "~> 1.4" - -# Use the Puma web server [https://github.com/puma/puma] -gem "puma", ">= 5.0" - -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] -gem "importmap-rails" - -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] -gem "turbo-rails" - -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] -gem "stimulus-rails" - -# Build JSON APIs with ease [https://github.com/rails/jbuilder] -gem "jbuilder" - -# Use Redis adapter to run Action Cable in production -# gem "redis", "~> 4.0" - -# Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] -# gem "kredis" - -# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] -# gem "bcrypt", "~> 3.1.7" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ] - -# Reduces boot times through caching; required in config/boot.rb -gem "bootsnap", require: false - -gem 'sentry-ruby', path: "../../../sentry-ruby" -gem 'sentry-sidekiq', path: "../../../sentry-sidekiq" -gem 'sentry-resque', path: "../../../sentry-resque" -gem 'sentry-delayed_job', path: "../../../sentry-delayed_job" -gem 'sentry-rails', path: "../../" - -gem "resque" -gem "sidekiq" -gem 'delayed_job_active_record' -gem "daemons" - -group :development, :test do - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem "debug", platforms: %i[ mri mingw x64_mingw ] -end - -group :development do - # Use console on exceptions pages [https://github.com/rails/web-console] - gem "web-console" - - # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler] - # gem "rack-mini-profiler" - - # Speed up commands on slow machines / big apps [https://github.com/rails/spring] - # gem "spring" -end - -group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] - gem "capybara" - gem "selenium-webdriver" - gem "webdrivers" - gem "rspec-rails" -end diff --git a/sentry-rails/examples/rails-7.0/README.md b/sentry-rails/examples/rails-7.0/README.md deleted file mode 100644 index 7db80e4ca..000000000 --- a/sentry-rails/examples/rails-7.0/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# README - -This README would normally document whatever steps are necessary to get the -application up and running. - -Things you may want to cover: - -* Ruby version - -* System dependencies - -* Configuration - -* Database creation - -* Database initialization - -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions - -* ... diff --git a/sentry-rails/examples/rails-7.0/Rakefile b/sentry-rails/examples/rails-7.0/Rakefile deleted file mode 100644 index 9a5ea7383..000000000 --- a/sentry-rails/examples/rails-7.0/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require_relative "config/application" - -Rails.application.load_tasks diff --git a/sentry-rails/examples/rails-7.0/app/assets/config/manifest.js b/sentry-rails/examples/rails-7.0/app/assets/config/manifest.js deleted file mode 100644 index 591819335..000000000 --- a/sentry-rails/examples/rails-7.0/app/assets/config/manifest.js +++ /dev/null @@ -1,2 +0,0 @@ -//= link_tree ../images -//= link_directory ../stylesheets .css diff --git a/sentry-rails/examples/rails-7.0/app/assets/images/.keep b/sentry-rails/examples/rails-7.0/app/assets/images/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/application.css b/sentry-rails/examples/rails-7.0/app/assets/stylesheets/application.css deleted file mode 100644 index d05ea0f51..000000000 --- a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/application.css +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's - * vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS - * files in this directory. Styles in this file should be added after the last require_* statement. - * It is generally better to create a new file per style scope. - * - *= require_tree . - *= require_self - */ diff --git a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/posts.scss b/sentry-rails/examples/rails-7.0/app/assets/stylesheets/posts.scss deleted file mode 100644 index 1a7e15390..000000000 --- a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/posts.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the posts controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/scaffolds.scss b/sentry-rails/examples/rails-7.0/app/assets/stylesheets/scaffolds.scss deleted file mode 100644 index 604518803..000000000 --- a/sentry-rails/examples/rails-7.0/app/assets/stylesheets/scaffolds.scss +++ /dev/null @@ -1,84 +0,0 @@ -body { - background-color: #fff; - color: #333; - margin: 33px; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, ol, ul, td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #eee; - padding: 10px; - font-size: 11px; -} - -a { - color: #000; - - &:visited { - color: #666; - } - - &:hover { - color: #fff; - background-color: #000; - } -} - -th { - padding-bottom: 5px; -} - -td { - padding: 0 5px 7px; -} - -div { - &.field, &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - padding: 2px; - background-color: red; - display: table; -} - -#error_explanation { - width: 450px; - border: 2px solid red; - padding: 7px 7px 0; - margin-bottom: 20px; - background-color: #f0f0f0; - - h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px -7px 0; - background-color: #c00; - color: #fff; - } - - ul li { - font-size: 12px; - list-style: square; - } -} - -label { - display: block; -} diff --git a/sentry-rails/examples/rails-7.0/app/channels/appearance_channel.rb b/sentry-rails/examples/rails-7.0/app/channels/appearance_channel.rb deleted file mode 100644 index d84cf4640..000000000 --- a/sentry-rails/examples/rails-7.0/app/channels/appearance_channel.rb +++ /dev/null @@ -1,14 +0,0 @@ -class AppearanceChannel < ApplicationCable::Channel - def subscribed - end - - def unsubscribed - end - - def hello - end - - def goodbye(data) - 1 / 0 - end -end diff --git a/sentry-rails/examples/rails-7.0/app/channels/application_cable/channel.rb b/sentry-rails/examples/rails-7.0/app/channels/application_cable/channel.rb deleted file mode 100644 index d67269728..000000000 --- a/sentry-rails/examples/rails-7.0/app/channels/application_cable/channel.rb +++ /dev/null @@ -1,4 +0,0 @@ -module ApplicationCable - class Channel < ActionCable::Channel::Base - end -end diff --git a/sentry-rails/examples/rails-7.0/app/channels/application_cable/connection.rb b/sentry-rails/examples/rails-7.0/app/channels/application_cable/connection.rb deleted file mode 100644 index ccf8bec21..000000000 --- a/sentry-rails/examples/rails-7.0/app/channels/application_cable/connection.rb +++ /dev/null @@ -1,6 +0,0 @@ -module ApplicationCable - class Connection < ActionCable::Connection::Base - def connect - end - end -end diff --git a/sentry-rails/examples/rails-7.0/app/controllers/application_controller.rb b/sentry-rails/examples/rails-7.0/app/controllers/application_controller.rb deleted file mode 100644 index 09705d12a..000000000 --- a/sentry-rails/examples/rails-7.0/app/controllers/application_controller.rb +++ /dev/null @@ -1,2 +0,0 @@ -class ApplicationController < ActionController::Base -end diff --git a/sentry-rails/examples/rails-7.0/app/controllers/concerns/.keep b/sentry-rails/examples/rails-7.0/app/controllers/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/app/controllers/posts_controller.rb b/sentry-rails/examples/rails-7.0/app/controllers/posts_controller.rb deleted file mode 100644 index 15888b5c2..000000000 --- a/sentry-rails/examples/rails-7.0/app/controllers/posts_controller.rb +++ /dev/null @@ -1,80 +0,0 @@ -class PostsController < ApplicationController - before_action :set_post, only: [:show, :edit, :update, :destroy] - - # GET /posts - # GET /posts.json - def index - @posts = Post.all - end - - # GET /posts/1 - # GET /posts/1.json - def show - @post.cover.attach( - io: File.open(File.join(Rails.root, 'public', 'favicon.ico')), - filename: 'favicon.ico', - identify: false - ) - @post - end - - # GET /posts/new - def new - @post = Post.new - end - - # GET /posts/1/edit - def edit - end - - # POST /posts - # POST /posts.json - def create - @post = Post.new(post_params) - - respond_to do |format| - if @post.save - format.html { redirect_to @post, notice: 'Post was successfully created.' } - format.json { render :show, status: :created, location: @post } - else - format.html { render :new } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # PATCH/PUT /posts/1 - # PATCH/PUT /posts/1.json - def update - respond_to do |format| - if @post.update(post_params) - format.html { redirect_to @post, notice: 'Post was successfully updated.' } - format.json { render :show, status: :ok, location: @post } - else - format.html { render :edit } - format.json { render json: @post.errors, status: :unprocessable_entity } - end - end - end - - # DELETE /posts/1 - # DELETE /posts/1.json - def destroy - @post.destroy - respond_to do |format| - format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } - format.json { head :no_content } - end - end - - private - # Use callbacks to share common setup or constraints between actions. - def set_post - @post = Post.find(params[:id]) - end - - # Only allow a list of trusted parameters through. - def post_params - params.require(:post).permit(:title, :content, :cover) - end -end diff --git a/sentry-rails/examples/rails-7.0/app/controllers/welcome_controller.rb b/sentry-rails/examples/rails-7.0/app/controllers/welcome_controller.rb deleted file mode 100644 index 4375f7511..000000000 --- a/sentry-rails/examples/rails-7.0/app/controllers/welcome_controller.rb +++ /dev/null @@ -1,54 +0,0 @@ -class WelcomeController < ApplicationController - before_action :set_sentry_context - - def index - a = 1 - b = 0 - a / b - end - - def connect_trace - # see the sinatra example under the `sentry-ruby` folder - response = Net::HTTP.get_response(URI("http://localhost:4567/connect_trace")) - - render plain: response.code - end - - def appearance - end - - def view_error - end - - def sidekiq_error - ErrorWorker.perform_async - render plain: "Remember to start sidekiq worker with '$ bundle exec sidekiq'" - end - - def resque_error - Resque.enqueue(RaiseError) - render plain: "Remember to start resque worker with '$ QUEUE=* bundle exec rake resque:work'" - end - - def delayed_job_error - ErrorDelayedJob.delay.perform - render plain: "Remember to start delayed_job worker with '$ bundle exec rake jobs:work'" - end - - def job_error - ErrorJob.perform_later - render plain: "success" - end - - def report_demo - # @sentry_event_id = Raven.last_event_id - render(status: 500) - end - - private - - def set_sentry_context - counter = (Sentry.get_current_scope.tags[:counter] || 0) + 1 - Sentry.set_tags(counter: counter) - end -end diff --git a/sentry-rails/examples/rails-7.0/app/delayed_jobs/error_delayed_job.rb b/sentry-rails/examples/rails-7.0/app/delayed_jobs/error_delayed_job.rb deleted file mode 100644 index b23b0c3ae..000000000 --- a/sentry-rails/examples/rails-7.0/app/delayed_jobs/error_delayed_job.rb +++ /dev/null @@ -1,5 +0,0 @@ -class ErrorDelayedJob - def self.perform - 1/0 - end -end diff --git a/sentry-rails/examples/rails-7.0/app/helpers/application_helper.rb b/sentry-rails/examples/rails-7.0/app/helpers/application_helper.rb deleted file mode 100644 index de6be7945..000000000 --- a/sentry-rails/examples/rails-7.0/app/helpers/application_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module ApplicationHelper -end diff --git a/sentry-rails/examples/rails-7.0/app/helpers/posts_helper.rb b/sentry-rails/examples/rails-7.0/app/helpers/posts_helper.rb deleted file mode 100644 index a7b8cec89..000000000 --- a/sentry-rails/examples/rails-7.0/app/helpers/posts_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module PostsHelper -end diff --git a/sentry-rails/examples/rails-7.0/app/javascript/channels/appearance_channel.js b/sentry-rails/examples/rails-7.0/app/javascript/channels/appearance_channel.js deleted file mode 100644 index fc5feb9a6..000000000 --- a/sentry-rails/examples/rails-7.0/app/javascript/channels/appearance_channel.js +++ /dev/null @@ -1,26 +0,0 @@ -import consumer from './consumer'; - -consumer.subscriptions.create('AppearanceChannel', { - initialized() { - this.hello = this.hello.bind(this); - this.goodbye = this.goodbye.bind(this); - }, - - connected() { - document.querySelector('button#hello').addEventListener('click', this.hello); - document.querySelector('button#goodbye').addEventListener('click', this.goodbye); - }, - - disconnect() { - document.querySelector('button#hello').removeEventListener('click', this.hello); - document.querySelector('button#goodbye').removeEventListener('click', this.goodbye); - }, - - hello() { - this.perform('hello'); - }, - - goodbye() { - this.perform('goodbye', { forever: true }); - } -}); diff --git a/sentry-rails/examples/rails-7.0/app/javascript/channels/consumer.js b/sentry-rails/examples/rails-7.0/app/javascript/channels/consumer.js deleted file mode 100644 index 0eceb59b1..000000000 --- a/sentry-rails/examples/rails-7.0/app/javascript/channels/consumer.js +++ /dev/null @@ -1,6 +0,0 @@ -// Action Cable provides the framework to deal with WebSockets in Rails. -// You can generate new channels where WebSocket features live using the `rails generate channel` command. - -import { createConsumer } from "@rails/actioncable" - -export default createConsumer() diff --git a/sentry-rails/examples/rails-7.0/app/javascript/channels/index.js b/sentry-rails/examples/rails-7.0/app/javascript/channels/index.js deleted file mode 100644 index 0cfcf7491..000000000 --- a/sentry-rails/examples/rails-7.0/app/javascript/channels/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// Load all the channels within this directory and all subdirectories. -// Channel files must be named *_channel.js. - -const channels = require.context('.', true, /_channel\.js$/) -channels.keys().forEach(channels) diff --git a/sentry-rails/examples/rails-7.0/app/javascript/packs/application.js b/sentry-rails/examples/rails-7.0/app/javascript/packs/application.js deleted file mode 100644 index 9cd55d4b9..000000000 --- a/sentry-rails/examples/rails-7.0/app/javascript/packs/application.js +++ /dev/null @@ -1,17 +0,0 @@ -// This file is automatically compiled by Webpack, along with any other files -// present in this directory. You're encouraged to place your actual application logic in -// a relevant structure within app/javascript and only use these pack files to reference -// that code so it'll be compiled. - -require("@rails/ujs").start() -require("turbolinks").start() -require("@rails/activestorage").start() -require("channels") - - -// Uncomment to copy all static images under ../images to the output folder and reference -// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) -// or the `imagePath` JavaScript helper below. -// -// const images = require.context('../images', true) -// const imagePath = (name) => images(name, true) diff --git a/sentry-rails/examples/rails-7.0/app/jobs/application_job.rb b/sentry-rails/examples/rails-7.0/app/jobs/application_job.rb deleted file mode 100644 index d394c3d10..000000000 --- a/sentry-rails/examples/rails-7.0/app/jobs/application_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class ApplicationJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError -end diff --git a/sentry-rails/examples/rails-7.0/app/jobs/error_job.rb b/sentry-rails/examples/rails-7.0/app/jobs/error_job.rb deleted file mode 100644 index f0bb41848..000000000 --- a/sentry-rails/examples/rails-7.0/app/jobs/error_job.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ErrorJob < ApplicationJob - self.queue_adapter = :async - - def perform - a = 1 - b = 2 - raise "Job failed" - end -end diff --git a/sentry-rails/examples/rails-7.0/app/mailers/application_mailer.rb b/sentry-rails/examples/rails-7.0/app/mailers/application_mailer.rb deleted file mode 100644 index 286b2239d..000000000 --- a/sentry-rails/examples/rails-7.0/app/mailers/application_mailer.rb +++ /dev/null @@ -1,4 +0,0 @@ -class ApplicationMailer < ActionMailer::Base - default from: 'from@example.com' - layout 'mailer' -end diff --git a/sentry-rails/examples/rails-7.0/app/models/application_record.rb b/sentry-rails/examples/rails-7.0/app/models/application_record.rb deleted file mode 100644 index 10a4cba84..000000000 --- a/sentry-rails/examples/rails-7.0/app/models/application_record.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationRecord < ActiveRecord::Base - self.abstract_class = true -end diff --git a/sentry-rails/examples/rails-7.0/app/models/concerns/.keep b/sentry-rails/examples/rails-7.0/app/models/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/app/models/post.rb b/sentry-rails/examples/rails-7.0/app/models/post.rb deleted file mode 100644 index f735d001b..000000000 --- a/sentry-rails/examples/rails-7.0/app/models/post.rb +++ /dev/null @@ -1,3 +0,0 @@ -class Post < ApplicationRecord - has_one_attached :cover -end diff --git a/sentry-rails/examples/rails-7.0/app/resque_jobs/raise_error.rb b/sentry-rails/examples/rails-7.0/app/resque_jobs/raise_error.rb deleted file mode 100644 index 596ac0715..000000000 --- a/sentry-rails/examples/rails-7.0/app/resque_jobs/raise_error.rb +++ /dev/null @@ -1,7 +0,0 @@ -class RaiseError - @queue = :default - - def self.perform - 1/0 - end -end diff --git a/sentry-rails/examples/rails-7.0/app/views/layouts/application.html.erb b/sentry-rails/examples/rails-7.0/app/views/layouts/application.html.erb deleted file mode 100644 index 58669e427..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/layouts/application.html.erb +++ /dev/null @@ -1,15 +0,0 @@ - - - - Rails60 - <%= csrf_meta_tags %> - <%= csp_meta_tag %> - - <%# <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %1> %> - <%# <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %1> %> - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.html.erb b/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.html.erb deleted file mode 100644 index cbd34d2e9..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.text.erb b/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.text.erb deleted file mode 100644 index 37f0bddbd..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/layouts/mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/_form.html.erb b/sentry-rails/examples/rails-7.0/app/views/posts/_form.html.erb deleted file mode 100644 index b88a3e593..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/_form.html.erb +++ /dev/null @@ -1,32 +0,0 @@ -<%= form_with(model: post, local: true) do |form| %> - <% if post.errors.any? %> -
-

<%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:

- - -
- <% end %> - -
- <%= form.label :title %> - <%= form.text_field :title %> -
- -
- <%= form.label :content %> - <%= form.text_area :content %> -
- -
- <%= form.label :cover %> - <%= form.file_field :cover %> -
- -
- <%= form.submit %> -
-<% end %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/_post.json.jbuilder b/sentry-rails/examples/rails-7.0/app/views/posts/_post.json.jbuilder deleted file mode 100644 index bdfe92fd2..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/_post.json.jbuilder +++ /dev/null @@ -1,2 +0,0 @@ -json.extract! post, :id, :title, :content, :created_at, :updated_at -json.url post_url(post, format: :json) diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/edit.html.erb b/sentry-rails/examples/rails-7.0/app/views/posts/edit.html.erb deleted file mode 100644 index ded33f77a..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/edit.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -

Editing Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Show', @post %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/index.html.erb b/sentry-rails/examples/rails-7.0/app/views/posts/index.html.erb deleted file mode 100644 index ad63fbf79..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/index.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -

<%= notice %>

- -

Posts

- - - - - - - - - - - - <% @posts.each do |post| %> - - - - - - - - <% end %> - -
TitleContent
<%= post.title %><%= post.content %><%= link_to 'Show', post %><%= link_to 'Edit', edit_post_path(post) %><%= link_to 'Destroy', post, method: :delete, data: { confirm: 'Are you sure?' } %>
- -
- -<%= link_to 'New Post', new_post_path %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/index.json.jbuilder b/sentry-rails/examples/rails-7.0/app/views/posts/index.json.jbuilder deleted file mode 100644 index a3c6f4a0b..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/index.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.array! @posts, partial: "posts/post", as: :post diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/new.html.erb b/sentry-rails/examples/rails-7.0/app/views/posts/new.html.erb deleted file mode 100644 index fb1e2a128..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/new.html.erb +++ /dev/null @@ -1,5 +0,0 @@ -

New Post

- -<%= render 'form', post: @post %> - -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/show.html.erb b/sentry-rails/examples/rails-7.0/app/views/posts/show.html.erb deleted file mode 100644 index 2d94bc731..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/show.html.erb +++ /dev/null @@ -1,19 +0,0 @@ -

<%= notice %>

- -

- Title: - <%= @post.title %> -

- -

- Content: - <%= @post.content %> -

- -

- Cover: - <%= image_tag @post.cover.variant(resize_to_limit: [100, 100]) %> -

- -<%= link_to 'Edit', edit_post_path(@post) %> | -<%= link_to 'Back', posts_path %> diff --git a/sentry-rails/examples/rails-7.0/app/views/posts/show.json.jbuilder b/sentry-rails/examples/rails-7.0/app/views/posts/show.json.jbuilder deleted file mode 100644 index 52744820e..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/posts/show.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! "posts/post", post: @post diff --git a/sentry-rails/examples/rails-7.0/app/views/welcome/appearance.html.erb b/sentry-rails/examples/rails-7.0/app/views/welcome/appearance.html.erb deleted file mode 100644 index e99fe8b2c..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/welcome/appearance.html.erb +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/sentry-rails/examples/rails-7.0/app/views/welcome/report_demo.html.erb b/sentry-rails/examples/rails-7.0/app/views/welcome/report_demo.html.erb deleted file mode 100644 index 4a9c19cb8..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/welcome/report_demo.html.erb +++ /dev/null @@ -1,22 +0,0 @@ - - - - Internal Server Error - - - -

Internal Server Error

- -

='(

- - <% if @sentry_event_id %> - - <% end %> - - - diff --git a/sentry-rails/examples/rails-7.0/app/views/welcome/view_error.html.erb b/sentry-rails/examples/rails-7.0/app/views/welcome/view_error.html.erb deleted file mode 100644 index 9ba7b5ad1..000000000 --- a/sentry-rails/examples/rails-7.0/app/views/welcome/view_error.html.erb +++ /dev/null @@ -1 +0,0 @@ -hey <%= foo %> diff --git a/sentry-rails/examples/rails-7.0/app/workers/error_worker.rb b/sentry-rails/examples/rails-7.0/app/workers/error_worker.rb deleted file mode 100644 index 9edbf87c3..000000000 --- a/sentry-rails/examples/rails-7.0/app/workers/error_worker.rb +++ /dev/null @@ -1,9 +0,0 @@ -class ErrorWorker - include Sidekiq::Worker - sidekiq_options retry: false - - def perform - a = 1 - raise "Worker failed" - end -end diff --git a/sentry-rails/examples/rails-7.0/bin/bundle b/sentry-rails/examples/rails-7.0/bin/bundle deleted file mode 100755 index a71368e32..000000000 --- a/sentry-rails/examples/rails-7.0/bin/bundle +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'bundle' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require "rubygems" - -m = Module.new do - module_function - - def invoked_as_script? - File.expand_path($0) == File.expand_path(__FILE__) - end - - def env_var_version - ENV["BUNDLER_VERSION"] - end - - def cli_arg_version - return unless invoked_as_script? # don't want to hijack other binstubs - return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` - bundler_version = nil - update_index = nil - ARGV.each_with_index do |a, i| - if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN - bundler_version = a - end - next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ - bundler_version = $1 - update_index = i - end - bundler_version - end - - def gemfile - gemfile = ENV["BUNDLE_GEMFILE"] - return gemfile if gemfile && !gemfile.empty? - - File.expand_path("../../Gemfile", __FILE__) - end - - def lockfile - lockfile = - case File.basename(gemfile) - when "gems.rb" then gemfile.sub(/\.rb$/, gemfile) - else "#{gemfile}.lock" - end - File.expand_path(lockfile) - end - - def lockfile_version - return unless File.file?(lockfile) - lockfile_contents = File.read(lockfile) - return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ - Regexp.last_match(1) - end - - def bundler_version - @bundler_version ||= - env_var_version || cli_arg_version || - lockfile_version - end - - def bundler_requirement - return "#{Gem::Requirement.default}.a" unless bundler_version - - bundler_gem_version = Gem::Version.new(bundler_version) - - requirement = bundler_gem_version.approximate_recommendation - - return requirement unless Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.7.0") - - requirement += ".a" if bundler_gem_version.prerelease? - - requirement - end - - def load_bundler! - ENV["BUNDLE_GEMFILE"] ||= gemfile - - activate_bundler - end - - def activate_bundler - gem_error = activation_error_handling do - gem "bundler", bundler_requirement - end - return if gem_error.nil? - require_error = activation_error_handling do - require "bundler/version" - end - return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) - warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" - exit 42 - end - - def activation_error_handling - yield - nil - rescue StandardError, LoadError => e - e - end -end - -m.load_bundler! - -if m.invoked_as_script? - load Gem.bin_path("bundler", "bundle") -end diff --git a/sentry-rails/examples/rails-7.0/bin/rails b/sentry-rails/examples/rails-7.0/bin/rails deleted file mode 100755 index efc037749..000000000 --- a/sentry-rails/examples/rails-7.0/bin/rails +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -APP_PATH = File.expand_path("../config/application", __dir__) -require_relative "../config/boot" -require "rails/commands" diff --git a/sentry-rails/examples/rails-7.0/bin/rake b/sentry-rails/examples/rails-7.0/bin/rake deleted file mode 100755 index 4fbf10b96..000000000 --- a/sentry-rails/examples/rails-7.0/bin/rake +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require_relative "../config/boot" -require "rake" -Rake.application.run diff --git a/sentry-rails/examples/rails-7.0/bin/setup b/sentry-rails/examples/rails-7.0/bin/setup deleted file mode 100755 index ec47b79b3..000000000 --- a/sentry-rails/examples/rails-7.0/bin/setup +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env ruby -require "fileutils" - -# path to your application root. -APP_ROOT = File.expand_path("..", __dir__) - -def system!(*args) - system(*args) || abort("\n== Command #{args} failed ==") -end - -FileUtils.chdir APP_ROOT do - # This script is a way to set up or update your development environment automatically. - # This script is idempotent, so that you can run it at any time and get an expectable outcome. - # Add necessary setup steps to this file. - - puts "== Installing dependencies ==" - system! "gem install bundler --conservative" - system("bundle check") || system!("bundle install") - - # puts "\n== Copying sample files ==" - # unless File.exist?("config/database.yml") - # FileUtils.cp "config/database.yml.sample", "config/database.yml" - # end - - puts "\n== Preparing database ==" - system! "bin/rails db:prepare" - - puts "\n== Removing old logs and tempfiles ==" - system! "bin/rails log:clear tmp:clear" - - puts "\n== Restarting application server ==" - system! "bin/rails restart" -end diff --git a/sentry-rails/examples/rails-7.0/config.ru b/sentry-rails/examples/rails-7.0/config.ru deleted file mode 100644 index 4a3c09a68..000000000 --- a/sentry-rails/examples/rails-7.0/config.ru +++ /dev/null @@ -1,6 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require_relative "config/environment" - -run Rails.application -Rails.application.load_server diff --git a/sentry-rails/examples/rails-7.0/config/application.rb b/sentry-rails/examples/rails-7.0/config/application.rb deleted file mode 100644 index 4eda09121..000000000 --- a/sentry-rails/examples/rails-7.0/config/application.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative "boot" - -require "rails/all" - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) - -module ExampleApp - class Application < Rails::Application - # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 7.0 - - # Configuration for the application, engines, and railties goes here. - # - # These settings can be overridden in specific environments using the files - # in config/environments, which are processed later. - # - # config.time_zone = "Central Time (US & Canada)" - # config.eager_load_paths << Rails.root.join("extras") - end -end diff --git a/sentry-rails/examples/rails-7.0/config/boot.rb b/sentry-rails/examples/rails-7.0/config/boot.rb deleted file mode 100644 index 988a5ddc4..000000000 --- a/sentry-rails/examples/rails-7.0/config/boot.rb +++ /dev/null @@ -1,4 +0,0 @@ -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) - -require "bundler/setup" # Set up gems listed in the Gemfile. -require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/sentry-rails/examples/rails-7.0/config/cable.yml b/sentry-rails/examples/rails-7.0/config/cable.yml deleted file mode 100644 index d77ba7489..000000000 --- a/sentry-rails/examples/rails-7.0/config/cable.yml +++ /dev/null @@ -1,10 +0,0 @@ -development: - adapter: async - -test: - adapter: test - -production: - adapter: redis - url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> - channel_prefix: example_app_production diff --git a/sentry-rails/examples/rails-7.0/config/credentials.yml.enc b/sentry-rails/examples/rails-7.0/config/credentials.yml.enc deleted file mode 100644 index 719489c9c..000000000 --- a/sentry-rails/examples/rails-7.0/config/credentials.yml.enc +++ /dev/null @@ -1 +0,0 @@ -hMzcp7KTXzFwv/URv0QKZFpTPQ7sm+euY78sT1+HM4blQSEHN2M5t9ngtyOlBFL5BXuOBMOeHeAbieS6cfTbxGszRV3tF4BhyzTF8lxpuCbC3Bz39KRO3Z4SW0PiCmE01v9CryvlL7T9cQ33BAGD+g6j5OfFaKZ01nLsLficUKtPKMSVb98k9a/fEGnmBnNaMQ50qr+uZ3ZEEFwmZdpZXUeONmbaJGPRibLMnrl3C8uD0OmHTVj2SahA+IF7pE3z0U5DY7gMeIr26shuuqbKlV/sPNNeeYctL0vH1B5bq4defA1Oh3/QSntyR4+yNBWeWtvKHa37h8Sx6QOnzuu4JcsLZWzJ2Gxv2vgdTK6ay+b5o/NMMPc3VPrfoq5BKQZa6o6KK47NYD1OeUPB8R+6hikSkxAJdA2waoAp--IMbuQeA4ovMZSNMw--XsI3lyNbL2NLWxm6EGstyw== \ No newline at end of file diff --git a/sentry-rails/examples/rails-7.0/config/database.yml b/sentry-rails/examples/rails-7.0/config/database.yml deleted file mode 100644 index fcba57f19..000000000 --- a/sentry-rails/examples/rails-7.0/config/database.yml +++ /dev/null @@ -1,25 +0,0 @@ -# SQLite. Versions 3.8.0 and up are supported. -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem "sqlite3" -# -default: &default - adapter: sqlite3 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - timeout: 5000 - -development: - <<: *default - database: db/development.sqlite3 - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: db/test.sqlite3 - -production: - <<: *default - database: db/production.sqlite3 diff --git a/sentry-rails/examples/rails-7.0/config/environment.rb b/sentry-rails/examples/rails-7.0/config/environment.rb deleted file mode 100644 index cac531577..000000000 --- a/sentry-rails/examples/rails-7.0/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the Rails application. -require_relative "application" - -# Initialize the Rails application. -Rails.application.initialize! diff --git a/sentry-rails/examples/rails-7.0/config/environments/development.rb b/sentry-rails/examples/rails-7.0/config/environments/development.rb deleted file mode 100644 index 8500f459a..000000000 --- a/sentry-rails/examples/rails-7.0/config/environments/development.rb +++ /dev/null @@ -1,70 +0,0 @@ -require "active_support/core_ext/integer/time" - -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # In the development environment your application's code is reloaded any time - # it changes. This slows down response time but is perfect for development - # since you don't have to restart the web server when you make code changes. - config.cache_classes = false - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports. - config.consider_all_requests_local = true - - # Enable server timing - config.server_timing = true - - # Enable/disable caching. By default caching is disabled. - # Run rails dev:cache to toggle caching. - if Rails.root.join("tmp/caching-dev.txt").exist? - config.action_controller.perform_caching = true - config.action_controller.enable_fragment_cache_logging = true - - config.cache_store = :memory_store - config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{2.days.to_i}" - } - else - config.action_controller.perform_caching = false - - config.cache_store = :null_store - end - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - config.action_mailer.perform_caching = false - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise exceptions for disallowed deprecations. - config.active_support.disallowed_deprecation = :raise - - # Tell Active Support which deprecation messages to disallow. - config.active_support.disallowed_deprecation_warnings = [] - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Highlight code that triggered database queries in logs. - config.active_record.verbose_query_logs = true - - # Suppress logger output for asset requests. - config.assets.quiet = true - - # Raises error for missing translations. - # config.i18n.raise_on_missing_translations = true - - # Annotate rendered view with file names. - # config.action_view.annotate_rendered_view_with_filenames = true - - # Uncomment if you wish to allow Action Cable access from any origin. - # config.action_cable.disable_request_forgery_protection = true -end diff --git a/sentry-rails/examples/rails-7.0/config/environments/production.rb b/sentry-rails/examples/rails-7.0/config/environments/production.rb deleted file mode 100644 index 2eac92a44..000000000 --- a/sentry-rails/examples/rails-7.0/config/environments/production.rb +++ /dev/null @@ -1,93 +0,0 @@ -require "active_support/core_ext/integer/time" - -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.cache_classes = true - - # Eager load code on boot. This eager loads most of Rails and - # your application in memory, allowing both threaded web servers - # and those relying on copy on write to perform better. - # Rake tasks automatically ignore this option for performance. - config.eager_load = true - - # Full error reports are disabled and caching is turned on. - config.consider_all_requests_local = false - config.action_controller.perform_caching = true - - # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"] - # or in config/master.key. This key is used to decrypt credentials (and other encrypted files). - # config.require_master_key = true - - # Disable serving static files from the `/public` folder by default since - # Apache or NGINX already handles this. - config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present? - - # Compress CSS using a preprocessor. - # config.assets.css_compressor = :sass - - # Do not fallback to assets pipeline if a precompiled asset is missed. - config.assets.compile = false - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.asset_host = "http://assets.example.com" - - # Specifies the header that your server uses for sending files. - # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache - # config.action_dispatch.x_sendfile_header = "X-Accel-Redirect" # for NGINX - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Mount Action Cable outside main process or domain. - # config.action_cable.mount_path = nil - # config.action_cable.url = "wss://example.com/cable" - # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ] - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - # config.force_ssl = true - - # Include generic and useful information about system operation, but avoid logging too much - # information to avoid inadvertent exposure of personally identifiable information (PII). - config.log_level = :info - - # Prepend all log lines with the following tags. - config.log_tags = [ :request_id ] - - # Use a different cache store in production. - # config.cache_store = :mem_cache_store - - # Use a real queuing backend for Active Job (and separate queues per environment). - # config.active_job.queue_adapter = :resque - # config.active_job.queue_name_prefix = "example_app_production" - - config.action_mailer.perform_caching = false - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Don't log any deprecations. - config.active_support.report_deprecations = false - - # Use default logging formatter so that PID and timestamp are not suppressed. - config.log_formatter = ::Logger::Formatter.new - - # Use a different logger for distributed setups. - # require "syslog/logger" - # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name") - - if ENV["RAILS_LOG_TO_STDOUT"].present? - logger = ActiveSupport::Logger.new(STDOUT) - logger.formatter = config.log_formatter - config.logger = ActiveSupport::TaggedLogging.new(logger) - end - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false -end diff --git a/sentry-rails/examples/rails-7.0/config/environments/test.rb b/sentry-rails/examples/rails-7.0/config/environments/test.rb deleted file mode 100644 index 8a7113441..000000000 --- a/sentry-rails/examples/rails-7.0/config/environments/test.rb +++ /dev/null @@ -1,60 +0,0 @@ -require "active_support/core_ext/integer/time" - -# The test environment is used exclusively to run your application's -# test suite. You never need to work with it otherwise. Remember that -# your test database is "scratch space" for the test suite and is wiped -# and recreated between test runs. Don't rely on the data there! - -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Turn false under Spring and add config.action_view.cache_template_loading = true. - config.cache_classes = true - - # Eager loading loads your whole application. When running a single test locally, - # this probably isn't necessary. It's a good idea to do in a continuous integration - # system, or in some way before deploying your code. - config.eager_load = ENV["CI"].present? - - # Configure public file server for tests with Cache-Control for performance. - config.public_file_server.enabled = true - config.public_file_server.headers = { - "Cache-Control" => "public, max-age=#{1.hour.to_i}" - } - - # Show full error reports and disable caching. - config.consider_all_requests_local = true - config.action_controller.perform_caching = false - config.cache_store = :null_store - - # Raise exceptions instead of rendering exception templates. - config.action_dispatch.show_exceptions = true - - # Disable request forgery protection in test environment. - config.action_controller.allow_forgery_protection = false - - # Store uploaded files on the local file system in a temporary directory. - config.active_storage.service = :test - - config.action_mailer.perform_caching = false - - # Tell Action Mailer not to deliver emails to the real world. - # The :test delivery method accumulates sent emails in the - # ActionMailer::Base.deliveries array. - config.action_mailer.delivery_method = :test - - # Print deprecation notices to the stderr. - config.active_support.deprecation = :stderr - - # Raise exceptions for disallowed deprecations. - config.active_support.disallowed_deprecation = :raise - - # Tell Active Support which deprecation messages to disallow. - config.active_support.disallowed_deprecation_warnings = [] - - # Raises error for missing translations. - # config.i18n.raise_on_missing_translations = true - - # Annotate rendered view with file names. - # config.action_view.annotate_rendered_view_with_filenames = true -end diff --git a/sentry-rails/examples/rails-7.0/config/initializers/assets.rb b/sentry-rails/examples/rails-7.0/config/initializers/assets.rb deleted file mode 100644 index 2eeef966f..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/assets.rb +++ /dev/null @@ -1,12 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = "1.0" - -# Add additional assets to the asset load path. -# Rails.application.config.assets.paths << Emoji.images_path - -# Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in the app/assets -# folder are already added. -# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/sentry-rails/examples/rails-7.0/config/initializers/content_security_policy.rb b/sentry-rails/examples/rails-7.0/config/initializers/content_security_policy.rb deleted file mode 100644 index 3621f97f8..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/content_security_policy.rb +++ /dev/null @@ -1,26 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Define an application-wide content security policy -# For further information see the following documentation -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy - -# Rails.application.configure do -# config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" -# end -# -# # Generate session nonces for permitted importmap and inline scripts -# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } -# config.content_security_policy_nonce_directives = %w(script-src) -# -# # Report CSP violations to a specified URI. See: -# # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only -# # config.content_security_policy_report_only = true -# end diff --git a/sentry-rails/examples/rails-7.0/config/initializers/filter_parameter_logging.rb b/sentry-rails/examples/rails-7.0/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index adc6568ce..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure parameters to be filtered from the log file. Use this to limit dissemination of -# sensitive information. See the ActiveSupport::ParameterFilter documentation for supported -# notations and behaviors. -Rails.application.config.filter_parameters += [ - :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn -] diff --git a/sentry-rails/examples/rails-7.0/config/initializers/inflections.rb b/sentry-rails/examples/rails-7.0/config/initializers/inflections.rb deleted file mode 100644 index 3860f659e..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/inflections.rb +++ /dev/null @@ -1,16 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, "\\1en" -# inflect.singular /^(ox)en/i, "\\1" -# inflect.irregular "person", "people" -# inflect.uncountable %w( fish sheep ) -# end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym "RESTful" -# end diff --git a/sentry-rails/examples/rails-7.0/config/initializers/permissions_policy.rb b/sentry-rails/examples/rails-7.0/config/initializers/permissions_policy.rb deleted file mode 100644 index 00f64d71b..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/permissions_policy.rb +++ /dev/null @@ -1,11 +0,0 @@ -# Define an application-wide HTTP permissions policy. For further -# information see https://developers.google.com/web/updates/2018/06/feature-policy -# -# Rails.application.config.permissions_policy do |f| -# f.camera :none -# f.gyroscope :none -# f.microphone :none -# f.usb :none -# f.fullscreen :self -# f.payment :self, "https://secure.example.com" -# end diff --git a/sentry-rails/examples/rails-7.0/config/initializers/sentry.rb b/sentry-rails/examples/rails-7.0/config/initializers/sentry.rb deleted file mode 100644 index c0b0d08fb..000000000 --- a/sentry-rails/examples/rails-7.0/config/initializers/sentry.rb +++ /dev/null @@ -1,14 +0,0 @@ -Sentry.init do |config| - config.breadcrumbs_logger = [:active_support_logger] - config.background_worker_threads = 0 - config.send_default_pii = true - config.traces_sample_rate = 1.0 # set a float between 0.0 and 1.0 to enable performance monitoring - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.release = `git branch --show-current` - config.capture_exception_frame_locals = true - # you can use the pre-defined job for the async callback - # - # config.async = lambda do |event, hint| - # Sentry::SendEventJob.perform_later(event, hint) - # end -end diff --git a/sentry-rails/examples/rails-7.0/config/locales/en.yml b/sentry-rails/examples/rails-7.0/config/locales/en.yml deleted file mode 100644 index 8ca56fc74..000000000 --- a/sentry-rails/examples/rails-7.0/config/locales/en.yml +++ /dev/null @@ -1,33 +0,0 @@ -# Files in the config/locales directory are used for internationalization -# and are automatically loaded by Rails. If you want to use locales other -# than English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t "hello" -# -# In views, this is aliased to just `t`: -# -# <%= t("hello") %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# The following keys must be escaped otherwise they will not be retrieved by -# the default I18n backend: -# -# true, false, on, off, yes, no -# -# Instead, surround them with single quotes. -# -# en: -# "true": "foo" -# -# To learn more, please read the Rails Internationalization guide -# available at https://guides.rubyonrails.org/i18n.html. - -en: - hello: "Hello world" diff --git a/sentry-rails/examples/rails-7.0/config/puma.rb b/sentry-rails/examples/rails-7.0/config/puma.rb deleted file mode 100644 index daaf03699..000000000 --- a/sentry-rails/examples/rails-7.0/config/puma.rb +++ /dev/null @@ -1,43 +0,0 @@ -# Puma can serve each request in a thread from an internal thread pool. -# The `threads` method setting takes two numbers: a minimum and maximum. -# Any libraries that use thread pools should be configured to match -# the maximum value specified for Puma. Default is set to 5 threads for minimum -# and maximum; this matches the default thread size of Active Record. -# -max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } -min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } -threads min_threads_count, max_threads_count - -# Specifies the `worker_timeout` threshold that Puma will use to wait before -# terminating a worker in development environments. -# -worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. -# -port ENV.fetch("PORT") { 3000 } - -# Specifies the `environment` that Puma will run in. -# -environment ENV.fetch("RAILS_ENV") { "development" } - -# Specifies the `pidfile` that Puma will use. -pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } - -# Specifies the number of `workers` to boot in clustered mode. -# Workers are forked web server processes. If using threads and workers together -# the concurrency of the application would be max `threads` * `workers`. -# Workers do not work on JRuby or Windows (both of which do not support -# processes). -# -# workers ENV.fetch("WEB_CONCURRENCY") { 2 } - -# Use the `preload_app!` method when specifying a `workers` number. -# This directive tells Puma to first boot the application and load code -# before forking the application. This takes advantage of Copy On Write -# process behavior so workers use less memory. -# -# preload_app! - -# Allow puma to be restarted by `bin/rails restart` command. -plugin :tmp_restart diff --git a/sentry-rails/examples/rails-7.0/config/routes.rb b/sentry-rails/examples/rails-7.0/config/routes.rb deleted file mode 100644 index 71b6a5f73..000000000 --- a/sentry-rails/examples/rails-7.0/config/routes.rb +++ /dev/null @@ -1,20 +0,0 @@ -require "resque/server" - -Rails.application.routes.draw do - resources :posts - get '500', to: 'welcome#report_demo' - root to: "welcome#index" - - get 'appearance', to: 'welcome#appearance' - get 'connect_trace', to: 'welcome#connect_trace' - get 'view_error', to: 'welcome#view_error' - get 'sidekiq_error', to: 'welcome#sidekiq_error' - get 'resque_error', to: 'welcome#resque_error' - get 'delayed_job_error', to: 'welcome#delayed_job_error' - get 'job_error', to: 'welcome#job_error' - - require 'sidekiq/web' - - mount Sidekiq::Web => '/sidekiq' - mount Resque::Server.new, at: "/resque" -end diff --git a/sentry-rails/examples/rails-7.0/config/storage.yml b/sentry-rails/examples/rails-7.0/config/storage.yml deleted file mode 100644 index 4942ab669..000000000 --- a/sentry-rails/examples/rails-7.0/config/storage.yml +++ /dev/null @@ -1,34 +0,0 @@ -test: - service: Disk - root: <%= Rails.root.join("tmp/storage") %> - -local: - service: Disk - root: <%= Rails.root.join("storage") %> - -# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) -# amazon: -# service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> -# region: us-east-1 -# bucket: your_own_bucket-<%= Rails.env %> - -# Remember not to checkin your GCS keyfile to a repository -# google: -# service: GCS -# project: your_project -# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> -# bucket: your_own_bucket-<%= Rails.env %> - -# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) -# microsoft: -# service: AzureStorage -# storage_account_name: your_account_name -# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> -# container: your_container_name-<%= Rails.env %> - -# mirror: -# service: Mirror -# primary: local -# mirrors: [ amazon, google, microsoft ] diff --git a/sentry-rails/examples/rails-7.0/db/migrate/20220403110436_create_posts.rb b/sentry-rails/examples/rails-7.0/db/migrate/20220403110436_create_posts.rb deleted file mode 100644 index 4117623a9..000000000 --- a/sentry-rails/examples/rails-7.0/db/migrate/20220403110436_create_posts.rb +++ /dev/null @@ -1,10 +0,0 @@ -class CreatePosts < ActiveRecord::Migration[7.0] - def change - create_table :posts do |t| - t.string :title - t.text :content - - t.timestamps - end - end -end diff --git a/sentry-rails/examples/rails-7.0/db/schema.rb b/sentry-rails/examples/rails-7.0/db/schema.rb deleted file mode 100644 index a72ad45be..000000000 --- a/sentry-rails/examples/rails-7.0/db/schema.rb +++ /dev/null @@ -1,20 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# This file is the source Rails uses to define your schema when running `bin/rails -# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to -# be faster and is potentially less error prone than running all of your -# migrations from scratch. Old migrations may fail to apply correctly if those -# migrations use external dependencies or application code. -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema[7.0].define(version: 2022_04_03_110436) do - create_table "posts", force: :cascade do |t| - t.string "title" - t.text "content" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - end -end diff --git a/sentry-rails/examples/rails-7.0/db/seeds.rb b/sentry-rails/examples/rails-7.0/db/seeds.rb deleted file mode 100644 index bc25fce30..000000000 --- a/sentry-rails/examples/rails-7.0/db/seeds.rb +++ /dev/null @@ -1,7 +0,0 @@ -# This file should contain all the record creation needed to seed the database with its default values. -# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). -# -# Examples: -# -# movies = Movie.create([{ name: "Star Wars" }, { name: "Lord of the Rings" }]) -# Character.create(name: "Luke", movie: movies.first) diff --git a/sentry-rails/examples/rails-7.0/lib/assets/.keep b/sentry-rails/examples/rails-7.0/lib/assets/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/lib/tasks/.keep b/sentry-rails/examples/rails-7.0/lib/tasks/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/public/404.html b/sentry-rails/examples/rails-7.0/public/404.html deleted file mode 100644 index 2be3af26f..000000000 --- a/sentry-rails/examples/rails-7.0/public/404.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The page you were looking for doesn't exist (404) - - - - - - -
-
-

The page you were looking for doesn't exist.

-

You may have mistyped the address or the page may have moved.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-7.0/public/422.html b/sentry-rails/examples/rails-7.0/public/422.html deleted file mode 100644 index c08eac0d1..000000000 --- a/sentry-rails/examples/rails-7.0/public/422.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - The change you wanted was rejected (422) - - - - - - -
-
-

The change you wanted was rejected.

-

Maybe you tried to change something you didn't have access to.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-7.0/public/500.html b/sentry-rails/examples/rails-7.0/public/500.html deleted file mode 100644 index 78a030af2..000000000 --- a/sentry-rails/examples/rails-7.0/public/500.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - We're sorry, but something went wrong (500) - - - - - - -
-
-

We're sorry, but something went wrong.

-
-

If you are the application owner check the logs for more information.

-
- - diff --git a/sentry-rails/examples/rails-7.0/public/apple-touch-icon-precomposed.png b/sentry-rails/examples/rails-7.0/public/apple-touch-icon-precomposed.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/public/apple-touch-icon.png b/sentry-rails/examples/rails-7.0/public/apple-touch-icon.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/public/favicon.ico b/sentry-rails/examples/rails-7.0/public/favicon.ico deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/public/robots.txt b/sentry-rails/examples/rails-7.0/public/robots.txt deleted file mode 100644 index c19f78ab6..000000000 --- a/sentry-rails/examples/rails-7.0/public/robots.txt +++ /dev/null @@ -1 +0,0 @@ -# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/sentry-rails/examples/rails-7.0/spec/rails_helper.rb b/sentry-rails/examples/rails-7.0/spec/rails_helper.rb deleted file mode 100644 index 20a6881d1..000000000 --- a/sentry-rails/examples/rails-7.0/spec/rails_helper.rb +++ /dev/null @@ -1,67 +0,0 @@ -# This file is copied to spec/ when you run 'rails generate rspec:install' -require 'spec_helper' -ENV['RAILS_ENV'] ||= 'test' -require_relative '../config/environment' -# Prevent database truncation if the environment is production -abort("The Rails environment is running in production mode!") if Rails.env.production? -require 'rspec/rails' -require 'sentry/test_helper' - -# Add additional requires below this line. Rails is not loaded until this point! - -# Requires supporting ruby files with custom matchers and macros, etc, in -# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are -# run as spec files by default. This means that files in spec/support that end -# in _spec.rb will both be required and run as specs, causing the specs to be -# run twice. It is recommended that you do not name files matching this glob to -# end with _spec.rb. You can configure this pattern with the --pattern -# option on the command line or in ~/.rspec, .rspec or `.rspec-local`. -# -# The following line is provided for convenience purposes. It has the downside -# of increasing the boot-up time by auto-requiring all files in the support -# directory. Alternatively, in the individual `*_spec.rb` files, manually -# require only the support files necessary. -# -# Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f } - -# Checks for pending migrations and applies them before tests are run. -# If you are not using ActiveRecord, you can remove these lines. -begin - ActiveRecord::Migration.maintain_test_schema! -rescue ActiveRecord::PendingMigrationError => e - puts e.to_s.strip - exit 1 -end -RSpec.configure do |config| - config.include Sentry::TestHelper - # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures - config.fixture_path = "#{::Rails.root}/spec/fixtures" - - # If you're not using ActiveRecord, or you'd prefer not to run each of your - # examples within a transaction, remove the following line or assign false - # instead of true. - config.use_transactional_fixtures = true - - # You can uncomment this line to turn off ActiveRecord support entirely. - # config.use_active_record = false - - # RSpec Rails can automatically mix in different behaviours to your tests - # based on their file location, for example enabling you to call `get` and - # `post` in specs under `spec/controllers`. - # - # You can disable this behaviour by removing the line below, and instead - # explicitly tag your specs with their type, e.g.: - # - # RSpec.describe UsersController, type: :controller do - # # ... - # end - # - # The different available types are documented in the features, such as in - # https://relishapp.com/rspec/rspec-rails/docs - config.infer_spec_type_from_file_location! - - # Filter lines from Rails gems in backtraces. - config.filter_rails_from_backtrace! - # arbitrary gems may also be filtered via: - # config.filter_gems_from_backtrace("gem name") -end diff --git a/sentry-rails/examples/rails-7.0/spec/requests/welcomes_spec.rb b/sentry-rails/examples/rails-7.0/spec/requests/welcomes_spec.rb deleted file mode 100644 index 6ec8f5bcc..000000000 --- a/sentry-rails/examples/rails-7.0/spec/requests/welcomes_spec.rb +++ /dev/null @@ -1,45 +0,0 @@ -require 'rails_helper' - -RSpec.describe "Welcomes", type: :request do - before do - setup_sentry_test - end - - after do - teardown_sentry_test - end - - describe "GET /" do - it "captures and sends exception to Sentry" do - get "/" - expect(response).to have_http_status(500) - expect(sentry_events.count).to eq(2) - - error_event = sentry_events.first - expect(error_event.transaction).to eq("WelcomeController#index") - error = extract_sentry_exceptions(error_event).first - expect(error.type).to eq("ZeroDivisionError") - expect(error_event.tags).to match(counter: 1, request_id: anything) - - transaction_event = sentry_events.last - expect(transaction_event.spans.count).to eq(3) - end - end - - describe "GET /view_error" do - it "captures and sends exception to Sentry" do - get "/view_error" - expect(response).to have_http_status(500) - expect(sentry_events.count).to eq(2) - - error_event = sentry_events.first - expect(error_event.transaction).to eq("WelcomeController#view_error") - error = extract_sentry_exceptions(error_event).first - expect(error.type).to eq("NameError") - expect(error_event.tags).to match(counter: 1, request_id: anything) - - transaction_event = sentry_events.last - expect(transaction_event.spans.count).to eq(4) - end - end -end diff --git a/sentry-rails/examples/rails-7.0/spec/spec_helper.rb b/sentry-rails/examples/rails-7.0/spec/spec_helper.rb deleted file mode 100644 index a0d408059..000000000 --- a/sentry-rails/examples/rails-7.0/spec/spec_helper.rb +++ /dev/null @@ -1,94 +0,0 @@ -# This file was generated by the `rails generate rspec:install` command. Conventionally, all -# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`. -# The generated `.rspec` file contains `--require spec_helper` which will cause -# this file to always be loaded, without a need to explicitly require it in any -# files. -# -# Given that it is always loaded, you are encouraged to keep this file as -# light-weight as possible. Requiring heavyweight dependencies from this file -# will add to the boot time of your test suite on EVERY test run, even for an -# individual file that may not need all of that loaded. Instead, consider making -# a separate helper file that requires the additional dependencies and performs -# the additional setup, and require it from the spec files that actually need -# it. -# -# See https://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration -RSpec.configure do |config| - # rspec-expectations config goes here. You can use an alternate - # assertion/expectation library such as wrong or the stdlib/minitest - # assertions if you prefer. - config.expect_with :rspec do |expectations| - # This option will default to `true` in RSpec 4. It makes the `description` - # and `failure_message` of custom matchers include text for helper methods - # defined using `chain`, e.g.: - # be_bigger_than(2).and_smaller_than(4).description - # # => "be bigger than 2 and smaller than 4" - # ...rather than: - # # => "be bigger than 2" - expectations.include_chain_clauses_in_custom_matcher_descriptions = true - end - - # rspec-mocks config goes here. You can use an alternate test double - # library (such as bogus or mocha) by changing the `mock_with` option here. - config.mock_with :rspec do |mocks| - # Prevents you from mocking or stubbing a method that does not exist on - # a real object. This is generally recommended, and will default to - # `true` in RSpec 4. - mocks.verify_partial_doubles = true - end - - # This option will default to `:apply_to_host_groups` in RSpec 4 (and will - # have no way to turn it off -- the option exists only for backwards - # compatibility in RSpec 3). It causes shared context metadata to be - # inherited by the metadata hash of host groups and examples, rather than - # triggering implicit auto-inclusion in groups with matching metadata. - config.shared_context_metadata_behavior = :apply_to_host_groups - -# The settings below are suggested to provide a good initial experience -# with RSpec, but feel free to customize to your heart's content. -=begin - # This allows you to limit a spec run to individual examples or groups - # you care about by tagging them with `:focus` metadata. When nothing - # is tagged with `:focus`, all examples get run. RSpec also provides - # aliases for `it`, `describe`, and `context` that include `:focus` - # metadata: `fit`, `fdescribe` and `fcontext`, respectively. - config.filter_run_when_matching :focus - - # Allows RSpec to persist some state between runs in order to support - # the `--only-failures` and `--next-failure` CLI options. We recommend - # you configure your source control system to ignore this file. - config.example_status_persistence_file_path = "spec/examples.txt" - - # Limits the available syntax to the non-monkey patched syntax that is - # recommended. For more details, see: - # https://relishapp.com/rspec/rspec-core/docs/configuration/zero-monkey-patching-mode - config.disable_monkey_patching! - - # Many RSpec users commonly either run the entire suite or an individual - # file, and it's useful to allow more verbose output when running an - # individual spec file. - if config.files_to_run.one? - # Use the documentation formatter for detailed output, - # unless a formatter has already been configured - # (e.g. via a command-line flag). - config.default_formatter = "doc" - end - - # Print the 10 slowest examples and example groups at the - # end of the spec run, to help surface which specs are running - # particularly slow. - config.profile_examples = 10 - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 - config.order = :random - - # Seed global randomization in this process using the `--seed` CLI option. - # Setting this allows you to use `--seed` to deterministically reproduce - # test failures related to randomization by passing the same `--seed` value - # as the one that triggered the failure. - Kernel.srand config.seed -=end -end diff --git a/sentry-rails/examples/rails-7.0/storage/.keep b/sentry-rails/examples/rails-7.0/storage/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/application_system_test_case.rb b/sentry-rails/examples/rails-7.0/test/application_system_test_case.rb deleted file mode 100644 index d19212abd..000000000 --- a/sentry-rails/examples/rails-7.0/test/application_system_test_case.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :chrome, screen_size: [1400, 1400] -end diff --git a/sentry-rails/examples/rails-7.0/test/channels/application_cable/connection_test.rb b/sentry-rails/examples/rails-7.0/test/channels/application_cable/connection_test.rb deleted file mode 100644 index 800405f15..000000000 --- a/sentry-rails/examples/rails-7.0/test/channels/application_cable/connection_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require "test_helper" - -class ApplicationCable::ConnectionTest < ActionCable::Connection::TestCase - # test "connects with cookies" do - # cookies.signed[:user_id] = 42 - # - # connect - # - # assert_equal connection.user_id, "42" - # end -end diff --git a/sentry-rails/examples/rails-7.0/test/controllers/.keep b/sentry-rails/examples/rails-7.0/test/controllers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/fixtures/files/.keep b/sentry-rails/examples/rails-7.0/test/fixtures/files/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/helpers/.keep b/sentry-rails/examples/rails-7.0/test/helpers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/integration/.keep b/sentry-rails/examples/rails-7.0/test/integration/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/mailers/.keep b/sentry-rails/examples/rails-7.0/test/mailers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/models/.keep b/sentry-rails/examples/rails-7.0/test/models/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/system/.keep b/sentry-rails/examples/rails-7.0/test/system/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-7.0/test/test_helper.rb b/sentry-rails/examples/rails-7.0/test/test_helper.rb deleted file mode 100644 index d713e377c..000000000 --- a/sentry-rails/examples/rails-7.0/test/test_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -ENV["RAILS_ENV"] ||= "test" -require_relative "../config/environment" -require "rails/test_help" - -class ActiveSupport::TestCase - # Run tests in parallel with specified workers - parallelize(workers: :number_of_processors) - - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/sentry-rails/examples/rails-7.0/vendor/.keep b/sentry-rails/examples/rails-7.0/vendor/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/.dockerignore b/sentry-rails/examples/rails-8.0/.dockerignore deleted file mode 100644 index 325bfc036..000000000 --- a/sentry-rails/examples/rails-8.0/.dockerignore +++ /dev/null @@ -1,51 +0,0 @@ -# See https://docs.docker.com/engine/reference/builder/#dockerignore-file for more about ignoring files. - -# Ignore git directory. -/.git/ -/.gitignore - -# Ignore bundler config. -/.bundle - -# Ignore all environment files. -/.env* - -# Ignore all default key files. -/config/master.key -/config/credentials/*.key - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore pidfiles, but keep the directory. -/tmp/pids/* -!/tmp/pids/.keep - -# Ignore storage (uploaded files in development and any SQLite databases). -/storage/* -!/storage/.keep -/tmp/storage/* -!/tmp/storage/.keep - -# Ignore assets. -/node_modules/ -/app/assets/builds/* -!/app/assets/builds/.keep -/public/assets - -# Ignore CI service files. -/.github - -# Ignore Kamal files. -/config/deploy*.yml -/.kamal - -# Ignore development files -/.devcontainer - -# Ignore Docker-related files -/.dockerignore -/Dockerfile* diff --git a/sentry-rails/examples/rails-8.0/.gitattributes b/sentry-rails/examples/rails-8.0/.gitattributes deleted file mode 100644 index 8dc432343..000000000 --- a/sentry-rails/examples/rails-8.0/.gitattributes +++ /dev/null @@ -1,9 +0,0 @@ -# See https://git-scm.com/docs/gitattributes for more about git attribute files. - -# Mark the database schema as having been generated. -db/schema.rb linguist-generated - -# Mark any vendored files as having been vendored. -vendor/* linguist-vendored -config/credentials/*.yml.enc diff=rails_credentials -config/credentials.yml.enc diff=rails_credentials diff --git a/sentry-rails/examples/rails-8.0/.github/dependabot.yml b/sentry-rails/examples/rails-8.0/.github/dependabot.yml deleted file mode 100644 index f0527e6be..000000000 --- a/sentry-rails/examples/rails-8.0/.github/dependabot.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: 2 -updates: -- package-ecosystem: bundler - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 -- package-ecosystem: github-actions - directory: "/" - schedule: - interval: daily - open-pull-requests-limit: 10 diff --git a/sentry-rails/examples/rails-8.0/.github/workflows/ci.yml b/sentry-rails/examples/rails-8.0/.github/workflows/ci.yml deleted file mode 100644 index abb548b40..000000000 --- a/sentry-rails/examples/rails-8.0/.github/workflows/ci.yml +++ /dev/null @@ -1,90 +0,0 @@ -name: CI - -on: - pull_request: - push: - branches: [ main ] - -jobs: - scan_ruby: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: .ruby-version - bundler-cache: true - - - name: Scan for common Rails security vulnerabilities using static analysis - run: bin/brakeman --no-pager - - scan_js: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: .ruby-version - bundler-cache: true - - - name: Scan for security vulnerabilities in JavaScript dependencies - run: bin/importmap audit - - lint: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: .ruby-version - bundler-cache: true - - - name: Lint code for consistent style - run: bin/rubocop -f github - - test: - runs-on: ubuntu-latest - - # services: - # redis: - # image: redis - # ports: - # - 6379:6379 - # options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 - steps: - - name: Install packages - run: sudo apt-get update && sudo apt-get install --no-install-recommends -y build-essential git pkg-config google-chrome-stable - - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: .ruby-version - bundler-cache: true - - - name: Run tests - env: - RAILS_ENV: test - # REDIS_URL: redis://localhost:6379/0 - run: bin/rails db:test:prepare test test:system - - - name: Keep screenshots from failed system tests - uses: actions/upload-artifact@v4 - if: failure() - with: - name: screenshots - path: ${{ github.workspace }}/tmp/screenshots - if-no-files-found: ignore diff --git a/sentry-rails/examples/rails-8.0/.gitignore b/sentry-rails/examples/rails-8.0/.gitignore deleted file mode 100644 index f92525ca5..000000000 --- a/sentry-rails/examples/rails-8.0/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# Temporary files generated by your text editor or operating system -# belong in git's global ignore instead: -# `$XDG_CONFIG_HOME/git/ignore` or `~/.config/git/ignore` - -# Ignore bundler config. -/.bundle - -# Ignore all environment files. -/.env* - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore pidfiles, but keep the directory. -/tmp/pids/* -!/tmp/pids/ -!/tmp/pids/.keep - -# Ignore storage (uploaded files in development and any SQLite databases). -/storage/* -!/storage/.keep -/tmp/storage/* -!/tmp/storage/ -!/tmp/storage/.keep - -/public/assets - -# Ignore master key for decrypting credentials and more. -/config/master.key diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/docker-setup.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/docker-setup.sample deleted file mode 100755 index 2fb07d7d7..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/docker-setup.sample +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -echo "Docker set up on $KAMAL_HOSTS..." diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/post-deploy.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/post-deploy.sample deleted file mode 100755 index 75efafc10..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/post-deploy.sample +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -# A sample post-deploy hook -# -# These environment variables are available: -# KAMAL_RECORDED_AT -# KAMAL_PERFORMER -# KAMAL_VERSION -# KAMAL_HOSTS -# KAMAL_ROLE (if set) -# KAMAL_DESTINATION (if set) -# KAMAL_RUNTIME - -echo "$KAMAL_PERFORMER deployed $KAMAL_VERSION to $KAMAL_DESTINATION in $KAMAL_RUNTIME seconds" diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/post-proxy-reboot.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/post-proxy-reboot.sample deleted file mode 100755 index 1435a677f..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/post-proxy-reboot.sample +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -echo "Rebooted kamal-proxy on $KAMAL_HOSTS" diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-build.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-build.sample deleted file mode 100755 index f87d81130..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-build.sample +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -# A sample pre-build hook -# -# Checks: -# 1. We have a clean checkout -# 2. A remote is configured -# 3. The branch has been pushed to the remote -# 4. The version we are deploying matches the remote -# -# These environment variables are available: -# KAMAL_RECORDED_AT -# KAMAL_PERFORMER -# KAMAL_VERSION -# KAMAL_HOSTS -# KAMAL_ROLE (if set) -# KAMAL_DESTINATION (if set) - -if [ -n "$(git status --porcelain)" ]; then - echo "Git checkout is not clean, aborting..." >&2 - git status --porcelain >&2 - exit 1 -fi - -first_remote=$(git remote) - -if [ -z "$first_remote" ]; then - echo "No git remote set, aborting..." >&2 - exit 1 -fi - -current_branch=$(git branch --show-current) - -if [ -z "$current_branch" ]; then - echo "Not on a git branch, aborting..." >&2 - exit 1 -fi - -remote_head=$(git ls-remote $first_remote --tags $current_branch | cut -f1) - -if [ -z "$remote_head" ]; then - echo "Branch not pushed to remote, aborting..." >&2 - exit 1 -fi - -if [ "$KAMAL_VERSION" != "$remote_head" ]; then - echo "Version ($KAMAL_VERSION) does not match remote HEAD ($remote_head), aborting..." >&2 - exit 1 -fi - -exit 0 diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-connect.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-connect.sample deleted file mode 100755 index 18e61d7e5..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-connect.sample +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env ruby - -# A sample pre-connect check -# -# Warms DNS before connecting to hosts in parallel -# -# These environment variables are available: -# KAMAL_RECORDED_AT -# KAMAL_PERFORMER -# KAMAL_VERSION -# KAMAL_HOSTS -# KAMAL_ROLE (if set) -# KAMAL_DESTINATION (if set) -# KAMAL_RUNTIME - -hosts = ENV["KAMAL_HOSTS"].split(",") -results = nil -max = 3 - -elapsed = Benchmark.realtime do - results = hosts.map do |host| - Thread.new do - tries = 1 - - begin - Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) - rescue SocketError - if tries < max - puts "Retrying DNS warmup: #{host}" - tries += 1 - sleep rand - retry - else - puts "DNS warmup failed: #{host}" - host - end - end - - tries - end - end.map(&:value) -end - -retries = results.sum - hosts.size -nopes = results.count { |r| r == max } - -puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ] diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-deploy.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-deploy.sample deleted file mode 100755 index 1b280c719..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-deploy.sample +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env ruby - -# A sample pre-deploy hook -# -# Checks the Github status of the build, waiting for a pending build to complete for up to 720 seconds. -# -# Fails unless the combined status is "success" -# -# These environment variables are available: -# KAMAL_RECORDED_AT -# KAMAL_PERFORMER -# KAMAL_VERSION -# KAMAL_HOSTS -# KAMAL_COMMAND -# KAMAL_SUBCOMMAND -# KAMAL_ROLE (if set) -# KAMAL_DESTINATION (if set) - -# Only check the build status for production deployments -if ENV["KAMAL_COMMAND"] == "rollback" || ENV["KAMAL_DESTINATION"] != "production" - exit 0 -end - -require "bundler/inline" - -# true = install gems so this is fast on repeat invocations -gemfile(true, quiet: true) do - source "https://rubygems.org" - - gem "octokit" - gem "faraday-retry" -end - -MAX_ATTEMPTS = 72 -ATTEMPTS_GAP = 10 - -def exit_with_error(message) - $stderr.puts message - exit 1 -end - -class GithubStatusChecks - attr_reader :remote_url, :git_sha, :github_client, :combined_status - - def initialize - @remote_url = `git config --get remote.origin.url`.strip.delete_prefix("https://github.com/") - @git_sha = `git rev-parse HEAD`.strip - @github_client = Octokit::Client.new(access_token: ENV["GITHUB_TOKEN"]) - refresh! - end - - def refresh! - @combined_status = github_client.combined_status(remote_url, git_sha) - end - - def state - combined_status[:state] - end - - def first_status_url - first_status = combined_status[:statuses].find { |status| status[:state] == state } - first_status && first_status[:target_url] - end - - def complete_count - combined_status[:statuses].count { |status| status[:state] != "pending"} - end - - def total_count - combined_status[:statuses].count - end - - def current_status - if total_count > 0 - "Completed #{complete_count}/#{total_count} checks, see #{first_status_url} ..." - else - "Build not started..." - end - end -end - - -$stdout.sync = true - -puts "Checking build status..." -attempts = 0 -checks = GithubStatusChecks.new - -begin - loop do - case checks.state - when "success" - puts "Checks passed, see #{checks.first_status_url}" - exit 0 - when "failure" - exit_with_error "Checks failed, see #{checks.first_status_url}" - when "pending" - attempts += 1 - end - - exit_with_error "Checks are still pending, gave up after #{MAX_ATTEMPTS * ATTEMPTS_GAP} seconds" if attempts == MAX_ATTEMPTS - - puts checks.current_status - sleep(ATTEMPTS_GAP) - checks.refresh! - end -rescue Octokit::NotFound - exit_with_error "Build status could not be found" -end diff --git a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-proxy-reboot.sample b/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-proxy-reboot.sample deleted file mode 100755 index 061f8059e..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/hooks/pre-proxy-reboot.sample +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -echo "Rebooting kamal-proxy on $KAMAL_HOSTS..." diff --git a/sentry-rails/examples/rails-8.0/.kamal/secrets b/sentry-rails/examples/rails-8.0/.kamal/secrets deleted file mode 100644 index 9a771a398..000000000 --- a/sentry-rails/examples/rails-8.0/.kamal/secrets +++ /dev/null @@ -1,17 +0,0 @@ -# Secrets defined here are available for reference under registry/password, env/secret, builder/secrets, -# and accessories/*/env/secret in config/deploy.yml. All secrets should be pulled from either -# password manager, ENV, or a file. DO NOT ENTER RAW CREDENTIALS HERE! This file needs to be safe for git. - -# Example of extracting secrets from 1password (or another compatible pw manager) -# SECRETS=$(kamal secrets fetch --adapter 1password --account your-account --from Vault/Item KAMAL_REGISTRY_PASSWORD RAILS_MASTER_KEY) -# KAMAL_REGISTRY_PASSWORD=$(kamal secrets extract KAMAL_REGISTRY_PASSWORD ${SECRETS}) -# RAILS_MASTER_KEY=$(kamal secrets extract RAILS_MASTER_KEY ${SECRETS}) - -# Use a GITHUB_TOKEN if private repositories are needed for the image -# GITHUB_TOKEN=$(gh config get -h github.com oauth_token) - -# Grab the registry password from ENV -KAMAL_REGISTRY_PASSWORD=$KAMAL_REGISTRY_PASSWORD - -# Improve security by using a password manager. Never check config/master.key into git! -RAILS_MASTER_KEY=$(cat config/master.key) diff --git a/sentry-rails/examples/rails-8.0/.rubocop.yml b/sentry-rails/examples/rails-8.0/.rubocop.yml deleted file mode 100644 index f9d86d4a5..000000000 --- a/sentry-rails/examples/rails-8.0/.rubocop.yml +++ /dev/null @@ -1,8 +0,0 @@ -# Omakase Ruby styling for Rails -inherit_gem: { rubocop-rails-omakase: rubocop.yml } - -# Overwrite or add rules to create your own house style -# -# # Use `[a, [b, c]]` not `[ a, [ b, c ] ]` -# Layout/SpaceInsideArrayLiteralBrackets: -# Enabled: false diff --git a/sentry-rails/examples/rails-8.0/Dockerfile b/sentry-rails/examples/rails-8.0/Dockerfile deleted file mode 100644 index d9124f6c9..000000000 --- a/sentry-rails/examples/rails-8.0/Dockerfile +++ /dev/null @@ -1,72 +0,0 @@ -# syntax=docker/dockerfile:1 -# check=error=true - -# This Dockerfile is designed for production, not development. Use with Kamal or build'n'run by hand: -# docker build -t rails_8_0 . -# docker run -d -p 80:80 -e RAILS_MASTER_KEY= --name rails_8_0 rails_8_0 - -# For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html - -# Make sure RUBY_VERSION matches the Ruby version in .ruby-version -ARG RUBY_VERSION=3.3.1 -FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base - -# Rails app lives here -WORKDIR /rails - -# Install base packages -RUN apt-get update -qq && \ - apt-get install --no-install-recommends -y curl libjemalloc2 libvips sqlite3 && \ - rm -rf /var/lib/apt/lists /var/cache/apt/archives - -# Set production environment -ENV RAILS_ENV="production" \ - BUNDLE_DEPLOYMENT="1" \ - BUNDLE_PATH="/usr/local/bundle" \ - BUNDLE_WITHOUT="development" - -# Throw-away build stage to reduce size of final image -FROM base AS build - -# Install packages needed to build gems -RUN apt-get update -qq && \ - apt-get install --no-install-recommends -y build-essential git pkg-config && \ - rm -rf /var/lib/apt/lists /var/cache/apt/archives - -# Install application gems -COPY Gemfile Gemfile.lock ./ -RUN bundle install && \ - rm -rf ~/.bundle/ "${BUNDLE_PATH}"/ruby/*/cache "${BUNDLE_PATH}"/ruby/*/bundler/gems/*/.git && \ - bundle exec bootsnap precompile --gemfile - -# Copy application code -COPY . . - -# Precompile bootsnap code for faster boot times -RUN bundle exec bootsnap precompile app/ lib/ - -# Precompiling assets for production without requiring secret RAILS_MASTER_KEY -RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile - - - - -# Final stage for app image -FROM base - -# Copy built artifacts: gems, application -COPY --from=build "${BUNDLE_PATH}" "${BUNDLE_PATH}" -COPY --from=build /rails /rails - -# Run and own only the runtime files as a non-root user for security -RUN groupadd --system --gid 1000 rails && \ - useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \ - chown -R rails:rails db log storage tmp -USER 1000:1000 - -# Entrypoint prepares the database. -ENTRYPOINT ["/rails/bin/docker-entrypoint"] - -# Start server via Thruster by default, this can be overwritten at runtime -EXPOSE 80 -CMD ["./bin/thrust", "./bin/rails", "server"] diff --git a/sentry-rails/examples/rails-8.0/Gemfile b/sentry-rails/examples/rails-8.0/Gemfile deleted file mode 100644 index 47f4a0f86..000000000 --- a/sentry-rails/examples/rails-8.0/Gemfile +++ /dev/null @@ -1,66 +0,0 @@ -source "https://rubygems.org" - -# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" -gem "rails", "~> 8.0.1" -# The modern asset pipeline for Rails [https://github.com/rails/propshaft] -gem "propshaft" -# Use sqlite3 as the database for Active Record -gem "sqlite3", ">= 2.1" -# Use the Puma web server [https://github.com/puma/puma] -gem "puma", ">= 5.0" -# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails] -gem "importmap-rails" -# Hotwire's SPA-like page accelerator [https://turbo.hotwired.dev] -gem "turbo-rails" -# Hotwire's modest JavaScript framework [https://stimulus.hotwired.dev] -gem "stimulus-rails" -# Build JSON APIs with ease [https://github.com/rails/jbuilder] -gem "jbuilder" - -# Use Active Model has_secure_password [https://guides.rubyonrails.org/active_model_basics.html#securepassword] -# gem "bcrypt", "~> 3.1.7" - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: %i[ windows jruby ] - -# Use the database-backed adapters for Rails.cache, Active Job, and Action Cable -gem "solid_cache" -gem "solid_queue" -gem "solid_cable" - -# Reduces boot times through caching; required in config/boot.rb -gem "bootsnap", require: false - -# Deploy this application anywhere as a Docker container [https://kamal-deploy.org] -gem "kamal", require: false - -# Add HTTP asset caching/compression and X-Sendfile acceleration to Puma [https://github.com/basecamp/thruster/] -gem "thruster", require: false - -# Use Active Storage variants [https://guides.rubyonrails.org/active_storage_overview.html#transforming-images] -# gem "image_processing", "~> 1.2" - -group :development, :test do - # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem "debug", platforms: %i[ mri windows ], require: "debug/prelude" - - # Static analysis for security vulnerabilities [https://brakemanscanner.org/] - gem "brakeman", require: false - - # Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/] - gem "rubocop-rails-omakase", require: false -end - -group :development do - # Use console on exceptions pages [https://github.com/rails/web-console] - gem "web-console" -end - -group :test do - # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] - gem "capybara" - gem "selenium-webdriver" -end - -gem "sentry-rails", path: "../../" -gem "sentry-ruby", path: "../../../sentry-ruby" diff --git a/sentry-rails/examples/rails-8.0/README.md b/sentry-rails/examples/rails-8.0/README.md deleted file mode 100644 index 7db80e4ca..000000000 --- a/sentry-rails/examples/rails-8.0/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# README - -This README would normally document whatever steps are necessary to get the -application up and running. - -Things you may want to cover: - -* Ruby version - -* System dependencies - -* Configuration - -* Database creation - -* Database initialization - -* How to run the test suite - -* Services (job queues, cache servers, search engines, etc.) - -* Deployment instructions - -* ... diff --git a/sentry-rails/examples/rails-8.0/Rakefile b/sentry-rails/examples/rails-8.0/Rakefile deleted file mode 100644 index 9a5ea7383..000000000 --- a/sentry-rails/examples/rails-8.0/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -# Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. - -require_relative "config/application" - -Rails.application.load_tasks diff --git a/sentry-rails/examples/rails-8.0/app/assets/images/.keep b/sentry-rails/examples/rails-8.0/app/assets/images/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/app/assets/stylesheets/application.css b/sentry-rails/examples/rails-8.0/app/assets/stylesheets/application.css deleted file mode 100644 index fe93333c0..000000000 --- a/sentry-rails/examples/rails-8.0/app/assets/stylesheets/application.css +++ /dev/null @@ -1,10 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css. - * - * With Propshaft, assets are served efficiently without preprocessing steps. You can still include - * application-wide styles in this file, but keep in mind that CSS precedence will follow the standard - * cascading order, meaning styles declared later in the document or manifest will override earlier ones, - * depending on specificity. - * - * Consider organizing styles into separate files for maintainability. - */ diff --git a/sentry-rails/examples/rails-8.0/app/controllers/application_controller.rb b/sentry-rails/examples/rails-8.0/app/controllers/application_controller.rb deleted file mode 100644 index 0d95db22b..000000000 --- a/sentry-rails/examples/rails-8.0/app/controllers/application_controller.rb +++ /dev/null @@ -1,4 +0,0 @@ -class ApplicationController < ActionController::Base - # Only allow modern browsers supporting webp images, web push, badges, import maps, CSS nesting, and CSS :has. - allow_browser versions: :modern -end diff --git a/sentry-rails/examples/rails-8.0/app/controllers/concerns/.keep b/sentry-rails/examples/rails-8.0/app/controllers/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/app/helpers/application_helper.rb b/sentry-rails/examples/rails-8.0/app/helpers/application_helper.rb deleted file mode 100644 index de6be7945..000000000 --- a/sentry-rails/examples/rails-8.0/app/helpers/application_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module ApplicationHelper -end diff --git a/sentry-rails/examples/rails-8.0/app/javascript/application.js b/sentry-rails/examples/rails-8.0/app/javascript/application.js deleted file mode 100644 index 0d7b49404..000000000 --- a/sentry-rails/examples/rails-8.0/app/javascript/application.js +++ /dev/null @@ -1,3 +0,0 @@ -// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails -import "@hotwired/turbo-rails" -import "controllers" diff --git a/sentry-rails/examples/rails-8.0/app/javascript/controllers/application.js b/sentry-rails/examples/rails-8.0/app/javascript/controllers/application.js deleted file mode 100644 index 1213e85c7..000000000 --- a/sentry-rails/examples/rails-8.0/app/javascript/controllers/application.js +++ /dev/null @@ -1,9 +0,0 @@ -import { Application } from "@hotwired/stimulus" - -const application = Application.start() - -// Configure Stimulus development experience -application.debug = false -window.Stimulus = application - -export { application } diff --git a/sentry-rails/examples/rails-8.0/app/javascript/controllers/hello_controller.js b/sentry-rails/examples/rails-8.0/app/javascript/controllers/hello_controller.js deleted file mode 100644 index 5975c0789..000000000 --- a/sentry-rails/examples/rails-8.0/app/javascript/controllers/hello_controller.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Controller } from "@hotwired/stimulus" - -export default class extends Controller { - connect() { - this.element.textContent = "Hello World!" - } -} diff --git a/sentry-rails/examples/rails-8.0/app/javascript/controllers/index.js b/sentry-rails/examples/rails-8.0/app/javascript/controllers/index.js deleted file mode 100644 index 1156bf836..000000000 --- a/sentry-rails/examples/rails-8.0/app/javascript/controllers/index.js +++ /dev/null @@ -1,4 +0,0 @@ -// Import and register all your controllers from the importmap via controllers/**/*_controller -import { application } from "controllers/application" -import { eagerLoadControllersFrom } from "@hotwired/stimulus-loading" -eagerLoadControllersFrom("controllers", application) diff --git a/sentry-rails/examples/rails-8.0/app/jobs/application_job.rb b/sentry-rails/examples/rails-8.0/app/jobs/application_job.rb deleted file mode 100644 index d394c3d10..000000000 --- a/sentry-rails/examples/rails-8.0/app/jobs/application_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class ApplicationJob < ActiveJob::Base - # Automatically retry jobs that encountered a deadlock - # retry_on ActiveRecord::Deadlocked - - # Most jobs are safe to ignore if the underlying records are no longer available - # discard_on ActiveJob::DeserializationError -end diff --git a/sentry-rails/examples/rails-8.0/app/jobs/error_job.rb b/sentry-rails/examples/rails-8.0/app/jobs/error_job.rb deleted file mode 100644 index 6d3723253..000000000 --- a/sentry-rails/examples/rails-8.0/app/jobs/error_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -class ErrorJob < ApplicationJob - queue_as :default - - def perform(*args) - foo - end -end diff --git a/sentry-rails/examples/rails-8.0/app/mailers/application_mailer.rb b/sentry-rails/examples/rails-8.0/app/mailers/application_mailer.rb deleted file mode 100644 index 3c34c8148..000000000 --- a/sentry-rails/examples/rails-8.0/app/mailers/application_mailer.rb +++ /dev/null @@ -1,4 +0,0 @@ -class ApplicationMailer < ActionMailer::Base - default from: "from@example.com" - layout "mailer" -end diff --git a/sentry-rails/examples/rails-8.0/app/models/application_record.rb b/sentry-rails/examples/rails-8.0/app/models/application_record.rb deleted file mode 100644 index b63caeb8a..000000000 --- a/sentry-rails/examples/rails-8.0/app/models/application_record.rb +++ /dev/null @@ -1,3 +0,0 @@ -class ApplicationRecord < ActiveRecord::Base - primary_abstract_class -end diff --git a/sentry-rails/examples/rails-8.0/app/models/concerns/.keep b/sentry-rails/examples/rails-8.0/app/models/concerns/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/app/views/layouts/application.html.erb b/sentry-rails/examples/rails-8.0/app/views/layouts/application.html.erb deleted file mode 100644 index cd69b0e8d..000000000 --- a/sentry-rails/examples/rails-8.0/app/views/layouts/application.html.erb +++ /dev/null @@ -1,28 +0,0 @@ - - - - <%= content_for(:title) || "Rails 8 0" %> - - - - <%= csrf_meta_tags %> - <%= csp_meta_tag %> - - <%= yield :head %> - - <%# Enable PWA manifest for installable apps (make sure to enable in config/routes.rb too!) %> - <%#= tag.link rel: "manifest", href: pwa_manifest_path(format: :json) %> - - - - - - <%# Includes all stylesheet files in app/assets/stylesheets %> - <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %> - <%= javascript_importmap_tags %> - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.html.erb b/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.html.erb deleted file mode 100644 index 3aac9002e..000000000 --- a/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - <%= yield %> - - diff --git a/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.text.erb b/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.text.erb deleted file mode 100644 index 37f0bddbd..000000000 --- a/sentry-rails/examples/rails-8.0/app/views/layouts/mailer.text.erb +++ /dev/null @@ -1 +0,0 @@ -<%= yield %> diff --git a/sentry-rails/examples/rails-8.0/app/views/pwa/manifest.json.erb b/sentry-rails/examples/rails-8.0/app/views/pwa/manifest.json.erb deleted file mode 100644 index 7416da152..000000000 --- a/sentry-rails/examples/rails-8.0/app/views/pwa/manifest.json.erb +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "Rails80", - "icons": [ - { - "src": "/icon.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "/icon.png", - "type": "image/png", - "sizes": "512x512", - "purpose": "maskable" - } - ], - "start_url": "/", - "display": "standalone", - "scope": "/", - "description": "Rails80.", - "theme_color": "red", - "background_color": "red" -} diff --git a/sentry-rails/examples/rails-8.0/app/views/pwa/service-worker.js b/sentry-rails/examples/rails-8.0/app/views/pwa/service-worker.js deleted file mode 100644 index b3a13fb7b..000000000 --- a/sentry-rails/examples/rails-8.0/app/views/pwa/service-worker.js +++ /dev/null @@ -1,26 +0,0 @@ -// Add a service worker for processing Web Push notifications: -// -// self.addEventListener("push", async (event) => { -// const { title, options } = await event.data.json() -// event.waitUntil(self.registration.showNotification(title, options)) -// }) -// -// self.addEventListener("notificationclick", function(event) { -// event.notification.close() -// event.waitUntil( -// clients.matchAll({ type: "window" }).then((clientList) => { -// for (let i = 0; i < clientList.length; i++) { -// let client = clientList[i] -// let clientPath = (new URL(client.url)).pathname -// -// if (clientPath == event.notification.data.path && "focus" in client) { -// return client.focus() -// } -// } -// -// if (clients.openWindow) { -// return clients.openWindow(event.notification.data.path) -// } -// }) -// ) -// }) diff --git a/sentry-rails/examples/rails-8.0/bin/brakeman b/sentry-rails/examples/rails-8.0/bin/brakeman deleted file mode 100755 index ace1c9ba0..000000000 --- a/sentry-rails/examples/rails-8.0/bin/brakeman +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env ruby -require "rubygems" -require "bundler/setup" - -ARGV.unshift("--ensure-latest") - -load Gem.bin_path("brakeman", "brakeman") diff --git a/sentry-rails/examples/rails-8.0/bin/bundle b/sentry-rails/examples/rails-8.0/bin/bundle deleted file mode 100755 index 50da5fdf9..000000000 --- a/sentry-rails/examples/rails-8.0/bin/bundle +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'bundle' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require "rubygems" - -m = Module.new do - module_function - - def invoked_as_script? - File.expand_path($0) == File.expand_path(__FILE__) - end - - def env_var_version - ENV["BUNDLER_VERSION"] - end - - def cli_arg_version - return unless invoked_as_script? # don't want to hijack other binstubs - return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` - bundler_version = nil - update_index = nil - ARGV.each_with_index do |a, i| - if update_index && update_index.succ == i && a.match?(Gem::Version::ANCHORED_VERSION_PATTERN) - bundler_version = a - end - next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ - bundler_version = $1 - update_index = i - end - bundler_version - end - - def gemfile - gemfile = ENV["BUNDLE_GEMFILE"] - return gemfile if gemfile && !gemfile.empty? - - File.expand_path("../Gemfile", __dir__) - end - - def lockfile - lockfile = - case File.basename(gemfile) - when "gems.rb" then gemfile.sub(/\.rb$/, ".locked") - else "#{gemfile}.lock" - end - File.expand_path(lockfile) - end - - def lockfile_version - return unless File.file?(lockfile) - lockfile_contents = File.read(lockfile) - return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ - Regexp.last_match(1) - end - - def bundler_requirement - @bundler_requirement ||= - env_var_version || - cli_arg_version || - bundler_requirement_for(lockfile_version) - end - - def bundler_requirement_for(version) - return "#{Gem::Requirement.default}.a" unless version - - bundler_gem_version = Gem::Version.new(version) - - bundler_gem_version.approximate_recommendation - end - - def load_bundler! - ENV["BUNDLE_GEMFILE"] ||= gemfile - - activate_bundler - end - - def activate_bundler - gem_error = activation_error_handling do - gem "bundler", bundler_requirement - end - return if gem_error.nil? - require_error = activation_error_handling do - require "bundler/version" - end - return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) - warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" - exit 42 - end - - def activation_error_handling - yield - nil - rescue StandardError, LoadError => e - e - end -end - -m.load_bundler! - -if m.invoked_as_script? - load Gem.bin_path("bundler", "bundle") -end diff --git a/sentry-rails/examples/rails-8.0/bin/dev b/sentry-rails/examples/rails-8.0/bin/dev deleted file mode 100755 index 5f91c2054..000000000 --- a/sentry-rails/examples/rails-8.0/bin/dev +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env ruby -exec "./bin/rails", "server", *ARGV diff --git a/sentry-rails/examples/rails-8.0/bin/docker-entrypoint b/sentry-rails/examples/rails-8.0/bin/docker-entrypoint deleted file mode 100755 index 57567d69b..000000000 --- a/sentry-rails/examples/rails-8.0/bin/docker-entrypoint +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -e - -# Enable jemalloc for reduced memory usage and latency. -if [ -z "${LD_PRELOAD+x}" ]; then - LD_PRELOAD=$(find /usr/lib -name libjemalloc.so.2 -print -quit) - export LD_PRELOAD -fi - -# If running the rails server then create or migrate existing database -if [ "${@: -2:1}" == "./bin/rails" ] && [ "${@: -1:1}" == "server" ]; then - ./bin/rails db:prepare -fi - -exec "${@}" diff --git a/sentry-rails/examples/rails-8.0/bin/importmap b/sentry-rails/examples/rails-8.0/bin/importmap deleted file mode 100755 index 36502ab16..000000000 --- a/sentry-rails/examples/rails-8.0/bin/importmap +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby - -require_relative "../config/application" -require "importmap/commands" diff --git a/sentry-rails/examples/rails-8.0/bin/jobs b/sentry-rails/examples/rails-8.0/bin/jobs deleted file mode 100755 index dcf59f309..000000000 --- a/sentry-rails/examples/rails-8.0/bin/jobs +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env ruby - -require_relative "../config/environment" -require "solid_queue/cli" - -SolidQueue::Cli.start(ARGV) diff --git a/sentry-rails/examples/rails-8.0/bin/kamal b/sentry-rails/examples/rails-8.0/bin/kamal deleted file mode 100755 index cbe59b95e..000000000 --- a/sentry-rails/examples/rails-8.0/bin/kamal +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env ruby -# frozen_string_literal: true - -# -# This file was generated by Bundler. -# -# The application 'kamal' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) - -bundle_binstub = File.expand_path("bundle", __dir__) - -if File.file?(bundle_binstub) - if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") - load(bundle_binstub) - else - abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. -Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") - end -end - -require "rubygems" -require "bundler/setup" - -load Gem.bin_path("kamal", "kamal") diff --git a/sentry-rails/examples/rails-8.0/bin/rails b/sentry-rails/examples/rails-8.0/bin/rails deleted file mode 100755 index efc037749..000000000 --- a/sentry-rails/examples/rails-8.0/bin/rails +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -APP_PATH = File.expand_path("../config/application", __dir__) -require_relative "../config/boot" -require "rails/commands" diff --git a/sentry-rails/examples/rails-8.0/bin/rake b/sentry-rails/examples/rails-8.0/bin/rake deleted file mode 100755 index 4fbf10b96..000000000 --- a/sentry-rails/examples/rails-8.0/bin/rake +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require_relative "../config/boot" -require "rake" -Rake.application.run diff --git a/sentry-rails/examples/rails-8.0/bin/rubocop b/sentry-rails/examples/rails-8.0/bin/rubocop deleted file mode 100755 index 40330c0ff..000000000 --- a/sentry-rails/examples/rails-8.0/bin/rubocop +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env ruby -require "rubygems" -require "bundler/setup" - -# explicit rubocop config increases performance slightly while avoiding config confusion. -ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__)) - -load Gem.bin_path("rubocop", "rubocop") diff --git a/sentry-rails/examples/rails-8.0/bin/setup b/sentry-rails/examples/rails-8.0/bin/setup deleted file mode 100755 index be3db3c0d..000000000 --- a/sentry-rails/examples/rails-8.0/bin/setup +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env ruby -require "fileutils" - -APP_ROOT = File.expand_path("..", __dir__) - -def system!(*args) - system(*args, exception: true) -end - -FileUtils.chdir APP_ROOT do - # This script is a way to set up or update your development environment automatically. - # This script is idempotent, so that you can run it at any time and get an expectable outcome. - # Add necessary setup steps to this file. - - puts "== Installing dependencies ==" - system("bundle check") || system!("bundle install") - - # puts "\n== Copying sample files ==" - # unless File.exist?("config/database.yml") - # FileUtils.cp "config/database.yml.sample", "config/database.yml" - # end - - puts "\n== Preparing database ==" - system! "bin/rails db:prepare" - - puts "\n== Removing old logs and tempfiles ==" - system! "bin/rails log:clear tmp:clear" - - unless ARGV.include?("--skip-server") - puts "\n== Starting development server ==" - STDOUT.flush # flush the output before exec(2) so that it displays - exec "bin/dev" - end -end diff --git a/sentry-rails/examples/rails-8.0/bin/thrust b/sentry-rails/examples/rails-8.0/bin/thrust deleted file mode 100755 index 36bde2d83..000000000 --- a/sentry-rails/examples/rails-8.0/bin/thrust +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env ruby -require "rubygems" -require "bundler/setup" - -load Gem.bin_path("thruster", "thrust") diff --git a/sentry-rails/examples/rails-8.0/config.ru b/sentry-rails/examples/rails-8.0/config.ru deleted file mode 100644 index 4a3c09a68..000000000 --- a/sentry-rails/examples/rails-8.0/config.ru +++ /dev/null @@ -1,6 +0,0 @@ -# This file is used by Rack-based servers to start the application. - -require_relative "config/environment" - -run Rails.application -Rails.application.load_server diff --git a/sentry-rails/examples/rails-8.0/config/application.rb b/sentry-rails/examples/rails-8.0/config/application.rb deleted file mode 100644 index 8b056fd7b..000000000 --- a/sentry-rails/examples/rails-8.0/config/application.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative "boot" - -require "rails/all" - -# Require the gems listed in Gemfile, including any gems -# you've limited to :test, :development, or :production. -Bundler.require(*Rails.groups) - -module Rails80 - class Application < Rails::Application - # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 8.0 - - # Please, add to the `ignore` list any other `lib` subdirectories that do - # not contain `.rb` files, or that should not be reloaded or eager loaded. - # Common ones are `templates`, `generators`, or `middleware`, for example. - config.autoload_lib(ignore: %w[assets tasks]) - - # Configuration for the application, engines, and railties goes here. - # - # These settings can be overridden in specific environments using the files - # in config/environments, which are processed later. - # - # config.time_zone = "Central Time (US & Canada)" - # config.eager_load_paths << Rails.root.join("extras") - end -end diff --git a/sentry-rails/examples/rails-8.0/config/boot.rb b/sentry-rails/examples/rails-8.0/config/boot.rb deleted file mode 100644 index 988a5ddc4..000000000 --- a/sentry-rails/examples/rails-8.0/config/boot.rb +++ /dev/null @@ -1,4 +0,0 @@ -ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) - -require "bundler/setup" # Set up gems listed in the Gemfile. -require "bootsnap/setup" # Speed up boot time by caching expensive operations. diff --git a/sentry-rails/examples/rails-8.0/config/cable.yml b/sentry-rails/examples/rails-8.0/config/cable.yml deleted file mode 100644 index b9adc5aa3..000000000 --- a/sentry-rails/examples/rails-8.0/config/cable.yml +++ /dev/null @@ -1,17 +0,0 @@ -# Async adapter only works within the same process, so for manually triggering cable updates from a console, -# and seeing results in the browser, you must do so from the web console (running inside the dev process), -# not a terminal started via bin/rails console! Add "console" to any action or any ERB template view -# to make the web console appear. -development: - adapter: async - -test: - adapter: test - -production: - adapter: solid_cable - connects_to: - database: - writing: cable - polling_interval: 0.1.seconds - message_retention: 1.day diff --git a/sentry-rails/examples/rails-8.0/config/cache.yml b/sentry-rails/examples/rails-8.0/config/cache.yml deleted file mode 100644 index 19d490843..000000000 --- a/sentry-rails/examples/rails-8.0/config/cache.yml +++ /dev/null @@ -1,16 +0,0 @@ -default: &default - store_options: - # Cap age of oldest cache entry to fulfill retention policies - # max_age: <%= 60.days.to_i %> - max_size: <%= 256.megabytes %> - namespace: <%= Rails.env %> - -development: - <<: *default - -test: - <<: *default - -production: - database: cache - <<: *default diff --git a/sentry-rails/examples/rails-8.0/config/credentials.yml.enc b/sentry-rails/examples/rails-8.0/config/credentials.yml.enc deleted file mode 100644 index 5d5f3e075..000000000 --- a/sentry-rails/examples/rails-8.0/config/credentials.yml.enc +++ /dev/null @@ -1 +0,0 @@ -E+SIdgyaMdcLJJ1uDfpAixhzBM/NtLAAAei4QsxywnDDfUHLO/Xt0Epk8rFz2v4B3NBBjj04p08rDLSxIzOLHZC5rbknqTt7gpqkPwtxrnaqml7hOI6H/NKg4ORBppsw3uksdTwwxZHz7ZMj+wAycf4bbiSnnyRikAffxCy93ckZBeGTj7c11laGzF+M1hGPsFZn7vU2ZqTYGXBNE+zw3Dh3Uhg8CeyyKk02O5x06StyeLLOIsXVM3KoFnyORn2NxLerFOHueXFAEDZKQnnVxaYxXuAkBBEOVVh7SGHbJOXqWoSxnqKhVg92+apQFsCnjkjEJ6bUONtym3an1K+T43GsTOzAhGKPT+u0+fDYgZEC7nscOjekPJTPxR9sjVEelaQHmOCCzgvUio0jxsMc+ecDFq3MUmoxz7ofG27IvzwWSTJETJMzOcukOePxfaXt8BHiQ80Vkm0EgAz6jMcFGPxqb06vHeCll206/x3gENKd0cOr0rK0vl1t--nfjbRzwAXJP+xi5h--t+Gj+uuKI40mdFBWYeGHKg== \ No newline at end of file diff --git a/sentry-rails/examples/rails-8.0/config/database.yml b/sentry-rails/examples/rails-8.0/config/database.yml deleted file mode 100644 index 6d01b6394..000000000 --- a/sentry-rails/examples/rails-8.0/config/database.yml +++ /dev/null @@ -1,47 +0,0 @@ -# SQLite. Versions 3.8.0 and up are supported. -# gem install sqlite3 -# -# Ensure the SQLite 3 gem is defined in your Gemfile -# gem "sqlite3" -# -default: &default - adapter: sqlite3 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> - timeout: 5000 - -development: - primary: - <<: *default - database: storage/development.sqlite3 - queue: - <<: *default - database: storage/development_queue.sqlite3 - migrations_paths: db/queue_migrate - - -# Warning: The database defined as "test" will be erased and -# re-generated from your development database when you run "rake". -# Do not set this db to the same as development or production. -test: - <<: *default - database: storage/test.sqlite3 - - -# Store production database in the storage/ directory, which by default -# is mounted as a persistent Docker volume in config/deploy.yml. -production: - primary: - <<: *default - database: storage/production.sqlite3 - cache: - <<: *default - database: storage/production_cache.sqlite3 - migrations_paths: db/cache_migrate - queue: - <<: *default - database: storage/production_queue.sqlite3 - migrations_paths: db/queue_migrate - cable: - <<: *default - database: storage/production_cable.sqlite3 - migrations_paths: db/cable_migrate diff --git a/sentry-rails/examples/rails-8.0/config/deploy.yml b/sentry-rails/examples/rails-8.0/config/deploy.yml deleted file mode 100644 index c527ec0ee..000000000 --- a/sentry-rails/examples/rails-8.0/config/deploy.yml +++ /dev/null @@ -1,116 +0,0 @@ -# Name of your application. Used to uniquely configure containers. -service: rails_8_0 - -# Name of the container image. -image: your-user/rails_8_0 - -# Deploy to these servers. -servers: - web: - - 192.168.0.1 - # job: - # hosts: - # - 192.168.0.1 - # cmd: bin/jobs - -# Enable SSL auto certification via Let's Encrypt and allow for multiple apps on a single web server. -# Remove this section when using multiple web servers and ensure you terminate SSL at your load balancer. -# -# Note: If using Cloudflare, set encryption mode in SSL/TLS setting to "Full" to enable CF-to-app encryption. -proxy: - ssl: true - host: app.example.com - -# Credentials for your image host. -registry: - # Specify the registry server, if you're not using Docker Hub - # server: registry.digitalocean.com / ghcr.io / ... - username: your-user - - # Always use an access token rather than real password when possible. - password: - - KAMAL_REGISTRY_PASSWORD - -# Inject ENV variables into containers (secrets come from .kamal/secrets). -env: - secret: - - RAILS_MASTER_KEY - clear: - # Run the Solid Queue Supervisor inside the web server's Puma process to do jobs. - # When you start using multiple servers, you should split out job processing to a dedicated machine. - SOLID_QUEUE_IN_PUMA: true - - # Set number of processes dedicated to Solid Queue (default: 1) - # JOB_CONCURRENCY: 3 - - # Set number of cores available to the application on each server (default: 1). - # WEB_CONCURRENCY: 2 - - # Match this to any external database server to configure Active Record correctly - # Use rails_8_0-db for a db accessory server on same machine via local kamal docker network. - # DB_HOST: 192.168.0.2 - - # Log everything from Rails - # RAILS_LOG_LEVEL: debug - -# Aliases are triggered with "bin/kamal ". You can overwrite arguments on invocation: -# "bin/kamal logs -r job" will tail logs from the first server in the job section. -aliases: - console: app exec --interactive --reuse "bin/rails console" - shell: app exec --interactive --reuse "bash" - logs: app logs -f - dbc: app exec --interactive --reuse "bin/rails dbconsole" - - -# Use a persistent storage volume for sqlite database files and local Active Storage files. -# Recommended to change this to a mounted volume path that is backed up off server. -volumes: - - "rails_8_0_storage:/rails/storage" - - -# Bridge fingerprinted assets, like JS and CSS, between versions to avoid -# hitting 404 on in-flight requests. Combines all files from new and old -# version inside the asset_path. -asset_path: /rails/public/assets - -# Configure the image builder. -builder: - arch: amd64 - - # # Build image via remote server (useful for faster amd64 builds on arm64 computers) - # remote: ssh://docker@docker-builder-server - # - # # Pass arguments and secrets to the Docker build process - # args: - # RUBY_VERSION: ruby-3.3.1 - # secrets: - # - GITHUB_TOKEN - # - RAILS_MASTER_KEY - -# Use a different ssh user than root -# ssh: -# user: app - -# Use accessory services (secrets come from .kamal/secrets). -# accessories: -# db: -# image: mysql:8.0 -# host: 192.168.0.2 -# # Change to 3306 to expose port to the world instead of just local network. -# port: "127.0.0.1:3306:3306" -# env: -# clear: -# MYSQL_ROOT_HOST: '%' -# secret: -# - MYSQL_ROOT_PASSWORD -# files: -# - config/mysql/production.cnf:/etc/mysql/my.cnf -# - db/production.sql:/docker-entrypoint-initdb.d/setup.sql -# directories: -# - data:/var/lib/mysql -# redis: -# image: redis:7.0 -# host: 192.168.0.2 -# port: 6379 -# directories: -# - data:/data diff --git a/sentry-rails/examples/rails-8.0/config/environment.rb b/sentry-rails/examples/rails-8.0/config/environment.rb deleted file mode 100644 index cac531577..000000000 --- a/sentry-rails/examples/rails-8.0/config/environment.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Load the Rails application. -require_relative "application" - -# Initialize the Rails application. -Rails.application.initialize! diff --git a/sentry-rails/examples/rails-8.0/config/environments/development.rb b/sentry-rails/examples/rails-8.0/config/environments/development.rb deleted file mode 100644 index 5a5714f10..000000000 --- a/sentry-rails/examples/rails-8.0/config/environments/development.rb +++ /dev/null @@ -1,75 +0,0 @@ -require "active_support/core_ext/integer/time" - -Rails.application.configure do - config.active_job.queue_adapter = :solid_queue - config.solid_queue.connects_to = { database: { writing: :queue } } - - # Settings specified here will take precedence over those in config/application.rb. - - # Make code changes take effect immediately without server restart. - config.enable_reloading = true - - # Do not eager load code on boot. - config.eager_load = false - - # Show full error reports. - config.consider_all_requests_local = true - - # Enable server timing. - config.server_timing = true - - # Enable/disable Action Controller caching. By default Action Controller caching is disabled. - # Run rails dev:cache to toggle Action Controller caching. - if Rails.root.join("tmp/caching-dev.txt").exist? - config.action_controller.perform_caching = true - config.action_controller.enable_fragment_cache_logging = true - config.public_file_server.headers = { "cache-control" => "public, max-age=#{2.days.to_i}" } - else - config.action_controller.perform_caching = false - end - - # Change to :null_store to avoid any caching. - config.cache_store = :memory_store - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false - - # Make template changes take effect immediately. - config.action_mailer.perform_caching = false - - # Set localhost to be used by links generated in mailer templates. - config.action_mailer.default_url_options = { host: "localhost", port: 3000 } - - # Print deprecation notices to the Rails logger. - config.active_support.deprecation = :log - - # Raise an error on page load if there are pending migrations. - config.active_record.migration_error = :page_load - - # Highlight code that triggered database queries in logs. - config.active_record.verbose_query_logs = true - - # Append comments with runtime information tags to SQL queries in logs. - config.active_record.query_log_tags_enabled = true - - # Highlight code that enqueued background job in logs. - config.active_job.verbose_enqueue_logs = true - - # Raises error for missing translations. - # config.i18n.raise_on_missing_translations = true - - # Annotate rendered view with file names. - config.action_view.annotate_rendered_view_with_filenames = true - - # Uncomment if you wish to allow Action Cable access from any origin. - # config.action_cable.disable_request_forgery_protection = true - - # Raise error when a before_action's only/except options reference missing actions. - config.action_controller.raise_on_missing_callback_actions = true - - # Apply autocorrection by RuboCop to files generated by `bin/rails generate`. - # config.generators.apply_rubocop_autocorrect_after_generate! -end diff --git a/sentry-rails/examples/rails-8.0/config/environments/production.rb b/sentry-rails/examples/rails-8.0/config/environments/production.rb deleted file mode 100644 index bdcd01d1b..000000000 --- a/sentry-rails/examples/rails-8.0/config/environments/production.rb +++ /dev/null @@ -1,90 +0,0 @@ -require "active_support/core_ext/integer/time" - -Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. - - # Code is not reloaded between requests. - config.enable_reloading = false - - # Eager load code on boot for better performance and memory savings (ignored by Rake tasks). - config.eager_load = true - - # Full error reports are disabled. - config.consider_all_requests_local = false - - # Turn on fragment caching in view templates. - config.action_controller.perform_caching = true - - # Cache assets for far-future expiry since they are all digest stamped. - config.public_file_server.headers = { "cache-control" => "public, max-age=#{1.year.to_i}" } - - # Enable serving of images, stylesheets, and JavaScripts from an asset server. - # config.asset_host = "http://assets.example.com" - - # Store uploaded files on the local file system (see config/storage.yml for options). - config.active_storage.service = :local - - # Assume all access to the app is happening through a SSL-terminating reverse proxy. - config.assume_ssl = true - - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - config.force_ssl = true - - # Skip http-to-https redirect for the default health check endpoint. - # config.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } } - - # Log to STDOUT with the current request id as a default log tag. - config.log_tags = [ :request_id ] - config.logger = ActiveSupport::TaggedLogging.logger(STDOUT) - - # Change to "debug" to log everything (including potentially personally-identifiable information!) - config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info") - - # Prevent health checks from clogging up the logs. - config.silence_healthcheck_path = "/up" - - # Don't log any deprecations. - config.active_support.report_deprecations = false - - # Replace the default in-process memory cache store with a durable alternative. - config.cache_store = :solid_cache_store - - # Replace the default in-process and non-durable queuing backend for Active Job. - config.active_job.queue_adapter = :solid_queue - config.solid_queue.connects_to = { database: { writing: :queue } } - - # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. - # config.action_mailer.raise_delivery_errors = false - - # Set host to be used by links generated in mailer templates. - config.action_mailer.default_url_options = { host: "example.com" } - - # Specify outgoing SMTP server. Remember to add smtp/* credentials via rails credentials:edit. - # config.action_mailer.smtp_settings = { - # user_name: Rails.application.credentials.dig(:smtp, :user_name), - # password: Rails.application.credentials.dig(:smtp, :password), - # address: "smtp.example.com", - # port: 587, - # authentication: :plain - # } - - # Enable locale fallbacks for I18n (makes lookups for any locale fall back to - # the I18n.default_locale when a translation cannot be found). - config.i18n.fallbacks = true - - # Do not dump schema after migrations. - config.active_record.dump_schema_after_migration = false - - # Only use :id for inspections in production. - config.active_record.attributes_for_inspect = [ :id ] - - # Enable DNS rebinding protection and other `Host` header attacks. - # config.hosts = [ - # "example.com", # Allow requests from example.com - # /.*\.example\.com/ # Allow requests from subdomains like `www.example.com` - # ] - # - # Skip DNS rebinding protection for the default health check endpoint. - # config.host_authorization = { exclude: ->(request) { request.path == "/up" } } -end diff --git a/sentry-rails/examples/rails-8.0/config/importmap.rb b/sentry-rails/examples/rails-8.0/config/importmap.rb deleted file mode 100644 index 909dfc542..000000000 --- a/sentry-rails/examples/rails-8.0/config/importmap.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Pin npm packages by running ./bin/importmap - -pin "application" -pin "@hotwired/turbo-rails", to: "turbo.min.js" -pin "@hotwired/stimulus", to: "stimulus.min.js" -pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" -pin_all_from "app/javascript/controllers", under: "controllers" diff --git a/sentry-rails/examples/rails-8.0/config/initializers/assets.rb b/sentry-rails/examples/rails-8.0/config/initializers/assets.rb deleted file mode 100644 index 487324424..000000000 --- a/sentry-rails/examples/rails-8.0/config/initializers/assets.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Version of your assets, change this if you want to expire all your assets. -Rails.application.config.assets.version = "1.0" - -# Add additional assets to the asset load path. -# Rails.application.config.assets.paths << Emoji.images_path diff --git a/sentry-rails/examples/rails-8.0/config/initializers/content_security_policy.rb b/sentry-rails/examples/rails-8.0/config/initializers/content_security_policy.rb deleted file mode 100644 index b3076b38f..000000000 --- a/sentry-rails/examples/rails-8.0/config/initializers/content_security_policy.rb +++ /dev/null @@ -1,25 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Define an application-wide content security policy. -# See the Securing Rails Applications Guide for more information: -# https://guides.rubyonrails.org/security.html#content-security-policy-header - -# Rails.application.configure do -# config.content_security_policy do |policy| -# policy.default_src :self, :https -# policy.font_src :self, :https, :data -# policy.img_src :self, :https, :data -# policy.object_src :none -# policy.script_src :self, :https -# policy.style_src :self, :https -# # Specify URI for violation reports -# # policy.report_uri "/csp-violation-report-endpoint" -# end -# -# # Generate session nonces for permitted importmap, inline scripts, and inline styles. -# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } -# config.content_security_policy_nonce_directives = %w(script-src style-src) -# -# # Report violations without enforcing the policy. -# # config.content_security_policy_report_only = true -# end diff --git a/sentry-rails/examples/rails-8.0/config/initializers/filter_parameter_logging.rb b/sentry-rails/examples/rails-8.0/config/initializers/filter_parameter_logging.rb deleted file mode 100644 index c0b717f7e..000000000 --- a/sentry-rails/examples/rails-8.0/config/initializers/filter_parameter_logging.rb +++ /dev/null @@ -1,8 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. -# Use this to limit dissemination of sensitive information. -# See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. -Rails.application.config.filter_parameters += [ - :passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc -] diff --git a/sentry-rails/examples/rails-8.0/config/initializers/inflections.rb b/sentry-rails/examples/rails-8.0/config/initializers/inflections.rb deleted file mode 100644 index 3860f659e..000000000 --- a/sentry-rails/examples/rails-8.0/config/initializers/inflections.rb +++ /dev/null @@ -1,16 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Add new inflection rules using the following format. Inflections -# are locale specific, and you may define rules for as many different -# locales as you wish. All of these examples are active by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.plural /^(ox)$/i, "\\1en" -# inflect.singular /^(ox)en/i, "\\1" -# inflect.irregular "person", "people" -# inflect.uncountable %w( fish sheep ) -# end - -# These inflection rules are supported but not enabled by default: -# ActiveSupport::Inflector.inflections(:en) do |inflect| -# inflect.acronym "RESTful" -# end diff --git a/sentry-rails/examples/rails-8.0/config/initializers/sentry.rb b/sentry-rails/examples/rails-8.0/config/initializers/sentry.rb deleted file mode 100644 index 0e9bd0790..000000000 --- a/sentry-rails/examples/rails-8.0/config/initializers/sentry.rb +++ /dev/null @@ -1,8 +0,0 @@ -Sentry.init do |config| - config.breadcrumbs_logger = [:active_support_logger] - config.background_worker_threads = 0 - config.send_default_pii = true - config.traces_sample_rate = 1.0 # set a float between 0.0 and 1.0 to enable performance monitoring - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.release = `git branch --show-current` -end diff --git a/sentry-rails/examples/rails-8.0/config/locales/en.yml b/sentry-rails/examples/rails-8.0/config/locales/en.yml deleted file mode 100644 index 6c349ae5e..000000000 --- a/sentry-rails/examples/rails-8.0/config/locales/en.yml +++ /dev/null @@ -1,31 +0,0 @@ -# Files in the config/locales directory are used for internationalization and -# are automatically loaded by Rails. If you want to use locales other than -# English, add the necessary files in this directory. -# -# To use the locales, use `I18n.t`: -# -# I18n.t "hello" -# -# In views, this is aliased to just `t`: -# -# <%= t("hello") %> -# -# To use a different locale, set it with `I18n.locale`: -# -# I18n.locale = :es -# -# This would use the information in config/locales/es.yml. -# -# To learn more about the API, please read the Rails Internationalization guide -# at https://guides.rubyonrails.org/i18n.html. -# -# Be aware that YAML interprets the following case-insensitive strings as -# booleans: `true`, `false`, `on`, `off`, `yes`, `no`. Therefore, these strings -# must be quoted to be interpreted as strings. For example: -# -# en: -# "yes": yup -# enabled: "ON" - -en: - hello: "Hello world" diff --git a/sentry-rails/examples/rails-8.0/config/puma.rb b/sentry-rails/examples/rails-8.0/config/puma.rb deleted file mode 100644 index a248513b2..000000000 --- a/sentry-rails/examples/rails-8.0/config/puma.rb +++ /dev/null @@ -1,41 +0,0 @@ -# This configuration file will be evaluated by Puma. The top-level methods that -# are invoked here are part of Puma's configuration DSL. For more information -# about methods provided by the DSL, see https://puma.io/puma/Puma/DSL.html. -# -# Puma starts a configurable number of processes (workers) and each process -# serves each request in a thread from an internal thread pool. -# -# You can control the number of workers using ENV["WEB_CONCURRENCY"]. You -# should only set this value when you want to run 2 or more workers. The -# default is already 1. -# -# The ideal number of threads per worker depends both on how much time the -# application spends waiting for IO operations and on how much you wish to -# prioritize throughput over latency. -# -# As a rule of thumb, increasing the number of threads will increase how much -# traffic a given process can handle (throughput), but due to CRuby's -# Global VM Lock (GVL) it has diminishing returns and will degrade the -# response time (latency) of the application. -# -# The default is set to 3 threads as it's deemed a decent compromise between -# throughput and latency for the average Rails application. -# -# Any libraries that use a connection pool or another resource pool should -# be configured to provide at least as many connections as the number of -# threads. This includes Active Record's `pool` parameter in `database.yml`. -threads_count = ENV.fetch("RAILS_MAX_THREADS", 3) -threads threads_count, threads_count - -# Specifies the `port` that Puma will listen on to receive requests; default is 3000. -port ENV.fetch("PORT", 3000) - -# Allow puma to be restarted by `bin/rails restart` command. -plugin :tmp_restart - -# Run the Solid Queue supervisor inside of Puma for single-server deployments -plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] - -# Specify the PID file. Defaults to tmp/pids/server.pid in development. -# In other environments, only set the PID file if requested. -pidfile ENV["PIDFILE"] if ENV["PIDFILE"] diff --git a/sentry-rails/examples/rails-8.0/config/queue.yml b/sentry-rails/examples/rails-8.0/config/queue.yml deleted file mode 100644 index 9eace59c4..000000000 --- a/sentry-rails/examples/rails-8.0/config/queue.yml +++ /dev/null @@ -1,18 +0,0 @@ -default: &default - dispatchers: - - polling_interval: 1 - batch_size: 500 - workers: - - queues: "*" - threads: 3 - processes: <%= ENV.fetch("JOB_CONCURRENCY", 1) %> - polling_interval: 0.1 - -development: - <<: *default - -test: - <<: *default - -production: - <<: *default diff --git a/sentry-rails/examples/rails-8.0/config/recurring.yml b/sentry-rails/examples/rails-8.0/config/recurring.yml deleted file mode 100644 index d045b1914..000000000 --- a/sentry-rails/examples/rails-8.0/config/recurring.yml +++ /dev/null @@ -1,10 +0,0 @@ -# production: -# periodic_cleanup: -# class: CleanSoftDeletedRecordsJob -# queue: background -# args: [ 1000, { batch_size: 500 } ] -# schedule: every hour -# periodic_command: -# command: "SoftDeletedRecord.due.delete_all" -# priority: 2 -# schedule: at 5am every day diff --git a/sentry-rails/examples/rails-8.0/config/routes.rb b/sentry-rails/examples/rails-8.0/config/routes.rb deleted file mode 100644 index 48254e88e..000000000 --- a/sentry-rails/examples/rails-8.0/config/routes.rb +++ /dev/null @@ -1,14 +0,0 @@ -Rails.application.routes.draw do - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html - - # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. - # Can be used by load balancers and uptime monitors to verify that the app is live. - get "up" => "rails/health#show", as: :rails_health_check - - # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb) - # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest - # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker - - # Defines the root path route ("/") - # root "posts#index" -end diff --git a/sentry-rails/examples/rails-8.0/config/storage.yml b/sentry-rails/examples/rails-8.0/config/storage.yml deleted file mode 100644 index 4942ab669..000000000 --- a/sentry-rails/examples/rails-8.0/config/storage.yml +++ /dev/null @@ -1,34 +0,0 @@ -test: - service: Disk - root: <%= Rails.root.join("tmp/storage") %> - -local: - service: Disk - root: <%= Rails.root.join("storage") %> - -# Use bin/rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) -# amazon: -# service: S3 -# access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> -# secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> -# region: us-east-1 -# bucket: your_own_bucket-<%= Rails.env %> - -# Remember not to checkin your GCS keyfile to a repository -# google: -# service: GCS -# project: your_project -# credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> -# bucket: your_own_bucket-<%= Rails.env %> - -# Use bin/rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) -# microsoft: -# service: AzureStorage -# storage_account_name: your_account_name -# storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> -# container: your_container_name-<%= Rails.env %> - -# mirror: -# service: Mirror -# primary: local -# mirrors: [ amazon, google, microsoft ] diff --git a/sentry-rails/examples/rails-8.0/db/cable_schema.rb b/sentry-rails/examples/rails-8.0/db/cable_schema.rb deleted file mode 100644 index 23666604a..000000000 --- a/sentry-rails/examples/rails-8.0/db/cable_schema.rb +++ /dev/null @@ -1,11 +0,0 @@ -ActiveRecord::Schema[7.1].define(version: 1) do - create_table "solid_cable_messages", force: :cascade do |t| - t.binary "channel", limit: 1024, null: false - t.binary "payload", limit: 536870912, null: false - t.datetime "created_at", null: false - t.integer "channel_hash", limit: 8, null: false - t.index ["channel"], name: "index_solid_cable_messages_on_channel" - t.index ["channel_hash"], name: "index_solid_cable_messages_on_channel_hash" - t.index ["created_at"], name: "index_solid_cable_messages_on_created_at" - end -end diff --git a/sentry-rails/examples/rails-8.0/db/cache_schema.rb b/sentry-rails/examples/rails-8.0/db/cache_schema.rb deleted file mode 100644 index 6005a2972..000000000 --- a/sentry-rails/examples/rails-8.0/db/cache_schema.rb +++ /dev/null @@ -1,14 +0,0 @@ -# frozen_string_literal: true - -ActiveRecord::Schema[7.2].define(version: 1) do - create_table "solid_cache_entries", force: :cascade do |t| - t.binary "key", limit: 1024, null: false - t.binary "value", limit: 536870912, null: false - t.datetime "created_at", null: false - t.integer "key_hash", limit: 8, null: false - t.integer "byte_size", limit: 4, null: false - t.index ["byte_size"], name: "index_solid_cache_entries_on_byte_size" - t.index ["key_hash", "byte_size"], name: "index_solid_cache_entries_on_key_hash_and_byte_size" - t.index ["key_hash"], name: "index_solid_cache_entries_on_key_hash", unique: true - end -end diff --git a/sentry-rails/examples/rails-8.0/db/queue_schema.rb b/sentry-rails/examples/rails-8.0/db/queue_schema.rb deleted file mode 100644 index 4b2cdcdc6..000000000 --- a/sentry-rails/examples/rails-8.0/db/queue_schema.rb +++ /dev/null @@ -1,141 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# This file is the source Rails uses to define your schema when running `bin/rails -# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to -# be faster and is potentially less error prone than running all of your -# migrations from scratch. Old migrations may fail to apply correctly if those -# migrations use external dependencies or application code. -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema[8.0].define(version: 1) do - create_table "solid_queue_blocked_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.string "queue_name", null: false - t.integer "priority", default: 0, null: false - t.string "concurrency_key", null: false - t.datetime "expires_at", null: false - t.datetime "created_at", null: false - t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" - t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" - t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true - end - - create_table "solid_queue_claimed_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.bigint "process_id" - t.datetime "created_at", null: false - t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true - t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" - end - - create_table "solid_queue_failed_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.text "error" - t.datetime "created_at", null: false - t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true - end - - create_table "solid_queue_jobs", force: :cascade do |t| - t.string "queue_name", null: false - t.string "class_name", null: false - t.text "arguments" - t.integer "priority", default: 0, null: false - t.string "active_job_id" - t.datetime "scheduled_at" - t.datetime "finished_at" - t.string "concurrency_key" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id" - t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name" - t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at" - t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering" - t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting" - end - - create_table "solid_queue_pauses", force: :cascade do |t| - t.string "queue_name", null: false - t.datetime "created_at", null: false - t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true - end - - create_table "solid_queue_processes", force: :cascade do |t| - t.string "kind", null: false - t.datetime "last_heartbeat_at", null: false - t.bigint "supervisor_id" - t.integer "pid", null: false - t.string "hostname" - t.text "metadata" - t.datetime "created_at", null: false - t.string "name", null: false - t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at" - t.index ["name", "supervisor_id"], name: "index_solid_queue_processes_on_name_and_supervisor_id", unique: true - t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id" - end - - create_table "solid_queue_ready_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.string "queue_name", null: false - t.integer "priority", default: 0, null: false - t.datetime "created_at", null: false - t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true - t.index ["priority", "job_id"], name: "index_solid_queue_poll_all" - t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" - end - - create_table "solid_queue_recurring_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.string "task_key", null: false - t.datetime "run_at", null: false - t.datetime "created_at", null: false - t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true - t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true - end - - create_table "solid_queue_recurring_tasks", force: :cascade do |t| - t.string "key", null: false - t.string "schedule", null: false - t.string "command", limit: 2048 - t.string "class_name" - t.text "arguments" - t.string "queue_name" - t.integer "priority", default: 0 - t.boolean "static", default: true, null: false - t.text "description" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["key"], name: "index_solid_queue_recurring_tasks_on_key", unique: true - t.index ["static"], name: "index_solid_queue_recurring_tasks_on_static" - end - - create_table "solid_queue_scheduled_executions", force: :cascade do |t| - t.bigint "job_id", null: false - t.string "queue_name", null: false - t.integer "priority", default: 0, null: false - t.datetime "scheduled_at", null: false - t.datetime "created_at", null: false - t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true - t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" - end - - create_table "solid_queue_semaphores", force: :cascade do |t| - t.string "key", null: false - t.integer "value", default: 1, null: false - t.datetime "expires_at", null: false - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at" - t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" - t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true - end - - add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade - add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade -end diff --git a/sentry-rails/examples/rails-8.0/db/schema.rb b/sentry-rails/examples/rails-8.0/db/schema.rb deleted file mode 100644 index 0f651a43a..000000000 --- a/sentry-rails/examples/rails-8.0/db/schema.rb +++ /dev/null @@ -1,14 +0,0 @@ -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# This file is the source Rails uses to define your schema when running `bin/rails -# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to -# be faster and is potentially less error prone than running all of your -# migrations from scratch. Old migrations may fail to apply correctly if those -# migrations use external dependencies or application code. -# -# It's strongly recommended that you check this file into your version control system. - -ActiveRecord::Schema[8.0].define(version: 0) do -end diff --git a/sentry-rails/examples/rails-8.0/db/seeds.rb b/sentry-rails/examples/rails-8.0/db/seeds.rb deleted file mode 100644 index 4fbd6ed97..000000000 --- a/sentry-rails/examples/rails-8.0/db/seeds.rb +++ /dev/null @@ -1,9 +0,0 @@ -# This file should ensure the existence of records required to run the application in every environment (production, -# development, test). The code here should be idempotent so that it can be executed at any point in every environment. -# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup). -# -# Example: -# -# ["Action", "Comedy", "Drama", "Horror"].each do |genre_name| -# MovieGenre.find_or_create_by!(name: genre_name) -# end diff --git a/sentry-rails/examples/rails-8.0/lib/tasks/.keep b/sentry-rails/examples/rails-8.0/lib/tasks/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/public/400.html b/sentry-rails/examples/rails-8.0/public/400.html deleted file mode 100644 index 282dbc8cc..000000000 --- a/sentry-rails/examples/rails-8.0/public/400.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - The server cannot process the request due to a client error (400 Bad Request) - - - - - - - - - - - - - -
-
- -
-
-

The server cannot process the request due to a client error. Please check the request and try again. If you’re the application owner check the logs for more information.

-
-
- - - - diff --git a/sentry-rails/examples/rails-8.0/public/404.html b/sentry-rails/examples/rails-8.0/public/404.html deleted file mode 100644 index c0670bc87..000000000 --- a/sentry-rails/examples/rails-8.0/public/404.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - The page you were looking for doesn’t exist (404 Not found) - - - - - - - - - - - - - -
-
- -
-
-

The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved. If you’re the application owner check the logs for more information.

-
-
- - - - diff --git a/sentry-rails/examples/rails-8.0/public/406-unsupported-browser.html b/sentry-rails/examples/rails-8.0/public/406-unsupported-browser.html deleted file mode 100644 index 9532a9ccd..000000000 --- a/sentry-rails/examples/rails-8.0/public/406-unsupported-browser.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - Your browser is not supported (406 Not Acceptable) - - - - - - - - - - - - - -
-
- -
-
-

Your browser is not supported.
Please upgrade your browser to continue.

-
-
- - - - diff --git a/sentry-rails/examples/rails-8.0/public/422.html b/sentry-rails/examples/rails-8.0/public/422.html deleted file mode 100644 index 8bcf06014..000000000 --- a/sentry-rails/examples/rails-8.0/public/422.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - The change you wanted was rejected (422 Unprocessable Entity) - - - - - - - - - - - - - -
-
- -
-
-

The change you wanted was rejected. Maybe you tried to change something you didn’t have access to. If you’re the application owner check the logs for more information.

-
-
- - - - diff --git a/sentry-rails/examples/rails-8.0/public/500.html b/sentry-rails/examples/rails-8.0/public/500.html deleted file mode 100644 index d77718c3a..000000000 --- a/sentry-rails/examples/rails-8.0/public/500.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - We’re sorry, but something went wrong (500 Internal Server Error) - - - - - - - - - - - - - -
-
- -
-
-

We’re sorry, but something went wrong.
If you’re the application owner check the logs for more information.

-
-
- - - - diff --git a/sentry-rails/examples/rails-8.0/public/icon.png b/sentry-rails/examples/rails-8.0/public/icon.png deleted file mode 100644 index c4c9dbfbb..000000000 Binary files a/sentry-rails/examples/rails-8.0/public/icon.png and /dev/null differ diff --git a/sentry-rails/examples/rails-8.0/public/icon.svg b/sentry-rails/examples/rails-8.0/public/icon.svg deleted file mode 100644 index 04b34bf83..000000000 --- a/sentry-rails/examples/rails-8.0/public/icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/sentry-rails/examples/rails-8.0/public/robots.txt b/sentry-rails/examples/rails-8.0/public/robots.txt deleted file mode 100644 index c19f78ab6..000000000 --- a/sentry-rails/examples/rails-8.0/public/robots.txt +++ /dev/null @@ -1 +0,0 @@ -# See https://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/sentry-rails/examples/rails-8.0/script/.keep b/sentry-rails/examples/rails-8.0/script/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/storage/.keep b/sentry-rails/examples/rails-8.0/storage/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/application_system_test_case.rb b/sentry-rails/examples/rails-8.0/test/application_system_test_case.rb deleted file mode 100644 index cee29fd21..000000000 --- a/sentry-rails/examples/rails-8.0/test/application_system_test_case.rb +++ /dev/null @@ -1,5 +0,0 @@ -require "test_helper" - -class ApplicationSystemTestCase < ActionDispatch::SystemTestCase - driven_by :selenium, using: :headless_chrome, screen_size: [ 1400, 1400 ] -end diff --git a/sentry-rails/examples/rails-8.0/test/controllers/.keep b/sentry-rails/examples/rails-8.0/test/controllers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/fixtures/files/.keep b/sentry-rails/examples/rails-8.0/test/fixtures/files/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/helpers/.keep b/sentry-rails/examples/rails-8.0/test/helpers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/integration/.keep b/sentry-rails/examples/rails-8.0/test/integration/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/jobs/error_job_test.rb b/sentry-rails/examples/rails-8.0/test/jobs/error_job_test.rb deleted file mode 100644 index bd766b7d3..000000000 --- a/sentry-rails/examples/rails-8.0/test/jobs/error_job_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "test_helper" - -class ErrorJobTest < ActiveJob::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/sentry-rails/examples/rails-8.0/test/mailers/.keep b/sentry-rails/examples/rails-8.0/test/mailers/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/models/.keep b/sentry-rails/examples/rails-8.0/test/models/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/system/.keep b/sentry-rails/examples/rails-8.0/test/system/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/test/test_helper.rb b/sentry-rails/examples/rails-8.0/test/test_helper.rb deleted file mode 100644 index 0c22470ec..000000000 --- a/sentry-rails/examples/rails-8.0/test/test_helper.rb +++ /dev/null @@ -1,15 +0,0 @@ -ENV["RAILS_ENV"] ||= "test" -require_relative "../config/environment" -require "rails/test_help" - -module ActiveSupport - class TestCase - # Run tests in parallel with specified workers - parallelize(workers: :number_of_processors) - - # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. - fixtures :all - - # Add more helper methods to be used by all tests here... - end -end diff --git a/sentry-rails/examples/rails-8.0/vendor/.keep b/sentry-rails/examples/rails-8.0/vendor/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/examples/rails-8.0/vendor/javascript/.keep b/sentry-rails/examples/rails-8.0/vendor/javascript/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/sentry-rails/lib/sentry/rails/active_job.rb b/sentry-rails/lib/sentry/rails/active_job.rb index 2f5a134d0..df7f27ecd 100644 --- a/sentry-rails/lib/sentry/rails/active_job.rb +++ b/sentry-rails/lib/sentry/rails/active_job.rb @@ -32,17 +32,13 @@ def record(job, &block) Sentry.with_scope do |scope| begin scope.set_transaction_name(job.class.name, source: :task) - transaction = - if job.is_a?(::Sentry::SendEventJob) - nil - else - Sentry.start_transaction( - name: scope.transaction_name, - source: scope.transaction_source, - op: OP_NAME, - origin: SPAN_ORIGIN - ) - end + + transaction = Sentry.start_transaction( + name: scope.transaction_name, + source: scope.transaction_source, + op: OP_NAME, + origin: SPAN_ORIGIN + ) scope.set_span(transaction) if transaction diff --git a/sentry-rails/lib/sentry/rails/breadcrumb/monotonic_active_support_logger.rb b/sentry-rails/lib/sentry/rails/breadcrumb/monotonic_active_support_logger.rb deleted file mode 100644 index 541f9bea3..000000000 --- a/sentry-rails/lib/sentry/rails/breadcrumb/monotonic_active_support_logger.rb +++ /dev/null @@ -1,46 +0,0 @@ -# frozen_string_literal: true - -require "sentry/rails/instrument_payload_cleanup_helper" - -module Sentry - module Rails - module Breadcrumb - module MonotonicActiveSupportLogger - class << self - include InstrumentPayloadCleanupHelper - - def add(name, started, _finished, _unique_id, data) - # skip Rails' internal events - return if name.start_with?("!") - - if data.is_a?(Hash) - # we should only mutate the copy of the data - data = data.dup - cleanup_data(data) - end - - crumb = Sentry::Breadcrumb.new( - data: data, - category: name, - timestamp: started.to_i - ) - Sentry.add_breadcrumb(crumb) - end - - def inject - @subscriber = ::ActiveSupport::Notifications.monotonic_subscribe(/.*/) do |name, started, finished, unique_id, data| - # we only record events that has a float as started timestamp - if started.is_a?(Float) - add(name, started, finished, unique_id, data) - end - end - end - - def detach - ::ActiveSupport::Notifications.unsubscribe(@subscriber) - end - end - end - end - end -end diff --git a/sentry-rails/lib/sentry/rails/configuration.rb b/sentry-rails/lib/sentry/rails/configuration.rb index 7b27a9152..42306e07f 100644 --- a/sentry-rails/lib/sentry/rails/configuration.rb +++ b/sentry-rails/lib/sentry/rails/configuration.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "sentry/rails/tracing/action_controller_subscriber" require "sentry/rails/tracing/action_view_subscriber" require "sentry/rails/tracing/active_record_subscriber" require "sentry/rails/tracing/active_storage_subscriber" diff --git a/sentry-rails/lib/sentry/rails/instrument_payload_cleanup_helper.rb b/sentry-rails/lib/sentry/rails/instrument_payload_cleanup_helper.rb deleted file mode 100644 index 07422c5e8..000000000 --- a/sentry-rails/lib/sentry/rails/instrument_payload_cleanup_helper.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Rails - module InstrumentPayloadCleanupHelper - IGNORED_DATA_TYPES = [:request, :response, :headers, :exception, :exception_object, Tracing::START_TIMESTAMP_NAME] - - def cleanup_data(data) - IGNORED_DATA_TYPES.each do |key| - data.delete(key) if data.key?(key) - end - end - end - end -end diff --git a/sentry-rails/lib/sentry/rails/overrides/streaming_reporter.rb b/sentry-rails/lib/sentry/rails/overrides/streaming_reporter.rb index 1fdd4ad60..d1bc1b1dd 100644 --- a/sentry-rails/lib/sentry/rails/overrides/streaming_reporter.rb +++ b/sentry-rails/lib/sentry/rails/overrides/streaming_reporter.rb @@ -9,17 +9,6 @@ def log_error(exception) super end end - - module OldStreamingReporter - def self.included(base) - base.send(:alias_method_chain, :log_error, :raven) - end - - def log_error_with_raven(exception) - Sentry::Rails.capture_exception(exception) - log_error_without_raven(exception) - end - end end end end diff --git a/sentry-rails/lib/sentry/rails/railtie.rb b/sentry-rails/lib/sentry/rails/railtie.rb index b514df3cd..a86093768 100644 --- a/sentry-rails/lib/sentry/rails/railtie.rb +++ b/sentry-rails/lib/sentry/rails/railtie.rb @@ -101,17 +101,12 @@ def patch_background_worker end def inject_breadcrumbs_logger - if Sentry.configuration.breadcrumbs_logger.include?(:active_support_logger) + if Sentry.configuration.breadcrumbs_logger.include?(:active_support_logger) || + ## legacy name redirected for backwards compat + Sentry.configuration.breadcrumbs_logger.include?(:monotonic_active_support_logger) require "sentry/rails/breadcrumb/active_support_logger" Sentry::Rails::Breadcrumb::ActiveSupportLogger.inject(Sentry.configuration.rails.active_support_logger_subscription_items) end - - if Sentry.configuration.breadcrumbs_logger.include?(:monotonic_active_support_logger) - return warn "Usage of `monotonic_active_support_logger` require a version of Rails >= 6.1, please upgrade your Rails version or use another logger" if ::Rails.version.to_f < 6.1 - - require "sentry/rails/breadcrumb/monotonic_active_support_logger" - Sentry::Rails::Breadcrumb::MonotonicActiveSupportLogger.inject - end end def setup_backtrace_cleanup_callback diff --git a/sentry-rails/lib/sentry/rails/tracing/action_controller_subscriber.rb b/sentry-rails/lib/sentry/rails/tracing/action_controller_subscriber.rb deleted file mode 100644 index 996332bb5..000000000 --- a/sentry-rails/lib/sentry/rails/tracing/action_controller_subscriber.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require "sentry/rails/tracing/abstract_subscriber" -require "sentry/rails/instrument_payload_cleanup_helper" - -module Sentry - module Rails - module Tracing - class ActionControllerSubscriber < AbstractSubscriber - extend InstrumentPayloadCleanupHelper - - EVENT_NAMES = ["process_action.action_controller"].freeze - OP_NAME = "view.process_action.action_controller" - SPAN_ORIGIN = "auto.view.rails" - - def self.subscribe! - Sentry.sdk_logger.warn <<~MSG - DEPRECATION WARNING: sentry-rails has changed its approach on controller span recording and #{self.name} is now depreacted. - Please stop using or referencing #{self.name} as it will be removed in the next major release. - MSG - - subscribe_to_event(EVENT_NAMES) do |event_name, duration, payload| - controller = payload[:controller] - action = payload[:action] - - record_on_current_span( - op: OP_NAME, - origin: SPAN_ORIGIN, - start_timestamp: payload[START_TIMESTAMP_NAME], - description: "#{controller}##{action}", - duration: duration - ) do |span| - payload = payload.dup - cleanup_data(payload) - span.set_data(:payload, payload) - span.set_http_status(payload[:status]) - end - end - end - end - end - end -end diff --git a/sentry-rails/sentry-rails.gemspec b/sentry-rails/sentry-rails.gemspec index e889f6054..0f9ad3654 100644 --- a/sentry-rails/sentry-rails.gemspec +++ b/sentry-rails/sentry-rails.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") @@ -30,6 +30,6 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] - spec.add_dependency "railties", ">= 5.0" + spec.add_dependency "railties", ">= 5.2.0" spec.add_dependency "sentry-ruby", "~> 5.28.0" end diff --git a/sentry-rails/spec/dummy/test_rails_app/app.rb b/sentry-rails/spec/dummy/test_rails_app/app.rb index 42f4d8d04..85eadf39b 100644 --- a/sentry-rails/spec/dummy/test_rails_app/app.rb +++ b/sentry-rails/spec/dummy/test_rails_app/app.rb @@ -105,7 +105,7 @@ def self.name config.transport.transport_class = Sentry::DummyTransport # for sending events synchronously config.background_worker_threads = 0 - config.capture_exception_frame_locals = true + config.include_local_variables = true yield(config, app) if block_given? end end diff --git a/sentry-rails/spec/sentry/rails/activejob_spec.rb b/sentry-rails/spec/sentry/rails/activejob_spec.rb index 8431bffff..c7f6c423a 100644 --- a/sentry-rails/spec/sentry/rails/activejob_spec.rb +++ b/sentry-rails/spec/sentry/rails/activejob_spec.rb @@ -229,50 +229,6 @@ def perform event = transport.events.last.to_json_compatible expect(event.dig("exception", "values", 0, "type")).to eq("ZeroDivisionError") end - - context "and in user-defined reporting job too" do - before do - Sentry.configuration.async = lambda do |event, hint| - UserDefinedReportingJob.perform_now(event, hint) - end - end - - class UserDefinedReportingJob < ActiveJob::Base - def perform(event, hint) - Post.find(0) - rescue - raise ActiveJob::DeserializationError - end - end - - it "doesn't cause infinite loop because of excluded exceptions" do - expect do - DeserializationErrorJob.perform_now - end.to raise_error(ActiveJob::DeserializationError, /divided by 0/) - end - end - - context "and in customized SentryJob too" do - before do - class CustomSentryJob < ::Sentry::SendEventJob - def perform(event, hint) - raise "Not excluded exception" - rescue - raise ActiveJob::DeserializationError - end - end - - Sentry.configuration.async = lambda do |event, hint| - CustomSentryJob.perform_now(event, hint) - end - end - - it "doesn't cause infinite loop" do - expect do - DeserializationErrorJob.perform_now - end.to raise_error(ActiveJob::DeserializationError, /divided by 0/) - end - end end context 'using rescue_from' do @@ -293,7 +249,7 @@ def perform(event, hint) expect(transport.events.size).to eq(1) event = transport.events.first - exceptions_data = event.exception.to_hash[:values] + exceptions_data = event.exception.to_h[:values] expect(exceptions_data.count).to eq(2) expect(exceptions_data[0][:type]).to eq("FailedJob::TestError") @@ -331,7 +287,7 @@ def perform(event, hint) first = transport.events[0] check_in_id = first.check_in_id expect(first).to be_a(Sentry::CheckInEvent) - expect(first.to_hash).to include( + expect(first.to_h).to include( type: 'check_in', check_in_id: check_in_id, monitor_slug: "normaljobwithcron", @@ -340,7 +296,7 @@ def perform(event, hint) second = transport.events[1] expect(second).to be_a(Sentry::CheckInEvent) - expect(second.to_hash).to include( + expect(second.to_h).to include( :duration, type: 'check_in', check_in_id: check_in_id, @@ -359,7 +315,7 @@ def perform(event, hint) first = transport.events[0] check_in_id = first.check_in_id expect(first).to be_a(Sentry::CheckInEvent) - expect(first.to_hash).to include( + expect(first.to_h).to include( type: 'check_in', check_in_id: check_in_id, monitor_slug: "failed_job", @@ -369,7 +325,7 @@ def perform(event, hint) second = transport.events[1] expect(second).to be_a(Sentry::CheckInEvent) - expect(second.to_hash).to include( + expect(second.to_h).to include( :duration, type: 'check_in', check_in_id: check_in_id, diff --git a/sentry-rails/spec/sentry/rails/breadcrumbs/active_support_logger_spec.rb b/sentry-rails/spec/sentry/rails/breadcrumbs/active_support_logger_spec.rb index e6a0ae6e3..2fb493793 100644 --- a/sentry-rails/spec/sentry/rails/breadcrumbs/active_support_logger_spec.rb +++ b/sentry-rails/spec/sentry/rails/breadcrumbs/active_support_logger_spec.rb @@ -93,6 +93,33 @@ end end + context "redirects legacy :monotonic_active_support_logger" do + before do + make_basic_app do |sentry_config| + sentry_config.breadcrumbs_logger = [:monotonic_active_support_logger] + end + end + + it "captures correct data of exception requests" do + get "/exception" + + expect(response.status).to eq(500) + breadcrumbs = event.dig("breadcrumbs", "values") + expect(breadcrumbs.count).to eq(2) + + breadcrumb = breadcrumbs.detect { |b| b["category"] == "process_action.action_controller" } + expect(breadcrumb["data"]).to include( + { + "controller" => "HelloController", + "action" => "exception", + "params" => { "controller" => "hello", "action" => "exception" }, + "format" => "html", + "method" => "GET", "path" => "/exception" + } + ) + end + end + context "with tracing" do before do make_basic_app do |sentry_config| @@ -130,7 +157,7 @@ expect(transport.events.count).to eq(1) - transaction = transport.events.last.to_hash + transaction = transport.events.last.to_h breadcrumbs = transaction[:breadcrumbs][:values] process_action_crumb = breadcrumbs.last expect(process_action_crumb[:category]).to eq("process_action.action_controller") diff --git a/sentry-rails/spec/sentry/rails/breadcrumbs/monotonic_active_support_logger_spec.rb b/sentry-rails/spec/sentry/rails/breadcrumbs/monotonic_active_support_logger_spec.rb deleted file mode 100644 index 031443c25..000000000 --- a/sentry-rails/spec/sentry/rails/breadcrumbs/monotonic_active_support_logger_spec.rb +++ /dev/null @@ -1,145 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - - -RSpec.describe "Sentry::Breadcrumbs::MonotonicActiveSupportLogger", type: :request do - after do - # even though we cleanup breadcrumbs in the rack middleware - # Breadcrumbs::MonotonicActiveSupportLogger subscribes to "every" instrumentation - # so it'll create other instrumentations "after" the request is finished - # and we should clear those as well - Sentry.get_current_scope.clear_breadcrumbs - end - - let(:transport) do - Sentry.get_current_client.transport - end - - let(:breadcrumb_buffer) do - Sentry.get_current_scope.breadcrumbs - end - - let(:event) do - transport.events.first.to_json_compatible - end - context "without tracing" do - before do - make_basic_app do |sentry_config| - sentry_config.breadcrumbs_logger = [:monotonic_active_support_logger] - end - end - - context "given a Rails version < 6.1", skip: Rails.version.to_f >= 6.1 do - it "does not run instrumentation" do - get "/exception" - - breadcrumbs = event.dig("breadcrumbs", "values") - expect(breadcrumbs.count).to be_zero - end - end - - context "given a Rails version >= 6.1", skip: Rails.version.to_f < 6.1 do - after do - Sentry::Rails::Breadcrumb::MonotonicActiveSupportLogger.detach - end - - it "captures correct data of exception requests" do - get "/exception" - - expect(response.status).to eq(500) - breadcrumbs = event.dig("breadcrumbs", "values") - expect(breadcrumbs.count).to eq(2) - - breadcrumb = breadcrumbs.detect { |b| b["category"] == "process_action.action_controller" } - expect(breadcrumb["data"]).to include( - { - "controller" => "HelloController", - "action" => "exception", - "params" => { "controller" => "hello", "action" => "exception" }, - "format" => "html", - "method" => "GET", "path" => "/exception" - } - ) - expect(breadcrumb["data"].keys).not_to include("headers") - expect(breadcrumb["data"].keys).not_to include("request") - expect(breadcrumb["data"].keys).not_to include("response") - end - - it "ignores exception data" do - get "/view_exception" - - expect(event.dig("breadcrumbs", "values", -1, "data").keys).not_to include("exception") - expect(event.dig("breadcrumbs", "values", -1, "data").keys).not_to include("exception_object") - end - - it "ignores events that doesn't have a float as started attributes" do - expect do - ActiveSupport::Notifications.publish "foo", Time.now - end.not_to raise_error - - expect(breadcrumb_buffer.count).to be_zero - end - end - end - - context "with tracing" do - before do - make_basic_app do |sentry_config| - sentry_config.breadcrumbs_logger = [:monotonic_active_support_logger] - sentry_config.traces_sample_rate = 1.0 - end - end - - context "given a Rails version < 6.1", skip: Rails.version.to_f >= 6.1 do - it "does not run instrumentation" do - get "/exception" - - breadcrumbs = event.dig("breadcrumbs", "values") - expect(breadcrumbs.count).to be_zero - end - end - - context "given a Rails version >= 6.1", skip: Rails.version.to_f < 6.1 do - after do - Sentry::Rails::Breadcrumb::MonotonicActiveSupportLogger.detach - end - - it "captures correct request data of normal requests" do - p = Post.create! - - get "/posts/#{p.id}" - - breadcrumbs = event.dig("breadcrumbs", "values") - - breadcrumb = breadcrumbs.detect { |b| b["category"] == "process_action.action_controller" } - expect(breadcrumb["data"]).to include( - { - "controller" => "PostsController", - "action" => "show", - "params" => { "controller" => "posts", "action" => "show", "id" => p.id.to_s }, - "format" => "html", - "method" => "GET", "path" => "/posts/#{p.id}" - } - ) - expect(breadcrumb["data"].keys).not_to include("headers") - expect(breadcrumb["data"].keys).not_to include("request") - expect(breadcrumb["data"].keys).not_to include("response") - end - - it "doesn't add internal start timestamp payload to breadcrumbs data" do - p = Post.create! - - get "/posts/#{p.id}" - - expect(transport.events.count).to eq(1) - - transaction = transport.events.last.to_hash - breadcrumbs = transaction[:breadcrumbs][:values] - process_action_crumb = breadcrumbs.last - expect(process_action_crumb[:category]).to eq("process_action.action_controller") - expect(process_action_crumb[:data].has_key?(Sentry::Rails::Tracing::START_TIMESTAMP_NAME)).to eq(false) - end - end - end -end diff --git a/sentry-rails/spec/sentry/rails/controller_methods_spec.rb b/sentry-rails/spec/sentry/rails/controller_methods_spec.rb index 6254dc290..0f9c82af6 100644 --- a/sentry-rails/spec/sentry/rails/controller_methods_spec.rb +++ b/sentry-rails/spec/sentry/rails/controller_methods_spec.rb @@ -37,7 +37,7 @@ def request event = transport.events.last expect(event.message).to eq("foo") expect(event.tags).to eq({ new_tag: true }) - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") end end @@ -49,8 +49,8 @@ def request event = transport.events.last expect(event.tags).to eq({ new_tag: true }) - expect(event.to_hash.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") end end end diff --git a/sentry-rails/spec/sentry/rails/event_spec.rb b/sentry-rails/spec/sentry/rails/event_spec.rb index 8dc969d08..92db6f0c3 100644 --- a/sentry-rails/spec/sentry/rails/event_spec.rb +++ b/sentry-rails/spec/sentry/rails/event_spec.rb @@ -8,7 +8,7 @@ end it "sets right SDK information" do - event_hash = Sentry::Rails.capture_message("foo").to_hash + event_hash = Sentry::Rails.capture_message("foo").to_h expect(event_hash[:sdk]).to eq(name: "sentry.ruby.rails", version: Sentry::Rails::VERSION) end @@ -27,7 +27,7 @@ e end - let(:hash) { Sentry::Rails.capture_exception(exception).to_hash } + let(:hash) { Sentry::Rails.capture_exception(exception).to_h } it 'marks in_app correctly' do frames = hash[:exception][:values][0][:stacktrace][:frames] diff --git a/sentry-rails/spec/sentry/rails/tracing/action_controller_subscriber_spec.rb b/sentry-rails/spec/sentry/rails/tracing/action_controller_subscriber_spec.rb deleted file mode 100644 index 59c69f849..000000000 --- a/sentry-rails/spec/sentry/rails/tracing/action_controller_subscriber_spec.rb +++ /dev/null @@ -1,65 +0,0 @@ -# frozen_string_literal: true - -require "spec_helper" - -RSpec.describe Sentry::Rails::Tracing::ActionControllerSubscriber, :subscriber, type: :request do - let(:transport) do - Sentry.get_current_client.transport - end - - context "when transaction is sampled" do - let(:string_io) { StringIO.new } - let(:logger) do - ::Logger.new(string_io) - end - - before do - make_basic_app do |config| - config.traces_sample_rate = 1.0 - config.rails.tracing_subscribers = [described_class] - config.sdk_logger = logger - end - end - - it "logs deprecation message" do - expect(string_io.string).to include( - "DEPRECATION WARNING: sentry-rails has changed its approach on controller span recording and Sentry::Rails::Tracing::ActionControllerSubscriber is now depreacted." - ) - end - - it "records controller action processing event" do - get "/world" - - expect(transport.events.count).to eq(1) - - transaction = transport.events.first.to_hash - expect(transaction[:type]).to eq("transaction") - expect(transaction[:spans].count).to eq(2) - - span = transaction[:spans][0] - expect(span[:op]).to eq("view.process_action.action_controller") - expect(span[:origin]).to eq("auto.view.rails") - expect(span[:description]).to eq("HelloController#world") - expect(span[:trace_id]).to eq(transaction.dig(:contexts, :trace, :trace_id)) - expect(span[:data].keys).to match_array(["http.response.status_code", :format, :method, :path, :params]) - end - end - - context "when transaction is not sampled" do - before do - make_basic_app - end - - it "doesn't record spans" do - transaction = Sentry::Transaction.new(sampled: false, hub: Sentry.get_current_hub) - Sentry.get_current_scope.set_span(transaction) - - get "/world" - - transaction.finish - - expect(transport.events.count).to eq(0) - expect(transaction.span_recorder.spans).to eq([transaction]) - end - end -end diff --git a/sentry-rails/spec/sentry/rails/tracing/action_view_subscriber_spec.rb b/sentry-rails/spec/sentry/rails/tracing/action_view_subscriber_spec.rb index 555584024..b847089b6 100644 --- a/sentry-rails/spec/sentry/rails/tracing/action_view_subscriber_spec.rb +++ b/sentry-rails/spec/sentry/rails/tracing/action_view_subscriber_spec.rb @@ -20,7 +20,7 @@ expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(2) @@ -39,7 +39,7 @@ end it "doesn't record spans" do - transaction = Sentry::Transaction.new(sampled: false, hub: Sentry.get_current_hub) + transaction = Sentry::Transaction.new(sampled: false) Sentry.get_current_scope.set_span(transaction) get "/view" diff --git a/sentry-rails/spec/sentry/rails/tracing/active_record_subscriber_spec.rb b/sentry-rails/spec/sentry/rails/tracing/active_record_subscriber_spec.rb index be674869f..ef688b2b0 100644 --- a/sentry-rails/spec/sentry/rails/tracing/active_record_subscriber_spec.rb +++ b/sentry-rails/spec/sentry/rails/tracing/active_record_subscriber_spec.rb @@ -21,7 +21,7 @@ end it "records database query events" do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Post.all.to_a @@ -30,7 +30,7 @@ expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(1) @@ -54,7 +54,7 @@ def foo rspec_class = self.name # RSpec::ExampleGroups::[....] before do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) foo @@ -68,7 +68,7 @@ def foo it "doesn't record query's source location" do expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(1) @@ -87,7 +87,7 @@ def foo it "records query's source location" do expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(1) @@ -106,7 +106,7 @@ def foo it "doesn't record query's source location" do expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(1) @@ -121,7 +121,7 @@ def foo end it "records database cached query events", skip: Rails.version.to_f < 5.1 do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) ActiveRecord::Base.connection.cache do @@ -133,7 +133,7 @@ def foo expect(transport.events.count).to eq(1) - transaction = transport.events.first.to_hash + transaction = transport.events.first.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:spans].count).to eq(2) @@ -155,7 +155,7 @@ def foo end it "doesn't record spans" do - transaction = Sentry::Transaction.new(sampled: false, hub: Sentry.get_current_hub) + transaction = Sentry::Transaction.new(sampled: false) Sentry.get_current_scope.set_span(transaction) Post.all.to_a diff --git a/sentry-rails/spec/sentry/rails/tracing/active_storage_subscriber_spec.rb b/sentry-rails/spec/sentry/rails/tracing/active_storage_subscriber_spec.rb index 9e93f2c8f..9a8a63b5a 100644 --- a/sentry-rails/spec/sentry/rails/tracing/active_storage_subscriber_spec.rb +++ b/sentry-rails/spec/sentry/rails/tracing/active_storage_subscriber_spec.rb @@ -25,7 +25,7 @@ expect(response).to have_http_status(:ok) expect(transport.events.count).to eq(2) - analysis_transaction = transport.events.first.to_hash + analysis_transaction = transport.events.first.to_h expect(analysis_transaction[:type]).to eq("transaction") if Rails.version.to_f > 6.1 @@ -40,7 +40,7 @@ expect(analysis_transaction[:spans][0][:origin]).to eq("auto.file.rails") end - request_transaction = transport.events.last.to_hash + request_transaction = transport.events.last.to_h expect(request_transaction[:type]).to eq("transaction") expect(request_transaction[:spans].count).to eq(2) @@ -68,7 +68,7 @@ p = Post.create! get "/posts/#{p.id}/attach" - request_transaction = transport.events.last.to_hash + request_transaction = transport.events.last.to_h expect(request_transaction[:type]).to eq("transaction") expect(request_transaction[:spans].count).to eq(2) diff --git a/sentry-rails/spec/sentry/rails/tracing/active_support_subscriber_spec.rb b/sentry-rails/spec/sentry/rails/tracing/active_support_subscriber_spec.rb index c276063da..0efaa33d5 100644 --- a/sentry-rails/spec/sentry/rails/tracing/active_support_subscriber_spec.rb +++ b/sentry-rails/spec/sentry/rails/tracing/active_support_subscriber_spec.rb @@ -16,14 +16,14 @@ end it "tracks cache write" do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.write("my_cache_key", "my_cache_value") transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) @@ -37,7 +37,7 @@ Rails.cache.write("my_cache_key", 0) - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.increment("my_cache_key") @@ -45,7 +45,7 @@ expect(Rails.cache.read("my_cache_key")).to eq(1) expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) expect(cache_transaction[:spans][0][:op]).to eq("cache.put") @@ -57,14 +57,14 @@ Rails.cache.write("my_cache_key", 0) - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.decrement("my_cache_key") transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) expect(cache_transaction[:spans][0][:op]).to eq("cache.put") @@ -72,14 +72,14 @@ end it "tracks cache read" do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.read("my_cache_key") transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) expect(cache_transaction[:spans][0][:op]).to eq("cache.get") @@ -87,7 +87,7 @@ end it "tracks cache delete" do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.read("my_cache_key") @@ -95,14 +95,14 @@ transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) expect(cache_transaction[:spans][0][:op]).to eq("cache.get") expect(cache_transaction[:spans][0][:origin]).to eq("auto.cache.rails") end it "tracks cache prune" do - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.write("my_cache_key", 123, expires_in: 0.seconds) @@ -112,7 +112,7 @@ transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(2) expect(cache_transaction[:spans][1][:op]).to eq("cache.flush") @@ -123,14 +123,14 @@ skip("cache.hit is unset on Rails 6.0.x.") if Rails.version.to_i == 6 Rails.cache.write("my_cache_key", "my_cache_value") - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.read("my_cache_key") Rails.cache.read("my_cache_key_non_existing") transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(2) expect(cache_transaction[:spans][0][:op]).to eq("cache.get") @@ -146,13 +146,13 @@ it "tracks cache delete" do Rails.cache.write("my_cache_key", "my_cache_value") - transaction = Sentry::Transaction.new(sampled: true, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(sampled: true) Sentry.get_current_scope.set_span(transaction) Rails.cache.delete("my_cache_key") transaction.finish expect(transport.events.count).to eq(1) - cache_transaction = transport.events.first.to_hash + cache_transaction = transport.events.first.to_h expect(cache_transaction[:type]).to eq("transaction") expect(cache_transaction[:spans].count).to eq(1) expect(cache_transaction[:spans][0][:op]).to eq("cache.remove") diff --git a/sentry-rails/spec/sentry/rails/tracing_spec.rb b/sentry-rails/spec/sentry/rails/tracing_spec.rb index 629f78aa9..aee2c38f9 100644 --- a/sentry-rails/spec/sentry/rails/tracing_spec.rb +++ b/sentry-rails/spec/sentry/rails/tracing_spec.rb @@ -26,8 +26,8 @@ expect(response).to have_http_status(:internal_server_error) expect(transport.events.count).to eq(2) - event = transport.events.first.to_hash - transaction = transport.events.last.to_hash + event = transport.events.first.to_h + transaction = transport.events.last.to_h expect(event.dig(:contexts, :trace, :trace_id).length).to eq(32) expect(event.dig(:contexts, :trace, :trace_id)).to eq(transaction.dig(:contexts, :trace, :trace_id)) @@ -67,7 +67,7 @@ expect(response).to have_http_status(:ok) expect(transport.events.count).to eq(1) - transaction = transport.events.last.to_hash + transaction = transport.events.last.to_h expect(transaction[:type]).to eq("transaction") expect(transaction.dig(:contexts, :trace, :op)).to eq("http.server") @@ -123,7 +123,7 @@ it "does not record sensitive params" do get "/posts?foo=bar&password=42&secret=baz" - transaction = transport.events.last.to_hash + transaction = transport.events.last.to_h params = transaction[:spans][0][:data][:params] expect(params["foo"]).to eq("bar") @@ -145,7 +145,7 @@ it "records all params" do get "/posts?foo=bar&password=42&secret=baz" - transaction = transport.events.last.to_hash + transaction = transport.events.last.to_h params = transaction[:spans][0][:data][:params] expect(params["foo"]).to eq("bar") @@ -260,7 +260,7 @@ expect(transport.events.count).to eq(3) - transaction = transport.events.last.to_hash + transaction = transport.events.last.to_h expect(transaction[:type]).to eq("transaction") expect(transaction[:transaction]).to eq("PostsController#show") @@ -275,7 +275,6 @@ status: "ok", sampled: true, name: "a/path", - hub: Sentry.get_current_hub ) end diff --git a/sentry-rails/spec/sentry/send_event_job_spec.rb b/sentry-rails/spec/sentry/send_event_job_spec.rb deleted file mode 100644 index 00f89b2ed..000000000 --- a/sentry-rails/spec/sentry/send_event_job_spec.rb +++ /dev/null @@ -1,105 +0,0 @@ -# frozen_string_literal: true - -require "active_job" -require "spec_helper" - -RSpec.describe "Sentry::SendEventJob" do - let(:event) do - Sentry.get_current_client.event_from_message("test message") - end - let(:transport) do - Sentry.get_current_client.transport - end - - context "when ActiveJob is not loaded" do - before do - TempActiveJob = ActiveJob - Object.send(:remove_const, "ActiveJob") - reload_send_event_job - end - - after do - ActiveJob = TempActiveJob - reload_send_event_job - end - - it "gets defined as a blank class" do - expect(Sentry::SendEventJob.superclass).to eq(Object) - end - end - - context "when ActiveJob is loaded" do - after do - reload_send_event_job - end - - it "reports events to Sentry" do - make_basic_app - - Sentry.configuration.before_send = lambda do |event, hint| - event.tags[:hint] = hint - event - end - - Sentry::SendEventJob.perform_now(event, { foo: "bar" }) - - expect(transport.events.count).to eq(1) - event = transport.events.first - expect(event.message).to eq("test message") - expect(event.tags[:hint][:foo]).to eq("bar") - end - - it "doesn't create a new transaction" do - make_basic_app do |config| - config.traces_sample_rate = 1.0 - end - - Sentry::SendEventJob.perform_now(event) - - expect(transport.events.count).to eq(1) - event = transport.events.first - expect(event.type).to eq("event") - end - - context "when ApplicationJob is not defined" do - before do - make_basic_app - end - it "uses ActiveJob::Base as the parent class" do - expect(Sentry::SendEventJob.superclass).to eq(ActiveJob::Base) - end - end - - context "when ApplicationJob is defined" do - before do - class ApplicationJob < ActiveJob::Base; end - reload_send_event_job - make_basic_app - end - - after do - Object.send(:remove_const, "ApplicationJob") - end - - it "uses ApplicationJob as the parent class" do - expect(Sentry::SendEventJob.superclass).to eq(ApplicationJob) - end - end - - context "when ApplicationJob is defined but it's something else" do - before do - class ApplicationJob; end - reload_send_event_job - make_basic_app - end - - after do - Object.send(:remove_const, "ApplicationJob") - end - - it "uses ActiveJob::Base as the parent class" do - expect(Sentry::SendEventJob.superclass).to eq(ActiveJob::Base) - end - end - end -end diff --git a/sentry-raven/.craft.yml b/sentry-raven/.craft.yml deleted file mode 100644 index ba6de9cd2..000000000 --- a/sentry-raven/.craft.yml +++ /dev/null @@ -1,19 +0,0 @@ -minVersion: '0.13.2' -github: - owner: getsentry - repo: sentry-ruby -changelogPolicy: simple -preReleaseCommand: ruby .scripts/bump-version.rb -releaseBranchPrefix: release-sentry-raven -statusProvider: - name: github -artifactProvider: - name: github -targets: - - name: gem - - name: registry - type: sdk - config: - canonical: 'gem:sentry-raven' - - name: github - tagPrefix: sentry-raven-v diff --git a/sentry-raven/.scripts/bump-version.rb b/sentry-raven/.scripts/bump-version.rb deleted file mode 100755 index 2526cbab0..000000000 --- a/sentry-raven/.scripts/bump-version.rb +++ /dev/null @@ -1,5 +0,0 @@ -file_name = "lib/raven/version.rb" - -text = File.read(file_name) -new_contents = text.gsub(/VERSION = ".*"/, "VERSION = \"#{ARGV[1]}\"") -File.open(file_name, "w") {|file| file.puts new_contents } diff --git a/sentry-raven/CHANGELOG.md b/sentry-raven/CHANGELOG.md deleted file mode 100644 index 4b186fd9c..000000000 --- a/sentry-raven/CHANGELOG.md +++ /dev/null @@ -1,707 +0,0 @@ -# Changelog - -## Unreleased - -- fix: user_context with block does not reset context after block exits - -## 3.1.2 - -- Fix Delayed::Plugins::Raven when job raises exception [#1057](https://github.com/getsentry/sentry-ruby/pull/1057) -- Merge hash instead of replacing the original value in user_context [#1064](https://github.com/getsentry/sentry-ruby/pull/1064) -- Don't exclude ActionView::MissingTemplate error by default [#1092](https://github.com/getsentry/sentry-ruby/pull/1092) -- Fix typo: much -> must for Raven::Event [#1106](https://github.com/getsentry/sentry-ruby/pull/1106) -- Fix undefined local variable or method logger [#1143](https://github.com/getsentry/sentry-ruby/pull/1143) - - Fixes [#1110](https://github.com/getsentry/sentry-ruby/issues/1110) -- fix format headers for sentry-raven [#1198](https://github.com/getsentry/sentry-ruby/pull/1198) -- Print deprecation message after sentry-raven is installed [#1206](https://github.com/getsentry/sentry-ruby/pull/1206) - -## 3.1.1 - -**Feature** - -- Add request id to headers if exists ([#1033](https://github.com/getsentry/sentry-ruby/pull/1033)) - -- Allow blocks on user_context ([#1023](https://github.com/getsentry/sentry-ruby/pull/1023)) - -- Enable configurable rack environment recorded parameters ([#860](https://github.com/getsentry/sentry-ruby/pull/860)) - -- Remove ActiveJob keys for both Sidekiq and DelayedJob ([#898](https://github.com/getsentry/sentry-ruby/pull/898)) - -**Fix** - -- Remove circular dependency in transport/http.rb ([#1035](https://github.com/getsentry/sentry-ruby/pull/1035)) - -## 3.1.0 - -**Feature** - -- Exclude all 4xx Rails errors ([#1004](https://github.com/getsentry/raven-ruby/pull/1004)) - - See the full list [here](https://github.com/getsentry/raven-ruby/blob/master/lib/raven/configuration.rb#L198-L219) - -- Add some error context in `transport_failure_callback` ([#1003](https://github.com/getsentry/raven-ruby/pull/1003)) - - Before: - - ```ruby - config.transport_failure_callback = lambda { |event| - AdminMailer.email_admins("Oh god, it's on fire!", event).deliver_later - } - ``` - - After: - - ```ruby - config.transport_failure_callback = lambda { |event, error| - AdminMailer.email_admins("Oh god, it's on fire because #{error.message}!", event).deliver_later - } - ``` - -- Support cleaning up exception backtrace with customized backtrace_cleaner ([#1011](https://github.com/getsentry/raven-ruby/pull/1011)) - - The new config `backtrace_cleanup_callback` takes a lambda/proc object (default is `nil`) and will be called with exception's backtrace - - ```ruby - Raven.configure do |config| - config.backtrace_cleanup_callback = lambda do |backtrace| - Rails.backtrace_cleaner.clean(backtrace) - end - end - ``` - - And with the Rails integration, it'll automatically use a customized `Raven::Rails::BacktraceCleaner` to clean up exception's backtrace. It's basically Rails 6's [backtrace cleaner](https://github.com/rails/rails/blob/master/railties/lib/rails/backtrace_cleaner.rb) but without silencers. - - The main reason to add this cleaner is to remove template methods from the trace, e.g. - - ``` - app/views/welcome/view_error.html.erb in _app_views_welcome_view_error_html_erb__2807287320172182514_65600 at line 1 - ``` - - will become - - ``` - app/views/welcome/view_error.html.erb at line 1 - ``` - - This can help Sentry group issues more accurately. See [#957](https://github.com/getsentry/raven-ruby/issues/957) for more information about this. - - If you don't want this change, you can disable it with: - - ```ruby - Raven.configure do |config| - config.backtrace_cleanup_callback = nil - end - ``` - - -- Make dsn value accessable from config ([#1012](https://github.com/getsentry/raven-ruby/pull/1012)) - - You can now access the dsn value via `Raven.configuration.dsn` - -**Deprecation** - -- Deprecate dasherized filenames ([#1006](https://github.com/getsentry/raven-ruby/pull/1006)) - - If you're using - - ```ruby - gem 'sentry-raven', require: 'sentry-raven-without-integrations' - # or - require "sentry-raven-without-integrations" - ``` - - you will start seeing deprecation warnings. Please change them into - - ```ruby - gem 'sentry-raven', require: 'sentry_raven_without_integrations' - # or - require "sentry_raven_without_integrations" - ``` - -- Unify breadcrumb loggers activation ([#1016](https://github.com/getsentry/raven-ruby/pull/1016)) - - Currently, we activate our breadcrumb loggers differently: - - ```ruby - require "raven/breadcrumbs/sentry_logger" - Raven.configuration.rails_activesupport_breadcrumbs = true - ``` - - It's not a nice user interface, so this PR adds a new configuration - option `breadcrumbs_logger` to improve this: - - ```ruby - Raven.configuration.breadcrumbs_logger = :sentry_logger - Raven.configuration.breadcrumbs_logger = :active_support_logger - Raven.configuration.breadcrumbs_logger = [:sentry_logger, :active_support_logger] - ``` - - Please migrate to the new activation apporach, otherwise you'll see depraction warnings. And old ones will be dropped in version 4.0. - -**Refactor** - -- Accept non-string message in Event.from_exception ([#1005](https://github.com/getsentry/raven-ruby/pull/1005)) -- Refactor event initialization ([#1010](https://github.com/getsentry/raven-ruby/pull/1010)) -- Refactor sidekiq integration ([#1019](https://github.com/getsentry/raven-ruby/pull/1019)) - -**Fix** - -- Replace sys_command usages in context.rb ([#1017](https://github.com/getsentry/raven-ruby/pull/1017)) -- Fix merge error from rack-timeout raven_context on old releases ([#1007](https://github.com/getsentry/raven-ruby/pull/1007)) -- Return value of `rescue_with_handler` when intercepting ActiveJob exceptions ([#1027](https://github.com/getsentry/raven-ruby/pull/1027)) - -## 3.0.4 - -- fix: Don't log warning messages when it doesn't need to (#1000) -- fix: Revert "Refactor Raven::Client class" (#1002) - -## 3.0.3 - -- fix: Ensure Processor::Cookie can run after Processor::RemoveCircularReferences (#996) -- fix: Avoid mutating user passed in options (#994) -- fix: Fix/Refactor Raven::Cli (#989) -- ref: Refactor Raven::Client class (#995) - - It adds `Event#message_from_exception` and `Event#log_message` interfaces - -## 3.0.2 - -- fix: Add gem target for craft - -## 3.0.1 - -- fix: Improve SanitizeData processor (#984) -- fix: Masking cookies as key/pair instead of a single string (#983) -- fix: Transports classes' requiring issue (#986) -- fix: Frozen string issues (#977) -- feat: Officially support Rails 6 (#982) - -3.0.0 ----- - -* SDK now requires Ruby >= 2.3 -* REF: Retain any literal "HTTP-" in header names [@elliterate, #950] -* REF: Delete JSON spec for recursive hashes [@ksylvest, #952] -* FEAT: Bump faraday version to latest [@ksylvest, #946] - -2.13.0 ----- - -* FIX: Sanitize event data before they are sent to async job. [@edariedl, #895] -* FIX: Serialization MongoDB ObjectId to JSON problem with gem delayed_job_mongoid conjunction. [@eagleas, #935] -* FEAT: Skip ActiveJob integration if there is a better one [@fsateler, #909] -* FIX: Bugs with send_event in asynchronous mode (#940) [@cstyles, #940] - -2.12.3 ----- - -* FIX: crash when Process.wait is used [@asBrettisay, #895] - -2.12.2 ----- - -* FIX: return tags/extra for [@rivayama, #931] - -2.12.1 ----- - -* FIX: undefined method `[]' for nil:NilClass [@HazAT, #932] - -2.12.0 ----- - -* FIX: Remove duplicate message when exception is emitted -* FIX: Frozen string bug in utf8conversation -* FEATURE: Allow block on tags_context and extra_context - -2.11.3 ----- - -* FIX: infinite backoff under pressure [@Bonias, #886] - -2.11.2 ----- - -* REF: Warn on 4xx error [@iloveitaly, #862] - -2.11.1 ----- - -* FIX: Call `to_s` on breadcrumb message [@halkeye, #914] - -2.11.0 ----- - -* FEATURE: Prepend the transaction around_action so libraries with controllers can alter the value. [@drcapulet, #887] - -2.10.0 ------ - -* FEATURE: Added support for `SENTRY_ENVIRONMENT` [@mtsmfm, #910] -* FEATURE: Added support for `SENTRY_RELEASE` [@coorasse, #911] - -2.9.0 ------ - -* FEATURE: Added `config.inspect_exception_causes_for_exclusion`. Determines if the exception cause should be inspected for `config.excluded_exceptions` option. [@effron, #872] - - -2.8.0 ------ - -* FEATURE: Added `config.before_send`. Provide a lambda or proc to this config setting, which will be `call`ed before sending an event to Sentry. Receives `event` and `hint` as parameters. `hint` is a hash `{:exception => ex | nil, :message => message | nil}`. [@hazat, #882] - -2.7.4 ------ - -* BUGFIX: Correctly handle public only DSNs [@mitsuhiko, #847] -* BUGFIX: context attributes with nil raised error [@joker-777, 824] -* BUGFIX: Suppress warning about enabling dyno metadata in Heroku CI [@meganemura, #833] - -2.7.3 ------ - -* BUGFIX: Fix proxy settings for Faraday [@Strnadj, #820] -* BUGFIX: Fix duplicated events in ActiveJob w/DelayedJob and Sidekiq [@BrentWheeldon, #815] - -2.7.2 ------ - -* BUGFIX: GlobalIDs are now displayed correctly in Sidekiq contexts [@louim, #798] -* BUGFIX: If git is not installed, fail silently during release detection [@nateberkopec] -* BUGFIX: We do not support rack-timeout <= 0.2, fix errors when incompat version present [@nateberkopec] -* BUGFIX: Put cookies in the correct spot of event [@nateberkopec, #812] -* BUGFIX: Exception context is deep_merged [@janklimo, #782] - -2.7.1 ------ - -* BUGFIX: Fixed LocalJumpError in Rails controllers [@nateberkopec w/@frodsan, #774] - -2.7.0 ------ - -* FEATURE: Add random sampling. [@nateberkopec, #734] -* FEATURE: Transactions. See Context docs for usage. [@nateberkopec, #743] -* FEATURE: You can set the current environment for Sentry via `SENTRY_CURRENT_ENV` env variable. Useful if your staging environment's RACK_ENV is "production", for example. [@tijmenb, #736] - -* BUGFIX: Fix wrapped classnames in old versions of Sidekiq and ActiveJob [@nateberkopec, #702] -* BUGFIX: Server names on Heroku were pretty useless before - now they follow the dyno name ("worker.1", "web.2") [@nateberkopec, #703] -* BUGFIX: ActiveJob::DeserializationError is now ignored by default. Not doing so can cause infinite loops if you are using an ActiveJob async callback. [@nateberkopec, #701] -* BUGFIX: Binary conversion to UTF-8 when binary is frozen is fixed [@nateberkopec, #757] -* BUGFIX: Our credit-card regex now matches Sentry's server behavior, which means it does not censor milliseconds since the epoch [@nateberkopec, #771] - -* REFACTOR: We now use an updated port of Rails' deep_merge which should be 5-10% faster [@nateberkopec, #770] -* REFACTOR: Tests have been cleaned up, and now run in random order. [@nateberkopec] -* REFACTOR: Raven::Event has been refactored a bit [@nateberkopec] - -2.6.3 ------ - -* BUGFIX: Fixed typo in the Heroku warning [@greysteil, #728] -* BUGFIX: Swallow IOErrors when reading the Rack request body [@nateberkopec] -* BUGFIX: Fix invalid UTF-8/circular references when using async [@nateberkopec, #730] - -2.6.2 ------ - -* BUGFIX: If using the Sidekiq or DelayedJob adapters with ActiveJob, ActiveJob wouldn't re-raise upon capturing an exception. [@nateberkopec, 5b02ad4ff2] - -* KNOWN ISSUE: When using `async`, Rack integration is not thread-safe [#721] -* KNOWN ISSUE: When using `async`, encoding errors may be raised [#725] - -2.6.1 ------ - -* BUGFIX: Fix cases where ActionDispatch::RemoteIP would blow up during event creation [@cmoylan, #722] -* BUGFIX: In ActiveJob, don't report exceptions which can be rescued by rescue_from handlers [@bensheldon, #719] - -2.6.0 ------ - -* FEATURE: raven-ruby now marks itself as the "ruby" logger by default, to match raven-js behavior [@nateberkopec] -* FEATURE: You may now override the default sanitization parameters [#712, @nateberkopec] -* FEATURE: Breadcrumb buffers are now publicly accessible [#686, @nateberkopec] -* FEATURE: We yell at you now if you're using Heroku but don't have runtime-dyno-metadata enabled [#715, @nateberkopec] -* FEATURE: project_root will always be set, regardless of framework [#716, @nateberkopec] - -* BUGFIX: Request body and message limits now match Sentry server defaults [#714, @nateberkopec] -* BUGFIX: Sidekiq context now works as expected [#713, @nateberkopec] -* BUGFIX: Capture exceptions in ActiveJob when not using Sidekiq adapter [#709, #671, @nateberkopec] - -2.5.3 ------ - -* BUGFIX: Deal properly with ASCII_8BIT/BINARY encodings [#689, #696, @nateberkopec] - -2.5.2 ------ - -* BUGFIX: raven test executable should be available [#691, @nateberkopec] -* BUGFIX: Fix stack overflow when calling Backtrace#inspect [#690, @nateberkopec] - -* KNOWN ISSUE: Character encoding errors [#689] - -2.5.1 ------ - -* BUGFIX: Fix case where Pathname objects are on the load path [@nateberkopec] -* BUGFIX: Fix bad UTF-8 characters in the URL querystring [@nateberkopec] -* BUGFIX: Fix case where rack-timeout could be required twice [@nateberkopec] - -* REFACTOR: Slightly cleaner character encoding fixing [@nateberkopec, @bf4] - -2.5.0 ------ - -* FEATURE: Greatly improved performance (2-3x faster capture) [@nateberkopec] -* FEATURE: Frozen objects are now sanitized [@nateberkopec] - -* BUGFIX: Grabbing Sidekiq context from "wrapped" classes works [@nateberkopec] -* BUGFIX: Relaxed Faraday dependency [@nateberkopec] - -2.4.0 ------ - -* FEATURE: Allow customization of the Faraday adapter [#639, @StupidCodeFactory] - -* BUGFIX: Report the SDK name as "raven-ruby", not "sentry-raven" [#641, @bretthoerner] -* BUGFIX: Sidekiq jobs now clear context/breadcrumbs properly between jobs [#637, @drewish] -* BUGFIX: Overriding the logger in Rails wasn't working [#638, @eugeneius] - -2.3.1 ------ - -* BUGFIX: Backtrace parser fixed for JRuby 9k [#619, @the-michael-toy] -* BUGFIX: Rake tasks should show the correct task name [#621, @Bugagazavr] -* BUGFIX: Formatted messages work if params are `nil` [#625, @miyachik] -* BUGFIX: Backtrace logger on failed event send works with custom formatters [#627, @chulkilee] -* BUGFIX: Fix typo that caused Version headers to not be corrected [#628, @nateberkopec] -* BUGFIX: Faraday errors are more descriptive when no server response [#629, @drewish] -* BUGFIX: DelayedJob handler no longer truncates unneccessarily short [#633, @darrennix] -* BUGFIX: Fix several processors not working correctly w/async jobs stored in backends like Redis [#634, @nateberkopec] - -2.3.0 ------ - -* CHANGE: Log levels of some messages have been changed. Raven logger is INFO level by default. [@nateberkopec] -* BUGFIX: Exception messages are now limited to 10,000 bytes. [#617, @mattrobenolt] - -2.2.0 ------ - -* ENHANCEMENT: Sentry server errors now return some information about the response headers. [#585, @rafadc] -* BUGFIX/ENHANCEMENT: Frozen objects are no longer sanitized. This prevents some bugs, but you can now also freeze objects if you don't want them to be sanitized by the SanitizeData processor. [#594, @nateberkopec] -* ENHANCEMENT: The ability to use Raven::Instance alone is greatly improved. You can now call #capture_exception directly on an Instance (#595), give it it's own Logger (#599), and set it's own config which will be used when creating Events (#601). Thanks to -* ENHANCEMENT: You may now provide your own LineCache-like class to Raven. This is useful if you have source code which is not available on disk. [#606, @nateberkopec] -* BUGFIX: Raven no longer emits anything to STDOUT if a system command fails [#596, @nateberkopec] -* ENHANCEMENT: Raven now tells you exactly why it will not send an event in the logs [#602, @nateberkopec] - -2.1.4 ------ - -* FIX: Remove `contexts` key, because it was disabling browser auto-tagging [#587, @nateberkopec] - -2.1.3 ------ - -* Move `os` context key to `server_os` [@nateberkopec] - -2.1.2 ------ - -* FIX: `sys_command` not falling back to Windows commands properly, logging output [@jmalves, @nateberkopec] - -2.1.1 ------ - -* FIX: Message params should accept nil [@jmalves, #570] - -2.1.0 ------ - -ENHANCEMENTS: - -* Your client version is now included in all Events. [@nateberkopec, #559] -* OS and Ruby runtime information now included in all Events. [@nateberkopec, #560] -* Transport errors (like Sentry 4XX errors) now raise Sentry::Error, not Faraday errors. [@nateberkopec, #565] -* Sidekiq integration is streamlined and improved. Supports Sidekiq 3.x and up. [@nateberkopec, #555] - -FIXES: - -* Heroku release detection is improved and more accurate. You must `heroku labs:enable runtime-dyno-metadata` for it to work. [@nateberkopec, #566] - -2.0.2 ------ - -* FIX: Don't set up Rack-Timeout middleware. [@janraasch, #558] - -2.0.1 ------ - -* FIX: UUIDs were being rejected by Sentry as being too long [@nateberkopec] - -2.0.0 ------ - -BREAKING CHANGES: - -* The object passed to the `async` callback is now a JSON-compatible hash, not a Raven::Event. This fixes many bugs with backend job processors like DelayedJob. [@nateberkopec, #547] -* Several deprecated accessors have been removed [@nateberkopec, #543] -* You can no longer pass an object which cannot be called to `should_capture` [@nateberkopec, #542] - -ENHANCEMENTS: - -* Rack::Timeout exceptions are now fingerprinted by URL, making them more useful [@nateberkopec, #538] -* Added an HTTP header processor by default. We now scrub `Authorization` headers correctly. You can use `config.sanitize_http_headers` to add a list of HTTP headers you don't want sent to Sentry (e.g. ["Via", "Referer", "User-Agent", "Server", "From"]) [@nateberkopec] - -FIXES: - -* User/Event IP addresses are now set more accurately. This will fix many issues with local proxy setups (nginx, etc). [@nateberkopec, #546] -* We now generate a real UUID in the correct format for Event IDs [@nateberkopec, #549] -* If `async` sending fails, we retry with sync sending. [@nateberkopec, #548] -* Changed truncation approach - event messages and HTTP bodies now limited to the same amount of characters they're limited to at the Sentry server [@nateberkopec, #536] - -OTHER: - -* Codebase cleaned up with Rubocop [@nateberkopec, #544] - -1.2.3 ------ - -* ENHANCEMENT: Send the current environment to Sentry [@dcramer, #530] -* BUGFIX: Fix all warnings emitted by Ruby verbose mode [@nateberkopec] -* BUGFIX: Fix compat with `log4r` [@nateberkopec, #535] - -1.2.2 ------ - -* BUGFIX: NameError in DelayedJob integration. [janraasch, #525] - -1.2.1 ------ - -* BUGFIX: Context clearing should now work properly in DelayedJob and Sidekiq. Also, we properly clear context if Sentry causes an exception. [nateberkopec, #520] -* BUGFIX: If Sentry will not send the event (due to environments or no DSN set), it will not attempt to "capture" (construct an event) [nateberkopec, #518] - -1.2.0 ------ - -* FEATURE: Raven now supports Breadcrumbs, though they aren't on by default. Check the docs for how to enable. [dcramer, #497] -* FEATURE: Raven is no longer a singleton, you may have many `Raven::Instance`s. [phillbaker, #504] -* PERFORMANCE: Raven no longer uses a vendored JSON implementation. JSON processing and encoding should be up to 6x faster. [dcramer, #510] -* BUGFIX: silence_ready now works for Rails apps. [ream88, #512] -* BUGFIX: transport_failure_callback now works correctly [nateberkopec, #508] - -1.1.0 ------ - -* The client exposes a ``last_event_id`` accessor at `Raven.last_event_id`. [dcramer, #493] -* PERFORMANCE: Skip identical backtraces from "re-raised" exceptions [databus23, #499] -* Support for ActionController::Live and Rails template streaming [nateberkopec, #486] - -1.0.0 ------ - -We (i.e. @nateberkopec) decided that `raven-ruby` has been stable enough for some time that it's time for a 1.0.0 release! - -BREAKING CHANGES: - -- Dropped support for Ruby 1.8.7 [nateberkopec, #465] -- `raven-ruby` no longer reports form POST data or web cookies by default. To re-enable this behavior, remove the appropriate Processors from your config (see docs or PR) [nateberkopec, #466] -- UDP transport has been removed [dcramer, #472] - -OTHER CHANGES: - -- Improved performance [zanker] -- Deprecated `config.catch_debugged_exceptions`, replaced with `config.rails_report_rescued_exceptions`. `catch_debugged_exceptions` will be removed in 1.1. [nateberkopec, #483] -- Added `config.transport_failure_callback`. Provide a lambda or proc to this config setting, which will be `call`ed when Sentry returns a 4xx/5xx response. [nateberkopec, #484] -- JRuby builds fixed [RobinDaugherty] -- Fix problems with duplicate exceptions and `Exception.cause` [dcramer, #490] -- Added Exception Context. Any Exception class can define a `raven_context` instance variable, which will be merged into any Event's context which contains this exception. [nateberkopec, #491] -+ Documentation from shaneog, squirly, dcramer, ehfeng, nateberkopec. - -0.15.6 ------- - -- Fixed bug where return value of debug middleware was nil [eugeneius, #461] -- Fixed a bug in checking `catch_debugged_exceptions` [greysteil, #458] -- Fixed a deprecation warning for Rails 5 [Elektron1c97, #457] - -0.15.5 ------- - -- DelayedJob integration fixed when last_error not present [dcramer, #454] -- Release detection doesn't overwrite manual release setting in Rails [eugeneius, #450] -- Deal properly with Cap 3.0/3.1 revision logs [timcheadle, #449] -- Rails 5 support [nateberkopec, #423] - -0.15.4 ------- - -- DelayedJob integration now also truncates last_error to 100 characters [nateberkopec] -- Fix several issues with release detection - silence git log message, fix Capistrano detection [nateberkopec, kkumler] - - -0.15.3 ------- - -- Double exception reporting in Rails FIXED! [nateberkopec, #422] -- Rails 3 users having issues with undefined runner fixed [nateberkopec, #428] -- Sidekiq integration works properly when ActiveJob enabled [mattrobenolt] -- Fix problems with invalid UTF-8 in exception messages [nateberkopec, #426] -- Backtraces now consider "exe" directories part of the app [nateberkopec, #420] -- Sinatra::NotFound now ignored by default [drcapulet, #383] -- Release versions now properly set. Support for Heroku, Capistrano, and Git. [iloveitaly #377, Sija #380] -- DelayedJob integration plays well with ActiveJob [kkumler, #378] -- DelayedJob handlers now truncated [nateberkopec, #431] -- Tons of code quality improvements [amatsuda, ddrmanxbxfr, pmbrent, cpizzaia, wdhorton, PepperTeasdale] - -0.15.2 ------- - -- Reverted ActiveJob support due to conflicts [#368] - -0.15.1 ------- - -- Fix ActiveJob support [greysteil, #367] - -0.15.0 ------- - -- Remove Certifi and use default Ruby SSL config [zanker, #352] -- Support for ``fingerprint`` [dcramer] -- Improved documentation and tests around various attributes [dcramer] -- Allow configurable integrations [cthornton] -- Prevent recursion with ``Exception.cause`` [dcramer, #357] -- Use empty hash if false-y value [GeekOnCoffee, #354] -- Correct some behavior with at_exit error capturing [kratob, #355] -- Sanitize matches whole words [alyssa, #361] -- Expose more debugging info to active_job integration [tonywok, #365] -- Capture exceptions swallowed by rails [robertclancy, #343] -- Sanitize the query string when the key is a symbol [jason-o-matic, #349] -- Moved documentation to docs.getsentry.com [mitsuhiko] - -0.14.0 ------- - -- Correct handling of JRuby stacktraces [dcramer] -- Better handling of unreachable file contexts [dcramer, #335] -- SSL is now default ON [dcramer, #338] -- Capture exceptions in runner tasks [eugeneius, #339] -- ActiveJob integration [lucasmazza, #327] -- Cleanup return values of async blocks [lucasmazza, #344] -- Better handling when sending NaN/Infinity JSON values [Alric, #345] -- Fix issues with digest/md5 namespace [lsb, #346] - -0.13.3 ------- - -- Fix a deprecation warning being shown in regular operation [ripta, #332] - -0.13.2 ------- - -- DelayedJob integration now includes the job id [javawizard, #321] -- Rails integration now works properly when you're not using all parts of Rails (e.g. just ActiveRecord) [lucasmazza, #323] -- Bugfix CLI tool when async config is on [if1live, #324] -- Fix and standardize tag hierarchies. Event tags > context tags > configuration tags in all cases. [JonathanBatten, #322 and eugeneius, #330] -- Using #send on Client, Base, and Transports is now deprecated. See [the commit](https://github.com/getsentry/raven-ruby/commit/9f482022a648ab662c22177ba24fd2e2b6794c34) (or the deprecation message) for their replacements. [nateberkopec, #326] -- You can now disable credit-card-like value filtering. [codekitchen, #329] - -0.13.1 ------- - -- Raven::Transports::HTTP#send returns the response now. [eagletmt, #317] -- Filenames now work a lot better when you vendor your gems. [eugeneius, #316] -- Fix raven:test issue when testing non-async configurations. [weynsee, #318] -- Fix blockless Raven#capture. [dinosaurjr, #320] -- Fix some log messages [eagletmt, #319] - -0.13.0 ------- - -- Support exception chaining [javawizard, #312] -- Add support for sending release version [eugeneius, #310] -- Better status reports on configuration [faber, #309] -- Client "send" method accepts an event in object or hash format - this will make it much easier to send Sentry events in a delayed job! [marclennox, #300] -- Fix duplicate fields in SanitizeData [wyattisimo, #294] -- Always preserve filename paths under project_root [eugeneius, #291] -- Truncate project root prefixes from filenames [eagletmt, #278] -- Renamed should_send callback to should_capture [nateberkopec, #270] -- Silencing the ready message now happens in the config as normal [nateberkopec, #260] -- Various internal refactorings [see here](https://github.com/getsentry/raven-ruby/compare/0-12-stable...master) - -0.12.3 ------- - -- URL query parameters are now sanitized for sensitive data [pcorliss, #275] -- Raven::Client can now use a proxy server when sending events to Sentry [dcramer, #277] -- Raven::Client will now use a timed backoff strategy if the server fails [codekitchen, #267] -- Automatic integration loading is now a lot less brittle [dcramer, handlers, #263, #264] -- Fixed some issues with prefixes and DSN strings [nateberkopec, #259] -- If Raven is initialized without a server config, it will no longer send events [nateberkopec, #258] -- Slightly nicer credit-card-like number scrubbing [nateberkopec, #254] -- Fix some exceptions not being caught by Sidekiq middleware [nateberkopec, #251] -- Uncommon types are now encoded correctly [nateberkopec, #249] - -0.12.2 ------- - -- Security fix where exponential numbers in specially crafted params could cause a CPU attack [dcramer, #262] - -0.12.1 ------- - -- Integrations (Sidekiq, DelayedJob, etc) now load independently of your Gemfile order. [nateberkopec, #236] -- Fixed bug where setting tags mutated your configuration [berg, #239] -- Fixed several issues with SanitizeData and UTF8 sanitization processors [nateberkopec, #238, #241, #244] - -0.12.0 ------- - -- You can now give additional fields to the SanitizeData processor. Values matched are replaced by the string mask (*********). Full documentation (and how to use with Rails config.filter_parameters) [here](https://docs.sentry.io/platforms/ruby/config/). [jamescway, #232] -- An additional processor has been added, though it isn't turned on by default: RemoveStacktrace. Use it to remove stacktraces from exception reports. [nateberkopec, #233] -- Dependency on `uuidtools` has been removed. [nateberkopec, #231] - -0.11.2 ------- - -- Fix some issues with the SanitizeData processor when processing strings that look like JSON - - -0.11.1 ------- - -- Raven now captures exceptions in Rake tasks automatically. [nateberkopec, troelskn #222] -- There is now a configuration option called ```should_send``` that can be configured to use a Proc to determine whether or not an event should be sent to Sentry. This can be used to implement rate limiters, etc. [nateberkopec, #221] -- Raven now includes three event processors by default instead of one, which can be turned on and off independently. [nateberkopec, #223] -- Fixed bug with YAJL compatibility. [nateberkopec, #223] - -0.10.1 ------- - -- Updated to RSpec 3. -- Apply filters to encoded JSON data. - - -0.10.0 ------- - -- Events are now sent to Sentry in all environments. To change this behavior, either unset ```SENTRY_DSN``` or explicitly configure it via ```Raven.configure```. -- gzip is now the default encoding -- Removed hashie dependency - - -0.9.0 ------ - -- Native support for Delayed::Job [pkuczynski, #176] -- Updated to Sentry protocol version 5 - - -0.5.0 ------ -- Rails 2 support [sluukonen, #45] -- Controller methods in Rails [jfirebaugh] -- Runs by default in any environment other than test, cucumber, or development. [#81] diff --git a/sentry-raven/CONTRIBUTING.md b/sentry-raven/CONTRIBUTING.md deleted file mode 100644 index 71cb77042..000000000 --- a/sentry-raven/CONTRIBUTING.md +++ /dev/null @@ -1,71 +0,0 @@ -

- - - -
-

- -# Contributing - -You can contribute this project in the following ways: - -- File a [bug report] or propose a feature -- Open a PR for bug fixes or implementing requested features -- Give feedback to opened issues/pull requests -- Test the latest version - `gem 'sentry-raven', github: 'getsentry/raven-ruby'` -- Contribute documentation in the [document repo] - - -And if you have any questions, please feel free to reach out on [Discord]. - - -[bug report]: https://github.com/getsentry/raven-ruby/issues/new?template=bug_report.md -[document repo]: https://github.com/getsentry/sentry-docs -[Discord]: https://discord.gg/Ww9hbqr - -## How To Contribute - -### Running Tests - -#### RAILS_VERSION - -Because this SDK supports multiple versions of Rails, or even without Rails, you might want to run your test against different versions of Rails. - -You can do this by changing the `RAILS_VERSION` environment variable: - - -``` -$ echo RAILS_VERSION=6.0 -$ bundle update # this is necessary if you're switching between Rails versions -$ bundle exec rake -``` - -If not specified, it runs tests against `Rails 5.2`. - -And if you don't want to run the Rails related test cases, you can use `RAILS_VERSION=0` - -``` -$ RAILS_VERSION=0 bundle exec rake # runs without Rails related test cases -``` - -### Testing Your Change Against Example Rails Apps - -We have a few example apps for different Rails versions under the `/examples` folder. You can use them to perform an end-to-end testing on your changes (just remember to change the DSN to your project's). - -At this moment, we recommend testing against the [Rails 6 example](https://github.com/getsentry/raven-ruby/tree/master/examples/rails-6.0) first. Please read its readme to see what kind of testing you can perform with it. - - -## Making a release - -Install and use `craft`: https://github.com/getsentry/craft - -Make sure the `CHANGELOG.md` is update and latest `master` contains all changes. - -Run: - -```bash -craft prepare x.x.x -``` - -Where `x.x.x` stands for the version you want to release. -Afterwards reach out to an employee of Sentry, they will cut a release by running the `publish` process of `craft`. diff --git a/sentry-raven/Gemfile b/sentry-raven/Gemfile deleted file mode 100644 index 5ee60968a..000000000 --- a/sentry-raven/Gemfile +++ /dev/null @@ -1,41 +0,0 @@ -source "https://rubygems.org/" -git_source(:github) { |name| "https://github.com/#{name}.git" } - -gemspec - -rails_version = ENV["RAILS_VERSION"] -rails_version = "5.2" if rails_version.nil? - -if rails_version.to_f != 0 - gem "rails", "~> #{rails_version}" - gem "rspec-rails", "~> 4.0" -end - -gem "delayed_job" -gem "sidekiq", "< 7.0" - -gem "rack", "< 3.0" -gem "rack-timeout" - -# TODO: Remove this if https://github.com/jruby/jruby/issues/6547 is addressed -gem "i18n", "<= 1.8.7" - -gem "pry" -gem "benchmark-ips" -gem "benchmark_driver" -gem "benchmark-ipsa" -gem "benchmark-memory" -gem "ruby-prof", platform: :mri -gem "rake", "> 12" -gem "rspec", "~> 3.9.0" -gem "capybara", "~> 3.15.0" # rspec system tests -gem "puma" # rspec system tests - -# https://github.com/flavorjones/loofah/pull/267 -# loofah changed the required ruby version in a patch so we need to explicitly pin it -gem "loofah", "2.20.0" if RUBY_VERSION.to_f < 2.5 - -gem "timecop" -gem "test-unit" -gem "simplecov" -gem "codecov", "<= 0.2.12" diff --git a/sentry-raven/LICENSE b/sentry-raven/LICENSE deleted file mode 100644 index 40e74dccd..000000000 --- a/sentry-raven/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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 2015 Functional Software, Inc - -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. diff --git a/sentry-raven/Makefile b/sentry-raven/Makefile deleted file mode 100644 index d218a238e..000000000 --- a/sentry-raven/Makefile +++ /dev/null @@ -1,3 +0,0 @@ -build: - bundle install - gem build sentry-raven.gemspec diff --git a/sentry-raven/README.md b/sentry-raven/README.md deleted file mode 100644 index 551143426..000000000 --- a/sentry-raven/README.md +++ /dev/null @@ -1,164 +0,0 @@ -

- - - -
-

- -# Raven-Ruby, the Ruby Client for Sentry - -### 🚧 Migrating To The New SDK 🚧 - -We've released our new Ruby SDK, [sentry-ruby](https://github.com/getsentry/sentry-ruby/tree/master/sentry-ruby). Here are the benefits of migrating to it: - -- **Unified Interfaces With Other SDKs:** The design of `sentry-raven` is outdated compared with our modern Sentry SDKs. If you also use other Sentry SDKs, such as Sentry's JavaScript SDK for your frontend application, you'll notice that their interfaces are quite different from the one provided for `sentry-raven`. The new `sentry-ruby` SDK provides a more consistent user experience across all different platforms. - -- **Performance Monitoring:** The Sentry Ruby SDK includes [performance monitoring](https://docs.sentry.io/product/performance/), which you can enable if you haven't already as ([discussed here](https://docs.sentry.io/platforms/ruby/performance/)). - -- **Future Support:** `sentry-raven` has entered maintenance mode, which means it won't receive any new feature supports or aggressive bug fixes. - -- **Better Extensibility:** Unlike `sentry-raven`, `sentry-ruby` is built with extensibility in mind and will allow the community to build extensions for different integrations/features. - -If you're interested in the migration, please also read our [migration guide](https://docs.sentry.io/platforms/ruby/migration/) for more information. - ---- - - -[![Gem Version](https://img.shields.io/gem/v/sentry-raven.svg)](https://rubygems.org/gems/sentry-raven) -![Build Status](https://github.com/getsentry/raven-ruby/workflows/Test/badge.svg) -[![Coverage Status](https://img.shields.io/codecov/c/github/getsentry/sentry-ruby/master?logo=codecov)](https://codecov.io/gh/getsentry/sentry-ruby/branch/master) -[![Gem](https://img.shields.io/gem/dt/sentry-raven.svg)](https://rubygems.org/gems/sentry-raven/) -[![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=sentry-raven&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=sentry-raven&package-manager=bundler&version-scheme=semver) - - -[Documentation](https://docs.sentry.io/clients/ruby/) | [Bug Tracker](https://github.com/getsentry/raven-ruby/issues) | [Forum](https://forum.sentry.io/) | IRC: irc.freenode.net, #sentry - -The official Ruby-language client and integration layer for the [Sentry](https://github.com/getsentry/sentry) error reporting API. - - -## Requirements - -We test on Ruby 2.3, 2.4, 2.5, 2.6 and 2.7 at the latest patchlevel/teeny version. We also support JRuby 9.0. Our Rails integration works with Rails 4.2+, including Rails 5 and Rails 6. - -## Getting Started - -### Install - -```ruby -gem "sentry-raven" -``` - -### Raven only runs when Sentry DSN is set - -Raven will capture and send exceptions to the Sentry server whenever its DSN is set. This makes environment-based configuration easy - if you don't want to send errors in a certain environment, just don't set the DSN in that environment! - -```bash -# Set your SENTRY_DSN environment variable. -export SENTRY_DSN=http://public@example.com/project-id -``` -```ruby -# Or you can configure the client in the code. -Raven.configure do |config| - config.dsn = 'http://public@example.com/project-id' -end -``` - -### Raven doesn't report some kinds of data by default - -**Raven ignores some exceptions by default** - most of these are related to 404s or controller actions not being found. [For a complete list, see the `IGNORE_DEFAULT` constant](https://github.com/getsentry/sentry-ruby/blob/master/sentry-raven/lib/raven/configuration.rb). - -Raven doesn't report POST data or cookies by default. In addition, it will attempt to remove any obviously sensitive data, such as credit card or Social Security numbers. For more information about how Sentry processes your data, [check out the documentation on the `processors` config setting.](https://docs.sentry.io/platforms/ruby/configuration/options/) - -### Usage - -**If you use Rails, you're already done - no more configuration required!** Check [Integrations](https://docs.sentry.io/platforms/ruby/configuration/integrations/) for more details on other gems Sentry integrates with automatically. - -Otherwise, Raven supports two methods of capturing exceptions: - -```ruby -Raven.capture do - # capture any exceptions which happen during execution of this block - 1 / 0 -end - -begin - 1 / 0 -rescue ZeroDivisionError => exception - Raven.capture_exception(exception) -end -``` - -### More configuration - -You're all set - but there's a few more settings you may want to know about too! - -#### async - -When an error or message occurs, the notification is immediately sent to Sentry. Raven can be configured to send asynchronously: - -```ruby -config.async = lambda { |event| - Thread.new { Raven.send_event(event) } -} -``` - -Using a thread to send events will be adequate for truly parallel Ruby platforms such as JRuby, though the benefit on MRI/CRuby will be limited. If the async callback raises an exception, Raven will attempt to send synchronously. - -Note that the naive example implementation has a major drawback - it can create an infinite number of threads. We recommend creating a background job, using your background job processor, that will send Sentry notifications in the background. - -```ruby -config.async = lambda { |event| SentryJob.perform_later(event) } - -class SentryJob < ActiveJob::Base - queue_as :default - - def perform(event) - Raven.send_event(event) - end -end -``` - -#### transport_failure_callback - -If Raven fails to send an event to Sentry for any reason (either the Sentry server has returned a 4XX or 5XX response), this Proc or lambda will be called. - -```ruby -config.transport_failure_callback = lambda { |event, error| - AdminMailer.email_admins("Oh god, it's on fire because #{error.message}!", event).deliver_later -} -``` - -#### Context - -Much of the usefulness of Sentry comes from additional context data with the events. Raven makes this very convenient by providing methods to set thread local context data that is then submitted automatically with all events: - -```ruby -Raven.user_context email: 'foo@example.com' - -Raven.tags_context interesting: 'yes' - -Raven.extra_context additional_info: 'foo' -``` - -You can also use `tags_context` and `extra_context` to provide scoped information: - -```ruby -Raven.tags_context(interesting: 'yes') do - # the `interesting: 'yes'` tag will only present in the requests sent inside the block - Raven.capture_exception(exception) -end - -Raven.extra_context(additional_info: 'foo') do - # same as above, the `additional_info` will only present in this request - Raven.capture_exception(exception) -end -``` - -For more information, see [Context](https://docs.sentry.io/platforms/ruby/enriching-events/context/). - -## More Information - -* [Documentation](https://docs.sentry.io/clients/ruby/) -* [Bug Tracker](https://github.com/getsentry/raven-ruby/issues) -* [Forum](https://forum.sentry.io/) -- [Discord](https://discord.gg/ez5KZN7) diff --git a/sentry-raven/Rakefile b/sentry-raven/Rakefile deleted file mode 100644 index f6c30faf6..000000000 --- a/sentry-raven/Rakefile +++ /dev/null @@ -1,24 +0,0 @@ -require 'rake' -require 'raven' -require 'rubygems/package_task' -require 'bundler/gem_tasks' - -gemspec = Gem::Specification.load(Dir['*.gemspec'].first) - -Gem::PackageTask.new(gemspec).define - -begin - require 'rubygems' - require 'rspec/core/rake_task' - - RSpec::Core::RakeTask.new(:spec) do |spec| - spec.pattern = 'spec/**/*_spec.rb' - end - -rescue LoadError - task :spec do - abort "Rspec is not available. bundle install to run unit tests" - end -end - -task :default => [:spec] diff --git a/sentry-raven/benchmarks/allocation_report.rb b/sentry-raven/benchmarks/allocation_report.rb deleted file mode 100644 index 089304ed4..000000000 --- a/sentry-raven/benchmarks/allocation_report.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'benchmark/ips' -require 'benchmark/ipsa' -require 'sentry-raven-without-integrations' - -Raven.configure do |config| - config.logger = Logger.new(nil) - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" -end - -exception = begin - 1/0 - rescue => e - e - end - -Raven.capture_exception(exception) - -report = MemoryProfiler.report do - Raven.capture_exception(exception) -end - -report.pretty_print diff --git a/sentry-raven/benchmarks/application.rb b/sentry-raven/benchmarks/application.rb deleted file mode 100644 index bf74fe120..000000000 --- a/sentry-raven/benchmarks/application.rb +++ /dev/null @@ -1,22 +0,0 @@ -require "active_support/all" -require "action_controller" -require_relative "../spec/support/test_rails_app/app" - -def app(create = false) - @app_integration_instance = nil if create - @app_integration_instance ||= new_session do |sess| - sess.host! "www.example.com" - end -end - -def new_session - app = make_basic_app - session = ActionDispatch::Integration::Session.new(app) - yield session if block_given? - - # This makes app.url_for and app.foo_path available in the console - session.extend(app.routes.url_helpers) - session.extend(app.routes.mounted_helpers) - - session -end diff --git a/sentry-raven/benchmarks/profile.rb b/sentry-raven/benchmarks/profile.rb deleted file mode 100644 index c2eee6351..000000000 --- a/sentry-raven/benchmarks/profile.rb +++ /dev/null @@ -1,26 +0,0 @@ -require 'raven' -require_relative 'application' - -TestApp.configure do |config| - config.middleware.delete ActionDispatch::DebugExceptions - config.middleware.delete ActionDispatch::ShowExceptions -end - -Raven.configure do |config| - config.logger = Logger.new(nil) - config.breadcrumbs_logger = [:active_support_logger] - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" -end - -require 'ruby-prof' - -RubyProf.measure_mode = RubyProf::PROCESS_TIME - -# profile the code -result = RubyProf.profile do - 100.times { app.get("/exception") } -end - -# print a graph profile to text -printer = RubyProf::MultiPrinter.new(result) -printer.print(:path => "./tmp", :profile => "profile") diff --git a/sentry-raven/benchmarks/rails_integration_allocation_comparison.rb b/sentry-raven/benchmarks/rails_integration_allocation_comparison.rb deleted file mode 100644 index 1c5af9d56..000000000 --- a/sentry-raven/benchmarks/rails_integration_allocation_comparison.rb +++ /dev/null @@ -1,25 +0,0 @@ -require "benchmark/memory" -require 'raven' -require_relative 'application' - -Raven.configure do |config| - config.logger = Logger.new(nil) - config.breadcrumbs_logger = [:active_support_logger] - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" -end - -TestApp.configure do |config| - config.middleware.delete ActionDispatch::DebugExceptions - config.middleware.delete ActionDispatch::ShowExceptions -end - -app.get("/exception") - -Benchmark.memory do |x| - x.report("master") { app.get("/exception") } - x.report("branch") { app.get("/exception") } - - x.compare! - x.hold!("/tmp/allocation_comparison.json") -end - diff --git a/sentry-raven/benchmarks/rails_integration_allocation_report.rb b/sentry-raven/benchmarks/rails_integration_allocation_report.rb deleted file mode 100644 index ea1681a96..000000000 --- a/sentry-raven/benchmarks/rails_integration_allocation_report.rb +++ /dev/null @@ -1,24 +0,0 @@ -require 'benchmark/ips' -require 'benchmark/ipsa' -require 'raven' -require 'raven/breadcrumbs/logger' -require_relative 'application' - -Raven.configure do |config| - config.logger = Logger.new(nil) - config.breadcrumbs_logger = [:active_support_logger] - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" -end - -TestApp.configure do |config| - config.middleware.delete ActionDispatch::DebugExceptions - config.middleware.delete ActionDispatch::ShowExceptions -end - -app.get("/exception") - -report = MemoryProfiler.report do - app.get("/exception") -end - -report.pretty_print diff --git a/sentry-raven/exe/raven b/sentry-raven/exe/raven deleted file mode 100755 index 48f2421fc..000000000 --- a/sentry-raven/exe/raven +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env ruby - -require "raven" -require "raven/cli" -require "optparse" - -parser = OptionParser.new do |opt| - opt.banner = "Usage: raven COMMAND [OPTIONS]" - opt.separator "" - opt.separator "Commands" - opt.separator " test: send a test event" - opt.separator "" - opt.separator "Options" - - opt.on("-h", "--help", "help") do - puts parser - end -end - -parser.parse! - -case ARGV[0] -when "test" - dsn = ARGV[1] if ARGV.length > 1 - if !dsn - puts "Usage: raven test " - else - Raven::CLI.test(dsn) - end -else - puts parser -end diff --git a/sentry-raven/lib/raven.rb b/sentry-raven/lib/raven.rb deleted file mode 100644 index 72b913df4..000000000 --- a/sentry-raven/lib/raven.rb +++ /dev/null @@ -1,3 +0,0 @@ -require 'raven/base' - -Raven.inject diff --git a/sentry-raven/lib/raven/backtrace.rb b/sentry-raven/lib/raven/backtrace.rb deleted file mode 100644 index 4afed54db..000000000 --- a/sentry-raven/lib/raven/backtrace.rb +++ /dev/null @@ -1,141 +0,0 @@ -# frozen_string_literal: true - -## Inspired by Rails' and Airbrake's backtrace parsers. - -module Raven - # Front end to parsing the backtrace for each notice - class Backtrace - # Handles backtrace parsing line by line - class Line - RB_EXTENSION = ".rb" - # regexp (optional leading X: on windows, or JRuby9000 class-prefix) - RUBY_INPUT_FORMAT = / - ^ \s* (?: [a-zA-Z]: | uri:classloader: )? ([^:]+ | <.*>): - (\d+) - (?: :in \s `([^']+)')?$ - /x.freeze - - # org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:170) - JAVA_INPUT_FORMAT = /^(.+)\.([^\.]+)\(([^\:]+)\:(\d+)\)$/.freeze - - # The file portion of the line (such as app/models/user.rb) - attr_reader :file - - # The line number portion of the line - attr_reader :number - - # The method of the line (such as index) - attr_reader :method - - # The module name (JRuby) - attr_reader :module_name - - # Parses a single line of a given backtrace - # @param [String] unparsed_line The raw line from +caller+ or some backtrace - # @return [Line] The parsed backtrace line - def self.parse(unparsed_line) - ruby_match = unparsed_line.match(RUBY_INPUT_FORMAT) - if ruby_match - _, file, number, method = ruby_match.to_a - file.sub!(/\.class$/, RB_EXTENSION) - module_name = nil - else - java_match = unparsed_line.match(JAVA_INPUT_FORMAT) - _, module_name, method, file, number = java_match.to_a - end - new(file, number, method, module_name) - end - - def initialize(file, number, method, module_name) - self.file = file - self.module_name = module_name - self.number = number.to_i - self.method = method - end - - def in_app - if file =~ self.class.in_app_pattern - true - else - false - end - end - - # Reconstructs the line in a readable fashion - def to_s - "#{file}:#{number}:in `#{method}'" - end - - def ==(other) - to_s == other.to_s - end - - def inspect - "" - end - - def self.in_app_pattern - @in_app_pattern ||= begin - project_root = Raven.configuration.project_root&.to_s - Regexp.new("^(#{project_root}/)?#{Raven.configuration.app_dirs_pattern || APP_DIRS_PATTERN}") - end - end - - private - - attr_writer :file, :number, :method, :module_name - end - - APP_DIRS_PATTERN = /(bin|exe|app|config|lib|test)/.freeze - - # holder for an Array of Backtrace::Line instances - attr_reader :lines - - def self.parse(backtrace, opts = {}) - ruby_lines = backtrace.is_a?(Array) ? backtrace : backtrace.split(/\n\s*/) - - ruby_lines = opts[:configuration].backtrace_cleanup_callback.call(ruby_lines) if opts[:configuration]&.backtrace_cleanup_callback - - filters = opts[:filters] || [] - filtered_lines = ruby_lines.to_a.map do |line| - filters.reduce(line) do |nested_line, proc| - proc.call(nested_line) - end - end.compact - - lines = filtered_lines.map do |unparsed_line| - Line.parse(unparsed_line) - end - - new(lines) - end - - def initialize(lines) - self.lines = lines - end - - def inspect - "" - end - - def to_s - content = [] - lines.each do |line| - content << line - end - content.join("\n") - end - - def ==(other) - if other.respond_to?(:lines) - lines == other.lines - else - false - end - end - - private - - attr_writer :lines - end -end diff --git a/sentry-raven/lib/raven/base.rb b/sentry-raven/lib/raven/base.rb deleted file mode 100644 index 852c939e6..000000000 --- a/sentry-raven/lib/raven/base.rb +++ /dev/null @@ -1,112 +0,0 @@ -require 'raven/version' -require "raven/helpers/deprecation_helper" -require 'raven/core_ext/object/deep_dup' -require 'raven/backtrace' -require 'raven/breadcrumbs' -require 'raven/processor' -require 'raven/processor/sanitizedata' -require 'raven/processor/removecircularreferences' -require 'raven/processor/utf8conversion' -require 'raven/processor/cookies' -require 'raven/processor/post_data' -require 'raven/processor/http_headers' -require 'raven/configuration' -require 'raven/context' -require 'raven/client' -require 'raven/event' -require 'raven/linecache' -require 'raven/logger' -require 'raven/interfaces/message' -require 'raven/interfaces/exception' -require 'raven/interfaces/single_exception' -require 'raven/interfaces/stack_trace' -require 'raven/interfaces/http' -require 'raven/transports' -require 'raven/transports/http' -require 'raven/utils/deep_merge' -require 'raven/utils/real_ip' -require 'raven/utils/request_id' -require 'raven/utils/exception_cause_chain' -require 'raven/instance' - -require 'forwardable' -require 'English' - -module Raven - AVAILABLE_INTEGRATIONS = %w(delayed_job railties sidekiq rack rack-timeout rake).freeze - - class Error < StandardError - end - - class << self - extend Forwardable - - def instance - @instance ||= Raven::Instance.new - end - - def_delegators :instance, :client=, :configuration=, :context, :logger, :configuration, - :client, :report_status, :configure, :send_event, :capture, :capture_type, - :last_event_id, :annotate_exception, :user_context, - :tags_context, :extra_context, :rack_context, :breadcrumbs - - def_delegator :instance, :report_status, :report_ready - def_delegator :instance, :capture_type, :capture_message - def_delegator :instance, :capture_type, :capture_exception - # For cross-language compatibility - def_delegator :instance, :capture_type, :captureException - def_delegator :instance, :capture_type, :captureMessage - def_delegator :instance, :annotate_exception, :annotateException - def_delegator :instance, :annotate_exception, :annotate - - # Injects various integrations. Default behavior: inject all available integrations - def inject - inject_only(*Raven::AVAILABLE_INTEGRATIONS) - end - - def inject_without(*exclude_integrations) - include_integrations = Raven::AVAILABLE_INTEGRATIONS - exclude_integrations.map(&:to_s) - inject_only(*include_integrations) - end - - def inject_only(*only_integrations) - only_integrations = only_integrations.map(&:to_s) - integrations_to_load = Raven::AVAILABLE_INTEGRATIONS & only_integrations - not_found_integrations = only_integrations - integrations_to_load - if not_found_integrations.any? - logger.warn "Integrations do not exist: #{not_found_integrations.join ', '}" - end - integrations_to_load &= Gem.loaded_specs.keys - # TODO(dcramer): integrations should have some additional checks baked-in - # or we should break them out into their own repos. Specifically both the - # rails and delayed_job checks are not always valid (i.e. Rails 2.3) and - # https://github.com/getsentry/raven-ruby/issues/180 - integrations_to_load.each do |integration| - load_integration(integration) - end - end - - def load_integration(integration) - require "raven/integrations/#{integration}" - rescue Exception => e - logger.warn "Unable to load raven/integrations/#{integration}: #{e}" - end - - def safely_prepend(module_name, opts = {}) - return if opts[:to].nil? || opts[:from].nil? - - if opts[:to].respond_to?(:prepend, true) - opts[:to].send(:prepend, opts[:from].const_get(module_name)) - else - opts[:to].send(:include, opts[:from].const_get("Old" + module_name)) - end - end - - def sys_command(command) - result = `#{command} 2>&1` rescue nil - return if result.nil? || result.empty? || ($CHILD_STATUS && $CHILD_STATUS.exitstatus != 0) - - result.strip - end - end -end diff --git a/sentry-raven/lib/raven/breadcrumbs.rb b/sentry-raven/lib/raven/breadcrumbs.rb deleted file mode 100644 index 01b32e1fd..000000000 --- a/sentry-raven/lib/raven/breadcrumbs.rb +++ /dev/null @@ -1,76 +0,0 @@ -module Raven - class Breadcrumb - attr_accessor :category, :data, :message, :level, :timestamp, :type - - def initialize - @category = nil - @data = {} - @level = nil - @message = nil - @timestamp = Time.now.to_i - @type = nil - end - - def to_hash - { - :category => @category, - :data => @data, - :level => @level, - :message => @message, - :timestamp => @timestamp, - :type => @type - } - end - end -end - -module Raven - class BreadcrumbBuffer - include Enumerable - - attr_accessor :buffer - - def self.current - Thread.current[:sentry_breadcrumbs] ||= new - end - - def self.clear! - Thread.current[:sentry_breadcrumbs] = nil - end - - def initialize(size = 100) - @buffer = Array.new(size) - end - - def record(crumb = nil) - if block_given? - crumb = Breadcrumb.new if crumb.nil? - yield(crumb) - end - @buffer.slice!(0) - @buffer << crumb - end - - def members - @buffer.compact - end - - def peek - members.last - end - - def each(&block) - members.each(&block) - end - - def empty? - members.none? - end - - def to_hash - { - :values => members.map(&:to_hash) - } - end - end -end diff --git a/sentry-raven/lib/raven/breadcrumbs/active_support_logger.rb b/sentry-raven/lib/raven/breadcrumbs/active_support_logger.rb deleted file mode 100644 index f44089215..000000000 --- a/sentry-raven/lib/raven/breadcrumbs/active_support_logger.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Raven - module Breadcrumbs - module ActiveSupportLogger - class << self - def add(name, started, _finished, _unique_id, data) - Raven.breadcrumbs.record do |crumb| - crumb.data = data - crumb.category = name - crumb.timestamp = started.to_i - end - end - - def inject - @subscriber = ::ActiveSupport::Notifications.subscribe(/.*/) do |name, started, finished, unique_id, data| - add(name, started, finished, unique_id, data) - end - end - - def detach - ::ActiveSupport::Notifications.unsubscribe(@subscriber) - end - end - end - end -end diff --git a/sentry-raven/lib/raven/breadcrumbs/logger.rb b/sentry-raven/lib/raven/breadcrumbs/logger.rb deleted file mode 100644 index 6cfa18784..000000000 --- a/sentry-raven/lib/raven/breadcrumbs/logger.rb +++ /dev/null @@ -1,3 +0,0 @@ -DeprecationHelper.deprecate_old_breadcrumbs_configuration(:sentry_logger) - -require "raven/breadcrumbs/sentry_logger" diff --git a/sentry-raven/lib/raven/breadcrumbs/sentry_logger.rb b/sentry-raven/lib/raven/breadcrumbs/sentry_logger.rb deleted file mode 100644 index f03bd46ee..000000000 --- a/sentry-raven/lib/raven/breadcrumbs/sentry_logger.rb +++ /dev/null @@ -1,73 +0,0 @@ -require 'logger' - -module Raven - module Breadcrumbs - module SentryLogger - LEVELS = { - ::Logger::DEBUG => 'debug', - ::Logger::INFO => 'info', - ::Logger::WARN => 'warn', - ::Logger::ERROR => 'error', - ::Logger::FATAL => 'fatal' - }.freeze - - def add(*args) - add_breadcrumb(*args) - super - end - - def add_breadcrumb(severity, message = nil, progname = nil) - message = progname if message.nil? # see Ruby's Logger docs for why - return if ignored_logger?(progname) - return if message.nil? || message == "" - - # some loggers will add leading/trailing space as they (incorrectly, mind you) - # think of logging as a shortcut to std{out,err} - message = message.to_s.strip - - last_crumb = Raven.breadcrumbs.peek - # try to avoid dupes from logger broadcasts - if last_crumb.nil? || last_crumb.message != message - Raven.breadcrumbs.record do |crumb| - crumb.level = Raven::Breadcrumbs::SentryLogger::LEVELS.fetch(severity, nil) - crumb.category = progname || 'logger' - crumb.message = message - crumb.type = - if severity >= 3 - "error" - else - crumb.level - end - end - end - end - - private - - def ignored_logger?(progname) - progname == "sentry" || - Raven.configuration.exclude_loggers.include?(progname) - end - end - module OldBreadcrumbsSentryLogger - def self.included(base) - base.class_eval do - include Raven::Breadcrumbs::SentryLogger - alias_method :add_without_raven, :add - alias_method :add, :add_with_raven - end - end - - def add_with_raven(*args) - add_breadcrumb(*args) - add_without_raven(*args) - end - end - end -end - -Raven.safely_prepend( - "Breadcrumbs::SentryLogger", - :from => Raven, - :to => ::Logger -) diff --git a/sentry-raven/lib/raven/cli.rb b/sentry-raven/lib/raven/cli.rb deleted file mode 100644 index b0215ffab..000000000 --- a/sentry-raven/lib/raven/cli.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Raven - class CLI - def self.test(dsn = nil, silent = false, config = nil) - config ||= Raven.configuration - - config.logger = if silent - ::Logger.new(nil) - else - logger = ::Logger.new(STDOUT) - logger.formatter = proc do |_severity, _datetime, _progname, msg| - "-> #{msg}\n" - end - logger - end - - config.timeout = 5 - config.dsn = dsn if dsn - - # wipe out env settings to ensure we send the event - unless config.capture_allowed? - env_name = config.environments.last || 'production' - config.current_environment = env_name - end - - instance = Raven::Instance.new(nil, config) - - instance.logger.debug "Sending a test event:" - instance.logger.debug "" - - begin - 1 / 0 - rescue ZeroDivisionError => e - evt = instance.capture_exception(e) - end - - if evt - instance.logger.debug "-> event ID: #{evt.id}" - instance.logger.debug "" - instance.logger.debug "Done!" - evt - else - instance.logger.debug "" - instance.logger.debug "An error occurred while attempting to send the event." - false - end - end - end -end diff --git a/sentry-raven/lib/raven/client.rb b/sentry-raven/lib/raven/client.rb deleted file mode 100644 index 2f69019a6..000000000 --- a/sentry-raven/lib/raven/client.rb +++ /dev/null @@ -1,168 +0,0 @@ -# frozen_string_literal: true - -require 'base64' -require 'json' -require 'zlib' - -require "raven/transports" - -module Raven - # Encodes events and sends them to the Sentry server. - class Client - PROTOCOL_VERSION = '5' - USER_AGENT = "raven-ruby/#{Raven::VERSION}" - CONTENT_TYPE = 'application/json' - - attr_accessor :configuration - - def initialize(configuration) - @configuration = configuration - @processors = configuration.processors.map { |v| v.new(self) } - @state = ClientState.new - end - - def send_event(event, hint = nil) - return false unless configuration.sending_allowed?(event) - - event = configuration.before_send.call(event, hint) if configuration.before_send - if event.nil? - configuration.logger.info "Discarded event because before_send returned nil" - return - end - - # Convert to hash - event = event.to_hash - - unless @state.should_try? - failed_send(nil, event) - return - end - - event_id = event[:event_id] || event['event_id'] - configuration.logger.info "Sending event #{event_id} to Sentry" - - content_type, encoded_data = encode(event) - - begin - transport.send_event(generate_auth_header, encoded_data, - :content_type => content_type) - successful_send - rescue => e - failed_send(e, event) - return - end - - event - end - - def transport - @transport ||= - case configuration.scheme - when 'http', 'https' - Transports::HTTP.new(configuration) - when 'stdout' - Transports::Stdout.new(configuration) - when 'dummy' - Transports::Dummy.new(configuration) - else - fail "Unknown transport scheme '#{configuration.scheme}'" - end - end - - private - - def encode(event) - hash = @processors.reduce(event.to_hash) { |a, e| e.process(a) } - encoded = JSON.fast_generate(hash) - - case configuration.encoding - when 'gzip' - ['application/octet-stream', Base64.strict_encode64(Zlib::Deflate.deflate(encoded))] - else - ['application/json', encoded] - end - end - - def get_message_from_exception(event) - ( - event && - event[:exception] && - event[:exception][:values] && - event[:exception][:values][0] && - event[:exception][:values][0][:type] && - event[:exception][:values][0][:value] && - "#{event[:exception][:values][0][:type]}: #{event[:exception][:values][0][:value]}" - ) - end - - def get_log_message(event) - (event && event[:message]) || (event && event['message']) || get_message_from_exception(event) || '' - end - - def generate_auth_header - now = Time.now.to_i.to_s - fields = { - 'sentry_version' => PROTOCOL_VERSION, - 'sentry_client' => USER_AGENT, - 'sentry_timestamp' => now, - 'sentry_key' => configuration.public_key - } - fields['sentry_secret'] = configuration.secret_key unless configuration.secret_key.nil? - 'Sentry ' + fields.map { |key, value| "#{key}=#{value}" }.join(', ') - end - - def successful_send - @state.success - end - - def failed_send(e, event) - if e # exception was raised - @state.failure - configuration.logger.warn "Unable to record event with remote Sentry server (#{e.class} - #{e.message}):\n#{e.backtrace[0..10].join("\n")}" - else - configuration.logger.warn "Not sending event due to previous failure(s)." - end - configuration.logger.warn("Failed to submit event: #{get_log_message(event)}") - - # configuration.transport_failure_callback can be false & nil - configuration.transport_failure_callback.call(event, e) if configuration.transport_failure_callback # rubocop:disable Style/SafeNavigation - end - end - - class ClientState - def initialize - reset - end - - def should_try? - return true if @status == :online - - interval = @retry_after || [@retry_number, 6].min**2 - return true if Time.now - @last_check >= interval - - false - end - - def failure(retry_after = nil) - @status = :error - @retry_number += 1 - @last_check = Time.now - @retry_after = retry_after - end - - def success - reset - end - - def reset - @status = :online - @retry_number = 0 - @last_check = nil - @retry_after = nil - end - - def failed? - @status == :error - end - end -end diff --git a/sentry-raven/lib/raven/configuration.rb b/sentry-raven/lib/raven/configuration.rb deleted file mode 100644 index cf774ad34..000000000 --- a/sentry-raven/lib/raven/configuration.rb +++ /dev/null @@ -1,557 +0,0 @@ -require 'uri' - -module Raven - class Configuration - # Directories to be recognized as part of your app. e.g. if you - # have an `engines` dir at the root of your project, you may want - # to set this to something like /(app|config|engines|lib)/ - attr_accessor :app_dirs_pattern - - # Provide an object that responds to `call` to send events asynchronously. - # E.g.: lambda { |event| Thread.new { Raven.send_event(event) } } - attr_reader :async - alias async? async - - # An array of breadcrumbs loggers to be used. Available options are: - # - :sentry_logger - # - :active_support_logger - attr_reader :breadcrumbs_logger - - # Number of lines of code context to capture, or nil for none - attr_accessor :context_lines - - # RACK_ENV by default. - attr_reader :current_environment - - # Encoding type for event bodies. Must be :json or :gzip. - attr_reader :encoding - - # Whitelist of environments that will send notifications to Sentry. Array of Strings. - attr_accessor :environments - - # Logger 'progname's to exclude from breadcrumbs - attr_accessor :exclude_loggers - - # Array of exception classes that should never be sent. See IGNORE_DEFAULT. - # You should probably append to this rather than overwrite it. - attr_accessor :excluded_exceptions - - # Boolean to check nested exceptions when deciding if to exclude. Defaults to false - attr_accessor :inspect_exception_causes_for_exclusion - alias inspect_exception_causes_for_exclusion? inspect_exception_causes_for_exclusion - - # DSN component - set automatically if DSN provided - attr_accessor :host - - # The Faraday adapter to be used. Will default to Net::HTTP when not set. - attr_accessor :http_adapter - - # A Proc yeilding the faraday builder allowing for further configuration - # of the faraday adapter - attr_accessor :faraday_builder - - # You may provide your own LineCache for matching paths with source files. - # This may be useful if you need to get source code from places other than - # the disk. See Raven::LineCache for the required interface you must implement. - attr_accessor :linecache - - # Logger used by Raven. In Rails, this is the Rails logger, otherwise - # Raven provides its own Raven::Logger. - attr_accessor :logger - - # Timeout waiting for the Sentry server connection to open in seconds - attr_accessor :open_timeout - - # DSN component - set automatically if DSN provided - attr_accessor :path - - # DSN component - set automatically if DSN provided - attr_accessor :port - - # Processors to run on data before sending upstream. See DEFAULT_PROCESSORS. - # You should probably append to this rather than overwrite it. - attr_accessor :processors - - # Project ID number to send to the Sentry server - # If you provide a DSN, this will be set automatically. - attr_accessor :project_id - - # Project directory root for in_app detection. Could be Rails root, etc. - # Set automatically for Rails. - attr_reader :project_root - - # Proxy information to pass to the HTTP adapter (via Faraday) - attr_accessor :proxy - - # Public key for authentication with the Sentry server - # If you provide a DSN, this will be set automatically. - attr_accessor :public_key - - # Turns on ActiveSupport breadcrumbs integration - attr_reader :rails_activesupport_breadcrumbs - - # Rails catches exceptions in the ActionDispatch::ShowExceptions or - # ActionDispatch::DebugExceptions middlewares, depending on the environment. - # When `rails_report_rescued_exceptions` is true (it is by default), Raven - # will report exceptions even when they are rescued by these middlewares. - attr_accessor :rails_report_rescued_exceptions - - # Release tag to be passed with every event sent to Sentry. - # We automatically try to set this to a git SHA or Capistrano release. - attr_accessor :release - - # The sampling factor to apply to events. A value of 0.0 will not send - # any events, and a value of 1.0 will send 100% of events. - attr_accessor :sample_rate - - # Boolean - sanitize values that look like credit card numbers - attr_accessor :sanitize_credit_cards - - # By default, Sentry censors Hash values when their keys match things like - # "secret", "password", etc. Provide an array of Strings that, when matched in - # a hash key, will be censored and not sent to Sentry. - attr_accessor :sanitize_fields - - # If you're sure you want to override the default sanitization values, you can - # add to them to an array of Strings here, e.g. %w(authorization password) - attr_accessor :sanitize_fields_excluded - - # Sanitize additional HTTP headers - only Authorization is removed by default. - attr_accessor :sanitize_http_headers - - # DSN component - set automatically if DSN provided. - # Otherwise, can be one of "http", "https", or "dummy" - attr_accessor :scheme - - # a proc/lambda that takes an array of stack traces - # it'll be used to silence (reduce) backtrace of the exception - # - # for example: - # - # ```ruby - # Raven.configuration.backtrace_cleanup_callback = lambda do |backtrace| - # Rails.backtrace_cleaner.clean(backtrace) - # end - # ``` - # - attr_accessor :backtrace_cleanup_callback - - # Secret key for authentication with the Sentry server - # If you provide a DSN, this will be set automatically. - # - # This is deprecated and not necessary for newer Sentry installations any more. - attr_accessor :secret_key - - # Include module versions in reports - boolean. - attr_accessor :send_modules - - # Simple server string - set this to the DSN found on your Sentry settings. - attr_reader :server - - attr_accessor :server_name - - # Provide a configurable callback to determine event capture. - # Note that the object passed into the block will be a String (messages) or - # an exception. - # e.g. lambda { |exc_or_msg| exc_or_msg.some_attr == false } - attr_reader :should_capture - - # Silences ready message when true. - attr_accessor :silence_ready - - # SSL settings passed directly to Faraday's ssl option - attr_accessor :ssl - - # The path to the SSL certificate file - attr_accessor :ssl_ca_file - - # Should the SSL certificate of the server be verified? - attr_accessor :ssl_verification - - # Default tags for events. Hash. - attr_accessor :tags - - # Timeout when waiting for the server to return data in seconds. - attr_accessor :timeout - - # Optional Proc, called when the Sentry server cannot be contacted for any reason - # E.g. lambda { |event| Thread.new { MyJobProcessor.send_email(event) } } - attr_reader :transport_failure_callback - - # Optional Proc, called before sending an event to the server/ - # E.g.: lambda { |event, hint| event } - # E.g.: lambda { |event, hint| nil } - # E.g.: lambda { |event, hint| - # event[:message] = 'a' - # event - # } - attr_reader :before_send - - # Errors object - an Array that contains error messages. See # - attr_reader :errors - - # the dsn value, whether it's set via `config.dsn=` or `ENV["SENTRY_DSN"]` - attr_reader :dsn - - # Array of rack env parameters to be included in the event sent to sentry. - attr_accessor :rack_env_whitelist - - # Most of these errors generate 4XX responses. In general, Sentry clients - # only automatically report 5xx responses. - IGNORE_DEFAULT = [ - 'AbstractController::ActionNotFound', - 'ActionController::BadRequest', - 'ActionController::InvalidAuthenticityToken', - 'ActionController::InvalidCrossOriginRequest', - 'ActionController::MethodNotAllowed', - 'ActionController::NotImplemented', - 'ActionController::ParameterMissing', - 'ActionController::RoutingError', - 'ActionController::UnknownAction', - 'ActionController::UnknownFormat', - 'ActionController::UnknownHttpMethod', - 'ActionDispatch::Http::Parameters::ParseError', - 'ActiveJob::DeserializationError', # Can cause infinite loops - 'ActiveRecord::RecordNotFound', - 'CGI::Session::CookieStore::TamperedWithCookie', - 'Mongoid::Errors::DocumentNotFound', - 'Rack::QueryParser::InvalidParameterError', - 'Rack::QueryParser::ParameterTypeError', - 'Sinatra::NotFound' - ].freeze - - # Note the order - we have to remove circular references and bad characters - # before passing to other processors. - DEFAULT_PROCESSORS = [ - Raven::Processor::RemoveCircularReferences, - Raven::Processor::UTF8Conversion, - Raven::Processor::SanitizeData, - Raven::Processor::Cookies, - Raven::Processor::PostData, - Raven::Processor::HTTPHeaders - ].freeze - - HEROKU_DYNO_METADATA_MESSAGE = "You are running on Heroku but haven't enabled Dyno Metadata. For Sentry's "\ - "release detection to work correctly, please run `heroku labs:enable runtime-dyno-metadata`".freeze - - RACK_ENV_WHITELIST_DEFAULT = %w( - REMOTE_ADDR - SERVER_NAME - SERVER_PORT - ).freeze - - LOG_PREFIX = "** [Raven] ".freeze - MODULE_SEPARATOR = "::".freeze - - AVAILABLE_BREADCRUMBS_LOGGERS = [:sentry_logger, :active_support_logger].freeze - - def initialize - self.async = false - self.breadcrumbs_logger = [] - self.context_lines = 3 - self.current_environment = current_environment_from_env - self.encoding = 'gzip' - self.environments = [] - self.exclude_loggers = [] - self.excluded_exceptions = IGNORE_DEFAULT.dup - self.inspect_exception_causes_for_exclusion = false - self.linecache = ::Raven::LineCache.new - self.logger = ::Raven::Logger.new(STDOUT) - self.open_timeout = 1 - self.processors = DEFAULT_PROCESSORS.dup - self.project_root = detect_project_root - @rails_activesupport_breadcrumbs = false - - self.rails_report_rescued_exceptions = true - self.release = detect_release - self.sample_rate = 1.0 - self.sanitize_credit_cards = true - self.sanitize_fields = [] - self.sanitize_fields_excluded = [] - self.sanitize_http_headers = [] - self.send_modules = true - self.server = ENV['SENTRY_DSN'] - self.server_name = server_name_from_env - self.should_capture = false - self.ssl_verification = true - self.tags = {} - self.timeout = 2 - self.transport_failure_callback = false - self.before_send = false - self.rack_env_whitelist = RACK_ENV_WHITELIST_DEFAULT - end - - def server=(value) - return if value.nil? - - @dsn = value - - uri = URI.parse(value) - uri_path = uri.path.split('/') - - if uri.user - # DSN-style string - self.project_id = uri_path.pop - self.public_key = uri.user - self.secret_key = !(uri.password.nil? || uri.password.empty?) ? uri.password : nil - end - - self.scheme = uri.scheme - self.host = uri.host - self.port = uri.port if uri.port - self.path = uri_path.join('/') - - # For anyone who wants to read the base server string - @server = "#{scheme}://#{host}" - @server += ":#{port}" unless port == { 'http' => 80, 'https' => 443 }[scheme] - @server += path - end - alias dsn= server= - - def encoding=(encoding) - raise(Error, 'Unsupported encoding') unless %w(gzip json).include? encoding - - @encoding = encoding - end - - def async=(value) - unless value == false || value.respond_to?(:call) - raise(ArgumentError, "async must be callable (or false to disable)") - end - - @async = value - end - - def breadcrumbs_logger=(logger) - loggers = - if logger.is_a?(Array) - logger - else - unless AVAILABLE_BREADCRUMBS_LOGGERS.include?(logger) - raise Raven::Error, "Unsupported breadcrumbs logger. Supported loggers: #{AVAILABLE_BREADCRUMBS_LOGGERS}" - end - - Array(logger) - end - - require "raven/breadcrumbs/sentry_logger" if loggers.include?(:sentry_logger) - - @breadcrumbs_logger = logger - end - - def transport_failure_callback=(value) - unless value == false || value.respond_to?(:call) - raise(ArgumentError, "transport_failure_callback must be callable (or false to disable)") - end - - @transport_failure_callback = value - end - - def should_capture=(value) - unless value == false || value.respond_to?(:call) - raise ArgumentError, "should_capture must be callable (or false to disable)" - end - - @should_capture = value - end - - def before_send=(value) - unless value == false || value.respond_to?(:call) - raise ArgumentError, "before_send must be callable (or false to disable)" - end - - @before_send = value - end - - # Allows config options to be read like a hash - # - # @param [Symbol] option Key for a given attribute - def [](option) - public_send(option) - end - - def current_environment=(environment) - @current_environment = environment.to_s - end - - def capture_allowed?(message_or_exc = nil) - @errors = [] - - valid? && - capture_in_current_environment? && - capture_allowed_by_callback?(message_or_exc) && - sample_allowed? - end - # If we cannot capture, we cannot send. - alias sending_allowed? capture_allowed? - - def error_messages - @errors = [errors[0]] + errors[1..-1].map(&:downcase) # fix case of all but first - errors.join(", ") - end - - def project_root=(root_dir) - @project_root = root_dir - Backtrace::Line.instance_variable_set(:@in_app_pattern, nil) # blow away cache - end - - def rails_activesupport_breadcrumbs=(val) - DeprecationHelper.deprecate_old_breadcrumbs_configuration(:active_support_logger) - @rails_activesupport_breadcrumbs = val - end - - def exception_class_allowed?(exc) - if exc.is_a?(Raven::Error) - # Try to prevent error reporting loops - logger.debug "Refusing to capture Raven error: #{exc.inspect}" - false - elsif excluded_exception?(exc) - logger.debug "User excluded error: #{exc.inspect}" - false - else - true - end - end - - def enabled_in_current_env? - environments.empty? || environments.include?(current_environment) - end - - private - - def detect_project_root - if defined? Rails.root # we are in a Rails application - Rails.root.to_s - else - Dir.pwd - end - end - - def detect_release - detect_release_from_env || - detect_release_from_git || - detect_release_from_capistrano || - detect_release_from_heroku - rescue => e - logger.error "Error detecting release: #{e.message}" - end - - def excluded_exception?(incoming_exception) - excluded_exceptions.any? do |excluded_exception| - matches_exception?(get_exception_class(excluded_exception), incoming_exception) - end - end - - def get_exception_class(x) - x.is_a?(Module) ? x : qualified_const_get(x) - end - - def matches_exception?(excluded_exception_class, incoming_exception) - if inspect_exception_causes_for_exclusion? - Raven::Utils::ExceptionCauseChain.exception_to_array(incoming_exception).any? { |cause| excluded_exception_class === cause } - else - excluded_exception_class === incoming_exception - end - end - - # In Ruby <2.0 const_get can't lookup "SomeModule::SomeClass" in one go - def qualified_const_get(x) - x = x.to_s - if !x.match(/::/) - Object.const_get(x) - else - x.split(MODULE_SEPARATOR).reject(&:empty?).inject(Object) { |a, e| a.const_get(e) } - end - rescue NameError # There's no way to safely ask if a constant exist for an unknown string - nil - end - - def detect_release_from_heroku - return unless running_on_heroku? - return if ENV['CI'] - logger.warn(HEROKU_DYNO_METADATA_MESSAGE) && return unless ENV['HEROKU_SLUG_COMMIT'] - - ENV['HEROKU_SLUG_COMMIT'] - end - - def running_on_heroku? - File.directory?("/etc/heroku") - end - - def detect_release_from_capistrano - revision_file = File.join(project_root, 'REVISION') - revision_log = File.join(project_root, '..', 'revisions.log') - - if File.exist?(revision_file) - File.read(revision_file).strip - elsif File.exist?(revision_log) - File.open(revision_log).to_a.last.strip.sub(/.*as release ([0-9]+).*/, '\1') - end - end - - def detect_release_from_git - Raven.sys_command("git rev-parse --short HEAD") if File.directory?(".git") - end - - def detect_release_from_env - ENV['SENTRY_RELEASE'] - end - - def capture_in_current_environment? - return true if enabled_in_current_env? - - @errors << "Not configured to send/capture in environment '#{current_environment}'" - false - end - - def capture_allowed_by_callback?(message_or_exc) - return true if !should_capture || message_or_exc.nil? || should_capture.call(message_or_exc) - - @errors << "should_capture returned false" - false - end - - def valid? - return true if %w(server host path public_key project_id).all? { |k| public_send(k) } - - if server - %w(server host path public_key project_id).map do |key| - @errors << "No #{key} specified" unless public_send(key) - end - else - @errors << "DSN not set" - end - false - end - - def sample_allowed? - return true if sample_rate == 1.0 - - if Random::DEFAULT.rand >= sample_rate - @errors << "Excluded by random sample" - false - else - true - end - end - - # Try to resolve the hostname to an FQDN, but fall back to whatever - # the load name is. - def resolve_hostname - Socket.gethostname || - Socket.gethostbyname(hostname).first rescue server_name - end - - def current_environment_from_env - ENV['SENTRY_CURRENT_ENV'] || ENV['SENTRY_ENVIRONMENT'] || ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'default' - end - - def server_name_from_env - if running_on_heroku? - ENV['DYNO'] - else - resolve_hostname - end - end - end -end diff --git a/sentry-raven/lib/raven/context.rb b/sentry-raven/lib/raven/context.rb deleted file mode 100644 index 9cd9313bb..000000000 --- a/sentry-raven/lib/raven/context.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'rbconfig' -require 'etc' - -module Raven - class Context - def self.current - Thread.current[:sentry_context] ||= new - end - - def self.clear! - Thread.current[:sentry_context] = nil - end - - attr_accessor :transaction, :extra, :server_os, :rack_env, :runtime, :tags, :user - - def initialize - self.server_os = self.class.os_context - self.runtime = self.class.runtime_context - self.extra = { :server => { :os => server_os, :runtime => runtime } } - self.rack_env = nil - self.tags = {} - self.user = {} - self.transaction = [] - end - - class << self - def os_context - @os_context ||= - begin - uname = Etc.uname - { - name: uname[:sysname] || RbConfig::CONFIG["host_os"], - version: uname[:version], - build: uname[:release], - kernel_version: uname[:version] - } - end - end - - def runtime_context - @runtime_context ||= { - name: RbConfig::CONFIG["ruby_install_name"], - version: RUBY_DESCRIPTION || Raven.sys_command("ruby -v") - } - end - end - end -end diff --git a/sentry-raven/lib/raven/core_ext/object/deep_dup.rb b/sentry-raven/lib/raven/core_ext/object/deep_dup.rb deleted file mode 100644 index 1458f9046..000000000 --- a/sentry-raven/lib/raven/core_ext/object/deep_dup.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'raven/core_ext/object/duplicable' - -######################################### -# This file was copied from Rails 5.2 # -######################################### - -class Object - # Returns a deep copy of object if it's duplicable. If it's - # not duplicable, returns +self+. - # - # object = Object.new - # dup = object.deep_dup - # dup.instance_variable_set(:@a, 1) - # - # object.instance_variable_defined?(:@a) # => false - # dup.instance_variable_defined?(:@a) # => true - def deep_dup - duplicable? ? dup : self - end -end - -class Array - # Returns a deep copy of array. - # - # array = [1, [2, 3]] - # dup = array.deep_dup - # dup[1][2] = 4 - # - # array[1][2] # => nil - # dup[1][2] # => 4 - def deep_dup - map(&:deep_dup) - end -end - -class Hash - # Returns a deep copy of hash. - # - # hash = { a: { b: 'b' } } - # dup = hash.deep_dup - # dup[:a][:c] = 'c' - # - # hash[:a][:c] # => nil - # dup[:a][:c] # => "c" - def deep_dup - hash = dup - each_pair do |key, value| - if key.frozen? && ::String === key - hash[key] = value.deep_dup - else - hash.delete(key) - hash[key.deep_dup] = value.deep_dup - end - end - hash - end -end diff --git a/sentry-raven/lib/raven/core_ext/object/duplicable.rb b/sentry-raven/lib/raven/core_ext/object/duplicable.rb deleted file mode 100644 index b70adb5bc..000000000 --- a/sentry-raven/lib/raven/core_ext/object/duplicable.rb +++ /dev/null @@ -1,153 +0,0 @@ -# frozen_string_literal: true - -######################################### -# This file was copied from Rails 5.2 # -######################################### - -#-- -# Most objects are cloneable, but not all. For example you can't dup methods: -# -# method(:puts).dup # => TypeError: allocator undefined for Method -# -# Classes may signal their instances are not duplicable removing +dup+/+clone+ -# or raising exceptions from them. So, to dup an arbitrary object you normally -# use an optimistic approach and are ready to catch an exception, say: -# -# arbitrary_object.dup rescue object -# -# Rails dups objects in a few critical spots where they are not that arbitrary. -# That rescue is very expensive (like 40 times slower than a predicate), and it -# is often triggered. -# -# That's why we hardcode the following cases and check duplicable? instead of -# using that rescue idiom. -#++ -class Object - # Can you safely dup this object? - # - # False for method objects; - # true otherwise. - def duplicable? - true - end -end - -class NilClass - begin - nil.dup - rescue TypeError - # +nil+ is not duplicable: - # - # nil.duplicable? # => false - # nil.dup # => TypeError: can't dup NilClass - def duplicable? - false - end - end -end - -class FalseClass - begin - false.dup - rescue TypeError - # +false+ is not duplicable: - # - # false.duplicable? # => false - # false.dup # => TypeError: can't dup FalseClass - def duplicable? - false - end - end -end - -class TrueClass - begin - true.dup - rescue TypeError - # +true+ is not duplicable: - # - # true.duplicable? # => false - # true.dup # => TypeError: can't dup TrueClass - def duplicable? - false - end - end -end - -class Symbol - begin - :symbol.dup # Ruby 2.4.x. - "symbol_from_string".to_sym.dup # Some symbols can't `dup` in Ruby 2.4.0. - rescue TypeError - # Symbols are not duplicable: - # - # :my_symbol.duplicable? # => false - # :my_symbol.dup # => TypeError: can't dup Symbol - def duplicable? - false - end - end -end - -class Numeric - begin - 1.dup - rescue TypeError - # Numbers are not duplicable: - # - # 3.duplicable? # => false - # 3.dup # => TypeError: can't dup Integer - def duplicable? - false - end - end -end - -require "bigdecimal" -class BigDecimal - # BigDecimals are duplicable: - # - # BigDecimal("1.2").duplicable? # => true - # BigDecimal("1.2").dup # => # - def duplicable? - true - end -end - -class Method - # Methods are not duplicable: - # - # method(:puts).duplicable? # => false - # method(:puts).dup # => TypeError: allocator undefined for Method - def duplicable? - false - end -end - -class Complex - begin - Complex(1).dup - rescue TypeError - # Complexes are not duplicable: - # - # Complex(1).duplicable? # => false - # Complex(1).dup # => TypeError: can't copy Complex - def duplicable? - false - end - end -end - -class Rational - begin - Rational(1).dup - rescue TypeError - # Rationals are not duplicable: - # - # Rational(1).duplicable? # => false - # Rational(1).dup # => TypeError: can't copy Rational - def duplicable? - false - end - end -end diff --git a/sentry-raven/lib/raven/event.rb b/sentry-raven/lib/raven/event.rb deleted file mode 100644 index ec0bdb030..000000000 --- a/sentry-raven/lib/raven/event.rb +++ /dev/null @@ -1,255 +0,0 @@ -# frozen_string_literal: true - -require 'socket' -require 'securerandom' - -module Raven - class Event - # See Sentry server default limits at - # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py - MAX_MESSAGE_SIZE_IN_BYTES = 1024 * 8 - REQUIRED_OPTION_KEYS = [:configuration, :context, :breadcrumbs].freeze - - SDK = { "name" => "raven-ruby", "version" => Raven::VERSION }.freeze - - attr_accessor :id, :logger, :transaction, :server_name, :release, :modules, - :extra, :tags, :context, :configuration, :checksum, - :fingerprint, :environment, :server_os, :runtime, - :breadcrumbs, :user, :backtrace, :platform, :sdk - alias event_id id - - attr_reader :level, :timestamp, :time_spent - - def initialize(options) - # Set some simple default values - self.id = SecureRandom.uuid.delete("-") - self.timestamp = Time.now.utc - self.level = :error - self.logger = :ruby - self.platform = :ruby - self.sdk = SDK - - # Set some attributes with empty hashes to allow merging - @interfaces = {} - self.user = {} # TODO: contexts - self.extra = {} # TODO: contexts - self.server_os = {} # TODO: contexts - self.runtime = {} # TODO: contexts - self.tags = {} # TODO: contexts - - unless REQUIRED_OPTION_KEYS.all? { |key| options.key?(key) } - raise "you must provide configuration, context, and breadcrumbs when initializing a Raven::Event" - end - - self.configuration = options[:configuration] - self.context = options[:context] - self.breadcrumbs = options[:breadcrumbs] - - # Allow attributes to be set on the event at initialization - yield self if block_given? - options.each_pair { |key, val| public_send("#{key}=", val) unless val.nil? } - - set_core_attributes_from_configuration - set_core_attributes_from_context - end - - def self.from_exception(exc, options = {}, &block) - exception_context = if exc.instance_variable_defined?(:@__raven_context) - exc.instance_variable_get(:@__raven_context) - elsif exc.respond_to?(:raven_context) - exc.raven_context - else - {} - end - options = Raven::Utils::DeepMergeHash.deep_merge(exception_context, options) - - return unless options[:configuration].exception_class_allowed?(exc) - - new(options) do |evt| - evt.add_exception_interface(exc) - yield evt if block - end - end - - def self.from_message(message, options = {}) - new(options) do |evt| - evt.message = message, options[:message_params] || [] - if options[:backtrace] - evt.interface(:stacktrace) do |int| - int.frames = evt.stacktrace_interface_from(options[:backtrace]) - end - end - end - end - - def message - @interfaces[:logentry]&.unformatted_message - end - - def message=(args) - if args.is_a?(Array) - message, params = args[0], args[0..-1] - else - message = args - end - - unless message.is_a?(String) - configuration.logger.debug("You're passing a non-string message") - message = message.to_s - end - - interface(:message) do |int| - int.message = message.byteslice(0...MAX_MESSAGE_SIZE_IN_BYTES) # Messages limited to 10kb - int.params = params - end - end - - def timestamp=(time) - @timestamp = time.is_a?(Time) ? time.strftime('%Y-%m-%dT%H:%M:%S') : time - end - - def time_spent=(time) - @time_spent = time.is_a?(Float) ? (time * 1000).to_i : time - end - - def level=(new_level) # needed to meet the Sentry spec - @level = new_level.to_s == "warn" ? :warning : new_level - end - - def interface(name, value = nil, &block) - int = Interface.registered[name] - raise(Error, "Unknown interface: #{name}") unless int - - @interfaces[int.sentry_alias] = int.new(value, &block) if value || block - @interfaces[int.sentry_alias] - end - - def [](key) - interface(key) - end - - def []=(key, value) - interface(key, value) - end - - def to_hash - data = [:checksum, :environment, :event_id, :extra, :fingerprint, :level, - :logger, :message, :modules, :platform, :release, :sdk, :server_name, - :tags, :time_spent, :timestamp, :transaction, :user].each_with_object({}) do |att, memo| - memo[att] = public_send(att) if public_send(att) - end - - data[:breadcrumbs] = @breadcrumbs.to_hash unless @breadcrumbs.empty? - - @interfaces.each_pair do |name, int_data| - data[name.to_sym] = int_data.to_hash - end - data - end - - def to_json_compatible - cleaned_hash = async_json_processors.reduce(to_hash) { |a, e| e.process(a) } - JSON.parse(JSON.generate(cleaned_hash)) - end - - def add_exception_interface(exc) - interface(:exception) do |exc_int| - exceptions = Raven::Utils::ExceptionCauseChain.exception_to_array(exc).reverse - backtraces = Set.new - exc_int.values = exceptions.map do |e| - SingleExceptionInterface.new do |int| - int.type = e.class.to_s - int.value = e.to_s - int.module = e.class.to_s.split('::')[0...-1].join('::') - - int.stacktrace = - if e.backtrace && !backtraces.include?(e.backtrace.object_id) - backtraces << e.backtrace.object_id - StacktraceInterface.new do |stacktrace| - stacktrace.frames = stacktrace_interface_from(e.backtrace) - end - end - end - end - end - end - - def stacktrace_interface_from(backtrace) - Backtrace.parse(backtrace, { configuration: configuration }).lines.reverse.each_with_object([]) do |line, memo| - frame = StacktraceInterface::Frame.new - frame.abs_path = line.file if line.file - frame.function = line.method if line.method - frame.lineno = line.number - frame.in_app = line.in_app - frame.module = line.module_name if line.module_name - - if configuration[:context_lines] && frame.abs_path - frame.pre_context, frame.context_line, frame.post_context = \ - configuration.linecache.get_file_context(frame.abs_path, frame.lineno, configuration[:context_lines]) - end - - memo << frame if frame.filename - end - end - - # For cross-language compat - class << self - alias captureException from_exception - alias captureMessage from_message - alias capture_exception from_exception - alias capture_message from_message - end - - private - - def set_core_attributes_from_configuration - self.server_name ||= configuration.server_name - self.release ||= configuration.release - self.modules = list_gem_specs if configuration.send_modules - self.environment ||= configuration.current_environment - end - - def set_core_attributes_from_context - self.transaction ||= context.transaction.last - - # If this is a Rack event, merge Rack context - add_rack_context if !self[:http] && context.rack_env - - # Merge contexts - self.user = context.user.merge(user) # TODO: contexts - self.extra = context.extra.merge(extra) # TODO: contexts - self.tags = configuration.tags.merge(context.tags).merge!(tags) # TODO: contexts - end - - def add_rack_context - interface :http do |int| - int.from_rack(context.rack_env) - end - context.user[:ip_address] = calculate_real_ip_from_rack - - if request_id = Utils::RequestId.read_from(context.rack_env) - context.tags[:request_id] = request_id - end - end - - # When behind a proxy (or if the user is using a proxy), we can't use - # REMOTE_ADDR to determine the Event IP, and must use other headers instead. - def calculate_real_ip_from_rack - Utils::RealIp.new( - :remote_addr => context.rack_env["REMOTE_ADDR"], - :client_ip => context.rack_env["HTTP_CLIENT_IP"], - :real_ip => context.rack_env["HTTP_X_REAL_IP"], - :forwarded_for => context.rack_env["HTTP_X_FORWARDED_FOR"] - ).calculate_ip - end - - def async_json_processors - configuration.processors.map { |v| v.new(self) } - end - - def list_gem_specs - # Older versions of Rubygems don't support iterating over all specs - Hash[Gem::Specification.map { |spec| [spec.name, spec.version.to_s] }] if Gem::Specification.respond_to?(:map) - end - end -end diff --git a/sentry-raven/lib/raven/helpers/deprecation_helper.rb b/sentry-raven/lib/raven/helpers/deprecation_helper.rb deleted file mode 100644 index bd81d746b..000000000 --- a/sentry-raven/lib/raven/helpers/deprecation_helper.rb +++ /dev/null @@ -1,17 +0,0 @@ -module DeprecationHelper - def self.deprecate_dasherized_filename(correct_filename) - warn "[Deprecation Warning] Dasherized filename \"#{correct_filename.gsub('_', '-')}\" is deprecated and will be removed in 4.0; use \"#{correct_filename}\" instead" # rubocop:disable Style/LineLength - end - - def self.deprecate_old_breadcrumbs_configuration(logger) - deprecated_usage = - if logger == :sentry_logger - "require \"raven/breadcrumbs/logger\"" - else - "Raven.configuration.rails_activesupport_breadcrumbs = true" - end - recommended_usage = "Raven.configuration.breadcrumbs_logger = :#{logger}" - - warn "[Deprecation Warning] The way you enable breadcrumbs logger (#{deprecated_usage}) is deprecated and will be removed in 4.0; use '#{recommended_usage}' instead" # rubocop:disable Style/LineLength - end -end diff --git a/sentry-raven/lib/raven/instance.rb b/sentry-raven/lib/raven/instance.rb deleted file mode 100644 index 116c7391d..000000000 --- a/sentry-raven/lib/raven/instance.rb +++ /dev/null @@ -1,249 +0,0 @@ -module Raven - # A copy of Raven's base module class methods, minus some of the integration - # and global hooks since it's meant to be used explicitly. Useful for - # sending errors to multiple sentry projects in a large application. - # - # @example - # class Foo - # def initialize - # @other_raven = Raven::Instance.new - # @other_raven.configure do |config| - # config.server = 'http://...' - # end - # end - # - # def foo - # # ... - # rescue => e - # @other_raven.capture_exception(e) - # end - # end - class Instance - # See Raven::Client. - attr_writer :client - - # See Raven::Configuration. - attr_accessor :configuration - - def initialize(context = nil, config = nil) - @context = @explicit_context = context - self.configuration = config || Configuration.new - end - - def context - if @explicit_context - @context ||= Context.new - else - Context.current - end - end - - def logger - configuration.logger - end - - # The client object is responsible for delivering formatted data to the - # Sentry server. - def client - @client ||= Client.new(configuration) - end - - # Tell the log that the client is good to go - def report_status - return unless configuration.enabled_in_current_env? - return if configuration.silence_ready - - if configuration.capture_allowed? - logger.info "Raven #{VERSION} ready to catch errors" - else - logger.info "Raven #{VERSION} configured not to capture errors: #{configuration.error_messages}" - end - end - - # Call this method to modify defaults in your initializers. - # - # @example - # Raven.configure do |config| - # config.server = 'http://...' - # end - def configure - yield(configuration) if block_given? - - self.client = Client.new(configuration) - report_status - client - end - - # Send an event to the configured Sentry server - # - # @example - # evt = Raven::Event.new(:message => "An errore) - # Raven.send_event(evt) - def send_event(event, hint = nil) - client.send_event(event, hint) - end - - # Capture and process any exceptions from the given block. - # - # @example - # Raven.capture do - # MyApp.run - # end - def capture(options = {}) - if block_given? - begin - yield - rescue Error - raise # Don't capture Raven errors - rescue Exception => e - capture_type(e, options) - raise - end - else - install_at_exit_hook(options) - end - end - - def capture_type(obj, options = {}) - unless configuration.capture_allowed?(obj) - logger.debug("#{obj} excluded from capture: #{configuration.error_messages}") - return false - end - - message_or_exc = obj.is_a?(String) ? "message" : "exception" - options = options.deep_dup - options[:configuration] = configuration - options[:context] = context - options[:breadcrumbs] = breadcrumbs - - if evt = Event.send("from_" + message_or_exc, obj, options) - yield evt if block_given? - if configuration.async? - begin - # We have to convert to a JSON-like hash, because background job - # processors (esp ActiveJob) may not like weird types in the event hash - configuration.async.call(evt.to_json_compatible) - rescue => e - logger.error("async event sending failed: #{e.message}") - send_event(evt, make_hint(obj)) - end - else - send_event(evt, make_hint(obj)) - end - Thread.current["sentry_#{object_id}_last_event_id".to_sym] = evt.id - evt - end - end - - alias capture_message capture_type - alias capture_exception capture_type - - def last_event_id - Thread.current["sentry_#{object_id}_last_event_id".to_sym] - end - - # Provides extra context to the exception prior to it being handled by - # Raven. An exception can have multiple annotations, which are merged - # together. - # - # The options (annotation) is treated the same as the ``options`` - # parameter to ``capture_exception`` or ``Event.from_exception``, and - # can contain the same ``:user``, ``:tags``, etc. options as these - # methods. - # - # These will be merged with the ``options`` parameter to - # ``Event.from_exception`` at the top of execution. - # - # @example - # begin - # raise "Hello" - # rescue => exc - # Raven.annotate_exception(exc, :user => { 'id' => 1, - # 'email' => 'foo@example.com' }) - # end - def annotate_exception(exc, options = {}) - notes = (exc.instance_variable_defined?(:@__raven_context) && exc.instance_variable_get(:@__raven_context)) || {} - Raven::Utils::DeepMergeHash.deep_merge!(notes, options) - exc.instance_variable_set(:@__raven_context, notes) - exc - end - - # Bind user context. Merges with existing context (if any). - # - # It is recommending that you send at least the ``id`` and ``email`` - # values. All other values are arbitrary. - # - # @example - # Raven.user_context('id' => 1, 'email' => 'foo@example.com') - def user_context(options = nil) - original_user_context = context.user - - if options - context.user = context.user.merge(options) - else - context.user = {} - end - - yield if block_given? - context.user - ensure - context.user = original_user_context if block_given? - end - - # Bind tags context. Merges with existing context (if any). - # - # Tags are key / value pairs which generally represent things like - # application version, environment, role, and server names. - # - # @example - # Raven.tags_context('my_custom_tag' => 'tag_value') - def tags_context(options = nil) - context.tags.merge!(options || {}) - yield if block_given? - context.tags - ensure - context.tags.delete_if { |k, _| options.keys.include? k } if block_given? - end - - # Bind extra context. Merges with existing context (if any). - # - # Extra context shows up as Additional Data within Sentry, and is - # completely arbitrary. - # - # @example - # Raven.extra_context('my_custom_data' => 'value') - def extra_context(options = nil) - context.extra.merge!(options || {}) - yield if block_given? - context.extra - ensure - context.extra.delete_if { |k, _| options.keys.include? k } if block_given? - end - - def rack_context(env) - env = nil if env.empty? - - context.rack_env = env - end - - def breadcrumbs - BreadcrumbBuffer.current - end - - private - - def install_at_exit_hook(options) - at_exit do - exception = $ERROR_INFO - if exception - logger.debug "Caught a post-mortem exception: #{exception.inspect}" - capture_type(exception, options) - end - end - end - - def make_hint(obj) - obj.is_a?(String) ? { :exception => nil, :message => obj } : { :exception => obj, :message => nil } - end - end -end diff --git a/sentry-raven/lib/raven/integrations/delayed_job.rb b/sentry-raven/lib/raven/integrations/delayed_job.rb deleted file mode 100644 index e69c369c4..000000000 --- a/sentry-raven/lib/raven/integrations/delayed_job.rb +++ /dev/null @@ -1,58 +0,0 @@ -require 'delayed_job' -require 'raven/utils/context_filter' - -module Delayed - module Plugins - class Raven < ::Delayed::Plugin - callbacks do |lifecycle| - lifecycle.around(:invoke_job) do |job, *args, &block| - begin - # Forward the call to the next callback in the callback chain - block.call(job, *args) - rescue Exception => e - # Log error to Sentry - extra = { - :delayed_job => { - :id => job.id.to_s, - :priority => job.priority, - :attempts => job.attempts, - :run_at => job.run_at, - :locked_at => job.locked_at, - :locked_by => job.locked_by, - :queue => job.queue, - :created_at => job.created_at - } - } - # last_error can be nil - extra[:last_error] = job.last_error[0...1000] if job.last_error - # handlers are YAML objects in strings, we definitely can't - # report all of that or the event will get truncated randomly - extra[:handler] = job.handler[0...1000] if job.handler - - if job.respond_to?('payload_object') && job.payload_object.respond_to?('job_data') - extra[:active_job] = ::Raven::Utils::ContextFilter.filter_context(job.payload_object.job_data) - end - ::Raven.capture_exception(e, - :logger => 'delayed_job', - :tags => { - :delayed_job_queue => job.queue, - :delayed_job_id => job.id.to_s - }, - :extra => extra) - - # Make sure we propagate the failure! - raise e - ensure - ::Raven::Context.clear! - ::Raven::BreadcrumbBuffer.clear! - end - end - end - end - end -end - -## -# Register DelayedJob Raven plugin -# -Delayed::Worker.plugins << Delayed::Plugins::Raven diff --git a/sentry-raven/lib/raven/integrations/rack-timeout.rb b/sentry-raven/lib/raven/integrations/rack-timeout.rb deleted file mode 100644 index 14952c688..000000000 --- a/sentry-raven/lib/raven/integrations/rack-timeout.rb +++ /dev/null @@ -1,22 +0,0 @@ -# We need to do this because of the way integration loading works -require "rack/timeout/base" unless defined?(Rack::Timeout) - -# This integration is a good example of how to change how exceptions -# get grouped by Sentry's UI. Simply override #raven_context in -# the exception class, and append something to the fingerprint -# that will distinguish exceptions in the way you desire. -module RackTimeoutExtensions - def raven_context - # Only rack-timeout 0.3.0+ provides the request environment, but we can't - # gate this based on a gem version constant because rack-timeout does - # not provide one. - if defined?(env) - { :fingerprint => ["{{ default }}", env["REQUEST_URI"]] } - else - {} - end - end -end - -Rack::Timeout::Error.include(RackTimeoutExtensions) -Rack::Timeout::RequestTimeoutException.include(RackTimeoutExtensions) diff --git a/sentry-raven/lib/raven/integrations/rack.rb b/sentry-raven/lib/raven/integrations/rack.rb deleted file mode 100644 index 73f875c2f..000000000 --- a/sentry-raven/lib/raven/integrations/rack.rb +++ /dev/null @@ -1,141 +0,0 @@ -require 'time' -require 'rack' - -module Raven - # Middleware for Rack applications. Any errors raised by the upstream - # application will be delivered to Sentry and re-raised. - # - # Synopsis: - # - # require 'rack' - # require 'raven' - # - # Raven.configure do |config| - # config.server = 'http://my_dsn' - # end - # - # app = Rack::Builder.app do - # use Raven::Rack - # run lambda { |env| raise "Rack down" } - # end - # - # Use a standard Raven.configure call to configure your server credentials. - class Rack - def self.capture_type(exception, env, options = {}) - if env['raven.requested_at'] - options[:time_spent] = Time.now - env['raven.requested_at'] - end - Raven.capture_type(exception, options) do |evt| - evt.interface :http do |int| - int.from_rack(env) - end - end - end - class << self - alias capture_message capture_type - alias capture_exception capture_type - end - - def initialize(app) - @app = app - end - - def call(env) - # store the current environment in our local context for arbitrary - # callers - env['raven.requested_at'] = Time.now - Raven.rack_context(env) - Raven.context.transaction.push(env["PATH_INFO"]) if env["PATH_INFO"] - - begin - response = @app.call(env) - rescue Error - raise # Don't capture Raven errors - rescue Exception => e - Raven::Rack.capture_exception(e, env) - raise - end - - error = env['rack.exception'] || env['sinatra.error'] - Raven::Rack.capture_exception(error, env) if error - - response - ensure - Context.clear! - BreadcrumbBuffer.clear! - end - end - - module RackInterface - def from_rack(env_hash) - req = ::Rack::Request.new(env_hash) - - self.url = req.scheme && req.url.split('?').first - self.method = req.request_method - self.query_string = req.query_string - self.data = read_data_from(req) - self.cookies = req.cookies - - self.headers = format_headers_for_sentry(env_hash) - self.env = format_env_for_sentry(env_hash) - end - - private - - # See Sentry server default limits at - # https://github.com/getsentry/sentry/blob/master/src/sentry/conf/server.py - def read_data_from(request) - if request.form_data? - request.POST - elsif request.body # JSON requests, etc - data = request.body.read(4096 * 4) # Sentry server limit - request.body.rewind - data - end - rescue IOError => e - e.message - end - - def format_headers_for_sentry(env_hash) - env_hash.each_with_object({}) do |(key, value), memo| - begin - key = key.to_s # rack env can contain symbols - next memo['X-Request-Id'] ||= Utils::RequestId.read_from(env_hash) if Utils::RequestId::REQUEST_ID_HEADERS.include?(key) - next unless key.upcase == key # Non-upper case stuff isn't either - - # Rack adds in an incorrect HTTP_VERSION key, which causes downstream - # to think this is a Version header. Instead, this is mapped to - # env['SERVER_PROTOCOL']. But we don't want to ignore a valid header - # if the request has legitimately sent a Version header themselves. - # See: https://github.com/rack/rack/blob/028438f/lib/rack/handler/cgi.rb#L29 - next if key == 'HTTP_VERSION' && value == env_hash['SERVER_PROTOCOL'] - next if key == 'HTTP_COOKIE' # Cookies don't go here, they go somewhere else - next unless key.start_with?('HTTP_') || %w(CONTENT_TYPE CONTENT_LENGTH).include?(key) - - # Rack stores headers as HTTP_WHAT_EVER, we need What-Ever - key = key.sub(/^HTTP_/, "") - key = key.split('_').map(&:capitalize).join('-') - memo[key] = value.to_s - rescue StandardError => e - # Rails adds objects to the Rack env that can sometimes raise exceptions - # when `to_s` is called. - # See: https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/middleware/remote_ip.rb#L134 - Raven.logger.warn("Error raised while formatting headers: #{e.message}") - next - end - end - end - - def format_env_for_sentry(env_hash) - return env_hash if Raven.configuration.rack_env_whitelist.empty? - - env_hash.select do |k, _v| - Raven.configuration.rack_env_whitelist.include? k.to_s - end - end - end - - class HttpInterface - include RackInterface - end -end diff --git a/sentry-raven/lib/raven/integrations/rails.rb b/sentry-raven/lib/raven/integrations/rails.rb deleted file mode 100644 index 42b76491f..000000000 --- a/sentry-raven/lib/raven/integrations/rails.rb +++ /dev/null @@ -1,89 +0,0 @@ -require 'rails' - -module Raven - class Rails < ::Rails::Railtie - require 'raven/integrations/rails/overrides/streaming_reporter' - require 'raven/integrations/rails/controller_methods' - require 'raven/integrations/rails/controller_transaction' - require 'raven/integrations/rails/backtrace_cleaner' - require 'raven/integrations/rack' - - initializer "raven.use_rack_middleware" do |app| - app.config.middleware.insert 0, Raven::Rack - end - - initializer 'raven.action_controller' do - ActiveSupport.on_load :action_controller do - include Raven::Rails::ControllerMethods - include Raven::Rails::ControllerTransaction - if ::Rails::VERSION::STRING >= "4.0.0" - Raven.safely_prepend( - "StreamingReporter", - :from => Raven::Rails::Overrides, - :to => ActionController::Live - ) - end - end - end - - initializer 'raven.action_view' do - ActiveSupport.on_load :action_view do - Raven.safely_prepend( - "StreamingReporter", - :from => Raven::Rails::Overrides, - :to => ActionView::StreamingTemplateRenderer::Body - ) - end - end - - config.before_initialize do - Raven.configuration.logger = ::Rails.logger - - backtrace_cleaner = Raven::Rails::BacktraceCleaner.new - - Raven.configuration.backtrace_cleanup_callback = lambda do |backtrace| - backtrace_cleaner.clean(backtrace) - end - end - - config.after_initialize do - if Raven.configuration.breadcrumbs_logger.include?(:active_support_logger) || - Raven.configuration.rails_activesupport_breadcrumbs - - require 'raven/breadcrumbs/active_support_logger' - Raven::Breadcrumbs::ActiveSupportLogger.inject - end - - if Raven.configuration.rails_report_rescued_exceptions - require 'raven/integrations/rails/overrides/debug_exceptions_catcher' - if defined?(::ActionDispatch::DebugExceptions) - exceptions_class = ::ActionDispatch::DebugExceptions - elsif defined?(::ActionDispatch::ShowExceptions) - exceptions_class = ::ActionDispatch::ShowExceptions - end - - Raven.safely_prepend( - "DebugExceptionsCatcher", - :from => Raven::Rails::Overrides, - :to => exceptions_class - ) - end - end - - initializer 'raven.active_job' do - ActiveSupport.on_load :active_job do - require 'raven/integrations/rails/active_job' - end - end - - rake_tasks do - require 'raven/integrations/tasks' - end - - if defined?(runner) - runner do - Raven.capture - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/rails/active_job.rb b/sentry-raven/lib/raven/integrations/rails/active_job.rb deleted file mode 100644 index 7bce01fca..000000000 --- a/sentry-raven/lib/raven/integrations/rails/active_job.rb +++ /dev/null @@ -1,63 +0,0 @@ -module Raven - class Rails - module ActiveJobExtensions - ALREADY_SUPPORTED_SENTRY_ADAPTERS = %w( - ActiveJob::QueueAdapters::SidekiqAdapter - ActiveJob::QueueAdapters::DelayedJobAdapter - ).freeze - - def self.included(base) - base.class_eval do - around_perform do |job, block| - if already_supported_by_specific_integration?(job) - block.call - else - capture_and_reraise_with_sentry(job, block) - end - end - end - end - - def capture_and_reraise_with_sentry(job, block) - block.call - rescue Exception => e # rubocop:disable Lint/RescueException - rescue_handler_result = rescue_with_handler(e) - return rescue_handler_result if rescue_handler_result - - Raven.capture_exception(e, :extra => raven_context(job)) - raise e - ensure - Context.clear! - BreadcrumbBuffer.clear! - end - - def already_supported_by_specific_integration?(job) - if ::Rails.version.to_f < 5.0 - ALREADY_SUPPORTED_SENTRY_ADAPTERS.include?(job.class.queue_adapter.to_s) - else - ALREADY_SUPPORTED_SENTRY_ADAPTERS.include?(job.class.queue_adapter.class.to_s) - end - end - - def raven_context(job) - ctx = { - :active_job => job.class.name, - :arguments => job.arguments, - :scheduled_at => job.scheduled_at, - :job_id => job.job_id, - :locale => job.locale - } - # Add provider_job_id details if Rails 5 - if job.respond_to?(:provider_job_id) - ctx[:provider_job_id] = job.provider_job_id - end - - ctx - end - end - end -end - -class ActiveJob::Base - include Raven::Rails::ActiveJobExtensions -end diff --git a/sentry-raven/lib/raven/integrations/rails/backtrace_cleaner.rb b/sentry-raven/lib/raven/integrations/rails/backtrace_cleaner.rb deleted file mode 100644 index 871ca03df..000000000 --- a/sentry-raven/lib/raven/integrations/rails/backtrace_cleaner.rb +++ /dev/null @@ -1,29 +0,0 @@ -require "active_support/backtrace_cleaner" -require "active_support/core_ext/string/access" - -module Raven - class Rails - class BacktraceCleaner < ActiveSupport::BacktraceCleaner - APP_DIRS_PATTERN = /\A(?:\.\/)?(?:app|config|lib|test|\(\w*\))/.freeze - RENDER_TEMPLATE_PATTERN = /:in `.*_\w+_{2,3}\d+_\d+'/.freeze - - def initialize - super - # we don't want any default silencers because they're too aggressive - remove_silencers! - - @root = "#{Raven.configuration.project_root}/" - add_filter do |line| - line.start_with?(@root) ? line.from(@root.size) : line - end - add_filter do |line| - if line =~ RENDER_TEMPLATE_PATTERN - line.sub(RENDER_TEMPLATE_PATTERN, "") - else - line - end - end - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/rails/controller_methods.rb b/sentry-raven/lib/raven/integrations/rails/controller_methods.rb deleted file mode 100644 index 9275b1538..000000000 --- a/sentry-raven/lib/raven/integrations/rails/controller_methods.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Raven - class Rails - module ControllerMethods - def capture_message(message, options = {}) - Raven::Rack.capture_message(message, request.env, options) - end - - def capture_exception(exception, options = {}) - Raven::Rack.capture_exception(exception, request.env, options) - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/rails/controller_transaction.rb b/sentry-raven/lib/raven/integrations/rails/controller_transaction.rb deleted file mode 100644 index 5ae0d3b63..000000000 --- a/sentry-raven/lib/raven/integrations/rails/controller_transaction.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Raven - class Rails - module ControllerTransaction - def self.included(base) - base.prepend_around_action do |controller, block| - Raven.context.transaction.push "#{controller.class}##{controller.action_name}" - block.call - Raven.context.transaction.pop - end - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb b/sentry-raven/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb deleted file mode 100644 index d525b2712..000000000 --- a/sentry-raven/lib/raven/integrations/rails/overrides/debug_exceptions_catcher.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Raven - class Rails - module Overrides - module DebugExceptionsCatcher - def render_exception(env_or_request, exception) - begin - env = env_or_request.respond_to?(:env) ? env_or_request.env : env_or_request - Raven::Rack.capture_exception(exception, env) - rescue - end - super - end - end - - module OldDebugExceptionsCatcher - def self.included(base) - base.send(:alias_method_chain, :render_exception, :raven) - end - - def render_exception_with_raven(env_or_request, exception) - begin - env = env_or_request.respond_to?(:env) ? env_or_request.env : env_or_request - Raven::Rack.capture_exception(exception, env) - rescue - end - render_exception_without_raven(env_or_request, exception) - end - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/rails/overrides/streaming_reporter.rb b/sentry-raven/lib/raven/integrations/rails/overrides/streaming_reporter.rb deleted file mode 100644 index bdfca63ad..000000000 --- a/sentry-raven/lib/raven/integrations/rails/overrides/streaming_reporter.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Raven - class Rails - module Overrides - module StreamingReporter - def log_error(exception) - Raven.capture_exception(exception) - super - end - end - - module OldStreamingReporter - def self.included(base) - base.send(:alias_method_chain, :log_error, :raven) - end - - def log_error_with_raven(exception) - Raven.capture_exception(exception) - log_error_without_raven(exception) - end - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/railties.rb b/sentry-raven/lib/raven/integrations/railties.rb deleted file mode 100644 index 6e9f91dc8..000000000 --- a/sentry-raven/lib/raven/integrations/railties.rb +++ /dev/null @@ -1 +0,0 @@ -require 'raven/integrations/rails' diff --git a/sentry-raven/lib/raven/integrations/rake.rb b/sentry-raven/lib/raven/integrations/rake.rb deleted file mode 100644 index e14174893..000000000 --- a/sentry-raven/lib/raven/integrations/rake.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rake' -require 'rake/task' -require 'raven/integrations/tasks' - -module Rake - class Application - alias orig_display_error_messsage display_error_message - def display_error_message(ex) - Raven.capture_exception( - ex, - :transaction => top_level_tasks.join(' '), - :logger => 'rake', - :tags => { 'rake_task' => top_level_tasks.join(' ') } - ) - orig_display_error_messsage(ex) - end - end -end diff --git a/sentry-raven/lib/raven/integrations/sidekiq.rb b/sentry-raven/lib/raven/integrations/sidekiq.rb deleted file mode 100644 index b74c699a3..000000000 --- a/sentry-raven/lib/raven/integrations/sidekiq.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'time' -require 'sidekiq' -require 'raven/integrations/sidekiq/cleanup_middleware' -require 'raven/integrations/sidekiq/error_handler' - -if Sidekiq::VERSION > '3' - Sidekiq.configure_server do |config| - config.error_handlers << Raven::Sidekiq::ErrorHandler.new - config.server_middleware do |chain| - chain.add Raven::Sidekiq::CleanupMiddleware - end - end -end diff --git a/sentry-raven/lib/raven/integrations/sidekiq/cleanup_middleware.rb b/sentry-raven/lib/raven/integrations/sidekiq/cleanup_middleware.rb deleted file mode 100644 index c4ea26f12..000000000 --- a/sentry-raven/lib/raven/integrations/sidekiq/cleanup_middleware.rb +++ /dev/null @@ -1,13 +0,0 @@ -module Raven - module Sidekiq - class CleanupMiddleware - def call(_worker, job, queue) - Raven.context.transaction.push "Sidekiq/#{job['class']}" - Raven.extra_context(:sidekiq => job.merge("queue" => queue)) - yield - Context.clear! - BreadcrumbBuffer.clear! - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/sidekiq/error_handler.rb b/sentry-raven/lib/raven/integrations/sidekiq/error_handler.rb deleted file mode 100644 index 80aef12da..000000000 --- a/sentry-raven/lib/raven/integrations/sidekiq/error_handler.rb +++ /dev/null @@ -1,38 +0,0 @@ -require 'raven/utils/context_filter' - -module Raven - module Sidekiq - class ErrorHandler - SIDEKIQ_NAME = "Sidekiq".freeze - - def call(ex, context) - context = Utils::ContextFilter.filter_context(context) - Raven.context.transaction.push transaction_from_context(context) - Raven.capture_exception( - ex, - :message => ex.message, - :extra => { :sidekiq => context } - ) - Context.clear! - BreadcrumbBuffer.clear! - end - - private - - # this will change in the future: - # https://github.com/mperham/sidekiq/pull/3161 - def transaction_from_context(context) - classname = (context["wrapped"] || context["class"] || - (context[:job] && (context[:job]["wrapped"] || context[:job]["class"])) - ) - if classname - "#{SIDEKIQ_NAME}/#{classname}" - elsif context[:event] - "#{SIDEKIQ_NAME}/#{context[:event]}" - else - SIDEKIQ_NAME - end - end - end - end -end diff --git a/sentry-raven/lib/raven/integrations/tasks.rb b/sentry-raven/lib/raven/integrations/tasks.rb deleted file mode 100644 index 8f698b95c..000000000 --- a/sentry-raven/lib/raven/integrations/tasks.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'rake' -require 'raven/cli' - -namespace :raven do - desc "Send a test event to the remote Sentry server" - task :test, [:dsn] do |_t, args| - Rake::Task["environment"].invoke if Rake::Task.tasks.map(&:to_s).include?("environment") - - Raven::CLI.test(args.dsn) - end -end diff --git a/sentry-raven/lib/raven/interface.rb b/sentry-raven/lib/raven/interface.rb deleted file mode 100644 index c4366cd1d..000000000 --- a/sentry-raven/lib/raven/interface.rb +++ /dev/null @@ -1,25 +0,0 @@ -module Raven - class Interface - def initialize(attributes = nil) - attributes&.each do |attr, value| - public_send "#{attr}=", value - end - - yield self if block_given? - end - - def self.inherited(klass) - name = klass.name.split("::").last.downcase.gsub("interface", "") - registered[name.to_sym] = klass - super - end - - def self.registered - @@registered ||= {} # rubocop:disable Style/ClassVars - end - - def to_hash - Hash[instance_variables.map { |name| [name[1..-1].to_sym, instance_variable_get(name)] }] - end - end -end diff --git a/sentry-raven/lib/raven/interfaces/exception.rb b/sentry-raven/lib/raven/interfaces/exception.rb deleted file mode 100644 index 97072d4f2..000000000 --- a/sentry-raven/lib/raven/interfaces/exception.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Raven - class ExceptionInterface < Interface - attr_accessor :values - - def self.sentry_alias - :exception - end - - def to_hash(*args) - data = super(*args) - data[:values] = data[:values].map(&:to_hash) if data[:values] - data - end - end -end diff --git a/sentry-raven/lib/raven/interfaces/http.rb b/sentry-raven/lib/raven/interfaces/http.rb deleted file mode 100644 index ef3b70421..000000000 --- a/sentry-raven/lib/raven/interfaces/http.rb +++ /dev/null @@ -1,16 +0,0 @@ -module Raven - class HttpInterface < Interface - attr_accessor :url, :method, :data, :query_string, :cookies, :headers, :env - - def initialize(*arguments) - self.headers = {} - self.env = {} - self.cookies = nil - super(*arguments) - end - - def self.sentry_alias - :request - end - end -end diff --git a/sentry-raven/lib/raven/interfaces/message.rb b/sentry-raven/lib/raven/interfaces/message.rb deleted file mode 100644 index 594cc275c..000000000 --- a/sentry-raven/lib/raven/interfaces/message.rb +++ /dev/null @@ -1,20 +0,0 @@ -require 'raven/interface' - -module Raven - class MessageInterface < Interface - attr_accessor :message, :params - - def initialize(*arguments) - self.params = [] - super(*arguments) - end - - def unformatted_message - Array(params).empty? ? message : message % params - end - - def self.sentry_alias - :logentry - end - end -end diff --git a/sentry-raven/lib/raven/interfaces/single_exception.rb b/sentry-raven/lib/raven/interfaces/single_exception.rb deleted file mode 100644 index c0c3e8c7a..000000000 --- a/sentry-raven/lib/raven/interfaces/single_exception.rb +++ /dev/null @@ -1,14 +0,0 @@ -module Raven - class SingleExceptionInterface < Interface - attr_accessor :type - attr_accessor :value - attr_accessor :module - attr_accessor :stacktrace - - def to_hash(*args) - data = super(*args) - data[:stacktrace] = data[:stacktrace].to_hash if data[:stacktrace] - data - end - end -end diff --git a/sentry-raven/lib/raven/interfaces/stack_trace.rb b/sentry-raven/lib/raven/interfaces/stack_trace.rb deleted file mode 100644 index ec42ff91a..000000000 --- a/sentry-raven/lib/raven/interfaces/stack_trace.rb +++ /dev/null @@ -1,69 +0,0 @@ -module Raven - class StacktraceInterface < Interface - attr_accessor :frames - - def initialize(*arguments) - super(*arguments) - end - - def self.sentry_alias - :stacktrace - end - - def to_hash(*args) - data = super(*args) - data[:frames] = data[:frames].map(&:to_hash) - data - end - - # Not actually an interface, but I want to use the same style - class Frame < Interface - attr_accessor :abs_path, :context_line, :function, :in_app, - :lineno, :module, :pre_context, :post_context, :vars - - def initialize(*arguments) - super(*arguments) - end - - def filename - return if abs_path.nil? - return @filename if instance_variable_defined?(:@filename) - - prefix = - if under_project_root? && in_app - project_root - elsif under_project_root? - longest_load_path || project_root - else - longest_load_path - end - - @filename = prefix ? abs_path[prefix.to_s.chomp(File::SEPARATOR).length + 1..-1] : abs_path - end - - def to_hash(*args) - data = super(*args) - data[:filename] = filename - data.delete(:vars) unless vars && !vars.empty? - data.delete(:pre_context) unless pre_context && !pre_context.empty? - data.delete(:post_context) unless post_context && !post_context.empty? - data.delete(:context_line) unless context_line && !context_line.empty? - data - end - - private - - def under_project_root? - project_root && abs_path.start_with?(project_root) - end - - def project_root - @project_root ||= Raven.configuration.project_root&.to_s - end - - def longest_load_path - $LOAD_PATH.select { |path| abs_path.start_with?(path.to_s) }.max_by(&:size) - end - end - end -end diff --git a/sentry-raven/lib/raven/linecache.rb b/sentry-raven/lib/raven/linecache.rb deleted file mode 100644 index ae1f5b477..000000000 --- a/sentry-raven/lib/raven/linecache.rb +++ /dev/null @@ -1,44 +0,0 @@ -module Raven - class LineCache - def initialize - @cache = {} - end - - # Any linecache you provide to Raven must implement this method. - # Returns an Array of Strings representing the lines in the source - # file. The number of lines retrieved is (2 * context) + 1, the middle - # line should be the line requested by lineno. See specs for more information. - def get_file_context(filename, lineno, context) - return nil, nil, nil unless valid_path?(filename) - - lines = Array.new(2 * context + 1) do |i| - getline(filename, lineno - context + i) - end - [lines[0..(context - 1)], lines[context], lines[(context + 1)..-1]] - end - - private - - def valid_path?(path) - lines = getlines(path) - !lines.nil? - end - - def getlines(path) - @cache[path] ||= begin - File.open(path, "r", &:readlines) - rescue - nil - end - end - - def getline(path, n) - return nil if n < 1 - - lines = getlines(path) - return nil if lines.nil? - - lines[n - 1] - end - end -end diff --git a/sentry-raven/lib/raven/logger.rb b/sentry-raven/lib/raven/logger.rb deleted file mode 100644 index 7450e85b7..000000000 --- a/sentry-raven/lib/raven/logger.rb +++ /dev/null @@ -1,20 +0,0 @@ -# frozen_string_literal: true - -require 'logger' - -module Raven - class Logger < ::Logger - LOG_PREFIX = "** [Raven] " - PROGNAME = "sentry" - - def initialize(*) - super - @level = ::Logger::INFO - original_formatter = ::Logger::Formatter.new - @default_formatter = proc do |severity, datetime, _progname, msg| - msg = "#{LOG_PREFIX}#{msg}" - original_formatter.call(severity, datetime, PROGNAME, msg) - end - end - end -end diff --git a/sentry-raven/lib/raven/processor.rb b/sentry-raven/lib/raven/processor.rb deleted file mode 100644 index 68ad5c2a1..000000000 --- a/sentry-raven/lib/raven/processor.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Raven - class Processor - STRING_MASK = '********'.freeze - INT_MASK = 0 - REGEX_SPECIAL_CHARACTERS = %w(. $ ^ { [ ( | ) * + ?).freeze - - def initialize(client = nil) - @client = client - end - - def process(_data) - raise NotImplementedError - end - end -end diff --git a/sentry-raven/lib/raven/processor/cookies.rb b/sentry-raven/lib/raven/processor/cookies.rb deleted file mode 100644 index 609e41fb4..000000000 --- a/sentry-raven/lib/raven/processor/cookies.rb +++ /dev/null @@ -1,36 +0,0 @@ -module Raven - class Processor::Cookies < Processor - def process(data) - process_if_symbol_keys(data) if data[:request] - process_if_string_keys(data) if data["request"] - - data - end - - private - - def process_if_symbol_keys(data) - if cookies = data.dig(:request, :cookies) - data[:request][:cookies] = generate_masked_cookies(cookies) - end - - if cookies_header = data[:request][:headers]["Cookie"] - data[:request][:headers]["Cookie"] = generate_masked_cookies(cookies_header) - end - end - - def process_if_string_keys(data) - if cookies = data.dig("request", "cookies") - data["request"]["cookies"] = generate_masked_cookies(cookies) - end - - if cookies_header = data.dig("request", "headers", "Cookie") - data["request"]["headers"]["Cookie"] = generate_masked_cookies(cookies_header) - end - end - - def generate_masked_cookies(cookies) - cookies.merge(cookies) { STRING_MASK } if cookies.respond_to?(:merge) - end - end -end diff --git a/sentry-raven/lib/raven/processor/http_headers.rb b/sentry-raven/lib/raven/processor/http_headers.rb deleted file mode 100644 index 95751c28a..000000000 --- a/sentry-raven/lib/raven/processor/http_headers.rb +++ /dev/null @@ -1,55 +0,0 @@ -module Raven - class Processor::HTTPHeaders < Processor - DEFAULT_FIELDS = ["Authorization"].freeze - - attr_accessor :sanitize_http_headers - - def initialize(client) - super - self.sanitize_http_headers = client.configuration.sanitize_http_headers - end - - def process(data) - process_if_symbol_keys(data) if data[:request] - process_if_string_keys(data) if data["request"] - - data - end - - private - - def process_if_symbol_keys(data) - return unless data[:request][:headers] - - data[:request][:headers].keys.select { |k| fields_re.match(k.to_s) }.each do |k| - data[:request][:headers][k] = STRING_MASK - end - end - - def process_if_string_keys(data) - return unless data["request"]["headers"] - - data["request"]["headers"].keys.select { |k| fields_re.match(k) }.each do |k| - data["request"]["headers"][k] = STRING_MASK - end - end - - def matches_regexes?(k) - fields_re.match(k.to_s) - end - - def fields_re - @fields_re ||= /#{(DEFAULT_FIELDS | sanitize_http_headers).map do |f| - use_boundary?(f) ? "\\b#{f}\\b" : f - end.join("|")}/i - end - - def use_boundary?(string) - !DEFAULT_FIELDS.include?(string) && !special_characters?(string) - end - - def special_characters?(string) - REGEX_SPECIAL_CHARACTERS.select { |r| string.include?(r) }.any? - end - end -end diff --git a/sentry-raven/lib/raven/processor/post_data.rb b/sentry-raven/lib/raven/processor/post_data.rb deleted file mode 100644 index 6d7ea2d34..000000000 --- a/sentry-raven/lib/raven/processor/post_data.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Raven - class Processor::PostData < Processor - def process(data) - process_if_symbol_keys(data) if data[:request] - process_if_string_keys(data) if data["request"] - - data - end - - private - - def process_if_symbol_keys(data) - return unless data[:request][:method] == "POST" - - data[:request][:data] = STRING_MASK - end - - def process_if_string_keys(data) - return unless data["request"]["method"] == "POST" - - data["request"]["data"] = STRING_MASK - end - end -end diff --git a/sentry-raven/lib/raven/processor/removecircularreferences.rb b/sentry-raven/lib/raven/processor/removecircularreferences.rb deleted file mode 100644 index a4114bf52..000000000 --- a/sentry-raven/lib/raven/processor/removecircularreferences.rb +++ /dev/null @@ -1,19 +0,0 @@ -module Raven - class Processor::RemoveCircularReferences < Processor - ELISION_STRING = "(...)".freeze - def process(value, visited = []) - return ELISION_STRING if visited.include?(value.__id__) - - visited << value.__id__ if value.is_a?(Array) || value.is_a?(Hash) - - case value - when Hash - !value.frozen? ? value.merge!(value) { |_, v| process v, visited } : value.merge(value) { |_, v| process v, visited } - when Array - !value.frozen? ? value.map! { |v| process v, visited } : value.map { |v| process v, visited } - else - value - end - end - end -end diff --git a/sentry-raven/lib/raven/processor/removestacktrace.rb b/sentry-raven/lib/raven/processor/removestacktrace.rb deleted file mode 100644 index 069b39e17..000000000 --- a/sentry-raven/lib/raven/processor/removestacktrace.rb +++ /dev/null @@ -1,24 +0,0 @@ -module Raven - class Processor::RemoveStacktrace < Processor - def process(data) - process_if_symbol_keys(data) if data[:exception] - process_if_string_keys(data) if data["exception"] - - data - end - - private - - def process_if_symbol_keys(data) - data[:exception][:values].map do |single_exception| - single_exception.delete(:stacktrace) if single_exception[:stacktrace] - end - end - - def process_if_string_keys(data) - data["exception"]["values"].map do |single_exception| - single_exception.delete("stacktrace") if single_exception["stacktrace"] - end - end - end -end diff --git a/sentry-raven/lib/raven/processor/sanitizedata.rb b/sentry-raven/lib/raven/processor/sanitizedata.rb deleted file mode 100644 index bf4cb2f8c..000000000 --- a/sentry-raven/lib/raven/processor/sanitizedata.rb +++ /dev/null @@ -1,136 +0,0 @@ -# frozen_string_literal: true - -require 'json' - -module Raven - class Processor::SanitizeData < Processor - DEFAULT_FIELDS = %w(authorization password passwd secret ssn social(.*)?sec).freeze - CREDIT_CARD_RE = /\b(?:3[47]\d|(?:4\d|5[1-5]|65)\d{2}|6011)\d{12}\b/.freeze - QUERY_STRING = ['query_string', :query_string].freeze - JSON_STARTS_WITH = ["[", "{"].freeze - - attr_accessor :sanitize_fields, :sanitize_credit_cards, :sanitize_fields_excluded - - def initialize(client) - super - self.sanitize_fields = client.configuration.sanitize_fields - self.sanitize_credit_cards = client.configuration.sanitize_credit_cards - self.sanitize_fields_excluded = client.configuration.sanitize_fields_excluded - end - - def process(value, key = nil) - case value - when Hash - sanitize_hash_value(key, value) - when Array - sanitize_array_value(key, value) - when Integer - matches_regexes?(key, value.to_s) ? INT_MASK : value - when String - sanitize_string_value(key, value) - else - value - end - end - - private - - # CGI.parse takes our nice UTF-8 strings and converts them back to ASCII, - # so we have to convert them back, again. - def utf8_processor - @utf8_processor ||= Processor::UTF8Conversion.new - end - - def sanitize_hash_value(key, value) - if key =~ sensitive_fields - STRING_MASK - elsif value.frozen? - value.merge(value) { |k, v| process v, k } - else - value.merge!(value) { |k, v| process v, k } - end - end - - def sanitize_array_value(key, value) - if value.frozen? - value.map { |v| process v, key } - else - value.map! { |v| process v, key } - end - end - - def sanitize_string_value(key, value) - if value =~ sensitive_fields && (json = parse_json_or_nil(value)) - # if this string is actually a json obj, convert and sanitize - process(json).to_json - elsif matches_regexes?(key, value) - STRING_MASK - elsif QUERY_STRING.include?(key) - sanitize_query_string(value) - elsif value =~ sensitive_fields - sanitize_sensitive_string_content(value) - else - value - end - end - - def sanitize_query_string(query_string) - query_hash = CGI.parse(query_string) - sanitized = utf8_processor.process(query_hash) - processed_query_hash = process(sanitized) - URI.encode_www_form(processed_query_hash) - end - - # this scrubs some sensitive info from the string content. for example: - # - # ``` - # unexpected token at '{ - # "role": "admin","password": "Abc@123","foo": "bar" - # }' - # ``` - # - # will become - # - # ``` - # unexpected token at '{ - # "role": "admin","password": *******,"foo": "bar" - # }' - # ``` - # - # it's particularly useful in hash or param-parsing related errors - def sanitize_sensitive_string_content(value) - value.gsub(/(#{sensitive_fields}['":]\s?(:|=>)?\s?)(".*?"|'.*?')/, '\1' + STRING_MASK) - end - - def matches_regexes?(k, v) - (sanitize_credit_cards && v =~ CREDIT_CARD_RE) || - k =~ sensitive_fields - end - - def sensitive_fields - return @sensitive_fields if instance_variable_defined?(:@sensitive_fields) - - fields = DEFAULT_FIELDS | sanitize_fields - fields -= sanitize_fields_excluded - @sensitive_fields = /#{fields.map do |f| - use_boundary?(f) ? "\\b#{f}\\b" : f - end.join("|")}/i - end - - def use_boundary?(string) - !DEFAULT_FIELDS.include?(string) && !special_characters?(string) - end - - def special_characters?(string) - REGEX_SPECIAL_CHARACTERS.select { |r| string.include?(r) }.any? - end - - def parse_json_or_nil(string) - return unless string.start_with?(*JSON_STARTS_WITH) - - JSON.parse(string) - rescue JSON::ParserError, NoMethodError - nil - end - end -end diff --git a/sentry-raven/lib/raven/processor/utf8conversion.rb b/sentry-raven/lib/raven/processor/utf8conversion.rb deleted file mode 100644 index 2fab3bdfb..000000000 --- a/sentry-raven/lib/raven/processor/utf8conversion.rb +++ /dev/null @@ -1,54 +0,0 @@ -module Raven - class Processor::UTF8Conversion < Processor - # Slightly misnamed - actually just removes any bytes with invalid encoding - # Previously, our JSON backend required UTF-8. Since we now use the built-in - # JSON, we can use any encoding, but it must be valid anyway so we can do - # things like call #match and #slice on strings - REPLACE = "".freeze - - def process(value) - case value - when Hash - !value.frozen? ? value.merge!(value) { |_, v| process v } : value.merge(value) { |_, v| process v } - when Array - !value.frozen? ? value.map! { |v| process v } : value.map { |v| process v } - when Exception - return value if value.message.valid_encoding? - - clean_exc = value.class.new(remove_invalid_bytes(value.message)) - clean_exc.set_backtrace(value.backtrace) - clean_exc - when String - # Encoding::BINARY / Encoding::ASCII_8BIT is a special binary encoding. - # valid_encoding? will always return true because it contains all codepoints, - # so instead we check if it only contains actual ASCII codepoints, and if - # not we assume it's actually just UTF8 and scrub accordingly. - if value.encoding == Encoding::BINARY && !value.ascii_only? - value = value.dup - value.force_encoding(Encoding::UTF_8) - end - return value if value.valid_encoding? - - remove_invalid_bytes(value) - else - value - end - end - - private - - # Stolen from RSpec - # https://github.com/rspec/rspec-support/blob/f0af3fd74a94ff7bb700f6ba06dbdc67bba17fbf/lib/rspec/support/encoded_string.rb#L120-L139 - if String.method_defined?(:scrub) # 2.1+ - def remove_invalid_bytes(string) - string.scrub(REPLACE) - end - else - def remove_invalid_bytes(string) - string.chars.map do |char| - char.valid_encoding? ? char : REPLACE - end.join - end - end - end -end diff --git a/sentry-raven/lib/raven/transports.rb b/sentry-raven/lib/raven/transports.rb deleted file mode 100644 index 8fd518464..000000000 --- a/sentry-raven/lib/raven/transports.rb +++ /dev/null @@ -1,19 +0,0 @@ -module Raven - module Transports - class Transport - attr_accessor :configuration - - def initialize(configuration) - @configuration = configuration - end - - def send_event # (auth_header, data, options = {}) - raise NotImplementedError, 'Abstract method not implemented' - end - end - end -end - -require "raven/transports/dummy" -require "raven/transports/http" -require "raven/transports/stdout" diff --git a/sentry-raven/lib/raven/transports/dummy.rb b/sentry-raven/lib/raven/transports/dummy.rb deleted file mode 100644 index 3653b0fa9..000000000 --- a/sentry-raven/lib/raven/transports/dummy.rb +++ /dev/null @@ -1,16 +0,0 @@ -module Raven - module Transports - class Dummy < Transport - attr_accessor :events - - def initialize(*) - super - @events = [] - end - - def send_event(auth_header, data, options = {}) - @events << [auth_header, data, options] - end - end - end -end diff --git a/sentry-raven/lib/raven/transports/http.rb b/sentry-raven/lib/raven/transports/http.rb deleted file mode 100644 index e406bb134..000000000 --- a/sentry-raven/lib/raven/transports/http.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'faraday' - -module Raven - module Transports - class HTTP < Transport - attr_accessor :conn, :adapter - - def initialize(*args) - super - self.adapter = configuration.http_adapter || Faraday.default_adapter - self.conn = set_conn - end - - def send_event(auth_header, data, options = {}) - unless configuration.sending_allowed? - configuration.logger.debug("Event not sent: #{configuration.error_messages}") - return - end - - project_id = configuration[:project_id] - path = configuration[:path] + "/" - - conn.post "#{path}api/#{project_id}/store/" do |req| - req.headers['Content-Type'] = options[:content_type] - req.headers['X-Sentry-Auth'] = auth_header - req.body = data - end - rescue Faraday::Error => e - error_info = e.message - if e.response && e.response[:headers]['x-sentry-error'] - error_info += " Error in headers is: #{e.response[:headers]['x-sentry-error']}" - end - raise Raven::Error, error_info - end - - private - - def set_conn - configuration.logger.debug "Raven HTTP Transport connecting to #{configuration.server}" - - proxy = configuration.public_send(:proxy) - - Faraday.new(configuration.server, :ssl => ssl_configuration, :proxy => proxy) do |builder| - configuration.faraday_builder&.call(builder) - builder.response :raise_error - builder.options.merge! faraday_opts - builder.headers[:user_agent] = "sentry-ruby/#{Raven::VERSION}" - builder.adapter(*adapter) - end - end - - # TODO: deprecate and replace where possible w/Faraday Builder - def faraday_opts - [:timeout, :open_timeout].each_with_object({}) do |opt, memo| - memo[opt] = configuration.public_send(opt) if configuration.public_send(opt) - end - end - - def ssl_configuration - (configuration.ssl || {}).merge( - :verify => configuration.ssl_verification, - :ca_file => configuration.ssl_ca_file - ) - end - end - end -end diff --git a/sentry-raven/lib/raven/transports/stdout.rb b/sentry-raven/lib/raven/transports/stdout.rb deleted file mode 100644 index ca1df4e52..000000000 --- a/sentry-raven/lib/raven/transports/stdout.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Raven - module Transports - class Stdout < Transport - attr_accessor :events - - def initialize(*) - super - end - - def send_event(_auth_header, data, _options = {}) - unless configuration.sending_allowed? - logger.debug("Event not sent: #{configuration.error_messages}") - end - - $stdout.puts data - $stdout.flush - end - end - end -end diff --git a/sentry-raven/lib/raven/utils/context_filter.rb b/sentry-raven/lib/raven/utils/context_filter.rb deleted file mode 100644 index d46f60181..000000000 --- a/sentry-raven/lib/raven/utils/context_filter.rb +++ /dev/null @@ -1,42 +0,0 @@ -module Raven - module Utils - module ContextFilter - class << self - ACTIVEJOB_RESERVED_PREFIX_REGEX = /^_aj_/.freeze - HAS_GLOBALID = const_defined?('GlobalID') - - # Once an ActiveJob is queued, ActiveRecord references get serialized into - # some internal reserved keys, such as _aj_globalid. - # - # The problem is, if this job in turn gets queued back into ActiveJob with - # these magic reserved keys, ActiveJob will throw up and error. We want to - # capture these and mutate the keys so we can sanely report it. - def filter_context(context) - case context - when Array - context.map { |arg| filter_context(arg) } - when Hash - Hash[context.map { |key, value| filter_context_hash(key, value) }] - else - format_globalid(context) - end - end - - private - - def filter_context_hash(key, value) - key = key.to_s.sub(ACTIVEJOB_RESERVED_PREFIX_REGEX, "") if key.match(ACTIVEJOB_RESERVED_PREFIX_REGEX) - [key, filter_context(value)] - end - - def format_globalid(context) - if HAS_GLOBALID && context.is_a?(GlobalID) - context.to_s - else - context - end - end - end - end - end -end diff --git a/sentry-raven/lib/raven/utils/deep_merge.rb b/sentry-raven/lib/raven/utils/deep_merge.rb deleted file mode 100644 index 0b3f41421..000000000 --- a/sentry-raven/lib/raven/utils/deep_merge.rb +++ /dev/null @@ -1,22 +0,0 @@ -module Raven - module Utils - # ported from ActiveSupport - module DeepMergeHash - def self.deep_merge(hash, other_hash, &block) - deep_merge!(hash, other_hash, &block) - end - - def self.deep_merge!(hash, other_hash, &block) - hash.merge!(other_hash) do |key, this_val, other_val| - if this_val.is_a?(Hash) && other_val.is_a?(Hash) - deep_merge(this_val, other_val, &block) - elsif block_given? - block.call(key, this_val, other_val) - else - other_val - end - end - end - end - end -end diff --git a/sentry-raven/lib/raven/utils/exception_cause_chain.rb b/sentry-raven/lib/raven/utils/exception_cause_chain.rb deleted file mode 100644 index 3b69c866b..000000000 --- a/sentry-raven/lib/raven/utils/exception_cause_chain.rb +++ /dev/null @@ -1,20 +0,0 @@ -module Raven - module Utils - module ExceptionCauseChain - def self.exception_to_array(exception) - if exception.respond_to?(:cause) && exception.cause - exceptions = [exception] - while exception.cause - exception = exception.cause - break if exceptions.any? { |e| e.object_id == exception.object_id } - - exceptions << exception - end - exceptions - else - [exception] - end - end - end - end -end diff --git a/sentry-raven/lib/raven/utils/real_ip.rb b/sentry-raven/lib/raven/utils/real_ip.rb deleted file mode 100644 index 2bec72926..000000000 --- a/sentry-raven/lib/raven/utils/real_ip.rb +++ /dev/null @@ -1,62 +0,0 @@ -require 'ipaddr' - -# Based on ActionDispatch::RemoteIp. All security-related precautions from that -# middleware have been removed, because the Event IP just needs to be accurate, -# and spoofing an IP here only makes data inaccurate, not insecure. Don't re-use -# this module if you have to *trust* the IP address. -module Raven - module Utils - class RealIp - LOCAL_ADDRESSES = [ - "127.0.0.1", # localhost IPv4 - "::1", # localhost IPv6 - "fc00::/7", # private IPv6 range fc00::/7 - "10.0.0.0/8", # private IPv4 range 10.x.x.x - "172.16.0.0/12", # private IPv4 range 172.16.0.0 .. 172.31.255.255 - "192.168.0.0/16" # private IPv4 range 192.168.x.x - ].map { |proxy| IPAddr.new(proxy) } - - attr_accessor :ip, :ip_addresses - - def initialize(ip_addresses) - self.ip_addresses = ip_addresses - end - - def calculate_ip - # CGI environment variable set by Rack - remote_addr = ips_from(ip_addresses[:remote_addr]).last - - # Could be a CSV list and/or repeated headers that were concatenated. - client_ips = ips_from(ip_addresses[:client_ip]) - real_ips = ips_from(ip_addresses[:real_ip]) - forwarded_ips = ips_from(ip_addresses[:forwarded_for]) - - ips = [client_ips, real_ips, forwarded_ips, remote_addr].flatten.compact - - # If every single IP option is in the trusted list, just return REMOTE_ADDR - self.ip = filter_local_addresses(ips).first || remote_addr - end - - protected - - def ips_from(header) - # Split the comma-separated list into an array of strings - ips = header ? header.strip.split(/[,\s]+/) : [] - ips.select do |ip| - begin - # Only return IPs that are valid according to the IPAddr#new method - range = IPAddr.new(ip).to_range - # we want to make sure nobody is sneaking a netmask in - range.begin == range.end - rescue ArgumentError - nil - end - end - end - - def filter_local_addresses(ips) - ips.reject { |ip| LOCAL_ADDRESSES.any? { |proxy| proxy === ip } } - end - end - end -end diff --git a/sentry-raven/lib/raven/utils/request_id.rb b/sentry-raven/lib/raven/utils/request_id.rb deleted file mode 100644 index ff0106dfc..000000000 --- a/sentry-raven/lib/raven/utils/request_id.rb +++ /dev/null @@ -1,16 +0,0 @@ -module Raven - module Utils - module RequestId - REQUEST_ID_HEADERS = %w(action_dispatch.request_id HTTP_X_REQUEST_ID).freeze - - # Request ID based on ActionDispatch::RequestId - def self.read_from(env_hash) - REQUEST_ID_HEADERS.each do |key| - request_id = env_hash[key] - return request_id if request_id - end - nil - end - end - end -end diff --git a/sentry-raven/lib/raven/version.rb b/sentry-raven/lib/raven/version.rb deleted file mode 100644 index 007f6d60c..000000000 --- a/sentry-raven/lib/raven/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -module Raven - VERSION = "3.1.2" -end diff --git a/sentry-raven/lib/sentry-raven-without-integrations.rb b/sentry-raven/lib/sentry-raven-without-integrations.rb deleted file mode 100644 index 17c2e5782..000000000 --- a/sentry-raven/lib/sentry-raven-without-integrations.rb +++ /dev/null @@ -1,6 +0,0 @@ -require "raven/helpers/deprecation_helper" - -filename = "sentry_raven_without_integrations" -DeprecationHelper.deprecate_dasherized_filename(filename) - -require filename diff --git a/sentry-raven/lib/sentry-raven.rb b/sentry-raven/lib/sentry-raven.rb deleted file mode 100644 index 9ffaeba50..000000000 --- a/sentry-raven/lib/sentry-raven.rb +++ /dev/null @@ -1 +0,0 @@ -require "raven" diff --git a/sentry-raven/lib/sentry_raven_without_integrations.rb b/sentry-raven/lib/sentry_raven_without_integrations.rb deleted file mode 100644 index e639d3b31..000000000 --- a/sentry-raven/lib/sentry_raven_without_integrations.rb +++ /dev/null @@ -1 +0,0 @@ -require 'raven/base' diff --git a/sentry-raven/sentry-raven.gemspec b/sentry-raven/sentry-raven.gemspec deleted file mode 100644 index f1f6b7dfb..000000000 --- a/sentry-raven/sentry-raven.gemspec +++ /dev/null @@ -1,28 +0,0 @@ -$LOAD_PATH.unshift File.expand_path('../lib', __FILE__) -require 'raven/version' - -Gem::Specification.new do |gem| - gem.name = "sentry-raven" - gem.authors = ["Sentry Team"] - gem.description = gem.summary = "A gem that provides a client interface for the Sentry error logger" - gem.email = "accounts@sentry.io" - gem.license = 'Apache-2.0' - gem.homepage = "https://github.com/getsentry/raven-ruby" - - gem.version = Raven::VERSION - gem.platform = Gem::Platform::RUBY - gem.required_ruby_version = '>= 2.3' - gem.extra_rdoc_files = ["README.md", "LICENSE"] - gem.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples)'`.split("\n") - gem.bindir = "exe" - gem.executables = "raven" - - gem.add_dependency "faraday", ">= 1.0" - - gem.post_install_message = <<~EOS - `sentry-raven` is deprecated! Please migrate to `sentry-ruby` - - See https://docs.sentry.io/platforms/ruby/migration for the migration guide. - - EOS -end diff --git a/sentry-raven/spec/raven/backtrace_spec.rb b/sentry-raven/spec/raven/backtrace_spec.rb deleted file mode 100644 index dae416ba1..000000000 --- a/sentry-raven/spec/raven/backtrace_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Backtrace do - before(:each) do - @backtrace = Raven::Backtrace.parse(Thread.current.backtrace) - end - - it "calls backtrace_cleanup_callback if it's present in the configuration" do - called = false - callback = proc do |backtrace| - called = true - backtrace - end - config = Raven.configuration - config.backtrace_cleanup_callback = callback - Raven::Backtrace.parse(Thread.current.backtrace, configuration: config) - - expect(called).to eq(true) - end - - it "#lines" do - expect(@backtrace.lines.first).to be_a(Raven::Backtrace::Line) - end - - it "#inspect" do - expect(@backtrace.inspect).to match(/Backtrace: .*>$/) - end - - it "#to_s" do - expect(@backtrace.to_s).to match(/backtrace_spec.rb:5/) - end - - it "==" do - @backtrace2 = Raven::Backtrace.new(@backtrace.lines) - expect(@backtrace).to be == @backtrace2 - end -end diff --git a/sentry-raven/spec/raven/breadcrumbs/active_support_breadcrumbs_spec.rb b/sentry-raven/spec/raven/breadcrumbs/active_support_breadcrumbs_spec.rb deleted file mode 100644 index f2c8a8103..000000000 --- a/sentry-raven/spec/raven/breadcrumbs/active_support_breadcrumbs_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require "spec_helper" - -RSpec.describe "Raven::Breadcrumbs::ActiveSupportLogger", :type => :request, :rails => true do - before(:all) do - Raven.configuration.breadcrumbs_logger = [:active_support_logger] - Rails.application = make_basic_app - end - - after(:all) do - Raven.configuration.breadcrumbs_logger = [] - Raven::Breadcrumbs::ActiveSupportLogger.detach - # even though we cleanup breadcrumbs in the rack middleware - # Breadcrumbs::ActiveSupportLogger subscribes to "every" instrumentation - # so it'll create other instrumentations "after" the request is finished - # and we should clear those as well - Raven::BreadcrumbBuffer.clear! - end - - it "captures correct data" do - get "/exception" - - expect(response.status).to eq(500) - event = JSON.parse!(Raven.client.transport.events.first[1]) - breadcrumbs = event.dig("breadcrumbs", "values") - expect(breadcrumbs.count).to eq(2) - - if Rails.version.to_i >= 5 - expect(breadcrumbs.first["data"]).to match( - { - "controller" => "HelloController", - "action" => "exception", - "params" => { "controller" => "hello", "action" => "exception" }, - "headers" => anything, - "format" => "html", - "method" => "GET", - "path" => "/exception" - } - ) - else - expect(breadcrumbs.first["data"]).to match( - { - "controller" => "HelloController", - "action" => "exception", - "params" => { "controller" => "hello", "action" => "exception" }, - "format" => "html", - "method" => "GET", - "path" => "/exception" - } - ) - - end - end -end diff --git a/sentry-raven/spec/raven/breadcrumbs/sentry_logger_spec.rb b/sentry-raven/spec/raven/breadcrumbs/sentry_logger_spec.rb deleted file mode 100644 index 8781ca404..000000000 --- a/sentry-raven/spec/raven/breadcrumbs/sentry_logger_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require "spec_helper" - -RSpec.describe "Raven::Breadcrumbs::SentryLogger", :type => :request, :rails => true do - before(:all) do - Raven.configuration.breadcrumbs_logger = [:sentry_logger] - Rails.application = make_basic_app - end - - after(:all) do - Raven.configuration.breadcrumbs_logger = [] - # revert the injected methods to keep other specs clean - Raven::Breadcrumbs::SentryLogger.module_eval do - def add(*args) - super - end - end - end - - it "captures correct data" do - get "/exception" - - expect(response.status).to eq(500) - event = JSON.parse!(Raven.client.transport.events.first[1]) - breadcrumbs = event.dig("breadcrumbs", "values") - expect(breadcrumbs.count).to eq(1) - expect(breadcrumbs.first).to match( - { - "category" => "Processing by HelloController#exception as HTML", - "data" => {}, - "level" => "info", - "message" => "Processing by HelloController#exception as HTML", - "timestamp" => anything, - "type" => "info" - } - ) - end -end diff --git a/sentry-raven/spec/raven/breadcrumbs_spec.rb b/sentry-raven/spec/raven/breadcrumbs_spec.rb deleted file mode 100644 index df2c2c10d..000000000 --- a/sentry-raven/spec/raven/breadcrumbs_spec.rb +++ /dev/null @@ -1,68 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::BreadcrumbBuffer do - before(:each) do - @breadcrumbs = Raven::BreadcrumbBuffer.new(10) - end - - it "records breadcrumbs w/a block" do - expect(@breadcrumbs.empty?).to be true - - @breadcrumbs.record do - Raven::Breadcrumb.new.tap { |b| b.message = "test" } - end - - expect(@breadcrumbs.members.size).to eq(1) - expect(@breadcrumbs.empty?).to be false - end - - it "records breadcrumbs w/o block" do - crumb = Raven::Breadcrumb.new.tap { |b| b.message = "test" } - @breadcrumbs.record(crumb) - - expect(@breadcrumbs.members[0]).to eq(crumb) - end - - it "allows peeking" do - expect(@breadcrumbs.peek).to eq(nil) - - crumb = Raven::Breadcrumb.new.tap { |b| b.message = "test" } - @breadcrumbs.record(crumb) - - expect(@breadcrumbs.peek).to eq(crumb) - end - - it "is enumerable" do - (0..10).each do |i| - @breadcrumbs.record(Raven::Breadcrumb.new.tap { |b| b.message = i }) - end - - expect(@breadcrumbs.each).to be_a Enumerator - end - - it "evicts when buffer exceeded" do - (0..10).each do |i| - @breadcrumbs.record(Raven::Breadcrumb.new.tap { |b| b.message = i }) - end - - expect(@breadcrumbs.members[0].message).to eq(1) - expect(@breadcrumbs.members[-1].message).to eq(10) - end - - it "converts to a hash" do - expect(@breadcrumbs.peek).to eq(nil) - - crumb = Raven::Breadcrumb.new.tap { |b| b.message = "test" } - @breadcrumbs.record(crumb) - - expect(@breadcrumbs.to_hash[:values]).to eq([crumb.to_hash]) - end - - it "clears in a threaded context" do - crumb = Raven::Breadcrumb.new.tap { |b| b.message = "test" } - Raven::BreadcrumbBuffer.current.record(crumb) - Raven::BreadcrumbBuffer.clear! - - expect(Raven::BreadcrumbBuffer.current.empty?).to be true - end -end diff --git a/sentry-raven/spec/raven/cli_spec.rb b/sentry-raven/spec/raven/cli_spec.rb deleted file mode 100644 index 9a8452e36..000000000 --- a/sentry-raven/spec/raven/cli_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require 'spec_helper' -require 'raven/cli' - -RSpec.describe Raven::CLI do - # avoid unexpectedly mutating the shared configuration object - let(:config) { Raven.configuration.dup } - - context "when there's no error" do - it "sends an event" do - event = described_class.test(config.server, true, config) - - expect(event).to be_a(Raven::Event) - hash = event.to_hash - expect(hash[:exception][:values][0][:type]).to eq("ZeroDivisionError") - expect(hash[:exception][:values][0][:value]).to eq("divided by 0") - end - - it "logs correct values" do - logger = spy - allow_any_instance_of(Raven::Instance).to receive(:logger).and_return(logger) - - event = described_class.test(config.server, true, config) - - expect(logger).to have_received(:debug).with("Sending a test event:") - expect(logger).to have_received(:debug).with("-> event ID: #{event.id}") - expect(logger).to have_received(:debug).with("Done!") - end - end - - context "when there's an error" do - before do - # make Configuration#sample_allowed? fail - config.sample_rate = 2.0 - allow(Random::DEFAULT).to receive(:rand).and_return(3.0) - end - - it "returns false" do - event = described_class.test(config.server, true, config) - - expect(event).to eq(false) - end - - it "logs correct values" do - logger = spy - allow_any_instance_of(Raven::Instance).to receive(:logger).and_return(logger) - - described_class.test(config.server, true, config) - - expect(logger).to have_received(:debug).with("Sending a test event:") - expect(logger).to have_received(:debug).with("An error occurred while attempting to send the event.") - expect(logger).not_to have_received(:debug).with("Done!") - end - end - - context "when with custom environments config" do - let(:config) { Raven.configuration.dup } - - before do - config.environments = %w(production test) - end - - it "still sends the test event" do - event = Raven::CLI.test(config.server, true, config) - - expect(event).to be_a(Raven::Event) - expect(config.errors).to be_empty - end - end -end diff --git a/sentry-raven/spec/raven/client_spec.rb b/sentry-raven/spec/raven/client_spec.rb deleted file mode 100644 index 035c54f7a..000000000 --- a/sentry-raven/spec/raven/client_spec.rb +++ /dev/null @@ -1,130 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Client do - let(:configuration) do - Raven::Configuration.new.tap do |config| - config.server = 'http://12345:67890@sentry.localdomain/sentry/42' - end - end - let(:client) { Raven::Client.new(configuration) } - - before do - @fake_time = Time.now - allow(Time).to receive(:now).and_return @fake_time - end - - it "generates an auth header" do - expect(client.send(:generate_auth_header)).to eq( - "Sentry sentry_version=5, sentry_client=raven-ruby/#{Raven::VERSION}, sentry_timestamp=#{@fake_time.to_i}, " \ - "sentry_key=12345, sentry_secret=67890" - ) - end - - it "generates a message with exception" do - event = Raven.capture_exception(ZeroDivisionError.new("divided by 0")).to_hash - expect(client.send(:get_message_from_exception, event)).to eq("ZeroDivisionError: divided by 0") - end - - it "generates a message without exception" do - event = Raven.capture_message("this is an STDOUT transport test").to_hash - expect(client.send(:get_message_from_exception, event)).to eq(nil) - end - - it "generates an auth header without a secret (Sentry 9)" do - client.configuration.server = "https://66260460f09b5940498e24bb7ce093a0@sentry.io/42" - - expect(client.send(:generate_auth_header)).to eq( - "Sentry sentry_version=5, sentry_client=raven-ruby/#{Raven::VERSION}, sentry_timestamp=#{@fake_time.to_i}, " \ - "sentry_key=66260460f09b5940498e24bb7ce093a0" - ) - end - - describe "#send_event" do - let(:event) { Raven.capture_exception(ZeroDivisionError.new("divided by 0")) } - - context "when success" do - before do - allow(client.transport).to receive(:send_event) - end - - it "sends Event object" do - expect(client).not_to receive(:failed_send) - - expect(client.send_event(event)).to eq(event.to_hash) - end - - it "sends Event hash" do - expect(client).not_to receive(:failed_send) - - expect(client.send_event(event.to_json_compatible)).to eq(event.to_json_compatible) - end - end - - context "when failed" do - let(:logger) { spy } - - before do - client.configuration.logger = logger - allow(client.transport).to receive(:send_event).and_raise(StandardError) - - expect(logger).to receive(:warn).exactly(2) - end - - it "sends Event object" do - expect(client.send_event(event)).to eq(nil) - end - - it "sends Event hash" do - expect(client.send_event(event.to_json_compatible)).to eq(nil) - end - end - end - - describe "#transport" do - context "when scheme is not set" do - it "returns HTTP transport object" do - expect(client.transport).to be_a(Raven::Transports::HTTP) - end - end - - context "when scheme is http" do - before do - client.configuration.scheme = "http" - end - - it "returns HTTP transport object" do - expect(client.transport).to be_a(Raven::Transports::HTTP) - end - end - - context "when scheme is https" do - before do - client.configuration.scheme = "https" - end - - it "returns HTTP transport object" do - expect(client.transport).to be_a(Raven::Transports::HTTP) - end - end - - context "when scheme is dummy" do - before do - client.configuration.scheme = "dummy" - end - - it "returns Dummy transport object" do - expect(client.transport).to be_a(Raven::Transports::Dummy) - end - end - - context "when scheme is stdout" do - before do - client.configuration.scheme = "stdout" - end - - it "returns Stdout transport object" do - expect(client.transport).to be_a(Raven::Transports::Stdout) - end - end - end -end diff --git a/sentry-raven/spec/raven/client_state_spec.rb b/sentry-raven/spec/raven/client_state_spec.rb deleted file mode 100644 index 5aa562f88..000000000 --- a/sentry-raven/spec/raven/client_state_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'spec_helper' -require 'timecop' - -RSpec.describe Raven::ClientState do - let(:state) { Raven::ClientState.new } - - it 'should try when online' do - expect(state.should_try?).to eq(true) - end - - it 'should not try with a new error' do - state.failure - expect(state.should_try?).to eq(false) - end - - it 'should try again after time passes' do - Timecop.freeze(-10) { state.failure } - expect(state.should_try?).to eq(true) - end - - it 'should try again after success' do - state.failure - state.success - expect(state.should_try?).to eq(true) - end - - it 'should try again after retry_after' do - Timecop.freeze(-2) { state.failure(1) } - expect(state.should_try?).to eq(true) - end - - it 'should exponentially backoff' do - Timecop.freeze do - state.failure - Timecop.travel(2) - expect(state.should_try?).to eq(true) - - state.failure - Timecop.travel(3) - expect(state.should_try?).to eq(false) - Timecop.travel(2) - expect(state.should_try?).to eq(true) - - state.failure - Timecop.travel(8) - expect(state.should_try?).to eq(false) - Timecop.travel(2) - expect(state.should_try?).to eq(true) - end - end -end diff --git a/sentry-raven/spec/raven/configuration_spec.rb b/sentry-raven/spec/raven/configuration_spec.rb deleted file mode 100644 index 5ce8bff08..000000000 --- a/sentry-raven/spec/raven/configuration_spec.rb +++ /dev/null @@ -1,400 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Configuration do - before do - # Make sure we reset the env in case something leaks in - ENV.delete('SENTRY_DSN') - ENV.delete('SENTRY_CURRENT_ENV') - ENV.delete('SENTRY_ENVIRONMENT') - ENV.delete('SENTRY_RELEASE') - ENV.delete('RAILS_ENV') - ENV.delete('RACK_ENV') - end - - it "should set some attributes when server is set" do - subject.server = "http://12345:67890@sentry.localdomain:3000/sentry/42" - - expect(subject.project_id).to eq("42") - expect(subject.public_key).to eq("12345") - expect(subject.secret_key).to eq("67890") - - expect(subject.scheme).to eq("http") - expect(subject.host).to eq("sentry.localdomain") - expect(subject.port).to eq(3000) - expect(subject.path).to eq("/sentry") - - expect(subject.server).to eq("http://sentry.localdomain:3000/sentry") - end - - describe "#breadcrumbs_logger=" do - it "raises error when given an invalid option" do - expect { subject.breadcrumbs_logger = :foo }.to raise_error( - Raven::Error, - 'Unsupported breadcrumbs logger. Supported loggers: [:sentry_logger, :active_support_logger]' - ) - end - end - - it "doesnt accept invalid encodings" do - expect { subject.encoding = "apple" }.to raise_error(Raven::Error, 'Unsupported encoding') - end - - it "has hashlike attribute accessors" do - expect(subject.encoding).to eq("gzip") - expect(subject[:encoding]).to eq("gzip") - end - - context 'configuring for async' do - it 'should be configurable to send events async' do - subject.async = ->(_e) { :ok } - expect(subject.async.call('event')).to eq(:ok) - end - - it 'should raise when setting async to anything other than callable or false' do - subject.transport_failure_callback = -> {} - subject.transport_failure_callback = false - expect { subject.async = true }.to raise_error(ArgumentError) - end - end - - it 'should raise when setting transport_failure_callback to anything other than callable or false' do - subject.transport_failure_callback = -> {} - subject.transport_failure_callback = false - expect { subject.transport_failure_callback = true }.to raise_error(ArgumentError) - end - - it 'should raise when setting should_capture to anything other than callable or false' do - subject.should_capture = -> {} - subject.should_capture = false - expect { subject.should_capture = true }.to raise_error(ArgumentError) - end - - it 'should raise when setting before_send to anything other than callable or false' do - subject.before_send = -> {} - subject.before_send = false - expect { subject.before_send = true }.to raise_error(ArgumentError) - end - - context 'being initialized with a current environment' do - before(:each) do - subject.current_environment = 'test' - subject.server = 'http://12345:67890@sentry.localdomain:3000/sentry/42' - end - - it 'should send events if test is whitelisted' do - subject.environments = %w(test) - subject.capture_allowed? - puts subject.errors - expect(subject.capture_allowed?).to eq(true) - end - - it 'should not send events if test is not whitelisted' do - subject.environments = %w(not_test) - expect(subject.capture_allowed?).to eq(false) - expect(subject.errors).to eq(["Not configured to send/capture in environment 'test'"]) - end - end - - context 'being initialized without a current environment' do - after do - ENV.delete('SENTRY_CURRENT_ENV') - ENV.delete('SENTRY_ENVIRONMENT') - ENV.delete('RAILS_ENV') - ENV.delete('RACK_ENV') - end - - it 'defaults to "default"' do - expect(subject.current_environment).to eq('default') - end - - it 'uses `SENTRY_CURRENT_ENV` env variable' do - ENV['SENTRY_CURRENT_ENV'] = 'set-with-sentry-current-env' - ENV['SENTRY_ENVIRONMENT'] = 'set-with-sentry-environment' - ENV['RAILS_ENV'] = 'set-with-rails-env' - ENV['RACK_ENV'] = 'set-with-rack-env' - - expect(subject.current_environment).to eq('set-with-sentry-current-env') - end - - it 'uses `SENTRY_ENVIRONMENT` env variable' do - ENV['SENTRY_ENVIRONMENT'] = 'set-with-sentry-environment' - ENV['RAILS_ENV'] = 'set-with-rails-env' - ENV['RACK_ENV'] = 'set-with-rack-env' - - expect(subject.current_environment).to eq('set-with-sentry-environment') - end - - it 'uses `RAILS_ENV` env variable' do - ENV['SENTRY_CURRENT_ENV'] = nil - ENV['RAILS_ENV'] = 'set-with-rails-env' - ENV['RACK_ENV'] = 'set-with-rack-env' - - expect(subject.current_environment).to eq('set-with-rails-env') - end - - it 'uses `RACK_ENV` env variable' do - ENV['SENTRY_CURRENT_ENV'] = nil - ENV['RAILS_ENV'] = nil - ENV['RACK_ENV'] = 'set-with-rack-env' - - expect(subject.current_environment).to eq('set-with-rack-env') - end - end - - context 'being initialized without a release' do - let(:fake_root) { "/tmp/sentry/" } - - before do - allow(File).to receive(:directory?).and_return(false) - allow_any_instance_of(described_class).to receive(:project_root).and_return(fake_root) - end - - it 'defaults to nil' do - expect(subject.release).to eq(nil) - end - - it 'uses `SENTRY_RELEASE` env variable' do - ENV['SENTRY_RELEASE'] = 'v1' - - expect(subject.release).to eq('v1') - - ENV.delete('SENTRY_CURRENT_ENV') - end - - context "when git is available" do - before do - allow(File).to receive(:directory?).and_return(false) - allow(File).to receive(:directory?).with(".git").and_return(true) - end - it 'gets release from git' do - allow(Raven).to receive(:`).with("git rev-parse --short HEAD 2>&1").and_return("COMMIT_SHA") - - expect(subject.release).to eq('COMMIT_SHA') - end - end - - context "when Capistrano is available" do - let(:revision) { "2019010101000" } - - before do - Dir.mkdir(fake_root) unless Dir.exist?(fake_root) - File.write(filename, file_content) - end - - after do - File.delete(filename) - Dir.delete(fake_root) - end - - context "when the REVISION file is present" do - let(:filename) do - File.join(fake_root, "REVISION") - end - let(:file_content) { revision } - - it "gets release from the REVISION file" do - expect(subject.release).to eq(revision) - end - end - - context "when the revisions.log file is present" do - let(:filename) do - File.join(fake_root, "..", "revisions.log") - end - let(:file_content) do - "Branch master (at COMMIT_SHA) deployed as release #{revision} by alice" - end - - it "gets release from the REVISION file" do - expect(subject.release).to eq(revision) - end - end - end - - context "when running on heroku" do - before do - allow(File).to receive(:directory?).and_return(false) - allow(File).to receive(:directory?).with("/etc/heroku").and_return(true) - end - - context "when it's on heroku ci" do - it "returns nil" do - begin - original_ci_val = ENV["CI"] - ENV["CI"] = "true" - - expect(subject.release).to eq(nil) - ensure - ENV["CI"] = original_ci_val - end - end - end - - context "when it's not on heroku ci" do - around do |example| - begin - original_ci_val = ENV["CI"] - ENV["CI"] = nil - - example.run - ensure - ENV["CI"] = original_ci_val - end - end - - it "returns nil + logs an warning if HEROKU_SLUG_COMMIT is not set" do - logger = double("logger") - expect(::Raven::Logger).to receive(:new).and_return(logger) - expect(logger).to receive(:warn).with(described_class::HEROKU_DYNO_METADATA_MESSAGE) - - expect(described_class.new.release).to eq(nil) - end - - it "returns HEROKU_SLUG_COMMIT" do - begin - ENV["HEROKU_SLUG_COMMIT"] = "REVISION" - - expect(subject.release).to eq("REVISION") - ensure - ENV["HEROKU_SLUG_COMMIT"] = nil - end - end - end - end - end - - describe "config: backtrace_cleanup_callback" do - it "defaults to nil" do - expect(subject.backtrace_cleanup_callback).to eq(nil) - end - - it "takes a proc and store it" do - subject.backtrace_cleanup_callback = proc {} - - expect(subject.backtrace_cleanup_callback).to be_a(Proc) - end - end - - context 'with a should_capture callback configured' do - before(:each) do - subject.should_capture = ->(exc_or_msg) { exc_or_msg != "dont send me" } - subject.server = 'http://12345:67890@sentry.localdomain:3000/sentry/42' - end - - it 'should not send events if should_capture returns false' do - expect(subject.capture_allowed?("dont send me")).to eq(false) - expect(subject.errors).to eq(["should_capture returned false"]) - expect(subject.capture_allowed?("send me")).to eq(true) - end - end - - context "with an invalid server" do - before(:each) do - subject.server = 'dummy://trololo' - end - - it 'captured_allowed returns false' do - expect(subject.capture_allowed?).to eq(false) - expect(subject.errors).to eq(["No public_key specified", "No project_id specified"]) - end - end - - context "with the new Sentry 9 DSN format" do - # Basically the same as before, without a secret - before(:each) do - subject.server = "https://66260460f09b5940498e24bb7ce093a0@sentry.io/42" - end - - it 'captured_allowed is true' do - expect(subject.capture_allowed?).to eq(true) - end - - it "sets the DSN in the way we expect" do - expect(subject.dsn).to eq("https://66260460f09b5940498e24bb7ce093a0@sentry.io/42") - expect(subject.server).to eq("https://sentry.io") - expect(subject.project_id).to eq("42") - expect(subject.public_key).to eq("66260460f09b5940498e24bb7ce093a0") - expect(subject.secret_key).to be_nil - end - end - - context "with a sample rate" do - before(:each) do - subject.server = 'http://12345:67890@sentry.localdomain:3000/sentry/42' - subject.sample_rate = 0.75 - end - - it 'captured_allowed false when sampled' do - allow(Random::DEFAULT).to receive(:rand).and_return(0.76) - expect(subject.capture_allowed?).to eq(false) - expect(subject.errors).to eq(["Excluded by random sample"]) - end - - it 'captured_allowed true when not sampled' do - allow(Random::DEFAULT).to receive(:rand).and_return(0.74) - expect(subject.capture_allowed?).to eq(true) - end - end - - describe '#exception_class_allowed?' do - class MyTestException < RuntimeError; end - - context 'with custom excluded_exceptions' do - before do - subject.excluded_exceptions = ['MyTestException'] - end - - context 'when the raised exception is a Raven::Error' do - let(:incoming_exception) { Raven::Error.new } - it 'returns false' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq false - end - end - - context 'when the raised exception is not in excluded_exceptions' do - let(:incoming_exception) { RuntimeError.new } - it 'returns true' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq true - end - end - - context 'when the raised exception has a cause that is in excluded_exceptions' do - let(:incoming_exception) { build_exception_with_cause(MyTestException.new) } - context 'when inspect_exception_causes_for_exclusion is false' do - it 'returns true' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq true - end - end - - # Only check causes when they're supported by the ruby version - context 'when inspect_exception_causes_for_exclusion is true' do - before do - subject.inspect_exception_causes_for_exclusion = true - end - - if Exception.new.respond_to? :cause - context 'when the language version supports exception causes' do - it 'returns false' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq false - end - end - else - context 'when the language version does not support exception causes' do - it 'returns true' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq true - end - end - end - end - end - - context 'when the raised exception is in excluded_exceptions' do - let(:incoming_exception) { MyTestException.new } - - it 'returns false' do - expect(subject.exception_class_allowed?(incoming_exception)).to eq false - end - end - end - end -end diff --git a/sentry-raven/spec/raven/event_spec.rb b/sentry-raven/spec/raven/event_spec.rb deleted file mode 100644 index daa0c5844..000000000 --- a/sentry-raven/spec/raven/event_spec.rb +++ /dev/null @@ -1,812 +0,0 @@ -require 'spec_helper' -require 'raven/integrations/rack' - -RSpec.describe Raven::Event do - before do - Raven::Context.clear! - Raven::BreadcrumbBuffer.clear! - end - - let(:essential_options) do - { - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - } - end - - describe "#initialize" do - it "initializes a Event when all required keys are provided" do - expect(described_class.new(essential_options)).to be_a(described_class) - end - - described_class::REQUIRED_OPTION_KEYS.each do |required_key| - it "raises error if #{required_key} is not given" do - essential_options.delete(required_key) - - expect do - described_class.new(essential_options) - end.to raise_error("you must provide configuration, context, and breadcrumbs when initializing a Raven::Event") - end - end - end - - context 'a fully implemented event' do - let(:hash) do - Raven::Event.new( - message: 'test', - level: 'warn', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - extra: { - 'my_custom_variable' => 'value' - }, - server_name: 'foo.local', - release: '721e41770371db95eee98ca2707686226b993eda', - environment: 'production', - **essential_options - ).to_hash - end - - it 'has message' do - expect(hash[:message]).to eq('test') - end - - it 'has level' do - expect(hash[:level]).to eq(:warning) - end - - it 'has logger' do - expect(hash[:logger]).to eq('foo') - end - - it 'has server name' do - expect(hash[:server_name]).to eq('foo.local') - end - - it 'has release' do - expect(hash[:release]).to eq('721e41770371db95eee98ca2707686226b993eda') - end - - it 'has environment' do - expect(hash[:environment]).to eq('production') - end - - it 'has tag data' do - expect(hash[:tags]).to eq('foo' => 'bar') - end - - it 'has extra data' do - expect(hash[:extra]["my_custom_variable"]).to eq('value') - end - - it 'has platform' do - expect(hash[:platform]).to eq(:ruby) - end - - it 'has SDK' do - expect(hash[:sdk]).to eq("name" => "raven-ruby", "version" => Raven::VERSION) - end - - it 'has server os' do - expect(hash[:extra][:server][:os].keys).to eq([:name, :version, :build, :kernel_version]) - end - - it 'has runtime' do - expect(hash[:extra][:server][:runtime][:version]).to match(/ruby/) - end - end - - context 'parameter entries are nil' do - let(:hash) do - Raven::Event.new( - message: 'test', - level: 'warn', - logger: 'foo', - tags: nil, - extra: nil, - user: nil, - server_name: 'foo.local', - release: '721e41770371db95eee98ca2707686226b993eda', - environment: 'production', - **essential_options - ).to_hash - end - - it "skips nil values" do - expect(hash[:extra]).to eq(Raven.context.extra) - expect(hash[:user]).to eq(Raven.context.user) - expect(hash[:tags]).to eq(Raven.configuration.tags) - end - end - - context 'user context specified' do - let(:hash) do - Raven.user_context('id' => 'hello') - - Raven::Event.new( - level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - extra: { - 'my_custom_variable' => 'value' - }, - server_name: 'foo.local', - **essential_options - ).to_hash - end - - it "adds user data" do - expect(hash[:user]).to eq('id' => 'hello') - end - end - - context 'tags context specified' do - let(:hash) do - Raven.tags_context('key' => 'value') - - Raven::Event.new(level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - extra: { - 'my_custom_variable' => 'value' - }, - server_name: 'foo.local', - **essential_options).to_hash - end - - it "merges tags data" do - expect(hash[:tags]).to eq('key' => 'value', - 'foo' => 'bar') - end - end - - context 'extra context specified' do - let(:hash) do - Raven.extra_context('key' => 'value') - - Raven::Event.new(level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - extra: { - 'my_custom_variable' => 'value' - }, - server_name: 'foo.local', - **essential_options).to_hash - end - - it "merges extra data" do - expect(hash[:extra]['key']).to eq('value') - expect(hash[:extra]['my_custom_variable']).to eq('value') - end - end - - context 'rack context specified' do - require 'stringio' - - let(:hash) do - Raven.rack_context('REQUEST_METHOD' => 'POST', - 'QUERY_STRING' => 'biz=baz', - 'HTTP_HOST' => 'localhost', - 'SERVER_NAME' => 'localhost', - 'SERVER_PORT' => '80', - 'HTTP_X_FORWARDED_FOR' => '1.1.1.1, 2.2.2.2', - 'HTTP_X_REQUEST_ID' => '98765432', - 'REMOTE_ADDR' => '192.168.1.1', - 'PATH_INFO' => '/lol', - 'rack.url_scheme' => 'http', - 'rack.input' => StringIO.new('foo=bar')) - - Raven::Event.new(level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - extra: { - 'my_custom_variable' => 'value' - }, - server_name: 'foo.local', - **essential_options).to_hash - end - - it "adds http data" do - expect(hash[:request]).to eq(data: { 'foo' => 'bar' }, - env: { 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => '80', "REMOTE_ADDR" => "192.168.1.1" }, - headers: { 'Host' => 'localhost', "X-Forwarded-For" => "1.1.1.1, 2.2.2.2", 'X-Request-Id' => '98765432' }, - method: 'POST', - query_string: 'biz=baz', - url: 'http://localhost/lol', - cookies: {}) - end - - it "sets user context ip address correctly" do - expect(hash[:user][:ip_address]).to eq("1.1.1.1") - end - - it "adds request_id to the tags" do - expect(hash[:tags][:request_id]).to eq("98765432") - end - end - - context "rack context, long body" do - let(:hash) do - Raven.rack_context('REQUEST_METHOD' => 'GET', - 'rack.url_scheme' => 'http', - 'rack.input' => StringIO.new('a' * 4096 * 5)) - - Raven::Event.new(essential_options).to_hash - end - - it "truncates http data" do - expect(hash[:request][:data]).to eq("a" * 4096 * 4) - end - end - - context 'configuration tags specified' do - let(:hash) do - config = Raven::Configuration.new - config.tags = { 'key' => 'value' } - config.release = "custom" - config.current_environment = "custom" - - Raven::Event.new( - level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - server_name: 'foo.local', - configuration: config, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - ).to_hash - end - - it 'merges tags data' do - expect(hash[:tags]).to eq('key' => 'value', - 'foo' => 'bar') - expect(hash[:release]).to eq("custom") - expect(hash[:environment]).to eq("custom") - end - end - - context 'configuration tags unspecified' do - it 'should not persist tags between unrelated events' do - config = Raven::Configuration.new - config.logger = Logger.new(nil) - - Raven::Event.new( - level: 'warning', - logger: 'foo', - tags: { - 'foo' => 'bar' - }, - server_name: 'foo.local', - configuration: config, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - ) - - hash = Raven::Event.new( - level: 'warning', - logger: 'foo', - server_name: 'foo.local', - configuration: config, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - ).to_hash - - expect(hash[:tags]).to eq({}) - end - end - - context 'tags hierarchy respected' do - let(:hash) do - config = Raven::Configuration.new - config.logger = Logger.new(nil) - config.tags = { - 'configuration_context_event_key' => 'configuration_value', - 'configuration_context_key' => 'configuration_value', - 'configuration_event_key' => 'configuration_value', - 'configuration_key' => 'configuration_value' - } - - Raven.tags_context('configuration_context_event_key' => 'context_value', - 'configuration_context_key' => 'context_value', - 'context_event_key' => 'context_value', - 'context_key' => 'context_value') - - Raven::Event.new( - level: 'warning', - logger: 'foo', - tags: { - 'configuration_context_event_key' => 'event_value', - 'configuration_event_key' => 'event_value', - 'context_event_key' => 'event_value', - 'event_key' => 'event_value' - }, - server_name: 'foo.local', - configuration: config, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - ).to_hash - end - - it 'merges tags data' do - expect(hash[:tags]).to eq('configuration_context_event_key' => 'event_value', - 'configuration_context_key' => 'context_value', - 'configuration_event_key' => 'event_value', - 'context_event_key' => 'event_value', - 'configuration_key' => 'configuration_value', - 'context_key' => 'context_value', - 'event_key' => 'event_value') - end - end - - context 'merging user context' do - before do - Raven.user_context('context_event_key' => 'context_value', - 'context_key' => 'context_value') - end - - let(:hash) do - Raven::Event.new(user: { - 'context_event_key' => 'event_value', - 'event_key' => 'event_value' - }, - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs).to_hash - end - - it 'prioritizes event context over request context' do - expect(hash[:user]).to eq('context_event_key' => 'event_value', - 'context_key' => 'context_value', - 'event_key' => 'event_value') - end - end - - context 'merging extra context' do - before do - Raven.extra_context('context_event_key' => 'context_value', - 'context_key' => 'context_value') - end - - let(:hash) do - Raven::Event.new(extra: { - 'context_event_key' => 'event_value', - 'event_key' => 'event_value' - }, - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs).to_hash - end - - it 'prioritizes event context over request context' do - expect(hash[:extra]['context_event_key']).to eq('event_value') - expect(hash[:extra]['context_key']).to eq('context_value') - expect(hash[:extra]['event_key']).to eq('event_value') - end - end - - context 'merging exception context' do - class ExceptionWithContext < StandardError - def raven_context - { extra: { - 'context_event_key' => 'context_value', - 'context_key' => 'context_value' - } } - end - end - - let(:hash) do - Raven::Event.from_exception( - ExceptionWithContext.new, - extra: { - 'context_event_key' => 'event_value', - 'event_key' => 'event_value' - }, - **essential_options - ).to_hash - end - - it 'prioritizes event context over request context' do - expect(hash[:extra]['context_event_key']).to eq('event_value') - expect(hash[:extra]['context_key']).to eq('context_value') - expect(hash[:extra]['event_key']).to eq('event_value') - end - end - - describe ".from_exception" do - it "proceses string message correctly" do - event = Raven::Event.from_exception(ExceptionWithContext.new, message: "MSG", **essential_options) - expect(event.message).to eq("MSG") - end - - it "slices long string message" do - event = Raven::Event.from_exception(ExceptionWithContext.new, message: "MSG" * 3000, **essential_options) - expect(event.message.length).to eq(8192) - end - - it "converts non-string message into string" do - expect(Raven.configuration.logger).to receive(:debug).with("You're passing a non-string message") - - event = Raven::Event.from_exception(ExceptionWithContext.new, message: { foo: "bar" }, **essential_options) - expect(event.message).to eq("{:foo=>\"bar\"}") - end - end - - describe '.to_json_compatible' do - subject do - Raven::Event.new(extra: { - 'my_custom_variable' => 'value', - 'date' => Time.utc(0), - 'anonymous_module' => Class.new - }, - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs) - end - - it "should coerce non-JSON-compatible types" do - json = subject.to_json_compatible - - expect(json["extra"]['my_custom_variable']).to eq('value') - expect(json["extra"]['date']).to be_a(String) - expect(json["extra"]['anonymous_module']).not_to be_a(Class) - end - - context "with bad data" do - subject do - data = {} - data['data'] = data - data['ary'] = [] - data['ary'].push('x' => data['ary']) - data['ary2'] = data['ary'] - - Raven::Event.new(extra: { - invalid: "invalid\255".dup.force_encoding('UTF-8'), - circular: data - }, - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs) - end - - it "should remove bad UTF-8" do - json = subject.to_json_compatible - - expect(json["extra"]["invalid"]).to eq("invalid") - end - - it "should remove circular references" do - json = subject.to_json_compatible - - expect(json["extra"]["circular"]["ary2"]).to eq("(...)") - end - end - - context "with sensitive data" do - subject do - Raven::Event.new(extra: { - 'password' => 'secretpassword' - }, - configuration: Raven.configuration, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs) - end - - it "should sanitize password" do - json = subject.to_json_compatible - - expect(json["extra"]["password"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - end - end - end - - describe '.capture_message' do - let(:message) { 'This is a message' } - let(:hash) { Raven::Event.capture_message(message, essential_options).to_hash } - - context 'for a Message' do - it 'returns an event' do - expect(Raven::Event.capture_message(message, essential_options)).to be_a(Raven::Event) - end - - it "doesn't change the option hash" do - h_int = { abc: :abc } - h = { k1: h_int, k2: h_int } - Raven.capture_message "Test extra", extra: { h1: h, h2: h_int }, **essential_options - - expect(h).to eq({ k1: h_int, k2: h_int }) - end - - it "sets the message to the value passed" do - expect(hash[:message]).to eq(message) - end - - it 'has level ERROR' do - expect(hash[:level]).to eq(:error) - end - - it 'accepts an options hash' do - expect(Raven::Event.capture_message(message, logger: 'logger', **essential_options).logger).to eq('logger') - end - - it 'accepts a stacktrace' do - backtrace = ["/path/to/some/file:22:in `function_name'", - "/some/other/path:1412:in `other_function'"] - evt = Raven::Event.capture_message(message, backtrace: backtrace, **essential_options) - expect(evt[:stacktrace]).to be_a(Raven::StacktraceInterface) - - frames = evt[:stacktrace].to_hash[:frames] - expect(frames.length).to eq(2) - expect(frames[0][:lineno]).to eq(1412) - expect(frames[0][:function]).to eq('other_function') - expect(frames[0][:filename]).to eq('/some/other/path') - - expect(frames[1][:lineno]).to eq(22) - expect(frames[1][:function]).to eq('function_name') - expect(frames[1][:filename]).to eq('/path/to/some/file') - end - end - end - - describe '.capture_exception' do - let(:message) { 'This is a message' } - let(:exception) { Exception.new(message) } - let(:hash) { Raven::Event.capture_exception(exception, **essential_options).to_hash } - - context 'for an Exception' do - it 'returns an event' do - expect(Raven::Event.capture_exception(exception, **essential_options)).to be_a(Raven::Event) - end - - it "sets the message to the exception's value and type" do - expect(hash[:exception][:values][0][:type]).to eq("Exception") - expect(hash[:exception][:values][0][:value]).to eq(message) - end - - it 'has level ERROR' do - expect(hash[:level]).to eq(:error) - end - - it 'uses the exception class name as the exception type' do - expect(hash[:exception][:values][0][:type]).to eq('Exception') - end - - it 'uses the exception message as the exception value' do - expect(hash[:exception][:values][0][:value]).to eq(message) - end - - it 'does not belong to a module' do - expect(hash[:exception][:values][0][:module]).to eq('') - end - end - - context 'for a nested exception type' do - module Raven::Test - class Exception < RuntimeError; end - end - let(:exception) { Raven::Test::Exception.new(message) } - - it 'sends the module name as part of the exception info' do - expect(hash[:exception][:values][0][:module]).to eq('Raven::Test') - end - end - - context 'for a Raven::Error' do - let(:exception) { Raven::Error.new } - it 'does not create an event' do - expect(Raven::Event.capture_exception(exception, **essential_options)).to be_nil - end - end - - context 'for an excluded exception type' do - module Raven::Test - class BaseExc < RuntimeError; end - class SubExc < BaseExc; end - module ExcTag; end - end - let(:config) do - config = Raven::Configuration.new - config.logger = Logger.new(nil) - config - end - - let(:essential_options) do - { - configuration: config, - context: Raven.context, - breadcrumbs: Raven.breadcrumbs - } - end - - context "invalid exclusion type" do - it 'returns Raven::Event' do - config.excluded_exceptions << nil - config.excluded_exceptions << 1 - config.excluded_exceptions << {} - expect(Raven::Event.capture_exception(Raven::Test::BaseExc.new, essential_options)).to be_a(Raven::Event) - end - end - - context "defined by string type" do - it 'returns nil for a class match' do - config.excluded_exceptions << 'Raven::Test::BaseExc' - expect(Raven::Event.capture_exception(Raven::Test::BaseExc.new, essential_options)).to be_nil - end - - it 'returns nil for a top class match' do - config.excluded_exceptions << '::Raven::Test::BaseExc' - expect(Raven::Event.capture_exception(Raven::Test::BaseExc.new, essential_options)).to be_nil - end - - it 'returns nil for a sub class match' do - config.excluded_exceptions << 'Raven::Test::BaseExc' - expect(Raven::Event.capture_exception(Raven::Test::SubExc.new, essential_options)).to be_nil - end - - it 'returns nil for a tagged class match' do - config.excluded_exceptions << 'Raven::Test::ExcTag' - expect( - Raven::Event.capture_exception( - Raven::Test::SubExc.new.tap { |x| x.extend(Raven::Test::ExcTag) }, - essential_options - ) - ).to be_nil - end - - it 'returns Raven::Event for an undefined exception class' do - config.excluded_exceptions << 'Raven::Test::NonExistentExc' - expect(Raven::Event.capture_exception(Raven::Test::BaseExc.new, essential_options)).to be_a(Raven::Event) - end - end - - context "defined by class type" do - it 'returns nil for a class match' do - config.excluded_exceptions << Raven::Test::BaseExc - expect(Raven::Event.capture_exception(Raven::Test::BaseExc.new, essential_options)).to be_nil - end - - it 'returns nil for a sub class match' do - config.excluded_exceptions << Raven::Test::BaseExc - expect(Raven::Event.capture_exception(Raven::Test::SubExc.new, essential_options)).to be_nil - end - - it 'returns nil for a tagged class match' do - config.excluded_exceptions << Raven::Test::ExcTag - expect(Raven::Event.capture_exception(Raven::Test::SubExc.new.tap { |x| x.extend(Raven::Test::ExcTag) }, essential_options)).to be_nil - end - end - end - - # Only check causes when they're supported - if Exception.new.respond_to? :cause - context 'when the exception has a cause' do - let(:exception) { build_exception_with_cause } - - it 'captures the cause' do - expect(hash[:exception][:values].length).to eq(2) - end - end - - context 'when the exception has nested causes' do - let(:exception) { build_exception_with_two_causes } - - it 'captures nested causes' do - expect(hash[:exception][:values].length).to eq(3) - end - end - end - - context 'when the exception has a recursive cause' do - let(:exception) { build_exception_with_recursive_cause } - - it 'should handle it gracefully' do - expect(hash[:exception][:values].length).to eq(1) - end - end - - if RUBY_PLATFORM == "java" - context 'when running under jRuby' do - let(:exception) do - begin - raise java.lang.OutOfMemoryError, "A Java error" - rescue Exception => e - return e - end - end - - it 'should have a backtrace' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames.length).not_to eq(0) - end - end - end - - context 'when the exception has a backtrace' do - let(:exception) do - e = Exception.new(message) - allow(e).to receive(:backtrace).and_return [ - "/path/to/some/file:22:in `function_name'", - "/some/other/path:1412:in `other_function'" - ] - e - end - - it 'parses the backtrace' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames.length).to eq(2) - expect(frames[0][:lineno]).to eq(1412) - expect(frames[0][:function]).to eq('other_function') - expect(frames[0][:filename]).to eq('/some/other/path') - - expect(frames[1][:lineno]).to eq(22) - expect(frames[1][:function]).to eq('function_name') - expect(frames[1][:filename]).to eq('/path/to/some/file') - end - - context 'with internal backtrace' do - let(:exception) do - e = Exception.new(message) - allow(e).to receive(:backtrace).and_return([":10:in `synchronize'"]) - e - end - - it 'marks filename and in_app correctly' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[0][:lineno]).to eq(10) - expect(frames[0][:function]).to eq("synchronize") - expect(frames[0][:filename]).to eq("") - end - end - - context 'when a path in the stack trace is on the load path' do - before do - $LOAD_PATH << '/some' - end - - after do - $LOAD_PATH.delete('/some') - end - - it 'strips prefixes in the load path from frame filenames' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[0][:filename]).to eq('other/path') - end - end - end - - it 'uses an annotation if one exists' do - Raven.annotate_exception(exception, logger: 'logger') - expect(Raven::Event.capture_exception(exception, **essential_options).logger).to eq('logger') - end - - it 'accepts a checksum' do - event = Raven::Event.capture_exception(exception, checksum: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', **essential_options) - expect(event.checksum).to eq('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') - end - - it 'accepts a release' do - expect(Raven::Event.capture_exception(exception, release: '1.0', **essential_options).release).to eq('1.0') - end - - it 'accepts a fingerprint' do - event = Raven::Event.capture_exception(exception, fingerprint: ['{{ default }}', 'foo'], **essential_options) - expect(event.fingerprint).to eq(['{{ default }}', 'foo']) - end - - it 'accepts a logger' do - expect(Raven::Event.capture_exception(exception, logger: 'root', **essential_options).logger).to eq('root') - end - end -end diff --git a/sentry-raven/spec/raven/instance_spec.rb b/sentry-raven/spec/raven/instance_spec.rb deleted file mode 100644 index 938822914..000000000 --- a/sentry-raven/spec/raven/instance_spec.rb +++ /dev/null @@ -1,405 +0,0 @@ -require 'spec_helper' -require 'raven/instance' - -RSpec.describe Raven::Instance do - let(:event) { Raven::Event.new(id: "event_id", configuration: configuration, context: Raven.context, breadcrumbs: Raven.breadcrumbs) } - let(:options) { { :key => "value" } } - let(:event_options) { options.merge(:context => subject.context, :configuration => configuration, breadcrumbs: Raven.breadcrumbs) } - let(:context) { nil } - let(:configuration) do - config = Raven::Configuration.new - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" - config.logger = Logger.new(nil) - config - end - - subject { described_class.new(context, configuration) } - - before do - allow(subject).to receive(:send_event) - allow(Raven::Event).to receive(:from_message) { event } - allow(Raven::Event).to receive(:from_exception) { event } - end - - describe '#context' do - it 'is Raven.context by default' do - expect(subject.context).to equal(Raven.context) - end - - context 'initialized with a context' do - let(:context) { :explicit } - - it 'is not Raven.context' do - expect(subject.context).to_not equal(Raven.context) - end - end - end - - describe '#capture_type' do - describe 'as #capture_message' do - before do - expect(Raven::Event).to receive(:from_message).with(message, event_options) - expect(subject).to receive(:send_event).with(event, :exception => nil, :message => message) - end - let(:message) { "Test message" } - - it 'sends the result of Event.capture_message' do - subject.capture_type(message, options) - end - - it 'yields the event to a passed block' do - expect { |b| subject.capture_type(message, options, &b) }.to yield_with_args(event) - end - end - - describe 'as #capture_message when async' do - let(:message) { "Test message" } - - around do |example| - prior_async = subject.configuration.async - subject.configuration.async = proc { :ok } - example.run - subject.configuration.async = prior_async - end - - it 'sends the result of Event.capture_type' do - expect(Raven::Event).to receive(:from_message).with(message, event_options) - expect(subject).not_to receive(:send_event).with(event) - - expect(subject.configuration.async).to receive(:call).with(event.to_json_compatible) - subject.capture_message(message, options) - end - - it 'returns the generated event' do - returned = subject.capture_message(message, options) - expect(returned).to eq(event) - end - end - - describe 'as #capture_exception' do - let(:exception) { build_exception } - - it 'sends the result of Event.capture_exception' do - expect(Raven::Event).to receive(:from_exception).with(exception, event_options) - expect(subject).to receive(:send_event).with(event, :exception => exception, :message => nil) - - subject.capture_exception(exception, options) - end - - it 'has an alias' do - expect(Raven::Event).to receive(:from_exception).with(exception, event_options) - expect(subject).to receive(:send_event).with(event, :exception => exception, :message => nil) - - subject.capture_exception(exception, options) - end - end - - describe 'as #capture_exception when async' do - let(:exception) { build_exception } - - context "when async" do - around do |example| - prior_async = subject.configuration.async - subject.configuration.async = proc { :ok } - example.run - subject.configuration.async = prior_async - end - - it 'sends the result of Event.capture_exception' do - expect(Raven::Event).to receive(:from_exception).with(exception, event_options) - expect(subject).not_to receive(:send_event).with(event) - - expect(subject.configuration.async).to receive(:call).with(event.to_json_compatible) - subject.capture_exception(exception, options) - end - - it 'returns the generated event' do - returned = subject.capture_exception(exception, options) - expect(returned).to eq(event) - end - end - - context "when async raises an exception" do - around do |example| - prior_async = subject.configuration.async - subject.configuration.async = proc { raise TypeError } - example.run - subject.configuration.async = prior_async - end - - it 'sends the result of Event.capture_exception via fallback' do - expect(Raven::Event).to receive(:from_exception).with(exception, event_options) - - expect(subject.configuration.async).to receive(:call).with(event.to_json_compatible) - subject.capture_exception(exception, options) - end - end - end - - describe 'as #capture_exception with a should_capture callback' do - let(:exception) { build_exception } - - it 'sends the result of Event.capture_exception according to the result of should_capture' do - expect(subject).not_to receive(:send_event).with(event) - - subject.configuration.should_capture = proc { false } - expect(subject.configuration.should_capture).to receive(:call).with(exception) - expect(subject.capture_exception(exception, options)).to be false - end - end - end - - describe '#capture' do - context 'given a block' do - it 'yields to the given block' do - expect { |b| subject.capture(&b) }.to yield_with_no_args - end - end - - it 'does not install an at_exit hook' do - expect(Kernel).not_to receive(:at_exit) - subject.capture {} - end - end - - describe '#annotate_exception' do - let(:exception) { build_exception } - - def ivars(object) - object.instance_variables.map(&:to_s) - end - - it 'adds an annotation to the exception' do - expect(ivars(exception)).not_to include("@__raven_context") - subject.annotate_exception(exception, {}) - expect(ivars(exception)).to include("@__raven_context") - expect(exception.instance_variable_get(:@__raven_context)).to \ - be_kind_of Hash - end - - context 'when the exception already has context' do - it 'does a deep merge of options' do - subject.annotate_exception(exception, :extra => { :language => "ruby" }) - subject.annotate_exception(exception, :extra => { :job_title => "engineer" }) - expected_hash = { :extra => { :language => "ruby", :job_title => "engineer" } } - expect(exception.instance_variable_get(:@__raven_context)).to \ - eq expected_hash - end - end - end - - describe '#report_status' do - let(:ready_message) do - "Raven #{Raven::VERSION} ready to catch errors" - end - - let(:not_ready_message) do - "Raven #{Raven::VERSION} configured not to capture errors: DSN not set" - end - - context "when current environment is included in environments" do - before do - subject.configuration.silence_ready = false - subject.configuration.environments = ["default"] - end - - it 'logs a ready message when configured' do - expect(subject.logger).to receive(:info).with(ready_message) - subject.report_status - end - - it 'logs a warning message when not properly configured' do - # dsn not set - subject.configuration = Raven::Configuration.new - - expect(subject.logger).to receive(:info).with(not_ready_message) - subject.report_status - end - - it 'logs nothing if "silence_ready" configuration is true' do - subject.configuration.silence_ready = true - expect(subject.logger).not_to receive(:info) - subject.report_status - end - end - - context "when current environment is not included in environments" do - it "doesn't log any message" do - subject.configuration.silence_ready = false - subject.configuration.environments = ["production"] - expect(subject.logger).not_to receive(:info) - subject.report_status - end - end - end - - describe '.last_event_id' do - let(:message) { "Test message" } - - it 'sends the result of Event.capture_type' do - expect(subject).to receive(:send_event).with(event, :exception => nil, :message => message) - - subject.capture_type("Test message", options) - - expect(subject.last_event_id).to eq(event.id) - end - end - - describe "#user_context" do - context "without a block" do - it "doesn't override previous data" do - subject.user_context(id: 1) - subject.user_context(email: "test@example.com") - - expect(subject.context.user).to eq({ id: 1, email: "test@example.com" }) - end - it "empties the user context when called without options" do - subject.context.user = { id: 1 } - expect(subject.user_context).to eq({}) - end - - it "empties the user context when called with nil" do - subject.context.user = { id: 1 } - expect(subject.user_context(nil)).to eq({}) - end - - it "doesn't empty the user context when called with {}" do - subject.context.user = { id: 1 } - expect(subject.user_context({})).to eq({ id: 1 }) - end - - it "returns the user context when set" do - expected = { id: 1 } - expect(subject.user_context(expected)).to eq(expected) - end - end - - context "with a block" do - it "returns the user context when set" do - expected = { id: 1 } - user_context = subject.user_context(expected) do - # do nothing - end - expect(user_context).to eq expected - end - - it "sets user context only in the block" do - subject.context.user = { id: 9999 } - - subject.user_context(id: 1) do - expect(subject.context.user).to eq(id: 1) - end - expect(subject.context.user).to eq(id: 9999) - end - - it "resets with nested blocks" do - subject.context.user = {} - subject.user_context(id: 9999) do - subject.user_context(email: 'foo@bar.com') do - expect(subject.context.user).to eq(id: 9999, email: 'foo@bar.com') - end - expect(subject.context.user).to eq(id: 9999) - end - expect(subject.context.user).to eq({}) - end - end - end - - describe "#tags_context" do - let(:default) { { :foo => :bar } } - let(:additional) { { :baz => :qux } } - - before do - subject.context.tags = default - end - - it "returns the tags" do - expect(subject.tags_context).to eq default - end - - it "returns the tags" do - expect(subject.tags_context(additional)).to eq default.merge(additional) - end - - it "doesn't set anything if the tags is empty" do - subject.tags_context({}) - expect(subject.context.tags).to eq default - end - - it "adds tags" do - subject.tags_context(additional) - expect(subject.context.tags).to eq default.merge(additional) - end - - context 'when block given' do - it "returns the tags" do - tags = subject.tags_context(additional) do - # do nothing - end - expect(tags).to eq default - end - - it "adds tags only in the block" do - subject.tags_context(additional) do - expect(subject.context.tags).to eq default.merge(additional) - end - expect(subject.context.tags).to eq default - end - end - end - - describe "#extra_context" do - let(:default) { { :foo => :bar } } - let(:additional) { { :baz => :qux } } - - before do - subject.context.extra = default - end - - it "returns the extra" do - expect(subject.extra_context).to eq default - end - - it "returns the extra" do - expect(subject.extra_context(additional)).to eq default.merge(additional) - end - - it "doesn't set anything if the extra is empty" do - subject.extra_context({}) - expect(subject.context.extra).to eq default - end - - it "adds extra" do - subject.extra_context(additional) - expect(subject.context.extra).to eq default.merge(additional) - end - - context 'when block given' do - it "returns the extra" do - extra = subject.extra_context(additional) do - # do nothing - end - expect(extra).to eq default - end - - it "adds extra only in the block" do - subject.extra_context(additional) do - expect(subject.context.extra).to eq default.merge(additional) - end - expect(subject.context.extra).to eq default - end - end - end - - describe "#rack_context" do - it "doesn't set anything if the context is empty" do - subject.rack_context({}) - expect(subject.context.rack_env).to be_nil - end - - it "sets arbitrary rack context" do - subject.rack_context(:foo => :bar) - expect(subject.context.rack_env[:foo]).to eq(:bar) - end - end -end diff --git a/sentry-raven/spec/raven/integration_spec.rb b/sentry-raven/spec/raven/integration_spec.rb deleted file mode 100644 index a3c698f02..000000000 --- a/sentry-raven/spec/raven/integration_spec.rb +++ /dev/null @@ -1,113 +0,0 @@ -require 'spec_helper' - -RSpec.describe "Integration tests" do - before(:each) do - @io = StringIO.new - @logger = Logger.new(@io) - @instance = Raven::Instance.new - @stubs = Faraday::Adapter::Test::Stubs.new - @instance.configuration = Raven::Configuration.new.tap do |config| - config.server = 'http://12345:67890@sentry.localdomain/sentry/42' - config.http_adapter = [:test, @stubs] - config.logger = @logger - end - end - - it "prints deprecation warning when requiring 'sentry-raven-without-integrations'" do - expect do - require "sentry-raven-without-integrations" - end.to output( - "[Deprecation Warning] Dasherized filename \"sentry-raven-without-integrations\" is deprecated and will be removed in 4.0; use \"sentry_raven_without_integrations\" instead\n" # rubocop:disable Style/LineLength - ).to_stderr - end - - it "posting an exception" do - @stubs.post('sentry/api/42/store/') { [200, {}, 'ok'] } - - @instance.capture_exception(build_exception) - - @stubs.verify_stubbed_calls - expect(@io.string).to match(/Sending event [0-9a-f]+ to Sentry$/) - end - - it "posting an exception to a prefixed DSN" do - @stubs.post('/prefix/sentry/api/42/store/') { [200, {}, 'ok'] } - @instance.configuration.server = 'http://12345:67890@sentry.localdomain/prefix/sentry/42' - - @instance.capture_exception(build_exception) - - @stubs.verify_stubbed_calls - end - - # TODO: Not a very good test - # it "hitting quota limit shouldn't swallow exception" do - # @stubs.post('sentry/api/42/store/') { [403, {}, 'Creation of this event was blocked'] } - # - # # sentry error and original error - # expect(@logger).not_to receive(:error) - # @instance.capture_exception(build_exception) - # - # @stubs.verify_stubbed_calls - # end - - it "timed backoff should prevent sends" do - expect(@instance.client.transport).to receive(:send_event).exactly(1).times.and_raise(Faraday::ConnectionFailed, "conn failed") - 2.times { @instance.capture_exception(build_exception) } - expect(@io.string).to match(/Failed to submit event: ZeroDivisionError: divided by 0$/) - end - - it "transport failure should call transport_failure_callback" do - @instance.configuration.transport_failure_callback = proc { |_event, error| @io.puts "OK! - #{error.message}" } - - expect(@instance.client.transport).to receive(:send_event).exactly(1).times.and_raise(Faraday::ConnectionFailed, "conn failed") - @instance.capture_exception(build_exception) - expect(@io.string).to match(/OK! - conn failed$/) - end - - describe '#before_send' do - it "change event before sending (capture_exception)" do - @stubs.post('/prefix/sentry/api/42/store/') { [200, {}, 'ok'] } - - @instance.configuration.server = 'http://12345:67890@sentry.localdomain/prefix/sentry/42' - @instance.configuration.before_send = lambda { |event, hint| - expect(hint[:exception]).not_to be nil - expect(hint[:message]).to be nil - event.environment = 'testxx' - event - } - - event = @instance.capture_exception(build_exception) - expect(event.environment).to eq('testxx') - - @stubs.verify_stubbed_calls - end - - it "change event before sending (capture_message)" do - @stubs.post('/prefix/sentry/api/42/store/') { [200, {}, 'ok'] } - - @instance.configuration.server = 'http://12345:67890@sentry.localdomain/prefix/sentry/42' - @instance.configuration.before_send = lambda { |event, hint| - expect(hint[:exception]).to be nil - expect(hint[:message]).not_to be nil - expect(event.message).to eq('xyz') - event.message = 'abc' - event - } - - event = @instance.capture_message('xyz') - expect(event.message).to eq('abc') - - @stubs.verify_stubbed_calls - end - - it "return nil" do - @instance.configuration.server = 'http://12345:67890@sentry.localdomain/prefix/sentry/42' - @instance.configuration.before_send = lambda { |_event, _hint| - nil - } - - @instance.capture_exception(build_exception) - expect(@instance.client.transport).to receive(:send_event).exactly(0) - end - end -end diff --git a/sentry-raven/spec/raven/integrations/delayed_job_spec.rb b/sentry-raven/spec/raven/integrations/delayed_job_spec.rb deleted file mode 100644 index 3af6f1863..000000000 --- a/sentry-raven/spec/raven/integrations/delayed_job_spec.rb +++ /dev/null @@ -1,62 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' -require 'delayed/backend/base' -require 'raven/integrations/delayed_job' - -module Delayed - module Plugins - class Raven - class SampleJob - include Delayed::Backend::Base - - class << self - def db_time_now - Time.now - end - end - - attr_accessor :attempts, :created_at, :error, :handler, :id, :last_error, :locked_at, :locked_by, - :payload_object, :priority, :queue, :run_at - - def initialize - super - - self.attempts = 0 - end - - def save!; end - end - - class RaiseErrorPayload - attr_accessor :job_data - - def perform - raise 'error' - end - end - end - end -end - -RSpec.describe Delayed::Plugins::Raven do - let(:worker) { Delayed::Worker.new } - - context 'ActiveJob' do - context 'when payload#perform raises exception' do - let(:job) { Delayed::Plugins::Raven::SampleJob.new } - - before do - allow(::Raven).to receive(:capture_exception) - - job.payload_object = Delayed::Plugins::Raven::RaiseErrorPayload.new - - worker.run(job) - end - - it 'should capture exception' do - expect(::Raven).to have_received(:capture_exception) - end - end - end -end diff --git a/sentry-raven/spec/raven/integrations/rack_spec.rb b/sentry-raven/spec/raven/integrations/rack_spec.rb deleted file mode 100644 index c7f8a7a2a..000000000 --- a/sentry-raven/spec/raven/integrations/rack_spec.rb +++ /dev/null @@ -1,189 +0,0 @@ -require 'spec_helper' -require 'raven/integrations/rack' - -RSpec.describe Raven::Rack do - let(:exception) { build_exception } - let(:additional_headers) { {} } - let(:env) { Rack::MockRequest.env_for("/test", additional_headers) } - - context "when we expect to capture an exception" do - before do - expect(Raven::Rack).to receive(:capture_exception).with(exception, env) - end - - it 'should capture exceptions' do - app = ->(_e) { raise exception } - stack = Raven::Rack.new(app) - - expect { stack.call(env) }.to raise_error(ZeroDivisionError) - end - - it 'should capture rack.exception' do - app = lambda do |e| - e['rack.exception'] = exception - [200, {}, ['okay']] - end - stack = Raven::Rack.new(app) - - stack.call(env) - end - - it 'should capture sinatra errors' do - app = lambda do |e| - e['sinatra.error'] = exception - [200, {}, ['okay']] - end - stack = Raven::Rack.new(app) - - stack.call(env) - end - end - - it 'should capture context and clear after app is called' do - Raven::Context.current.tags[:environment] = :test - - app = ->(_e) { :ok } - stack = Raven::Rack.new(app) - - stack.call(env) - - expect(Raven::Context.current.tags).to eq({}) - end - - it 'sets transaction' do - app = lambda do |_e| - expect(Raven.context.transaction.last).to eq "/test" - end - stack = Raven::Rack.new(app) - - stack.call(env) - - expect(Raven.context.transaction.last).to be_nil - end - - it 'should allow empty rack env in rspec tests' do - Raven.rack_context({}) # the rack env is empty when running rails/rspec tests - Raven.capture_exception(build_exception) - end - - it 'should bind request context' do - Raven::Context.current.rack_env = nil - - app = lambda do |env| - expect(Raven::Context.current.rack_env).to eq(env) - - ['response', {}, env] - end - stack = Raven::Rack.new(app) - - stack.call({}) - end - - it 'excludes non whitelisted params from rack env' do - interface = Raven::HttpInterface.new - additional_env = { "random_param" => "text", "query_string" => "test" } - new_env = env.merge(additional_env) - interface.from_rack(new_env) - - expect(interface.env).to_not include(additional_env) - end - - it 'formats rack env according to the provided whitelist' do - Raven.configuration.rack_env_whitelist = %w(random_param query_string) - interface = Raven::HttpInterface.new - additional_env = { "random_param" => "text", "query_string" => "test" } - new_env = env.merge(additional_env) - interface.from_rack(new_env) - - expect(interface.env).to eq(additional_env) - end - - it 'keeps the original env intact when an empty whitelist is provided' do - Raven.configuration.rack_env_whitelist = [] - interface = Raven::HttpInterface.new - interface.from_rack(env) - - expect(interface.env).to eq(env) - end - - describe 'format headers' do - let(:additional_headers) { { "HTTP_VERSION" => "HTTP/1.1", "HTTP_COOKIE" => "test", "HTTP_X_REQUEST_ID" => "12345678" } } - - it 'transforms headers to conform with the interface' do - interface = Raven::HttpInterface.new - interface.from_rack(env) - - expect(interface.headers).to eq("Content-Length" => "0", "Version" => "HTTP/1.1", "X-Request-Id" => "12345678") - end - - context 'from Rails middleware' do - let(:additional_headers) { { "action_dispatch.request_id" => "12345678" } } - - it 'transforms headers to conform with the interface' do - interface = Raven::HttpInterface.new - interface.from_rack(env) - - expect(interface.headers).to eq("Content-Length" => "0", "X-Request-Id" => "12345678") - end - end - - context 'with additional env variables' do - let(:mock) { double } - let(:env) { { "some.variable" => mock } } - - it 'does not call #to_s for unnecessary env variables' do - expect(mock).not_to receive(:to_s) - - interface = Raven::HttpInterface.new - interface.from_rack(env) - end - end - end - - it 'puts cookies into the cookies attribute' do - interface = Raven::HttpInterface.new - new_env = env.merge("HTTP_COOKIE" => "test") - interface.from_rack(new_env) - - expect(interface.cookies).to eq("test" => nil) - end - - it 'does not ignore version headers which do not match SERVER_PROTOCOL' do - new_env = env.merge("SERVER_PROTOCOL" => "HTTP/1.1", "HTTP_VERSION" => "HTTP/2.0") - - interface = Raven::HttpInterface.new - interface.from_rack(new_env) - - expect(interface.headers["Version"]).to eq("HTTP/2.0") - end - - it 'retains any literal "HTTP-" in the actual header name' do - interface = Raven::HttpInterface.new - new_env = env.merge("HTTP_HTTP_CUSTOM_HTTP_HEADER" => "test") - interface.from_rack(new_env) - - expect(interface.headers).to include("Http-Custom-Http-Header" => "test") - end - - it 'does not fail if an object in the env cannot be cast to string' do - obj = Class.new do - def to_s - raise 'Could not stringify object!' - end - end.new - - new_env = env.merge("HTTP_FOO" => "BAR", "rails_object" => obj) - interface = Raven::HttpInterface.new - - expect { interface.from_rack(new_env) }.to_not raise_error - end - - it 'should pass rack/lint' do - app = proc do - [200, { 'Content-Type' => 'text/plain' }, ['OK']] - end - - stack = Raven::Rack.new(Rack::Lint.new(app)) - expect { stack.call(env) }.to_not raise_error - end -end diff --git a/sentry-raven/spec/raven/integrations/rack_timeout_spec.rb b/sentry-raven/spec/raven/integrations/rack_timeout_spec.rb deleted file mode 100644 index 66f32699b..000000000 --- a/sentry-raven/spec/raven/integrations/rack_timeout_spec.rb +++ /dev/null @@ -1,18 +0,0 @@ -require "spec_helper" -require "rack/timeout/base" -require "raven/integrations/rack-timeout" - -RSpec.describe "Rack timeout" do - it "should have a raven_context method defined" do - exc = Rack::Timeout::RequestTimeoutException.new("REQUEST_URI" => "This is a URI") - - expect(exc.raven_context[:fingerprint]).to eq(["{{ default }}", "This is a URI"]) - end - - it "should return an empty context if env is missing" do - exception = Object.new - exception.extend(RackTimeoutExtensions) - - expect(exception.raven_context).to eq({}) - end -end diff --git a/sentry-raven/spec/raven/integrations/rails/activejob_spec.rb b/sentry-raven/spec/raven/integrations/rails/activejob_spec.rb deleted file mode 100644 index 207fd8b86..000000000 --- a/sentry-raven/spec/raven/integrations/rails/activejob_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -require "spec_helper" - -if defined? ActiveJob - class MyActiveJob < ActiveJob::Base - self.logger = nil - - class TestError < RuntimeError - end - - def perform - raise TestError, "Boom!" - end - end - - class RescuedActiveJob < MyActiveJob - rescue_from TestError, :with => :rescue_callback - - def rescue_callback(error); end - end -end - -RSpec.describe "ActiveJob integration", :rails => true do - before(:all) do - require "rspec/rails" - require "raven/integrations/rails" - require "raven/integrations/rails/active_job" - end - - before(:each) do - Raven.client.transport.events = [] - MyActiveJob.queue_adapter = :inline - end - - it_should_behave_like "Raven default capture behavior" do - let(:block) { MyActiveJob.new.perform_now } - let(:captured_class) { MyActiveJob::TestError } - let(:captured_message) { "Boom!" } - end - - it "clears context" do - Raven.extra_context(:foo => :bar) - job = MyActiveJob.new - - expect { job.perform_now }.to raise_error(MyActiveJob::TestError) - event = JSON.parse!(Raven.client.transport.events.first[1]) - - expect(event["extra"]["foo"]).to eq("bar") - - Raven.client.transport.events = [] - expect { job.perform_now }.to raise_error(MyActiveJob::TestError) - event = JSON.parse!(Raven.client.transport.events.first[1]) - - expect(event["extra"]["foo"]).to eq(nil) - end - - context 'using rescue_from' do - it 'does not trigger Sentry' do - job = RescuedActiveJob.new - allow(job).to receive(:rescue_callback) - - expect { job.perform_now }.not_to raise_error - - expect(Raven.client.transport.events.size).to eq(0) - expect(job).to have_received(:rescue_callback).once - end - end - - context "when we are using an adapter which has a specific integration" do - it "does not trigger sentry and re-raises" do - MyActiveJob.queue_adapter = :sidekiq - job = MyActiveJob.new - - expect { job.perform_now }.to raise_error(MyActiveJob::TestError) - - expect(Raven.client.transport.events.size).to eq(0) - end - end -end diff --git a/sentry-raven/spec/raven/integrations/rails/controller_methods_spec.rb b/sentry-raven/spec/raven/integrations/rails/controller_methods_spec.rb deleted file mode 100644 index c503f4f83..000000000 --- a/sentry-raven/spec/raven/integrations/rails/controller_methods_spec.rb +++ /dev/null @@ -1,31 +0,0 @@ -require 'spec_helper' - -RSpec.describe "Raven::Rails::ControllerMethods", :rails => true do - include Raven::Rails::ControllerMethods if defined?(Rails) - - before(:all) do - require 'raven/integrations/rails/controller_methods' - end - - let(:env) { { "foo" => "bar" } } - let(:request) { double('request', :env => env) } - let(:options) { double('options') } - - describe "#capture_message" do - let(:message) { double('message') } - - it "captures a message with the request environment" do - expect(Raven::Rack).to receive(:capture_message).with(message, env, options) - capture_message(message, options) - end - end - - describe "#capture_exception" do - let(:exception) { double('exception') } - - it "captures a exception with the request environment" do - expect(Raven::Rack).to receive(:capture_exception).with(exception, env, options) - capture_exception(exception, options) - end - end -end diff --git a/sentry-raven/spec/raven/integrations/rails/event_spec.rb b/sentry-raven/spec/raven/integrations/rails/event_spec.rb deleted file mode 100644 index 4709575b8..000000000 --- a/sentry-raven/spec/raven/integrations/rails/event_spec.rb +++ /dev/null @@ -1,72 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Event, :rails => true do - context 'in a rails environment' do - let(:configuration) do - config = Raven::Configuration.new - config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" - config.logger = Logger.new(nil) - config - end - - let(:instance) { Raven::Instance.new(nil, configuration) } - - context 'with an application stacktrace' do - let(:exception) do - e = Exception.new("Oh no!") - allow(e).to receive(:backtrace).and_return [ - "#{Rails.root}/vendor/bundle/cache/other_gem.rb:10:in `public_method'", - "vendor/bundle/some_gem.rb:10:in `a_method'", - "#{Rails.root}/app/models/user.rb:132:in `new_function'", - "/gem/lib/path:87:in `a_function'", - "/app/some/other/path:1412:in `other_function'", - "test/some/other/path:1412:in `other_function'" - ] - e - end - - let(:hash) { instance.capture_exception(exception).to_hash } - - it 'marks in_app correctly' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[0][:filename]).to eq("test/some/other/path") - expect(frames[0][:in_app]).to eq(true) - expect(frames[1][:filename]).to eq("/app/some/other/path") - expect(frames[1][:in_app]).to eq(false) - expect(frames[2][:filename]).to eq("/gem/lib/path") - expect(frames[2][:in_app]).to eq(false) - expect(frames[3][:filename]).to eq("app/models/user.rb") - expect(frames[3][:in_app]).to eq(true) - expect(frames[4][:filename]).to eq("vendor/bundle/some_gem.rb") - expect(frames[4][:in_app]).to eq(false) - expect(frames[5][:filename]).to eq("vendor/bundle/cache/other_gem.rb") - expect(frames[5][:in_app]).to eq(false) - end - - context 'when an in_app path under project_root is on the load path' do - it 'normalizes the filename using project_root' do - $LOAD_PATH << "#{Rails.root}/app/models" - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[3][:filename]).to eq("app/models/user.rb") - $LOAD_PATH.delete("#{Rails.root}/app/models") - end - end - - context 'when a non-in_app path under project_root is on the load path' do - it 'normalizes the filename using the load path' do - $LOAD_PATH.push "#{Rails.root}/vendor/bundle" - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[5][:filename]).to eq("cache/other_gem.rb") - $LOAD_PATH.pop - end - end - - context "when a non-in_app path under project_root isn't on the load path" do - it 'normalizes the filename using project_root' do - frames = hash[:exception][:values][0][:stacktrace][:frames] - expect(frames[5][:filename]).to eq("vendor/bundle/cache/other_gem.rb") - end - end - end - end -end diff --git a/sentry-raven/spec/raven/integrations/rails/overrides/debug_exceptions_catcher_spec.rb b/sentry-raven/spec/raven/integrations/rails/overrides/debug_exceptions_catcher_spec.rb deleted file mode 100644 index b4a14ba00..000000000 --- a/sentry-raven/spec/raven/integrations/rails/overrides/debug_exceptions_catcher_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -require 'spec_helper' - -RSpec.shared_examples "exception catching middleware" do - let(:middleware) do - Class.new do - def initialize(app) - @app = app - end - - def call(env) - @app.call(env) - rescue => e - render_exception(env, e) - end - - def render_exception(_, exception) - [500, exception.message, {}] - end - end - end - - let(:app) do - lambda { |_| raise "app error" } # rubocop:disable Style/Lambda - end - - let(:env) { {} } - - it "shows the exception" do - expect(middleware.new(app).call(env)).to eq([500, "app error", {}]) - end - - it "captures the exception" do - expect(Raven::Rack).to receive(:capture_exception) - middleware.new(app).call(env) - end - - context "when an error is raised" do - it "shows the original exception" do - allow(Raven::Rack).to receive(:capture_exception).and_raise("raven error") - expect(middleware.new(app).call(env)).to eq([500, "app error", {}]) - end - end -end - -RSpec.describe "Raven::Rails::Overrides::DebugExceptionsCatcher", :rails => true do - before(:all) do - require 'raven/integrations/rails/overrides/debug_exceptions_catcher' - end - - if Class.respond_to?(:alias_method_chain) - context "using include" do - before do - middleware.send(:include, Raven::Rails::Overrides::OldDebugExceptionsCatcher) - end - - include_examples "exception catching middleware" - end - end - - if Class.respond_to?(:prepend) - context "using prepend" do - before do - middleware.send(:prepend, Raven::Rails::Overrides::DebugExceptionsCatcher) - end - - include_examples "exception catching middleware" - end - end -end diff --git a/sentry-raven/spec/raven/integrations/rails_spec.rb b/sentry-raven/spec/raven/integrations/rails_spec.rb deleted file mode 100644 index 5e2fb3137..000000000 --- a/sentry-raven/spec/raven/integrations/rails_spec.rb +++ /dev/null @@ -1,81 +0,0 @@ -require "spec_helper" - -RSpec.describe "Rails Integration", :type => :request, :rails => true do - before(:all) do - make_basic_app - end - - after(:each) do - Raven.client.transport.events = [] - end - - it "inserts middleware" do - expect(Rails.application.middleware).to include(Raven::Rack) - end - - it "doesn't do anything on a normal route" do - get "/" - - expect(response.status).to eq(200) - expect(Raven.client.transport.events.size).to eq(0) - end - - it "should capture exceptions in production" do - get "/exception" - - expect(response.status).to eq(500) - event = JSON.parse!(Raven.client.transport.events.first[1]) - expect(event["exception"]["values"][0]["type"]).to eq("RuntimeError") - expect(event["exception"]["values"][0]["value"]).to eq("An unhandled exception!") - end - - it "should capture exceptions in production" do - get "/exception" - - expect(response.status).to eq(500) - event = JSON.parse!(Raven.client.transport.events.first[1]) - expect(event["exception"]["values"][0]["type"]).to eq("RuntimeError") - expect(event["exception"]["values"][0]["value"]).to eq("An unhandled exception!") - end - - it "filters exception backtrace with with custom BacktraceCleaner" do - get "/view_exception" - - event = JSON.parse!(Raven.client.transport.events.first[1]) - traces = event.dig("exception", "values", 0, "stacktrace", "frames") - expect(traces.dig(-1, "filename")).to eq("inline template") - - # we want to avoid something like "_inline_template__3014794444104730113_10960" - expect(traces.dig(-1, "function")).to be_nil - end - - it "doesn't filters exception backtrace if backtrace_cleanup_callback is overridden" do - Raven.configuration.backtrace_cleanup_callback = nil - - get "/view_exception" - - event = JSON.parse!(Raven.client.transport.events.first[1]) - traces = event.dig("exception", "values", 0, "stacktrace", "frames") - expect(traces.dig(-1, "filename")).to eq("inline template") - expect(traces.dig(-1, "function")).not_to be_nil - end - - it "sets transaction to ControllerName#method" do - get "/exception" - - event = JSON.parse!(Raven.client.transport.events.first[1]) - expect(event['transaction']).to eq("HelloController#exception") - end - - it "sets Raven.configuration.logger correctly" do - expect(Raven.configuration.logger).to eq(Rails.logger) - end - - it "sets Raven.configuration.project_root correctly" do - expect(Raven.configuration.project_root).to eq(Rails.root.to_s) - end - - it "doesn't clobber a manually configured release" do - expect(Raven.configuration.release).to eq('beta') - end -end diff --git a/sentry-raven/spec/raven/integrations/rake_spec.rb b/sentry-raven/spec/raven/integrations/rake_spec.rb deleted file mode 100644 index 2ff3d74ff..000000000 --- a/sentry-raven/spec/raven/integrations/rake_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'spec_helper' - -RSpec.describe 'Rake tasks' do - it "should capture exceptions in Rake tasks" do - expect(`cd spec/support && bundle exec rake raise_exception 2>&1`).to match(/Sending event [abcdef0-9]+ to Sentry/) - end -end diff --git a/sentry-raven/spec/raven/integrations/sidekiq/error_handler_spec.rb b/sentry-raven/spec/raven/integrations/sidekiq/error_handler_spec.rb deleted file mode 100644 index 30262b746..000000000 --- a/sentry-raven/spec/raven/integrations/sidekiq/error_handler_spec.rb +++ /dev/null @@ -1,67 +0,0 @@ -require 'spec_helper' - -require 'raven/integrations/sidekiq/error_handler' - -RSpec.describe "Raven::Sidekiq::ErrorHandler" do - let(:context) do - { - "args" => [true, true], - "class" => "HardWorker", - "created_at" => 1_474_922_824.910579, - "enqueued_at" => 1_474_922_824.910665, - "error_class" => "RuntimeError", - "error_message" => "a wild exception appeared", - "failed_at" => 1_474_922_825.158953, - "jid" => "701ed9cfa51c84a763d56bc4", - "queue" => "default", - "retry" => true, - "retry_count" => 0 - } - end - - it "should capture exceptions based on Sidekiq context" do - exception = build_exception - expected_options = { - :message => exception.message, - :extra => { :sidekiq => context } - } - - expect(Raven).to receive(:capture_exception).with(exception, expected_options) - - Raven::Sidekiq::ErrorHandler.new.call(exception, context) - end - - context "when the captured exception is already annotated" do - it "does a deep merge of options" do - exception = build_exception - Raven.annotate_exception(exception, :extra => { :job_title => "engineer" }) - expected_options = { - :message => exception.message, - :extra => { - :sidekiq => context, - :job_title => "engineer" - } - } - - expect(Raven::Event).to receive(:new).with(hash_including(expected_options)) - - Raven::Sidekiq::ErrorHandler.new.call(exception, context) - end - end - - it "filters out ActiveJob keys", :rails => true do - exception = build_exception - aj_context = context - aj_context["_aj_globalid"] = GlobalID.new('gid://app/model/id') - expected_context = aj_context.dup - expected_context.delete("_aj_globalid") - expected_context["globalid"] = "gid://app/model/id" - expected_options = { - :message => exception.message, - :extra => { :sidekiq => expected_context } - } - expect(Raven).to receive(:capture_exception).with(exception, expected_options) - - Raven::Sidekiq::ErrorHandler.new.call(exception, aj_context) - end -end diff --git a/sentry-raven/spec/raven/integrations/sidekiq_spec.rb b/sentry-raven/spec/raven/integrations/sidekiq_spec.rb deleted file mode 100644 index 3b56ac815..000000000 --- a/sentry-raven/spec/raven/integrations/sidekiq_spec.rb +++ /dev/null @@ -1,136 +0,0 @@ -require 'spec_helper' - -# sidekiq only enables server config when the CLI class is loaded -# so we need to load the CLI class to achieve full integration in test environment -require 'sidekiq/cli' -require 'sidekiq/manager' -require 'sidekiq/api' - -require 'raven/integrations/sidekiq' - -class HappyWorker - include Sidekiq::Worker - - def perform - Raven.breadcrumbs.record do |crumb| - crumb.message = "I'm happy!" - end - Raven.tags_context :mood => 'happy' - end -end - -class SadWorker - include Sidekiq::Worker - - def perform - Raven.breadcrumbs.record do |crumb| - crumb.message = "I'm sad!" - end - Raven.tags_context :mood => 'sad' - - raise "I'm sad!" - end -end - -class VerySadWorker - include Sidekiq::Worker - - def perform - Raven.breadcrumbs.record do |crumb| - crumb.message = "I'm very sad!" - end - Raven.tags_context :mood => 'very sad' - - raise "I'm very sad!" - end -end - -class ReportingWorker - include Sidekiq::Worker - - def perform - Raven.capture_message("I have something to say!") - end -end - -RSpec.describe "Sidekiq full-stack integration" do - before :all do - Sidekiq.logger = Logger.new(nil) - end - - after(:all) do - # those test jobs will go into the real Redis and be visiable to other sidekiq processes - # this can affect local testing and development, so we should clear them after each test - Sidekiq::RetrySet.new.clear - end - - def process_job(klass) - msg = Sidekiq.dump_json("class" => klass) - job = Sidekiq::BasicFetch::UnitOfWork.new('queue:default', msg) - @processor.instance_variable_set(:'@job', job) - - @processor.send(:process, job) - rescue StandardError - # do nothing - end - - before do - options = - if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("6.0") - Sidekiq[:queue] = ['default'] - Sidekiq - else - { queues: ['default'] } - end - - manager = Sidekiq::Manager.new(options) - @processor = manager.workers.first - end - - it "actually captures an exception" do - expect { process_job("SadWorker") }.to change { Raven.client.transport.events.size }.by(1) - - event = JSON.parse(Raven.client.transport.events.last[1]) - expect(event["logentry"]["message"]).to eq("I'm sad!") - end - - it "clears context from other workers and captures its own" do - process_job("HappyWorker") - process_job("SadWorker") - - event = JSON.parse(Raven.client.transport.events.last[1]) - - expect(event["tags"]).to eq("mood" => "sad") - expect(event["transaction"]).to eq("Sidekiq/SadWorker") - expect(event["breadcrumbs"]["values"][0]["message"]).to eq("I'm sad!") - end - - it "clears context after raising" do - process_job("SadWorker") - process_job("VerySadWorker") - - event = JSON.parse(Raven.client.transport.events.last[1]) - - expect(event["tags"]).to eq("mood" => "very sad") - expect(event["breadcrumbs"]["values"][0]["message"]).to eq("I'm very sad!") - end - - it "captures exceptions raised during events" do - Sidekiq.options[:lifecycle_events][:startup] = [proc { raise "Uhoh!" }] - @processor.fire_event(:startup) - - event = JSON.parse(Raven.client.transport.events.last[1]) - - expect(event["logentry"]["message"]).to eq "Uhoh!" - expect(event["transaction"]).to eq "Sidekiq/startup" - end - - it "has some context when capturing, even if no exception raised" do - process_job("ReportingWorker") - - event = JSON.parse(Raven.client.transport.events.last[1]) - - expect(event["logentry"]["message"]).to eq "I have something to say!" - expect(event["extra"]["sidekiq"]).to eq("class" => "ReportingWorker", "queue" => "default") - end -end diff --git a/sentry-raven/spec/raven/interface_spec.rb b/sentry-raven/spec/raven/interface_spec.rb deleted file mode 100644 index 7ae0e467a..000000000 --- a/sentry-raven/spec/raven/interface_spec.rb +++ /dev/null @@ -1,37 +0,0 @@ -require 'spec_helper' - -class TestInterface < Raven::Interface - attr_accessor :some_attr -end - -RSpec.describe Raven::Interface do - it "should register an interface when a new class is defined" do - expect(Raven::Interface.registered[:test]).to eq(TestInterface) - end - - it "can be initialized with some attributes" do - interface = TestInterface.new(:some_attr => "test") - expect(interface.some_attr).to eq("test") - end - - it "can initialize with a block" do - interface = TestInterface.new { |int| int.some_attr = "test" } - expect(interface.some_attr).to eq("test") - end - - it "serializes to a Hash" do - interface = TestInterface.new(:some_attr => "test") - expect(interface.to_hash).to eq(:some_attr => "test") - end -end - -RSpec.describe Raven::MessageInterface do - it "supports invalid format string message when params is not defined" do - interface = Raven::MessageInterface.new(:params => nil, :message => "test '%'") - expect(interface.unformatted_message).to eq("test '%'") - end - it "supports invalid format string message when params is empty" do - interface = Raven::MessageInterface.new(:message => "test '%'") - expect(interface.unformatted_message).to eq("test '%'") - end -end diff --git a/sentry-raven/spec/raven/interfaces/stack_trace_spec.rb b/sentry-raven/spec/raven/interfaces/stack_trace_spec.rb deleted file mode 100644 index f6ad60f71..000000000 --- a/sentry-raven/spec/raven/interfaces/stack_trace_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::StacktraceInterface::Frame do - it "should convert pathnames to strings" do - frame = Raven::StacktraceInterface::Frame.new - $LOAD_PATH.unshift Pathname.pwd # Oh no, a Pathname in the $LOAD_PATH! - frame.abs_path = __FILE__ - expect(frame.filename).to match(/stack_trace_spec.rb/) - $LOAD_PATH.shift - end -end diff --git a/sentry-raven/spec/raven/json_spec.rb b/sentry-raven/spec/raven/json_spec.rb deleted file mode 100644 index 9c511c48b..000000000 --- a/sentry-raven/spec/raven/json_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -# Raven sometimes has to deal with some weird JSON. This makes sure whatever -# JSON impl we use handles it in the way that we expect. - -require 'spec_helper' -require 'ostruct' - -RSpec.describe JSON do - data = [ - OpenStruct.new(:key => 'foo', :val => 'bar', :enc_key => '"foo"', :enc_val => '"bar"'), - OpenStruct.new(:key => :foo, :val => :bar, :enc_key => '"foo"', :enc_val => '"bar"'), - OpenStruct.new(:key => 1, :val => 1, :enc_key => '"1"', :enc_val => '1') - ] - - data.each do |obj| - it "works with #{obj.key.class} keys" do - expect(JSON.dump(obj.key => 'bar')).to eq "{#{obj.enc_key}:\"bar\"}" - end - - it "works with #{obj.val.class} values" do - expect(JSON.dump('bar' => obj.val)).to eq "{\"bar\":#{obj.enc_val}}" - end - - it "works with an array of #{obj.val.class}s" do - expect(JSON.dump('bar' => [obj.val])).to eq "{\"bar\":[#{obj.enc_val}]}" - end - - it "works with a hash of #{obj.val.class}s" do - expect(JSON.dump('bar' => { obj.key => obj.val })).to eq "{\"bar\":{#{obj.enc_key}:#{obj.enc_val}}}" - end - end - - it 'encodes anything that responds to to_s' do - data = [ - :symbol, - 1 / 0.0, - 0 / 0.0 - ] - expect(JSON.dump(data)).to eq "[\"symbol\",Infinity,NaN]" - end - - it 'resolves large numbers to Infinity' do - expect(JSON.parse("[123e090000000]")).to eq [+1.0 / 0.0] - end - - it 'it raises the correct error on strings that look like incomplete objects' do - expect { JSON.parse("{") }.to raise_error(JSON::ParserError) - expect { JSON.parse("[") }.to raise_error(JSON::ParserError) - end - - it "accepts any encoding which is internally valid" do - expect do - JSON.parse(%({"example": "this is a utf8 or ASCII string"})) - end.not_to raise_error - - expect do - JSON.parse(%({"example": "this is a utf8 or ASCII string"}).encode("utf-16")) - end.not_to raise_error - - expect do - JSON.parse(%({"example": "this is a utf8 or ASCII string"}).encode("US-ASCII")) - end.not_to raise_error - end -end diff --git a/sentry-raven/spec/raven/linecache_spec.rb b/sentry-raven/spec/raven/linecache_spec.rb deleted file mode 100644 index 4edda6e10..000000000 --- a/sentry-raven/spec/raven/linecache_spec.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'spec_helper' -# rubocop:disable Style/WordArray -RSpec.describe Raven::LineCache do - describe "#get_file_context" do - it "returns an array of nils if the path is not valid" do - expect(subject.get_file_context("/nonexist", 1, 10)).to eq([nil, nil, nil]) - end - - it "returns a variable size depending on context" do - expect(subject.get_file_context("spec/support/linecache.txt", 3, 2)).to eq( - [ - ["foo\n", "bar\n"], - "baz\n", - ["qux\n", "lorem\n"] - ] - ) - end - - it "returns nil if line doesnt exist" do - expect(subject.get_file_context("spec/support/linecache.txt", 1, 2)).to eq( - [ - [nil, nil], - "foo\n", - ["bar\n", "baz\n"] - ] - ) - end - - it "returns a different section of the file based on lineno" do - expect(subject.get_file_context("./spec/support/linecache.txt", 4, 2)).to eq( - [ - ["bar\n", "baz\n"], - "qux\n", - ["lorem\n", "ipsum\n"] - ] - ) - end - end -end -# rubocop:enable Style/WordArray diff --git a/sentry-raven/spec/raven/logger_spec.rb b/sentry-raven/spec/raven/logger_spec.rb deleted file mode 100644 index 638fff8a9..000000000 --- a/sentry-raven/spec/raven/logger_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Logger do - it "should log to a given IO" do - stringio = StringIO.new - log = Raven::Logger.new(stringio) - - log.fatal("Oh noes!") - - expect(stringio.string).to end_with("FATAL -- sentry: ** [Raven] Oh noes!\n") - end - - it "should allow exceptions to be logged" do - stringio = StringIO.new - log = Raven::Logger.new(stringio) - - log.fatal(Exception.new("Oh exceptions")) - - expect(stringio.string).to end_with("FATAL -- sentry: ** [Raven] Oh exceptions\n") - end -end diff --git a/sentry-raven/spec/raven/processors/cookies_spec.rb b/sentry-raven/spec/raven/processors/cookies_spec.rb deleted file mode 100644 index f13bc702f..000000000 --- a/sentry-raven/spec/raven/processors/cookies_spec.rb +++ /dev/null @@ -1,63 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::Cookies do - before do - @client = double("client") - @processor = Raven::Processor::Cookies.new(@client) - end - - it 'should remove cookies' do - test_data = { - :request => { - :headers => { - "Cookie" => { "_sentry-testapp_session" => "SlRKVnNha2Z" }, - "AnotherHeader" => "still_here" - }, - :cookies => { "_sentry-testapp_session" => "SlRKVnNha2Z" }, - :some_other_data => "still_here" - } - } - - result = @processor.process(test_data) - - expect(result[:request][:cookies]).to eq({ "_sentry-testapp_session" => "********" }) - expect(result[:request][:headers]["Cookie"]).to eq({ "_sentry-testapp_session" => "********" }) - expect(result[:request][:some_other_data]).to eq("still_here") - expect(result[:request][:headers]["AnotherHeader"]).to eq("still_here") - end - - it 'should remove cookies even if keys are strings' do - test_data = { - "request" => { - "headers" => { - "Cookie" => { "_sentry-testapp_session" => "SlRKVnNha2Z" }, - "AnotherHeader" => "still_here" - }, - "cookies" => { "_sentry-testapp_session" => "SlRKVnNha2Z" }, - "some_other_data" => "still_here" - } - } - - result = @processor.process(test_data) - - expect(result["request"]["cookies"]).to eq({ "_sentry-testapp_session" => "********" }) - expect(result["request"]["headers"]["Cookie"]).to eq({ "_sentry-testapp_session" => "********" }) - expect(result["request"]["some_other_data"]).to eq("still_here") - expect(result["request"]["headers"]["AnotherHeader"]).to eq("still_here") - end - - it 'does not fail if it runs after Processor::RemoveCircularReferences' do - test_data = { - :request => { - :headers => { - "Cookie" => Raven::Processor::RemoveCircularReferences::ELISION_STRING, - "AnotherHeader" => "still_here" - }, - :cookies => Raven::Processor::RemoveCircularReferences::ELISION_STRING, - :some_other_data => "still_here" - } - } - - @processor.process(test_data) - end -end diff --git a/sentry-raven/spec/raven/processors/http_headers_spec.rb b/sentry-raven/spec/raven/processors/http_headers_spec.rb deleted file mode 100644 index 90979cfb7..000000000 --- a/sentry-raven/spec/raven/processors/http_headers_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::HTTPHeaders do - before do - @client = double("client") - allow(@client).to receive_message_chain(:configuration, :sanitize_http_headers) { ['User-Defined-Header'] } - @processor = Raven::Processor::HTTPHeaders.new(@client) - end - - it 'should remove HTTP headers we dont like' do - data = { - :request => { - :headers => { - "Authorization" => "dontseeme", - "AnotherHeader" => "still_here" - } - } - } - - result = @processor.process(data) - - expect(result[:request][:headers]["Authorization"]).to eq("********") - expect(result[:request][:headers]["AnotherHeader"]).to eq("still_here") - end - - it 'should be configurable' do - data = { - :request => { - :headers => { - "User-Defined-Header" => "dontseeme", - "AnotherHeader" => "still_here" - } - } - } - - result = @processor.process(data) - - expect(result[:request][:headers]["User-Defined-Header"]).to eq("********") - expect(result[:request][:headers]["AnotherHeader"]).to eq("still_here") - end - - it "should remove headers even if the keys are strings" do - data = { - "request" => { - "headers" => { - "Authorization" => "dontseeme", - "AnotherHeader" => "still_here" - } - } - } - - result = @processor.process(data) - - expect(result["request"]["headers"]["Authorization"]).to eq("********") - expect(result["request"]["headers"]["AnotherHeader"]).to eq("still_here") - end -end diff --git a/sentry-raven/spec/raven/processors/post_data_spec.rb b/sentry-raven/spec/raven/processors/post_data_spec.rb deleted file mode 100644 index f6c3e2f75..000000000 --- a/sentry-raven/spec/raven/processors/post_data_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::PostData do - before do - @client = double("client") - @processor = Raven::Processor::PostData.new(@client) - end - - it 'should remove post data when HTTP method is POST' do - data = { - :request => { - :method => "POST", - :data => { - "sensitive_stuff" => "TOP_SECRET-GAMMA" - } - } - } - - result = @processor.process(data) - - expect(result[:request][:data]).to eq("********") - end - - it 'should NOT remove post data when HTTP method is not POST' do - data = { - :request => { - :method => "GET", - :data => { - "sensitive_stuff" => "TOP_SECRET-GAMMA" - } - } - } - - result = @processor.process(data) - - expect(result[:request][:data]).to eq("sensitive_stuff" => "TOP_SECRET-GAMMA") - end - - it 'should remove post data when HTTP method is POST and keys are strings' do - data = { - "request" => { - "method" => "POST", - "data" => { - "sensitive_stuff" => "TOP_SECRET-GAMMA" - } - } - } - - result = @processor.process(data) - - expect(result["request"]["data"]).to eq("********") - end -end diff --git a/sentry-raven/spec/raven/processors/removecirculareferences_spec.rb b/sentry-raven/spec/raven/processors/removecirculareferences_spec.rb deleted file mode 100644 index eb2bc7a94..000000000 --- a/sentry-raven/spec/raven/processors/removecirculareferences_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::RemoveCircularReferences do - before do - @client = double("client") - @processor = Raven::Processor::RemoveCircularReferences.new(@client) - end - - it 'should cleanup circular references' do - data = {} - data['data'] = data - data['ary'] = [] - data['ary'].push('x' => data['ary']) - data['ary2'] = data['ary'] - data['leave intact'] = { 'not a circular reference' => true } - - result = @processor.process(data) - expect(result['data']).to eq('(...)') - expect(result['ary'].first['x']).to eq('(...)') - expect(result['ary2']).to eq("(...)") - expect(result['leave intact']).to eq('not a circular reference' => true) - end -end diff --git a/sentry-raven/spec/raven/processors/removestacktrace_spec.rb b/sentry-raven/spec/raven/processors/removestacktrace_spec.rb deleted file mode 100644 index e77385b81..000000000 --- a/sentry-raven/spec/raven/processors/removestacktrace_spec.rb +++ /dev/null @@ -1,56 +0,0 @@ -require 'spec_helper' -require 'raven/processor/removestacktrace' - -RSpec.describe Raven::Processor::RemoveStacktrace do - before do - @client = double("client") - @processor = Raven::Processor::RemoveStacktrace.new(@client) - end - - it 'should remove stacktraces' do - data = Raven.capture_exception(build_exception).to_hash - - expect(data[:exception][:values][0][:stacktrace]).to_not eq(nil) - result = @processor.process(data) - - expect(result[:exception][:values][0][:stacktrace]).to eq(nil) - end - - # Only check causes when they're supported - if Exception.new.respond_to? :cause - it 'should remove stacktraces from causes' do - data = Raven.capture_exception(build_exception_with_cause).to_hash - - expect(data[:exception][:values][0][:stacktrace]).to_not eq(nil) - expect(data[:exception][:values][1][:stacktrace]).to_not eq(nil) - result = @processor.process(data) - - expect(result[:exception][:values][0][:stacktrace]).to eq(nil) - expect(result[:exception][:values][1][:stacktrace]).to eq(nil) - end - - it 'should remove stacktraces from nested causes' do - data = Raven.capture_exception(build_exception_with_two_causes).to_hash - - expect(data[:exception][:values][0][:stacktrace]).to_not eq(nil) - expect(data[:exception][:values][1][:stacktrace]).to_not eq(nil) - expect(data[:exception][:values][2][:stacktrace]).to_not eq(nil) - result = @processor.process(data) - - expect(result[:exception][:values][0][:stacktrace]).to eq(nil) - expect(result[:exception][:values][1][:stacktrace]).to eq(nil) - expect(result[:exception][:values][2][:stacktrace]).to eq(nil) - end - end - - if defined?(Rails) # depends on activesupport - it 'should remove stacktraces even when keys are strings' do - data = Raven.capture_exception(build_exception).to_hash.deep_stringify_keys - - expect(data["exception"]["values"][0]["stacktrace"]).to_not eq(nil) - result = @processor.process(data) - - expect(result["exception"]["values"][0]["stacktrace"]).to eq(nil) - end - end -end diff --git a/sentry-raven/spec/raven/processors/sanitizedata_processor_spec.rb b/sentry-raven/spec/raven/processors/sanitizedata_processor_spec.rb deleted file mode 100644 index 8097f9e4f..000000000 --- a/sentry-raven/spec/raven/processors/sanitizedata_processor_spec.rb +++ /dev/null @@ -1,298 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::SanitizeData do - before do - config = Struct.new(:sanitize_fields, :sanitize_credit_cards, :sanitize_fields_excluded).new([], true, []) - client = Struct.new(:configuration).new(config) - @processor = Raven::Processor::SanitizeData.new(client) - end - - context 'configuration for sanitize fields' do - it 'should union default sanitize fields with user-defined sanitize fields' do - fields = Raven::Processor::SanitizeData::DEFAULT_FIELDS | %w(test monkeybutt) - - @processor.sanitize_fields = fields - expected_sensitive_fields = /authorization|password|passwd|secret|ssn|social(.*)?sec|\btest\b|\bmonkeybutt\b/i - - expect(@processor.send(:sensitive_fields)).to eq(expected_sensitive_fields) - end - - it 'should remove default fields if specified by sanitize_fields_excluded' do - @processor.sanitize_fields_excluded = %w(authorization) - - expected_sensitive_fields = /password|passwd|secret|ssn|social(.*)?sec/i - - expect(@processor.send(:sensitive_fields)).to eq(expected_sensitive_fields) - end - - it 'accepts regex-like strings' do - @processor.sanitize_fields = ["foo(.*)?bar"] - - expected_sensitive_fields = /authorization|password|passwd|secret|ssn|social(.*)?sec|foo(.*)?bar/i - - expect(@processor.send(:sensitive_fields)).to eq(expected_sensitive_fields) - end - end - - it 'should filter http data' do - @processor.sanitize_fields = ['user_field'] - - data = { - 'sentry.interfaces.Http' => { - 'data' => { - 'foo' => 'bar', - 'password' => 'hello', - 'the_secret' => 'hello', - 'a_password_here' => 'hello', - 'mypasswd' => 'hello', - 'test' => 1, - :ssn => '123-45-6789', # test symbol handling - 'social_security_number' => 123456789, - 'user_field' => 'user', - 'user_field_foo' => 'hello', - 'query_string' => 'foo=bar%E9' # test utf8 handling - } - } - } - - result = @processor.process(data) - - vars = result["sentry.interfaces.Http"]["data"] - expect(vars["foo"]).to eq("bar") - expect(vars["password"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["the_secret"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["a_password_here"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["mypasswd"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["test"]).to eq(1) - expect(vars[:ssn]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["social_security_number"]).to eq(Raven::Processor::SanitizeData::INT_MASK) - expect(vars["user_field"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["user_field_foo"]).to eq('hello') - expect(vars["query_string"]).to match('foo=bar') - end - - it "filters out hash paird under sensitive keys" do - data = { - 'sentry.interfaces.Http' => { - 'data' => { - 'foo' => 'bar', - :password => { - 'new' => 'test' - }, - "passwd" => { - 'new' => 'test' - } - } - } - } - - result = @processor.process(data) - vars = result["sentry.interfaces.Http"]["data"] - expect(vars[:password]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["passwd"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - end - - it 'should filter json data' do - @processor.sanitize_fields = ['user_field'] - - data_with_json = { - 'json' => { - 'foo' => 'bar', - 'password' => 'hello', - 'the_secret' => 'hello', - 'a_password_here' => 'hello', - 'mypasswd' => 'hello', - 'test' => 1, - 'ssn' => '123-45-6789', - 'social_security_number' => 123456789, - 'user_field' => 'user', - 'user_field_foo' => 'hello' - }.to_json - } - - result = JSON.parse(@processor.process(data_with_json)['json']) - - vars = result - expect(vars["foo"]).to eq("bar") - expect(vars["password"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["the_secret"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["a_password_here"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["mypasswd"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["test"]).to eq(1) - expect(vars["ssn"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["social_security_number"]).to eq(Raven::Processor::SanitizeData::INT_MASK) - expect(vars["user_field"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(vars["user_field_foo"]).to eq('hello') - end - - it 'should filter json embedded in a ruby object' do - data_with_embedded_json = { - 'data' => { - 'json' => %w(foo bar).to_json, - 'json_hash' => { 'foo' => 'bar' }.to_json, - 'sensitive' => { 'password' => 'secret' }.to_json - } - } - - result = @processor.process(data_with_embedded_json) - - expect(JSON.parse(result["data"]["json"])).to eq(%w(foo bar)) - expect(JSON.parse(result["data"]["json_hash"])).to eq('foo' => 'bar') - expect(JSON.parse(result["data"]["sensitive"])).to eq('password' => Raven::Processor::SanitizeData::STRING_MASK) - end - - it 'should not fail when json is invalid' do - data_with_invalid_json = { - 'data' => { - 'invalid' => "{\r\n\"key\":\"value\",\r\n \"foo\":{\"bar\":\"baz\"}\r\n" - } - } - - result = @processor.process(data_with_invalid_json) - - expect { JSON.parse(result["data"]["invalid"]) }.to raise_exception(JSON::ParserError) - end - - it 'should filter credit card values' do - data = { - 'ccnumba' => '4242424242424242', - 'ccnumba_int' => 4242424242424242 - } - - result = @processor.process(data) - expect(result["ccnumba"]).to eq(Raven::Processor::SanitizeData::STRING_MASK) - expect(result["ccnumba_int"]).to eq(Raven::Processor::SanitizeData::INT_MASK) - end - - it 'should pass through credit card values if configured' do - @processor.sanitize_credit_cards = false - data = { - 'ccnumba' => '4242424242424242', - 'ccnumba_int' => 4242424242424242 - } - - result = @processor.process(data) - expect(result["ccnumba"]).to eq('4242424242424242') - expect(result["ccnumba_int"]).to eq(4242424242424242) - end - - it 'sanitizes hashes nested in arrays' do - data = { - "empty_array" => [], - "array" => [{ 'password' => 'secret' }] - } - - result = @processor.process(data) - - expect(result["array"][0]['password']).to eq(Raven::Processor::SanitizeData::STRING_MASK) - end - - context "unparseable plain text" do - it "still sanitizes sensitive fields in string data" do - text = <<~ERR - unexpected token at '{ - "role": "admin","password": "Abc@123","foo": "bar" - }' - ERR - result = @processor.process(text) - - expect(result).to eq( - <<~ERR - unexpected token at '{ - "role": "admin","password": #{Raven::Processor::SanitizeData::STRING_MASK},"foo": "bar" - }' - ERR - ) - end - it "sanitizes different types of key/value format" do - texts = [ - "\"password\" => 'Abc@123'", - "\"password\" =>\"Abc@123\"", - "\"password\"=> \"Abc@123\"", - "'password'=> \"Abc@123\"", - "password: \"Abc@123\"", - "password: 'Abc@123'", - "password:'Abc@123'" - ] - - texts.each do |text| - result = @processor.process(text) - expect(result).not_to match(/Abc@123/) - end - end - end - - context "query strings" do - it 'sanitizes' do - data = { - 'sentry.interfaces.Http' => { - 'data' => { - 'query_string' => 'foo=bar&password=secret' - } - } - } - - result = @processor.process(data) - - vars = result["sentry.interfaces.Http"]["data"] - expect(vars["query_string"]).to_not include("secret") - end - - it 'handles :query_string as symbol' do - data = { - 'sentry.interfaces.Http' => { - 'data' => { - :query_string => 'foo=bar&password=secret' - } - } - } - - result = @processor.process(data) - - vars = result["sentry.interfaces.Http"]["data"] - expect(vars[:query_string]).to_not include("secret") - end - - it 'handles multiple values for a key' do - data = { - 'sentry.interfaces.Http' => { - 'data' => { - 'query_string' => 'foo=bar&foo=fubar&foo=barfoo' - } - } - } - - result = @processor.process(data) - - vars = result["sentry.interfaces.Http"]["data"] - query_string = vars["query_string"].split('&') - expect(query_string).to include("foo=bar") - expect(query_string).to include("foo=fubar") - expect(query_string).to include("foo=barfoo") - end - - it 'handles url encoded keys and values' do - encoded_query_string = 'Bio+4%24=cA%24%7C-%7C+M%28%29n3%5E' - data = { - 'sentry.interfaces.Http' => { - 'data' => { - 'query_string' => encoded_query_string - } - } - } - - result = @processor.process(data) - - vars = result["sentry.interfaces.Http"]["data"] - expect(vars["query_string"]).to eq(encoded_query_string) - end - - # Sometimes this sort of thing can show up in request headers, e.g. - # X-REQUEST-START on Heroku - it 'does not censor milliseconds since the epoch' do - result = @processor.process(:millis_since_epoch => 1507671610403.to_s) - - expect(result).to eq(:millis_since_epoch => 1507671610403.to_s) - end - end -end diff --git a/sentry-raven/spec/raven/processors/utf8conversion_spec.rb b/sentry-raven/spec/raven/processors/utf8conversion_spec.rb deleted file mode 100644 index 0737b26b3..000000000 --- a/sentry-raven/spec/raven/processors/utf8conversion_spec.rb +++ /dev/null @@ -1,79 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Processor::UTF8Conversion do - before do - @client = double("client") - @processor = Raven::Processor::UTF8Conversion.new(@client) - @bad_utf8_string = "invalid utf8 string goes here\255".dup.force_encoding('UTF-8') - end - - it "has a utf8 fixture which is not valid utf-8" do - expect(@bad_utf8_string.valid_encoding?).to eq(false) - expect { @bad_utf8_string.match("") }.to raise_error(ArgumentError) - end - - it 'should cleanup invalid UTF-8 bytes' do - data = {} - data['invalid'] = @bad_utf8_string - - results = @processor.process(data) - expect(results['invalid']).to eq("invalid utf8 string goes here") - end - - it "should cleanup invalid UTF-8 bytes in Exception messages" do - data = Exception.new(@bad_utf8_string) - - results = @processor.process(data) - expect(results.message).to eq("invalid utf8 string goes here") - end - - it 'should keep valid UTF-8 bytes after cleaning' do - data = {} - data['invalid'] = "한국, 中國, 日本(にっぽん)\255".dup.force_encoding('UTF-8') - - results = @processor.process(data) - expect(results['invalid']).to eq("한국, 中國, 日本(にっぽん)") - end - - it 'should work recursively on hashes' do - data = { 'nested' => {} } - data['nested']['invalid'] = @bad_utf8_string - - results = @processor.process(data) - expect(results['nested']['invalid']).to eq("invalid utf8 string goes here") - end - - it 'should work recursively on arrays' do - data = ['good string', 'good string', - ['good string', @bad_utf8_string]] - - results = @processor.process(data) - expect(results[2][1]).to eq("invalid utf8 string goes here") - end - - it 'should not blow up on symbols' do - data = { :key => :value } - - results = @processor.process(data) - expect(results[:key]).to eq(:value) - end - - it "deals with unicode hidden in ASCII_8BIT" do - data = ["\xE2\x9C\x89 Hello".dup.force_encoding(Encoding::ASCII_8BIT)] - - results = @processor.process(data) - - # Calling JSON.generate here to simulate this value eventually being fed - # to JSON generator in the client for transport, we're looking to see - # if encoding errors are raised - expect(JSON.generate(results)).to eq("[\"✉ Hello\"]") - end - - it "deals with unicode hidden in ASCII_8BIT when the string is frozen" do - data = ["\xE2\x9C\x89 Hello".dup.force_encoding(Encoding::ASCII_8BIT).freeze] - - results = @processor.process(data) - - expect(JSON.generate(results)).to eq("[\"✉ Hello\"]") - end -end diff --git a/sentry-raven/spec/raven/raven_spec.rb b/sentry-raven/spec/raven/raven_spec.rb deleted file mode 100644 index df2db4ca2..000000000 --- a/sentry-raven/spec/raven/raven_spec.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven do - let(:event) { Raven::Event.new(:id => "event_id") } - let(:options) { double("options") } - - before do - allow(Raven.instance).to receive(:send_event) - allow(Raven::Event).to receive(:from_message) { event } - allow(Raven::Event).to receive(:from_exception) { event } - end - - describe '.capture' do - context 'not given a block' do - let(:options) { { :key => 'value' } } - - def capture_in_separate_process - pipe_in, pipe_out = IO.pipe - - fork do - pipe_in.close - described_class.capture(options) - - allow(Raven.instance).to receive(:capture_type) do |exception, _options| - pipe_out.puts exception.message - end - - # silence process - $stderr.reopen('/dev/null', 'w') - $stdout.reopen('/dev/null', 'w') - - yield - exit - end - - pipe_out.close - captured_messages = pipe_in.read - pipe_in.close - # sometimes the at_exit hook was registered multiple times - captured_messages.split("\n").last - end - - it 'does not yield' do - # As there is no yield matcher that does not require a probe (e.g. this - # is not valid: expect { |b| described_class.capture }.to_not yield_control), - # expect that a LocalJumpError, which is raised when yielding when no - # block is defined, is not raised. - described_class.capture - end - - it 'installs an at exit hook that will capture exceptions' do - skip('fork not supported in jruby') if RUBY_PLATFORM == 'java' - captured_message = capture_in_separate_process { raise 'test error' } - expect(captured_message).to eq('test error') - end - end - end - - describe '.inject_only' do - before do - allow(Gem.loaded_specs).to receive(:keys).and_return(%w(railties rack sidekiq)) - end - - it 'loads integrations when they are valid configurations' do - expect(Raven).to receive(:load_integration).once.with('railties') - expect(Raven).to receive(:load_integration).once.with('sidekiq') - - Raven.inject_only(:railties, :sidekiq) - end - - it 'skips any integrations that are not supported' do - expect(Raven).to receive(:load_integration).once.with('railties') - expect(Raven.logger).to receive(:warn).with('Integrations do not exist: doesnot, exist') - - Raven.inject_only(:railties, :doesnot, :exist) - end - - it 'skips any integrations that are not loaded in the gemspec' do - expect(Raven).to receive(:load_integration).once.with('railties') - - Raven.inject_only(:railties, :delayed_job) - end - end - - describe '.inject_without' do - before do - allow(Gem.loaded_specs).to receive(:keys).and_return(Raven::AVAILABLE_INTEGRATIONS) - end - - it 'injects all integrations except those passed as an argument' do - expect(Raven).to receive(:load_integration).once.with('rake') - - Raven.inject_without(:delayed_job, :logger, :railties, :sidekiq, :rack, :"rack-timeout") - end - end - - describe "#sys_command" do - it "should execute system commands" do - expect(Raven.sys_command("echo 'Sentry'")).to eq("Sentry") - end - - it "should return nil if a system command doesn't exist" do - expect(Raven.sys_command("asdasdasdsa")).to eq(nil) - end - - it "should return nil if the process exits with a non-zero exit status" do - expect(Raven.sys_command("uname -c")).to eq(nil) # non-existent uname option - end - - it "should not output to stdout on failure" do - expect { Raven.sys_command("asdasdasdsa") }.to_not output.to_stdout - expect { Raven.sys_command("uname -c") }.to_not output.to_stdout - end - - it "should tolerate a missing $CHILD_STATUS" do - Signal.trap('CLD', 'DEFAULT') - expect(Raven.sys_command("echo 'Sentry'")).to eq("Sentry") - end - end -end diff --git a/sentry-raven/spec/raven/transports/http_spec.rb b/sentry-raven/spec/raven/transports/http_spec.rb deleted file mode 100644 index 0cd9422e6..000000000 --- a/sentry-raven/spec/raven/transports/http_spec.rb +++ /dev/null @@ -1,74 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Transports::HTTP do - let(:config) { Raven::Configuration.new.tap { |c| c.dsn = 'http://12345@sentry.localdomain/sentry/42' } } - let(:client) { Raven::Client.new(config) } - - it 'should set a custom User-Agent' do - expect(client.send(:transport).conn.headers[:user_agent]).to eq("sentry-ruby/#{Raven::VERSION}") - end - - context "when event is not allowed (by sampling)" do - let(:event) do - JSON.generate(Raven.capture_message("test").to_hash) - end - - before do - config.sample_rate = 0.5 - allow(Random::DEFAULT).to receive(:rand).and_return(0.6) - end - - it "logs correct message" do - expect(config.logger).to receive(:debug).with("Raven HTTP Transport connecting to http://sentry.localdomain/sentry") - expect(config.logger).to receive(:debug).with("Event not sent: Excluded by random sample") - client.transport.send_event("test_auth", event) - end - end - - it 'should raise an error on 4xx responses' do - stubs = Faraday::Adapter::Test::Stubs.new do |stub| - stub.post('sentry/api/42/store/') { [404, {}, 'not found'] } - end - client.configuration.http_adapter = [:test, stubs] - - event = JSON.generate(Raven.capture_message("test").to_hash) - expect { client.send(:transport).send_event("test", event) }.to raise_error(Raven::Error, /the server responded with status 404/) - - stubs.verify_stubbed_calls - end - - it 'should raise an error on 5xx responses' do - stubs = Faraday::Adapter::Test::Stubs.new do |stub| - stub.post('sentry/api/42/store/') { [500, {}, 'error'] } - end - client.configuration.http_adapter = [:test, stubs] - - event = JSON.generate(Raven.capture_message("test").to_hash) - expect { client.send(:transport).send_event("test", event) }.to raise_error(Raven::Error, /the server responded with status 500/) - - stubs.verify_stubbed_calls - end - - it 'should add header info message to the error' do - stubs = Faraday::Adapter::Test::Stubs.new do |stub| - stub.post('sentry/api/42/store/') { [400, { 'x-sentry-error' => 'error_in_header' }, 'error'] } - end - client.configuration.http_adapter = [:test, stubs] - - event = JSON.generate(Raven.capture_message("test").to_hash) - expect { client.send(:transport).send_event("test", event) }.to raise_error(Raven::Error, /error_in_header/) - - stubs.verify_stubbed_calls - end - - it 'allows to customise faraday' do - builder = spy('faraday_builder') - expect(Faraday).to receive(:new).and_yield(builder) - - client.configuration.faraday_builder = proc { |b| b.request :instrumentation } - - client.send(:transport) - - expect(builder).to have_received(:request).with(:instrumentation) - end -end diff --git a/sentry-raven/spec/raven/transports/stdout_spec.rb b/sentry-raven/spec/raven/transports/stdout_spec.rb deleted file mode 100644 index 9430fd313..000000000 --- a/sentry-raven/spec/raven/transports/stdout_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Transports::Stdout do - let(:config) { Raven::Configuration.new.tap { |c| c.dsn = 'stdout://12345:67890@sentry.localdomain/sentry/42' } } - let(:client) { Raven::Client.new(config) } - - it 'should write to stdout' do - event = JSON.generate(Raven.capture_message("this is an STDOUT transport test").to_hash) - expect { client.send(:transport).send_event("stdout test", event) }.to output(/\"message\":\"this is an STDOUT transport test\"/).to_stdout - end -end diff --git a/sentry-raven/spec/raven/utils/context_filter_spec.rb b/sentry-raven/spec/raven/utils/context_filter_spec.rb deleted file mode 100644 index d03e163ca..000000000 --- a/sentry-raven/spec/raven/utils/context_filter_spec.rb +++ /dev/null @@ -1,41 +0,0 @@ -require "spec_helper" - -require "raven/utils/context_filter" - -RSpec.describe Raven::Utils::ContextFilter do - context "filters out ActiveJob keys from context" do - let(:context) do - { :_aj_globalid => "gid://app/model/id", :key => "value" } - end - let(:expected_context) do - { "globalid" => "gid://app/model/id", :key => "value" } - end - - it "removes reserved keys" do - new_context = described_class.filter_context(context) - - expect(new_context).to eq(expected_context) - end - end - - context "filters out ActiveJob keys from nested context" do - let(:context) do - { - :_aj_globalid => "gid://app/model/id", - :arguments => { :key => "value", :_aj_symbol_keys => ["key"] } - } - end - let(:expected_context) do - { - "globalid" => "gid://app/model/id", - :arguments => { :key => "value", "symbol_keys" => ["key"] } - } - end - - it "removes reserved keys" do - new_context = described_class.filter_context(context) - - expect(new_context).to eq(expected_context) - end - end -end diff --git a/sentry-raven/spec/raven/utils/exception_cause_chain_spec.rb b/sentry-raven/spec/raven/utils/exception_cause_chain_spec.rb deleted file mode 100644 index 823c7981f..000000000 --- a/sentry-raven/spec/raven/utils/exception_cause_chain_spec.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Utils::ExceptionCauseChain do - describe '.exception_to_array' do - # Only check causes when they're supported - if Exception.new.respond_to? :cause - context 'when the ruby version supports exception causes' do - context 'when the exception has a cause' do - let(:exception) { build_exception_with_cause } - - it 'captures the cause' do - expect(described_class.exception_to_array(exception).length).to eq(2) - end - end - - context 'when the exception has nested causes' do - let(:exception) { build_exception_with_two_causes } - - it 'captures nested causes' do - expect(described_class.exception_to_array(exception).length).to eq(3) - end - end - - context 'when the exception has a recursive cause' do - let(:exception) { build_exception_with_recursive_cause } - - it 'should handle it gracefully' do - expect(described_class.exception_to_array(exception).length).to eq(1) - end - end - end - else - context 'when the ruby version does not support exception causes' do - let(:exception) { build_exception_with_two_causes } - - it 'returns the passed in exception' do - expect(described_class.exception_to_array(exception)).to eq [exception] - end - end - end - end -end diff --git a/sentry-raven/spec/raven/utils/real_ip_spec.rb b/sentry-raven/spec/raven/utils/real_ip_spec.rb deleted file mode 100644 index 5c821874c..000000000 --- a/sentry-raven/spec/raven/utils/real_ip_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -require 'spec_helper' - -RSpec.describe Raven::Utils::RealIp do - context "when no ip addresses are provided other than REMOTE_ADDR" do - subject { Raven::Utils::RealIp.new(:remote_addr => "1.1.1.1") } - - it "should return the remote_addr" do - expect(subject.calculate_ip).to eq("1.1.1.1") - end - end - - context "when a list of x-forwarded-for ips is provided" do - subject do - Raven::Utils::RealIp.new( - :forwarded_for => "192.168.0.2, 2.2.2.2, 3.3.3.3, 4.4.4.4", - :remote_addr => "192.168.0.1" - ) - end - - it "should return the oldest ancestor that is not a local IP" do - expect(subject.calculate_ip).to eq("2.2.2.2") - end - end - - context "when client/real ips are provided" do - subject do - Raven::Utils::RealIp.new( - :forwarded_for => "2.2.2.2", - :real_ip => "4.4.4.4", - :client_ip => "3.3.3.3", - :remote_addr => "192.168.0.1" - ) - end - - it "should return the oldest ancestor, preferring client/real ips first" do - expect(subject.calculate_ip).to eq("3.3.3.3") - end - end - - context "all provided ip addresses are actually local addresses" do - subject do - Raven::Utils::RealIp.new( - :forwarded_for => "127.0.0.1, ::1, 10.0.0.0", - :remote_addr => "192.168.0.1" - ) - end - - it "should return REMOTE_ADDR" do - expect(subject.calculate_ip).to eq("192.168.0.1") - end - end - - context "when an invalid IP is provided" do - subject do - Raven::Utils::RealIp.new( - :forwarded_for => "4.4.4.4.4, 2.2.2.2", - :remote_addr => "192.168.0.1" - ) - end - - it "return the eldest valid IP" do - expect(subject.calculate_ip).to eq("2.2.2.2") - end - end - - context "with IPv6 ips" do - subject do - Raven::Utils::RealIp.new( - :forwarded_for => "2001:db8:a0b:12f0::1", - :remote_addr => "192.168.0.1" - ) - end - - it "return the eldest valid IP" do - expect(subject.calculate_ip).to eq("2001:db8:a0b:12f0::1") - end - end -end diff --git a/sentry-raven/spec/raven/utils/request_id_spec.rb b/sentry-raven/spec/raven/utils/request_id_spec.rb deleted file mode 100644 index 176a293b7..000000000 --- a/sentry-raven/spec/raven/utils/request_id_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -require "spec_helper" - -RSpec.describe Raven::Utils::RequestId do - describe ".read_from" do - subject { Raven::Utils::RequestId.read_from(env_hash) } - - context "when HTTP_X_REQUEST_ID is available" do - let(:env_hash) { { "HTTP_X_REQUEST_ID" => "request-id-sorta" } } - - it { is_expected.to eq("request-id-sorta") } - end - - context "when action_dispatch.request_id is available (from Rails middleware)" do - let(:env_hash) { { "action_dispatch.request_id" => "request-id-kinda" } } - - it { is_expected.to eq("request-id-kinda") } - end - - context "when no request-id is available" do - let(:env_hash) { { "foo" => "bar" } } - - it { is_expected.to be_nil } - end - end -end diff --git a/sentry-raven/spec/spec_helper.rb b/sentry-raven/spec/spec_helper.rb deleted file mode 100644 index e8300d9d2..000000000 --- a/sentry-raven/spec/spec_helper.rb +++ /dev/null @@ -1,90 +0,0 @@ -require 'pry' - -require 'simplecov' -SimpleCov.start do - project_name "sentry-raven" - root File.join(__FILE__, "../../../") - coverage_dir File.join(__FILE__, "../../coverage") -end - -if ENV["CI"] && ENV["CODECOV"] == "1" - require 'codecov' - SimpleCov.formatter = SimpleCov::Formatter::Codecov -end - -require 'sentry_raven_without_integrations' - -Raven.configure do |config| - config.dsn = "dummy://12345:67890@sentry.localdomain/sentry/42" - config.encoding = "json" - config.silence_ready = true - config.logger = Logger.new(nil) -end - -if ENV["RAILS_VERSION"] && (ENV["RAILS_VERSION"].to_i == 0) - RSpec.configure do |config| - config.filter_run_excluding :rails => true - end -else - require File.dirname(__FILE__) + "/support/test_rails_app/app.rb" - require "rspec/rails" -end - -RSpec.configure do |config| - config.mock_with(:rspec) { |mocks| mocks.verify_partial_doubles = true } - config.raise_errors_for_deprecations! - config.disable_monkey_patching! - Kernel.srand config.seed -end - -RSpec.shared_examples "Raven default capture behavior" do - it "captures exceptions" do - expect { block }.to raise_error(captured_class) - - expect(Raven.client.transport.events.size).to eq(1) - - event = JSON.parse!(Raven.client.transport.events.first[1]) - expect(event["exception"]["values"][0]["type"]).to eq(captured_class.name) - expect(event["exception"]["values"][0]["value"]).to eq(captured_message) - end -end - -def build_exception - 1 / 0 -rescue ZeroDivisionError => e - e -end - -def build_exception_with_cause(cause = "exception a") - begin - raise cause - rescue - raise "exception b" - end -rescue RuntimeError => e - e -end - -def build_exception_with_two_causes - begin - begin - raise "exception a" - rescue - raise "exception b" - end - rescue - raise "exception c" - end -rescue RuntimeError => e - e -end - -def build_exception_with_recursive_cause - backtrace = [] - - exception = double("Exception") - allow(exception).to receive(:cause).and_return(exception) - allow(exception).to receive(:message).and_return("example") - allow(exception).to receive(:backtrace).and_return(backtrace) - exception -end diff --git a/sentry-raven/spec/support/Rakefile b/sentry-raven/spec/support/Rakefile deleted file mode 100644 index 287bbea68..000000000 --- a/sentry-raven/spec/support/Rakefile +++ /dev/null @@ -1,12 +0,0 @@ -require 'rake' -require 'rubygems' -require 'raven' -require 'raven/transports/dummy' - -Raven.configure do |config| - config.dsn = 'dummy://12345:67890@sentry.localdomain/sentry/42' -end - -task :raise_exception do - 1 / 0 -end diff --git a/sentry-raven/spec/support/linecache.txt b/sentry-raven/spec/support/linecache.txt deleted file mode 100644 index bfd64c32c..000000000 --- a/sentry-raven/spec/support/linecache.txt +++ /dev/null @@ -1,6 +0,0 @@ -foo -bar -baz -qux -lorem -ipsum diff --git a/sentry-raven/spec/support/test_rails_app/app.rb b/sentry-raven/spec/support/test_rails_app/app.rb deleted file mode 100644 index 9559061b9..000000000 --- a/sentry-raven/spec/support/test_rails_app/app.rb +++ /dev/null @@ -1,59 +0,0 @@ -require 'rails' -# require "active_record/railtie" -require "action_view/railtie" -require "action_controller/railtie" -# require "action_mailer/railtie" -require "active_job/railtie" -# require "action_cable/engine" -# require "sprockets/railtie" -# require "rails/test_unit/railtie" -require 'raven/integrations/rails' - -ActiveSupport::Deprecation.silenced = true - -class TestApp < Rails::Application -end - -class HelloController < ActionController::Base - def exception - raise "An unhandled exception!" - end - - def view_exception - render inline: "<%= foo %>" - end - - def world - render :plain => "Hello World!" - end -end - -def make_basic_app - app = Class.new(TestApp) do - def self.name - "RailsTestApp" - end - end - - app.config.hosts = nil - app.config.secret_key_base = "test" - - # Usually set for us in production.rb - app.config.eager_load = true - app.routes.append do - get "/exception", :to => "hello#exception" - get "/view_exception", :to => "hello#view_exception" - root :to => "hello#world" - end - - app.initializer :configure_release do - Raven.configure do |config| - config.release = 'beta' - end - end - - app.initialize! - - Rails.application = app - app -end diff --git a/sentry-resque/Gemfile b/sentry-resque/Gemfile index 1279c191c..f3b188d0d 100644 --- a/sentry-resque/Gemfile +++ b/sentry-resque/Gemfile @@ -14,5 +14,5 @@ gem "resque-retry", "~> 1.8" group :rails do gem "sentry-rails", path: "../sentry-rails" - gem "rails" + gem "rails", "> 5.2.0" end diff --git a/sentry-resque/example/Gemfile b/sentry-resque/example/Gemfile deleted file mode 100644 index 20d98ac4a..000000000 --- a/sentry-resque/example/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "rails" -gem "sqlite3" -gem "resque" -gem "sentry-resque", path: "../" -gem "sentry-ruby", path: "../../sentry-ruby" - -gem "debug", github: "ruby/debug" diff --git a/sentry-resque/example/app.rb b/sentry-resque/example/app.rb deleted file mode 100644 index 2e85eca19..000000000 --- a/sentry-resque/example/app.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require "active_job" -require "resque" -require "sentry-resque" - -Sentry.init do |config| - config.breadcrumbs_logger = [:sentry_logger] - # replace it with your sentry dsn - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -class MyJob < ActiveJob::Base - self.queue_adapter = :resque - - def perform - raise "foo" - end -end - -worker = Resque::Worker.new(:default) - -MyJob.perform_later - -begin - worker.work(0) -rescue => e - puts("active job failed because of \"#{e.message}\"") -end - -class Foo - def self.perform - 1 / 0 - end -end - -Resque::Job.create(:default, Foo) - -begin - worker.work(0) -rescue => e - puts("inline job failed because of \"#{e.message}\"") -end diff --git a/sentry-resque/sentry-resque.gemspec b/sentry-resque/sentry-resque.gemspec index af055a296..e1c918d3f 100644 --- a/sentry-resque/sentry-resque.gemspec +++ b/sentry-resque/sentry-resque.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") diff --git a/sentry-resque/spec/sentry/resque_spec.rb b/sentry-resque/spec/sentry/resque_spec.rb index 993bd87fe..63b4dd354 100644 --- a/sentry-resque/spec/sentry/resque_spec.rb +++ b/sentry-resque/spec/sentry/resque_spec.rb @@ -66,7 +66,7 @@ def self.perform(msg) process_job(worker) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("report") expect(event[:tags]).to eq({ "resque.queue" => "default" }) expect(event[:contexts][:"Resque"]).to include({ job_class: "MessageJob", arguments: ["report"], queue: "default" }) @@ -88,7 +88,7 @@ def self.perform(msg) process_job(worker) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("tagged report") expect(event[:tags]).to include({ number: 1 }) @@ -97,7 +97,7 @@ def self.perform(msg) process_job(worker) expect(transport.events.count).to eq(2) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "resque.queue" => "default" }) end @@ -109,7 +109,7 @@ def self.perform(msg) end.to change { Resque::Stat.get("failed") }.by(1) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.resque", version: described_class::VERSION }) expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") @@ -123,7 +123,7 @@ def self.perform(msg) end.to change { Resque::Stat.get("failed") }.by(1) expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "resque.queue" => "default", number: 1 }) expect(Sentry.get_current_scope.extra).to eq({}) @@ -135,7 +135,7 @@ def self.perform(msg) end.to change { Resque::Stat.get("failed") }.by(1) expect(transport.events.count).to eq(2) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:tags]).to eq({ "resque.queue" => "default" }) expect(Sentry.get_current_scope.extra).to eq({}) expect(Sentry.get_current_scope.tags).to eq({}) @@ -161,7 +161,7 @@ def self.perform(msg) end end.to change { transport.events.count }.by(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.resque", version: described_class::VERSION }) expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") @@ -175,7 +175,7 @@ def self.perform(msg) end.to change { Resque::Stat.get("failed") }.by(1) .and change { transport.events.count }.by(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.resque", version: described_class::VERSION }) expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") @@ -201,7 +201,7 @@ def self.perform(msg) end end.to change { transport.events.count }.by(3) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.resque", version: described_class::VERSION }) expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") @@ -222,7 +222,7 @@ def self.perform(msg) process_job(worker) end.not_to raise_error(TypeError) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") end end @@ -284,7 +284,7 @@ def perform it "injects ActiveJob information to the event" do expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:message]).to eq("report from ActiveJob") expect(event[:tags]).to match({ "resque.queue" => "default", number: 1 }) expect(event[:contexts][:"Active-Job"][:job_class]).to eq("AJMessageJob") @@ -309,7 +309,7 @@ def perform it "injects ActiveJob information to the event" do expect(transport.events.count).to eq(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") expect(event[:tags]).to match({ "resque.queue" => "default", number: 2 }) expect(event[:contexts][:"Active-Job"][:job_class]).to eq("AJFailedJob") diff --git a/sentry-resque/spec/sentry/tracing_spec.rb b/sentry-resque/spec/sentry/tracing_spec.rb index bf81f9006..827d4ab20 100644 --- a/sentry-resque/spec/sentry/tracing_spec.rb +++ b/sentry-resque/spec/sentry/tracing_spec.rb @@ -35,10 +35,10 @@ def self.perform(msg) worker.work(0) expect(transport.events.count).to eq(2) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event[:message]).to eq("report") - tracing_event = transport.events.last.to_hash + tracing_event = transport.events.last.to_h expect(tracing_event[:transaction]).to eq("MessageJob") expect(tracing_event[:transaction_info]).to eq({ source: :task }) expect(tracing_event[:type]).to eq("transaction") @@ -53,10 +53,10 @@ def self.perform(msg) worker.work(0) expect(transport.events.count).to eq(2) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event.dig(:exception, :values, 0, :type)).to eq("ZeroDivisionError") - tracing_event = transport.events.last.to_hash + tracing_event = transport.events.last.to_h expect(tracing_event[:transaction]).to eq("FailedJob") expect(tracing_event[:transaction_info]).to eq({ source: :task }) expect(tracing_event[:type]).to eq("transaction") @@ -78,7 +78,7 @@ def self.perform(msg) worker.work(0) expect(transport.events.count).to eq(1) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event[:message]).to eq("report") end end diff --git a/sentry-ruby/Gemfile b/sentry-ruby/Gemfile index deb2dd79b..8771374c8 100644 --- a/sentry-ruby/Gemfile +++ b/sentry-ruby/Gemfile @@ -20,7 +20,7 @@ gem "timecop" gem "stackprof" unless RUBY_PLATFORM == "java" gem "vernier", platforms: :ruby if RUBY_VERSION >= "3.2.1" -gem "graphql", ">= 2.2.6" if RUBY_VERSION.to_f >= 2.7 +gem "graphql", ">= 2.2.6" gem "benchmark-ips" gem "benchmark_driver" diff --git a/sentry-ruby/benchmarks/allocation_comparison.rb b/sentry-ruby/benchmarks/allocation_comparison.rb index c765b2ff6..9a3b87bd9 100644 --- a/sentry-ruby/benchmarks/allocation_comparison.rb +++ b/sentry-ruby/benchmarks/allocation_comparison.rb @@ -5,7 +5,7 @@ require "sentry/benchmarks/benchmark_transport" Sentry.init do |config| - config.logger = ::Logger.new(nil) + config.sdk_logger = ::Logger.new(nil) config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" config.transport.transport_class = Sentry::BenchmarkTransport config.breadcrumbs_logger = [:sentry_logger] diff --git a/sentry-ruby/benchmarks/allocation_report.rb b/sentry-ruby/benchmarks/allocation_report.rb index 54fbd4139..36d7ece57 100644 --- a/sentry-ruby/benchmarks/allocation_report.rb +++ b/sentry-ruby/benchmarks/allocation_report.rb @@ -5,7 +5,7 @@ require "sentry/benchmarks/benchmark_transport" Sentry.init do |config| - config.logger = ::Logger.new(nil) + config.sdk_logger = ::Logger.new(nil) config.dsn = "dummy://12345:67890@sentry.localdomain:3000/sentry/42" config.transport.transport_class = Sentry::BenchmarkTransport config.breadcrumbs_logger = [:sentry_logger] diff --git a/sentry-ruby/examples/crons/Gemfile b/sentry-ruby/examples/crons/Gemfile deleted file mode 100644 index ec891db60..000000000 --- a/sentry-ruby/examples/crons/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '> 2.6' - -gem "rake" -gem 'sentry-ruby', path: "../../" diff --git a/sentry-ruby/examples/crons/README.md b/sentry-ruby/examples/crons/README.md deleted file mode 100644 index 7430bde64..000000000 --- a/sentry-ruby/examples/crons/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# sentry-ruby Crons example - -Crons monitoring allows you to track that certain that should be performed -on a certain schedule are indeed performed on time and without errors. See -[documentation](https://docs.sentry.io/platforms/ruby/crons/) for more details. - -This example project has a few rake tasks that manually send monitor check-ins -to Sentry. diff --git a/sentry-ruby/examples/crons/Rakefile.rb b/sentry-ruby/examples/crons/Rakefile.rb deleted file mode 100644 index b25f4eeac..000000000 --- a/sentry-ruby/examples/crons/Rakefile.rb +++ /dev/null @@ -1,79 +0,0 @@ -require "sentry-ruby" - -Sentry.init do |config| - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -# Create a config from an interval schedule (every 10 minutes) -monitor_config = Sentry::Cron::MonitorConfig.from_interval( - 1, - :hour, - checkin_margin: 15, # Optional check-in margin in minutes - max_runtime: 15 # Optional max runtime in minutes -) - -task :successful_cron do - # This check-in will tell Sentry that the cron job started and is in-progress. - # Sentry will expect it to send a :ok check-in within max_runtime minutes. - check_in_id = Sentry.capture_check_in( - "rake-task-example", - :in_progress, - monitor_config: monitor_config - ) - - puts "rake task is running" - - Sentry.capture_check_in( - "rake-task-example", - :ok, - check_in_id: check_in_id, - monitor_config: monitor_config - ) -end - -task :failed_cron do - check_in_id = Sentry.capture_check_in( - "rake-task-example", - :in_progress, - monitor_config: monitor_config - ) - - puts "rake task is running" - - # Sending an :error check-in will mark the cron job as errored on Sentry, - # and this will also create a new Issue on Sentry linked to that cron job. - Sentry.capture_check_in( - "rake-task-example", - :error, - check_in_id: check_in_id, - monitor_config: monitor_config - ) -end - -task :heartbeat do - puts "rake task is running" - - # Heartbeat check-in sends :ok status - # without the parent check_in_id. - # This will tell Sentry that this cron run was successful. - Sentry.capture_check_in( - "rake-task-example", - :ok, - monitor_config: monitor_config - ) -end - -task :raise_exception do - check_in_id = Sentry.capture_check_in( - "rake-task-example", - :in_progress, - monitor_config: monitor_config - ) - - puts "rake task is running" - - # If you raise an error within the job, Sentry will report it and link - # the issue to the cron job. But the job itself will be marked as "in progress" - # until either your job sends another check-in, or it timeouts. - raise "This job errored out" -end diff --git a/sentry-ruby/examples/rails-6.0 b/sentry-ruby/examples/rails-6.0 deleted file mode 120000 index efd938a5a..000000000 --- a/sentry-ruby/examples/rails-6.0 +++ /dev/null @@ -1 +0,0 @@ -../../sentry-rails/examples/rails-6.0 \ No newline at end of file diff --git a/sentry-ruby/examples/rake/Gemfile b/sentry-ruby/examples/rake/Gemfile deleted file mode 100644 index ec891db60..000000000 --- a/sentry-ruby/examples/rake/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '> 2.6' - -gem "rake" -gem 'sentry-ruby', path: "../../" diff --git a/sentry-ruby/examples/rake/Rakefile.rb b/sentry-ruby/examples/rake/Rakefile.rb deleted file mode 100644 index 144c8c2bb..000000000 --- a/sentry-ruby/examples/rake/Rakefile.rb +++ /dev/null @@ -1,15 +0,0 @@ -require "sentry-ruby" - -Sentry.init do |config| - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -# bundle exec rake raise_exception -task :raise_exception do - 1/0 -end - -# bundle exec rake send_message[foo] -task :send_message, ['name'] do |_task, args| - Sentry.capture_message("message from #{args[:name]}") -end diff --git a/sentry-ruby/examples/sinatra/Gemfile b/sentry-ruby/examples/sinatra/Gemfile deleted file mode 100644 index 3dd9e29d1..000000000 --- a/sentry-ruby/examples/sinatra/Gemfile +++ /dev/null @@ -1,13 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '> 2.6' - -gem "sinatra" - -# Use Puma as the app server -gem 'puma', '~> 3.11' - -gem 'sentry-ruby', path: "../../" - -gem "debug", github: "ruby/debug" diff --git a/sentry-ruby/examples/sinatra/README.md b/sentry-ruby/examples/sinatra/README.md deleted file mode 100644 index 150f65a56..000000000 --- a/sentry-ruby/examples/sinatra/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Sinatra Example For Sentry's Ruby SDK - -## Setup - -1. `bundle install` -2. Set your own Sentry DSN in `app.rb` - -## Send Some Events To Sentry - -### Exception & Performance Monitoring - -1. Start the server - `bundle exec ruby app.rb` -2. Visit `localhost:4567/exception` -3. You should see both exception and transaction events in Sentry. - diff --git a/sentry-ruby/examples/sinatra/app.rb b/sentry-ruby/examples/sinatra/app.rb deleted file mode 100644 index 25c010f0a..000000000 --- a/sentry-ruby/examples/sinatra/app.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'sentry-ruby' - -Sentry.init do |config| - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' - config.traces_sample_rate = 1.0 - # skips handled exceptions - config.before_send = lambda do |event, hint| - handled_errors = Sinatra::Application.errors.keys.grep(Class) # skip status codes - should_skip = false - - handled_errors.each do |error| - if hint[:exception].is_a?(error) - should_skip = true - end - end - - event unless should_skip - end -end - -# this needs to be placed **after** SDK is initialized -# see https://github.com/getsentry/sentry-ruby/issues/1778 for more information -require 'sinatra' - -use Sentry::Rack::CaptureExceptions - -error RuntimeError do - halt 400, "this error will not be reported" -end - -get "/handled_exception" do - raise "foo" -end - -get "/" do - 1/0 -end - -get "/connect_trace" do - event = Sentry.capture_message("sentry-trace test") - event.event_id -end diff --git a/sentry-ruby/examples/without_integrations/Gemfile b/sentry-ruby/examples/without_integrations/Gemfile deleted file mode 100644 index dd5d28d29..000000000 --- a/sentry-ruby/examples/without_integrations/Gemfile +++ /dev/null @@ -1,7 +0,0 @@ -source 'https://rubygems.org' -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby '> 2.6' - -gem 'sentry-ruby', path: "../../" -gem "debug", github: "ruby/debug" diff --git a/sentry-ruby/examples/without_integrations/app.rb b/sentry-ruby/examples/without_integrations/app.rb deleted file mode 100644 index 281820ee4..000000000 --- a/sentry-ruby/examples/without_integrations/app.rb +++ /dev/null @@ -1,7 +0,0 @@ -require "sentry-ruby" - -Sentry.init do |config| - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -Sentry.capture_message("test Sentry", hint: { background: false }) diff --git a/sentry-ruby/lib/sentry-ruby.rb b/sentry-ruby/lib/sentry-ruby.rb index e2b6094f8..a4e6d358c 100644 --- a/sentry-ruby/lib/sentry-ruby.rb +++ b/sentry-ruby/lib/sentry-ruby.rb @@ -26,7 +26,6 @@ require "sentry/session_flusher" require "sentry/backpressure_monitor" require "sentry/cron/monitor_check_ins" -require "sentry/metrics" require "sentry/vernier/profiler" [ @@ -59,7 +58,6 @@ module Sentry logger session_flusher backpressure_monitor - metrics_aggregator exception_locals_tp ].freeze @@ -93,10 +91,6 @@ def exception_locals_tp # @return [BackpressureMonitor, nil] attr_reader :backpressure_monitor - # @!attribute [r] metrics_aggregator - # @return [Metrics::Aggregator, nil] - attr_reader :metrics_aggregator - ##### Patch Registration ##### # @!visibility private @@ -252,7 +246,6 @@ def init(&block) @background_worker = Sentry::BackgroundWorker.new(config) @session_flusher = config.session_tracking? ? Sentry::SessionFlusher.new(config, client) : nil @backpressure_monitor = config.enable_backpressure_handling ? Sentry::BackpressureMonitor.new(config, client) : nil - @metrics_aggregator = config.metrics.enabled ? Sentry::Metrics::Aggregator.new(config, client) : nil exception_locals_tp.enable if config.include_local_variables at_exit { close } end @@ -273,12 +266,6 @@ def close @backpressure_monitor = nil end - if @metrics_aggregator - @metrics_aggregator.flush(force: true) - @metrics_aggregator.kill - @metrics_aggregator = nil - end - if client = get_current_client client.flush @@ -635,24 +622,9 @@ def continue_trace(env, **options) # # @see https://develop.sentry.dev/sdk/telemetry/logs/ Sentry SDK Telemetry Logs Protocol # - # @return [StructuredLogger, nil] The structured logger instance or nil if logs are disabled + # @return [StructuredLogger] The structured logger instance or nil if logs are disabled def logger - @logger ||= - if configuration.enable_logs - # Initialize the public-facing Structured Logger if logs are enabled - # Use configured structured logger class or default to StructuredLogger - # @see https://develop.sentry.dev/sdk/telemetry/logs/ - configuration.structured_logging.logger_class.new(configuration) - else - warn <<~STR - [sentry] `Sentry.logger` will no longer be used as internal SDK logger when `enable_logs` feature is turned on. - Use Sentry.configuration.sdk_logger for SDK-specific logging needs." - - Caller: #{caller.first} - STR - - configuration.sdk_logger - end + @logger ||= configuration.structured_logging.logger_class.new(configuration) end ##### Helpers ##### diff --git a/sentry-ruby/lib/sentry/background_worker.rb b/sentry-ruby/lib/sentry/background_worker.rb index 9841230f4..1c8795006 100644 --- a/sentry-ruby/lib/sentry/background_worker.rb +++ b/sentry-ruby/lib/sentry/background_worker.rb @@ -23,10 +23,7 @@ def initialize(configuration) @shutdown_callback = nil @executor = - if configuration.async - log_debug("config.async is set, BackgroundWorker is disabled") - Concurrent::ImmediateExecutor.new - elsif @number_of_threads == 0 + if @number_of_threads == 0 log_debug("config.background_worker_threads is set to 0, all events will be sent synchronously") Concurrent::ImmediateExecutor.new else diff --git a/sentry-ruby/lib/sentry/breadcrumb.rb b/sentry-ruby/lib/sentry/breadcrumb.rb index 69490f78a..489d0bb16 100644 --- a/sentry-ruby/lib/sentry/breadcrumb.rb +++ b/sentry-ruby/lib/sentry/breadcrumb.rb @@ -34,7 +34,7 @@ def initialize(category: nil, data: nil, message: nil, timestamp: nil, level: ni end # @return [Hash] - def to_hash + def to_h { category: @category, data: serialized_data, diff --git a/sentry-ruby/lib/sentry/breadcrumb_buffer.rb b/sentry-ruby/lib/sentry/breadcrumb_buffer.rb index 7f3a2dc04..3a5cc0177 100644 --- a/sentry-ruby/lib/sentry/breadcrumb_buffer.rb +++ b/sentry-ruby/lib/sentry/breadcrumb_buffer.rb @@ -48,9 +48,9 @@ def empty? end # @return [Hash] - def to_hash + def to_h { - values: members.map(&:to_hash) + values: members.map(&:to_h) } end diff --git a/sentry-ruby/lib/sentry/check_in_event.rb b/sentry-ruby/lib/sentry/check_in_event.rb index 758b2432c..9e2b8df29 100644 --- a/sentry-ruby/lib/sentry/check_in_event.rb +++ b/sentry-ruby/lib/sentry/check_in_event.rb @@ -48,13 +48,13 @@ def initialize( end # @return [Hash] - def to_hash + def to_h data = super data[:check_in_id] = check_in_id data[:monitor_slug] = monitor_slug data[:status] = status data[:duration] = duration if duration - data[:monitor_config] = monitor_config.to_hash if monitor_config + data[:monitor_config] = monitor_config.to_h if monitor_config data end end diff --git a/sentry-ruby/lib/sentry/client.rb b/sentry-ruby/lib/sentry/client.rb index d41056aa5..0b7c598f6 100644 --- a/sentry-ruby/lib/sentry/client.rb +++ b/sentry-ruby/lib/sentry/client.rb @@ -60,8 +60,7 @@ def capture_event(event, scope, hint = {}) return end - event_type = event.is_a?(Event) ? event.type : event["type"] - data_category = Envelope::Item.data_category(event_type) + data_category = Envelope::Item.data_category(event.type) is_transaction = event.is_a?(TransactionEvent) spans_before = is_transaction ? event.spans.size : 0 @@ -78,9 +77,7 @@ def capture_event(event, scope, hint = {}) transport.record_lost_event(:event_processor, "span", num: spans_delta) if spans_delta > 0 end - if async_block = configuration.async - dispatch_async_event(async_block, event, hint) - elsif configuration.background_worker_threads != 0 && hint.fetch(:background, true) + if configuration.background_worker_threads != 0 && hint.fetch(:background, true) unless dispatch_background_event(event, hint) transport.record_lost_event(:queue_overflow, data_category) transport.record_lost_event(:queue_overflow, "span", num: spans_before + 1) if is_transaction @@ -210,22 +207,13 @@ def event_from_transaction(transaction) # @!macro send_event def send_event(event, hint = nil) - event_type = event.is_a?(Event) ? event.type : event["type"] - data_category = Envelope::Item.data_category(event_type) + data_category = Envelope::Item.data_category(event.type) spans_before = event.is_a?(TransactionEvent) ? event.spans.size : 0 - if event_type != TransactionEvent::TYPE && configuration.before_send + if event.is_a?(ErrorEvent) && configuration.before_send event = configuration.before_send.call(event, hint) - case event - when ErrorEvent, CheckInEvent - # do nothing - when Hash - log_debug(<<~MSG) - Returning a Hash from before_send is deprecated and will be removed in the next major version. - Please return a Sentry::ErrorEvent object instead. - MSG - else + if !event.is_a?(ErrorEvent) # Avoid serializing the event object in this case because we aren't sure what it is and what it contains log_debug(<<~MSG) Discarded event because before_send didn't return a Sentry::ErrorEvent object but an instance of #{event.class} @@ -235,21 +223,10 @@ def send_event(event, hint = nil) end end - if event_type == TransactionEvent::TYPE && configuration.before_send_transaction + if event.is_a?(TransactionEvent) && configuration.before_send_transaction event = configuration.before_send_transaction.call(event, hint) - if event.is_a?(TransactionEvent) || event.is_a?(Hash) - spans_after = event.is_a?(TransactionEvent) ? event.spans.size : 0 - spans_delta = spans_before - spans_after - transport.record_lost_event(:before_send, "span", num: spans_delta) if spans_delta > 0 - - if event.is_a?(Hash) - log_debug(<<~MSG) - Returning a Hash from before_send_transaction is deprecated and will be removed in the next major version. - Please return a Sentry::TransactionEvent object instead. - MSG - end - else + if !event.is_a?(TransactionEvent) # Avoid serializing the event object in this case because we aren't sure what it is and what it contains log_debug(<<~MSG) Discarded event because before_send_transaction didn't return a Sentry::TransactionEvent object but an instance of #{event.class} @@ -258,6 +235,23 @@ def send_event(event, hint = nil) transport.record_lost_event(:before_send, "span", num: spans_before + 1) return end + + spans_after = event.is_a?(TransactionEvent) ? event.spans.size : 0 + spans_delta = spans_before - spans_after + transport.record_lost_event(:before_send, "span", num: spans_delta) if spans_delta > 0 + end + + if event.is_a?(CheckInEvent) && configuration.before_send_check_in + event = configuration.before_send_check_in.call(event, hint) + + if !event.is_a?(CheckInEvent) + # Avoid serializing the event object in this case because we aren't sure what it is and what it contains + log_debug(<<~MSG) + Discarded event because before_send_check_in didn't return a Sentry::CheckInEvent object but an instance of #{event.class} + MSG + transport.record_lost_event(:before_send, data_category) + return + end end transport.send_event(event) if configuration.sending_to_dsn_allowed? @@ -291,7 +285,7 @@ def send_logs(log_events) processed_log_event = configuration.before_send_log.call(log_event) if processed_log_event - envelope_items << processed_log_event.to_hash + envelope_items << processed_log_event.to_h else discarded_count += 1 end @@ -299,7 +293,7 @@ def send_logs(log_events) envelope_items else - envelope_items = log_events.map(&:to_hash) + envelope_items = log_events.map(&:to_h) end envelope.add_item( @@ -334,38 +328,6 @@ def send_envelope(envelope) raise end - # @deprecated use Sentry.get_traceparent instead. - # - # Generates a Sentry trace for distribted tracing from the given Span. - # Returns `nil` if `config.propagate_traces` is `false`. - # @param span [Span] the span to generate trace from. - # @return [String, nil] - def generate_sentry_trace(span) - return unless configuration.propagate_traces - - trace = span.to_sentry_trace - log_debug("[Tracing] Adding #{SENTRY_TRACE_HEADER_NAME} header to outgoing request: #{trace}") - trace - end - - # @deprecated Use Sentry.get_baggage instead. - # - # Generates a W3C Baggage header for distributed tracing from the given Span. - # Returns `nil` if `config.propagate_traces` is `false`. - # @param span [Span] the span to generate trace from. - # @return [String, nil] - def generate_baggage(span) - return unless configuration.propagate_traces - - baggage = span.to_baggage - - if baggage && !baggage.empty? - log_debug("[Tracing] Adding #{BAGGAGE_HEADER_NAME} header to outgoing request: #{baggage}") - end - - baggage - end - private def dispatch_background_event(event, hint) @@ -373,28 +335,5 @@ def dispatch_background_event(event, hint) send_event(event, hint) end end - - def dispatch_async_event(async_block, event, hint) - # We have to convert to a JSON-like hash, because background job - # processors (esp ActiveJob) may not like weird types in the event hash - - event_hash = - begin - event.to_json_compatible - rescue => e - log_error("Converting #{event.type} (#{event.event_id}) to JSON compatible hash failed", e, debug: configuration.debug) - return - end - - if async_block.arity == 2 - hint = JSON.parse(JSON.generate(hint)) - async_block.call(event_hash, hint) - else - async_block.call(event_hash) - end - rescue => e - log_error("Async #{event_hash["type"]} sending failed", e, debug: configuration.debug) - send_event(event, hint) - end end end diff --git a/sentry-ruby/lib/sentry/configuration.rb b/sentry-ruby/lib/sentry/configuration.rb index 325134eab..aae16487d 100644 --- a/sentry-ruby/lib/sentry/configuration.rb +++ b/sentry-ruby/lib/sentry/configuration.rb @@ -9,7 +9,6 @@ require "sentry/release_detector" require "sentry/transport/configuration" require "sentry/cron/configuration" -require "sentry/metrics/configuration" require "sentry/linecache" require "sentry/interfaces/stacktrace_builder" require "sentry/logger" @@ -31,13 +30,6 @@ class Configuration # @return [Regexp, nil] attr_accessor :app_dirs_pattern - # Provide an object that responds to `call` to send events asynchronously. - # E.g.: lambda { |event| Thread.new { Sentry.send_event(event) } } - # - # @deprecated It will be removed in the next major release. Please read https://github.com/getsentry/sentry-ruby/issues/1522 for more information - # @return [Proc, nil] - attr_reader :async - # to send events in a non-blocking way, sentry-ruby has its own background worker # by default, the worker holds a thread pool that has [the number of processors] threads # but you can configure it with this configuration option @@ -75,11 +67,10 @@ class Configuration # @return [Proc] attr_reader :before_breadcrumb - # Optional Proc, called before sending an event to the server + # Optional Proc, called before sending an error event to the server # @example # config.before_send = lambda do |event, hint| # # skip ZeroDivisionError exceptions - # # note: hint[:exception] would be a String if you use async callback # if hint[:exception].is_a?(ZeroDivisionError) # nil # else @@ -89,7 +80,7 @@ class Configuration # @return [Proc] attr_reader :before_send - # Optional Proc, called before sending an event to the server + # Optional Proc, called before sending a transaction event to the server # @example # config.before_send_transaction = lambda do |event, hint| # # skip unimportant transactions or strip sensitive data @@ -102,6 +93,18 @@ class Configuration # @return [Proc] attr_reader :before_send_transaction + # Optional Proc, called before sending a check-in event to the server + # @example + # config.before_send_check_in = lambda do |event, hint| + # if event.monitor_slug == "unimportant_job" + # nil + # else + # event + # end + # end + # @return [Proc] + attr_reader :before_send_check_in + # Optional Proc, called before sending an event to the server # @example # config.before_send_log = lambda do |log| @@ -118,7 +121,6 @@ class Configuration # # And if you also use sentry-rails: # - :active_support_logger - # - :monotonic_active_support_logger # # @return [Array] attr_reader :breadcrumbs_logger @@ -145,7 +147,7 @@ class Configuration attr_reader :dsn # Whitelist of enabled_environments that will send notifications to Sentry. Array of Strings. - # @return [Array] + # @return [Array, nil] attr_accessor :enabled_environments # Logger 'progname's to exclude from breadcrumbs @@ -174,18 +176,6 @@ class Configuration # @return [Boolean, String] attr_accessor :spotlight - # @deprecated Use {#include_local_variables} instead. - alias_method :capture_exception_frame_locals, :include_local_variables - - # @deprecated Use {#include_local_variables=} instead. - def capture_exception_frame_locals=(value) - log_warn <<~MSG - `capture_exception_frame_locals` is now deprecated in favor of `include_local_variables`. - MSG - - self.include_local_variables = value - end - # You may provide your own LineCache for matching paths with source files. # This may be useful if you need to get source code from places other than the disk. # @see LineCache @@ -202,18 +192,6 @@ def capture_exception_frame_locals=(value) # @return [String, nil] attr_accessor :sdk_debug_transport_log_file - # @deprecated Use {#sdk_logger=} instead. - def logger=(logger) - warn "[sentry] `config.logger=` is deprecated. Please use `config.sdk_logger=` instead." - self.sdk_logger = logger - end - - # @deprecated Use {#sdk_logger} instead. - def logger - warn "[sentry] `config.logger` is deprecated. Please use `config.sdk_logger` instead." - self.sdk_logger - end - # Project directory root for in_app detection. Could be Rails root, etc. # Set automatically for Rails. # @return [String] @@ -273,10 +251,6 @@ def logger # @return [Cron::Configuration] attr_reader :cron - # Metrics related configuration. - # @return [Metrics::Configuration] - attr_reader :metrics - # Take a float between 0.0 and 1.0 as the sample rate for tracing events (transactions). # @return [Float, nil] attr_reader :traces_sample_rate @@ -299,12 +273,6 @@ def logger # @return [StructuredLoggingConfiguration] attr_reader :structured_logging - # Easier way to use performance tracing - # If set to true, will set traces_sample_rate to 1.0 - # @deprecated It will be removed in the next major release. - # @return [Boolean, nil] - attr_reader :enable_tracing - # Send diagnostic client reports about dropped events, true by default # tries to attach to an existing envelope max once every 30s # @return [Boolean] @@ -325,6 +293,18 @@ def logger # @return [Array] attr_accessor :trace_propagation_targets + # Collection of HTTP status codes or ranges of codes to ignore when tracing incoming requests. + # If a transaction's http.response.status_code matches one of these values, + # the transaction will be dropped and marked as not sampled. + # Defaults to TRACE_IGNORE_STATUS_CODES_DEFAULT. + # + # @example + # # ignore 404 and 502 <= status_code <= 511 + # config.trace_ignore_status_codes = [404, (502..511)] + # + # @return [Array, Array] + attr_reader :trace_ignore_status_codes + # The instrumenter to use, :sentry or :otel # @return [Symbol] attr_reader :instrumenter @@ -339,6 +319,15 @@ def logger # @return [Float, nil] attr_reader :profiles_sample_rate + # Interval in microseconds at which to take samples. + # The default is 1e6 / 101, or 101Hz. + # Note that the 101 is intentional to avoid lockstep sampling. + # + # @example + # config.profiles_sample_interval = 1e5 / 101 + # @return [Float] + attr_accessor :profiles_sample_interval + # Array of patches to apply. # Default is {DEFAULT_PATCHES} # @return [Array] @@ -376,6 +365,8 @@ def logger SERVER_PORT ].freeze + TRACE_IGNORE_STATUS_CODES_DEFAULT = [(301..303), (305..399), (401..404)] + HEROKU_DYNO_METADATA_MESSAGE = "You are running on Heroku but haven't enabled Dyno Metadata. For Sentry's "\ "release detection to work correctly, please run `heroku labs:enable runtime-dyno-metadata`" @@ -391,6 +382,9 @@ def logger APP_DIRS_PATTERN = /(bin|exe|app|config|lib|test|spec)/ + # 101 Hz in microseconds + DEFAULT_PROFILES_SAMPLE_INTERVAL = 1e6 / 101 + class << self # Post initialization callbacks are called at the end of initialization process # allowing extending the configuration of sentry-ruby by multiple extensions @@ -473,7 +467,7 @@ def initialize self.context_lines = 3 self.include_local_variables = false self.environment = environment_from_env - self.enabled_environments = [] + self.enabled_environments = nil self.exclude_loggers = [] self.excluded_exceptions = IGNORE_DEFAULT + PUMA_IGNORE_DEFAULT self.inspect_exception_causes_for_exclusion = true @@ -498,21 +492,22 @@ def initialize self.server_name = server_name_from_env self.instrumenter = :sentry self.trace_propagation_targets = [PROPAGATION_TARGETS_MATCH_ALL] + self.trace_ignore_status_codes = TRACE_IGNORE_STATUS_CODES_DEFAULT self.enabled_patches = DEFAULT_PATCHES.dup self.before_send = nil self.before_send_transaction = nil + self.before_send_check_in = nil self.before_send_log = nil self.rack_env_whitelist = RACK_ENV_WHITELIST_DEFAULT self.traces_sampler = nil - self.enable_tracing = nil self.enable_logs = false self.profiler_class = Sentry::Profiler + self.profiles_sample_interval = DEFAULT_PROFILES_SAMPLE_INTERVAL @transport = Transport::Configuration.new @cron = Cron::Configuration.new - @metrics = Metrics::Configuration.new(self.sdk_logger) @structured_logging = StructuredLoggingConfiguration.new @gem_specs = Hash[Gem::Specification.map { |spec| [spec.name, spec.version.to_s] }] if Gem::Specification.respond_to?(:map) @@ -555,22 +550,6 @@ def release=(value) @release = value end - def async=(value) - check_callable!("async", value) - - log_warn <<~MSG - - sentry-ruby now sends events asynchronously by default with its background worker (supported since 4.1.0). - The `config.async` callback has become redundant while continuing to cause issues. - (The problems of `async` are detailed in https://github.com/getsentry/sentry-ruby/issues/1522) - - Therefore, we encourage you to remove it and let the background worker take care of async job sending. - It's deprecation is planned in the next major release (6.0), which is scheduled around the 3rd quarter of 2022. - MSG - - @async = value - end - def breadcrumbs_logger=(logger) loggers = if logger.is_a?(Array) @@ -596,6 +575,12 @@ def before_send_transaction=(value) @before_send_transaction = value end + def before_send_check_in=(value) + check_callable!("before_send_check_in", value) + + @before_send_check_in = value + end + def before_breadcrumb=(value) check_callable!("before_breadcrumb", value) @@ -610,15 +595,12 @@ def instrumenter=(instrumenter) @instrumenter = INSTRUMENTERS.include?(instrumenter) ? instrumenter : :sentry end - def enable_tracing=(enable_tracing) - unless enable_tracing.nil? - log_warn <<~MSG - `enable_tracing` is now deprecated in favor of `traces_sample_rate = 1.0`. - MSG + def trace_ignore_status_codes=(codes) + unless codes.is_a?(Array) && codes.all? { |code| valid_status_code_entry?(code) } + raise ArgumentError, "trace_ignore_status_codes must be an Array of integers or ranges between (100-599) where begin <= end" end - @enable_tracing = enable_tracing - @traces_sample_rate ||= 1.0 if enable_tracing + @trace_ignore_status_codes = codes end def traces_sample_rate=(traces_sample_rate) @@ -674,7 +656,7 @@ def exception_class_allowed?(exc) end def enabled_in_current_env? - enabled_environments.empty? || enabled_environments.include?(environment) + enabled_environments.nil? || enabled_environments.include?(environment) end def valid_sample_rate?(sample_rate) @@ -685,7 +667,7 @@ def valid_sample_rate?(sample_rate) def tracing_enabled? valid_sampler = !!((valid_sample_rate?(@traces_sample_rate)) || @traces_sampler) - (@enable_tracing != false) && valid_sampler && sending_allowed? + valid_sampler && sending_allowed? end def profiling_enabled? @@ -816,6 +798,23 @@ def processor_count available_processor_count = Concurrent.available_processor_count if Concurrent.respond_to?(:available_processor_count) available_processor_count || Concurrent.processor_count end + + def valid_http_status_code?(code) + code.is_a?(Integer) && code >= 100 && code <= 599 + end + + def valid_status_code_entry?(entry) + case entry + when Integer + valid_http_status_code?(entry) + when Range + valid_http_status_code?(entry.begin) && + valid_http_status_code?(entry.end) && + entry.begin <= entry.end + else + false + end + end end class StructuredLoggingConfiguration diff --git a/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb b/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb index df7445286..314733cfb 100644 --- a/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb +++ b/sentry-ruby/lib/sentry/cron/monitor_check_ins.rb @@ -14,12 +14,12 @@ def perform(*args, **opts) :in_progress, monitor_config: monitor_config) - start = Metrics::Timing.duration_start + start = Process.clock_gettime(Process::CLOCK_MONOTONIC) begin # need to do this on ruby <= 2.6 sadly ret = method(:perform).super_method.arity == 0 ? super() : super - duration = Metrics::Timing.duration_end(start) + duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start Sentry.capture_check_in(slug, :ok, @@ -29,7 +29,7 @@ def perform(*args, **opts) ret rescue Exception - duration = Metrics::Timing.duration_end(start) + duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start Sentry.capture_check_in(slug, :error, diff --git a/sentry-ruby/lib/sentry/cron/monitor_config.rb b/sentry-ruby/lib/sentry/cron/monitor_config.rb index dfd28a4bd..36d7b52e8 100644 --- a/sentry-ruby/lib/sentry/cron/monitor_config.rb +++ b/sentry-ruby/lib/sentry/cron/monitor_config.rb @@ -40,9 +40,9 @@ def self.from_interval(num, unit, **options) new(MonitorSchedule::Interval.new(num, unit), **options) end - def to_hash + def to_h { - schedule: schedule.to_hash, + schedule: schedule.to_h, checkin_margin: checkin_margin, max_runtime: max_runtime, timezone: timezone diff --git a/sentry-ruby/lib/sentry/cron/monitor_schedule.rb b/sentry-ruby/lib/sentry/cron/monitor_schedule.rb index d7c80cdd8..cb5423cab 100644 --- a/sentry-ruby/lib/sentry/cron/monitor_schedule.rb +++ b/sentry-ruby/lib/sentry/cron/monitor_schedule.rb @@ -12,7 +12,7 @@ def initialize(value) @value = value end - def to_hash + def to_h { type: :crontab, value: value } end end @@ -33,7 +33,7 @@ def initialize(value, unit) @unit = unit end - def to_hash + def to_h { type: :interval, value: value, unit: unit } end end diff --git a/sentry-ruby/lib/sentry/envelope/item.rb b/sentry-ruby/lib/sentry/envelope/item.rb index 864ad0239..2fe806493 100644 --- a/sentry-ruby/lib/sentry/envelope/item.rb +++ b/sentry-ruby/lib/sentry/envelope/item.rb @@ -3,7 +3,6 @@ module Sentry # @api private class Envelope::Item - STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD = 500 MAX_SERIALIZED_PAYLOAD_SIZE = 1024 * 1000 SIZE_LIMITS = Hash.new(MAX_SERIALIZED_PAYLOAD_SIZE).update( @@ -18,7 +17,6 @@ def self.data_category(type) when "session", "attachment", "transaction", "profile", "span", "log" then type when "sessions" then "session" when "check_in" then "monitor" - when "statsd", "metric_meta" then "metric_bucket" when "event" then "error" when "client_report" then "internal" else "default" @@ -45,11 +43,6 @@ def serialize result = to_s end - if result.bytesize > size_limit - reduce_stacktrace! - result = to_s - end - [result, result.bytesize > size_limit] end @@ -68,21 +61,5 @@ def remove_breadcrumbs! payload.delete("breadcrumbs") end end - - def reduce_stacktrace! - if exceptions = payload.dig(:exception, :values) || payload.dig("exception", "values") - exceptions.each do |exception| - # in most cases there is only one exception (2 or 3 when have multiple causes), so we won't loop through this double condition much - traces = exception.dig(:stacktrace, :frames) || exception.dig("stacktrace", "frames") - - if traces && traces.size > STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD - size_on_both_ends = STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD / 2 - traces.replace( - traces[0..(size_on_both_ends - 1)] + traces[-size_on_both_ends..-1], - ) - end - end - end - end end end diff --git a/sentry-ruby/lib/sentry/error_event.rb b/sentry-ruby/lib/sentry/error_event.rb index 13a891f71..a76e8b2ab 100644 --- a/sentry-ruby/lib/sentry/error_event.rb +++ b/sentry-ruby/lib/sentry/error_event.rb @@ -10,10 +10,10 @@ class ErrorEvent < Event attr_reader :threads # @return [Hash] - def to_hash + def to_h data = super - data[:threads] = threads.to_hash if threads - data[:exception] = exception.to_hash if exception + data[:threads] = threads.to_h if threads + data[:exception] = exception.to_h if exception data end diff --git a/sentry-ruby/lib/sentry/event.rb b/sentry-ruby/lib/sentry/event.rb index d9ad89d44..09db52f1f 100644 --- a/sentry-ruby/lib/sentry/event.rb +++ b/sentry-ruby/lib/sentry/event.rb @@ -81,12 +81,6 @@ def initialize(configuration:, integration_meta: nil, message: nil) @message = (message || "").byteslice(0..MAX_MESSAGE_SIZE_IN_BYTES) end - # @deprecated This method will be removed in v5.0.0. Please just use Sentry.configuration - # @return [Configuration] - def configuration - Sentry.configuration - end - # Sets the event's timestamp. # @param time [Time, Float] # @return [void] @@ -118,16 +112,16 @@ def rack_env=(env) end # @return [Hash] - def to_hash + def to_h data = serialize_attributes - data[:breadcrumbs] = breadcrumbs.to_hash if breadcrumbs - data[:request] = request.to_hash if request + data[:breadcrumbs] = breadcrumbs.to_h if breadcrumbs + data[:request] = request.to_h if request data end # @return [Hash] def to_json_compatible - JSON.parse(JSON.generate(to_hash)) + JSON.parse(JSON.generate(to_h)) end private diff --git a/sentry-ruby/lib/sentry/hub.rb b/sentry-ruby/lib/sentry/hub.rb index 53250288d..b44a2d467 100644 --- a/sentry-ruby/lib/sentry/hub.rb +++ b/sentry-ruby/lib/sentry/hub.rb @@ -116,10 +116,10 @@ def start_transaction(transaction: nil, custom_sampling_context: {}, instrumente return unless configuration.tracing_enabled? return unless instrumenter == configuration.instrumenter - transaction ||= Transaction.new(**options.merge(hub: self)) + transaction ||= Transaction.new(**options) sampling_context = { - transaction_context: transaction.to_hash, + transaction_context: transaction.to_h, parent_sampled: transaction.parent_sampled, parent_sample_rate: transaction.parent_sample_rate } @@ -218,7 +218,7 @@ def capture_check_in(slug, status, **options) end def capture_log_event(message, **options) - return unless current_client + return unless current_client && current_client.configuration.enable_logs event = current_client.event_from_log(message, **options) @@ -353,7 +353,6 @@ def continue_trace(env, **options) return nil unless propagation_context.incoming_trace Transaction.new( - hub: self, trace_id: propagation_context.trace_id, parent_span_id: propagation_context.parent_span_id, parent_sampled: propagation_context.parent_sampled, diff --git a/sentry-ruby/lib/sentry/interface.rb b/sentry-ruby/lib/sentry/interface.rb index d54d605b1..ed8f60cb0 100644 --- a/sentry-ruby/lib/sentry/interface.rb +++ b/sentry-ruby/lib/sentry/interface.rb @@ -3,7 +3,7 @@ module Sentry class Interface # @return [Hash] - def to_hash + def to_h Hash[instance_variables.map { |name| [name[1..-1].to_sym, instance_variable_get(name)] }] end end diff --git a/sentry-ruby/lib/sentry/interfaces/exception.rb b/sentry-ruby/lib/sentry/interfaces/exception.rb index 58cb1a576..4ca18d5ae 100644 --- a/sentry-ruby/lib/sentry/interfaces/exception.rb +++ b/sentry-ruby/lib/sentry/interfaces/exception.rb @@ -13,9 +13,9 @@ def initialize(exceptions:) end # @return [Hash] - def to_hash + def to_h data = super - data[:values] = data[:values].map(&:to_hash) if data[:values] + data[:values] = data[:values].map(&:to_h) if data[:values] data end diff --git a/sentry-ruby/lib/sentry/interfaces/single_exception.rb b/sentry-ruby/lib/sentry/interfaces/single_exception.rb index db2d54e7b..1753ed0ae 100644 --- a/sentry-ruby/lib/sentry/interfaces/single_exception.rb +++ b/sentry-ruby/lib/sentry/interfaces/single_exception.rb @@ -32,10 +32,10 @@ def initialize(exception:, mechanism:, stacktrace: nil) @mechanism = mechanism end - def to_hash + def to_h data = super - data[:stacktrace] = data[:stacktrace].to_hash if data[:stacktrace] - data[:mechanism] = data[:mechanism].to_hash + data[:stacktrace] = data[:stacktrace].to_h if data[:stacktrace] + data[:mechanism] = data[:mechanism].to_h data end diff --git a/sentry-ruby/lib/sentry/interfaces/stacktrace.rb b/sentry-ruby/lib/sentry/interfaces/stacktrace.rb index 5f4be3719..104b7a0fb 100644 --- a/sentry-ruby/lib/sentry/interfaces/stacktrace.rb +++ b/sentry-ruby/lib/sentry/interfaces/stacktrace.rb @@ -11,8 +11,8 @@ def initialize(frames:) end # @return [Hash] - def to_hash - { frames: @frames.map(&:to_hash) } + def to_h + { frames: @frames.map(&:to_h) } end # @return [String] @@ -66,7 +66,7 @@ def set_context(linecache, context_lines) linecache.get_file_context(abs_path, lineno, context_lines) end - def to_hash(*args) + def to_h(*args) data = super(*args) data.delete(:vars) unless vars && !vars.empty? data.delete(:pre_context) unless pre_context && !pre_context.empty? diff --git a/sentry-ruby/lib/sentry/interfaces/stacktrace_builder.rb b/sentry-ruby/lib/sentry/interfaces/stacktrace_builder.rb index d2d0758ec..3f4a7f090 100644 --- a/sentry-ruby/lib/sentry/interfaces/stacktrace_builder.rb +++ b/sentry-ruby/lib/sentry/interfaces/stacktrace_builder.rb @@ -75,14 +75,6 @@ def build(backtrace:, &frame_callback) StacktraceInterface.new(frames: frames) end - # Get the code location hash for a single line for where metrics where added. - # @return [Hash] - def metrics_code_location(unparsed_line) - parsed_line = Backtrace::Line.parse(unparsed_line) - frame = convert_parsed_line_into_frame(parsed_line) - frame.to_hash.reject { |k, _| %i[project_root in_app].include?(k) } - end - private def convert_parsed_line_into_frame(line) diff --git a/sentry-ruby/lib/sentry/interfaces/threads.rb b/sentry-ruby/lib/sentry/interfaces/threads.rb index f250050db..bac6e0e25 100644 --- a/sentry-ruby/lib/sentry/interfaces/threads.rb +++ b/sentry-ruby/lib/sentry/interfaces/threads.rb @@ -13,7 +13,7 @@ def initialize(crashed: false, stacktrace: nil) end # @return [Hash] - def to_hash + def to_h { values: [ { @@ -21,7 +21,7 @@ def to_hash name: @name, crashed: @crashed, current: @current, - stacktrace: @stacktrace&.to_hash + stacktrace: @stacktrace&.to_h } ] } diff --git a/sentry-ruby/lib/sentry/log_event.rb b/sentry-ruby/lib/sentry/log_event.rb index 438fb85c2..cc26eb9f9 100644 --- a/sentry-ruby/lib/sentry/log_event.rb +++ b/sentry-ruby/lib/sentry/log_event.rb @@ -87,7 +87,7 @@ def initialize(configuration: Sentry.configuration, **options) @contexts = {} end - def to_hash + def to_h SERIALIZEABLE_ATTRIBUTES.each_with_object({}) do |name, memo| memo[name] = serialize(name) end diff --git a/sentry-ruby/lib/sentry/metrics.rb b/sentry-ruby/lib/sentry/metrics.rb deleted file mode 100644 index 5da299605..000000000 --- a/sentry-ruby/lib/sentry/metrics.rb +++ /dev/null @@ -1,68 +0,0 @@ -# frozen_string_literal: true - -require "sentry/metrics/metric" -require "sentry/metrics/counter_metric" -require "sentry/metrics/distribution_metric" -require "sentry/metrics/gauge_metric" -require "sentry/metrics/set_metric" -require "sentry/metrics/timing" -require "sentry/metrics/aggregator" - -module Sentry - module Metrics - DURATION_UNITS = %w[nanosecond microsecond millisecond second minute hour day week] - INFORMATION_UNITS = %w[bit byte kilobyte kibibyte megabyte mebibyte gigabyte gibibyte terabyte tebibyte petabyte pebibyte exabyte exbibyte] - FRACTIONAL_UNITS = %w[ratio percent] - - OP_NAME = "metric.timing" - SPAN_ORIGIN = "auto.metric.timing" - - class << self - def increment(key, value = 1.0, unit: "none", tags: {}, timestamp: nil) - log_deprecation - Sentry.metrics_aggregator&.add(:c, key, value, unit: unit, tags: tags, timestamp: timestamp) - end - - def distribution(key, value, unit: "none", tags: {}, timestamp: nil) - log_deprecation - Sentry.metrics_aggregator&.add(:d, key, value, unit: unit, tags: tags, timestamp: timestamp) - end - - def set(key, value, unit: "none", tags: {}, timestamp: nil) - log_deprecation - Sentry.metrics_aggregator&.add(:s, key, value, unit: unit, tags: tags, timestamp: timestamp) - end - - def gauge(key, value, unit: "none", tags: {}, timestamp: nil) - log_deprecation - Sentry.metrics_aggregator&.add(:g, key, value, unit: unit, tags: tags, timestamp: timestamp) - end - - def timing(key, unit: "second", tags: {}, timestamp: nil, &block) - log_deprecation - - return unless block_given? - return yield unless DURATION_UNITS.include?(unit) - - result, value = Sentry.with_child_span(op: OP_NAME, description: key, origin: SPAN_ORIGIN) do |span| - tags.each { |k, v| span.set_tag(k, v.is_a?(Array) ? v.join(", ") : v.to_s) } if span - - start = Timing.send(unit.to_sym) - result = yield - value = Timing.send(unit.to_sym) - start - - [result, value] - end - - Sentry.metrics_aggregator&.add(:d, key, value, unit: unit, tags: tags, timestamp: timestamp) - result - end - - def log_deprecation - Sentry.sdk_logger.warn(LOGGER_PROGNAME) do - "`Sentry::Metrics` is now deprecated and will be removed in the next major." - end - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/aggregator.rb b/sentry-ruby/lib/sentry/metrics/aggregator.rb deleted file mode 100644 index ca7e95563..000000000 --- a/sentry-ruby/lib/sentry/metrics/aggregator.rb +++ /dev/null @@ -1,248 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class Aggregator < ThreadedPeriodicWorker - FLUSH_INTERVAL = 5 - ROLLUP_IN_SECONDS = 10 - - # this is how far removed from user code in the backtrace we are - # when we record code locations - DEFAULT_STACKLEVEL = 4 - - KEY_SANITIZATION_REGEX = /[^a-zA-Z0-9_\-.]+/ - UNIT_SANITIZATION_REGEX = /[^a-zA-Z0-9_]+/ - TAG_KEY_SANITIZATION_REGEX = /[^a-zA-Z0-9_\-.\/]+/ - - TAG_VALUE_SANITIZATION_MAP = { - "\n" => "\\n", - "\r" => "\\r", - "\t" => "\\t", - "\\" => "\\\\", - "|" => "\\u{7c}", - "," => "\\u{2c}" - } - - METRIC_TYPES = { - c: CounterMetric, - d: DistributionMetric, - g: GaugeMetric, - s: SetMetric - } - - # exposed only for testing - attr_reader :client, :thread, :buckets, :flush_shift, :code_locations - - def initialize(configuration, client) - super(configuration.sdk_logger, FLUSH_INTERVAL) - @client = client - @before_emit = configuration.metrics.before_emit - @enable_code_locations = configuration.metrics.enable_code_locations - @stacktrace_builder = configuration.stacktrace_builder - - @default_tags = {} - @default_tags["release"] = configuration.release if configuration.release - @default_tags["environment"] = configuration.environment if configuration.environment - - @mutex = Mutex.new - - # a nested hash of timestamp -> bucket keys -> Metric instance - @buckets = {} - - # the flush interval needs to be shifted once per startup to create jittering - @flush_shift = Random.rand * ROLLUP_IN_SECONDS - - # a nested hash of timestamp (start of day) -> meta keys -> frame - @code_locations = {} - end - - def add(type, - key, - value, - unit: "none", - tags: {}, - timestamp: nil, - stacklevel: nil) - return unless ensure_thread - return unless METRIC_TYPES.keys.include?(type) - - updated_tags = get_updated_tags(tags) - return if @before_emit && !@before_emit.call(key, updated_tags) - - timestamp ||= Sentry.utc_now - - # this is integer division and thus takes the floor of the division - # and buckets into 10 second intervals - bucket_timestamp = (timestamp.to_i / ROLLUP_IN_SECONDS) * ROLLUP_IN_SECONDS - - serialized_tags = serialize_tags(updated_tags) - bucket_key = [type, key, unit, serialized_tags] - - added = @mutex.synchronize do - record_code_location(type, key, unit, timestamp, stacklevel: stacklevel) if @enable_code_locations - process_bucket(bucket_timestamp, bucket_key, type, value) - end - - # for sets, we pass on if there was a new entry to the local gauge - local_value = type == :s ? added : value - process_span_aggregator(bucket_key, local_value) - end - - def flush(force: false) - flushable_buckets = get_flushable_buckets!(force) - code_locations = get_code_locations! - return if flushable_buckets.empty? && code_locations.empty? - - envelope = Envelope.new - - unless flushable_buckets.empty? - payload = serialize_buckets(flushable_buckets) - envelope.add_item( - { type: "statsd", length: payload.bytesize }, - payload - ) - end - - unless code_locations.empty? - code_locations.each do |timestamp, locations| - payload = serialize_locations(timestamp, locations) - envelope.add_item( - { type: "metric_meta", content_type: "application/json" }, - payload - ) - end - end - - @client.capture_envelope(envelope) - end - - alias_method :run, :flush - - private - - # important to sort for key consistency - def serialize_tags(tags) - tags.flat_map do |k, v| - if v.is_a?(Array) - v.map { |x| [k.to_s, x.to_s] } - else - [[k.to_s, v.to_s]] - end - end.sort - end - - def get_flushable_buckets!(force) - @mutex.synchronize do - flushable_buckets = {} - - if force - flushable_buckets = @buckets - @buckets = {} - else - cutoff = Sentry.utc_now.to_i - ROLLUP_IN_SECONDS - @flush_shift - flushable_buckets = @buckets.select { |k, _| k <= cutoff } - @buckets.reject! { |k, _| k <= cutoff } - end - - flushable_buckets - end - end - - def get_code_locations! - @mutex.synchronize do - code_locations = @code_locations - @code_locations = {} - code_locations - end - end - - # serialize buckets to statsd format - def serialize_buckets(buckets) - buckets.map do |timestamp, timestamp_buckets| - timestamp_buckets.map do |metric_key, metric| - type, key, unit, tags = metric_key - values = metric.serialize.join(":") - sanitized_tags = tags.map { |k, v| "#{sanitize_tag_key(k)}:#{sanitize_tag_value(v)}" }.join(",") - - "#{sanitize_key(key)}@#{sanitize_unit(unit)}:#{values}|#{type}|\##{sanitized_tags}|T#{timestamp}" - end - end.flatten.join("\n") - end - - def serialize_locations(timestamp, locations) - mapping = locations.map do |meta_key, location| - type, key, unit = meta_key - mri = "#{type}:#{sanitize_key(key)}@#{sanitize_unit(unit)}" - - # note this needs to be an array but it really doesn't serve a purpose right now - [mri, [location.merge(type: "location")]] - end.to_h - - { timestamp: timestamp, mapping: mapping } - end - - def sanitize_key(key) - key.gsub(KEY_SANITIZATION_REGEX, "_") - end - - def sanitize_unit(unit) - unit.gsub(UNIT_SANITIZATION_REGEX, "") - end - - def sanitize_tag_key(key) - key.gsub(TAG_KEY_SANITIZATION_REGEX, "") - end - - def sanitize_tag_value(value) - value.chars.map { |c| TAG_VALUE_SANITIZATION_MAP[c] || c }.join - end - - def get_transaction_name - scope = Sentry.get_current_scope - return nil unless scope && scope.transaction_name - return nil if scope.transaction_source_low_quality? - - scope.transaction_name - end - - def get_updated_tags(tags) - updated_tags = @default_tags.merge(tags) - - transaction_name = get_transaction_name - updated_tags["transaction"] = transaction_name if transaction_name - - updated_tags - end - - def process_span_aggregator(key, value) - scope = Sentry.get_current_scope - return nil unless scope && scope.span - return nil if scope.transaction_source_low_quality? - - scope.span.metrics_local_aggregator.add(key, value) - end - - def process_bucket(timestamp, key, type, value) - @buckets[timestamp] ||= {} - - if (metric = @buckets[timestamp][key]) - old_weight = metric.weight - metric.add(value) - metric.weight - old_weight - else - metric = METRIC_TYPES[type].new(value) - @buckets[timestamp][key] = metric - metric.weight - end - end - - def record_code_location(type, key, unit, timestamp, stacklevel: nil) - meta_key = [type, key, unit] - start_of_day = Time.utc(timestamp.year, timestamp.month, timestamp.day).to_i - - @code_locations[start_of_day] ||= {} - @code_locations[start_of_day][meta_key] ||= @stacktrace_builder.metrics_code_location(caller[stacklevel || DEFAULT_STACKLEVEL]) - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/configuration.rb b/sentry-ruby/lib/sentry/metrics/configuration.rb deleted file mode 100644 index 2e93bf3f0..000000000 --- a/sentry-ruby/lib/sentry/metrics/configuration.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class Configuration - include ArgumentCheckingHelper - include LoggingHelper - - # Enable metrics usage. - # Starts a new {Sentry::Metrics::Aggregator} instance to aggregate metrics - # and a thread to aggregate flush every 5 seconds. - # @return [Boolean] - attr_reader :enabled - - # Enable code location reporting. - # Will be sent once per day. - # True by default. - # @return [Boolean] - attr_accessor :enable_code_locations - - # Optional Proc, called before emitting a metric to the aggregator. - # Use it to filter keys (return false/nil) or update tags. - # Make sure to return true at the end. - # - # @example - # config.metrics.before_emit = lambda do |key, tags| - # return nil if key == 'foo' - # tags[:bar] = 42 - # tags.delete(:baz) - # true - # end - # - # @return [Proc, nil] - attr_reader :before_emit - - def initialize(sdk_logger) - @sdk_logger = sdk_logger - @enabled = false - @enable_code_locations = true - end - - def enabled=(value) - log_warn <<~MSG - `config.metrics` is now deprecated and will be removed in the next major. - MSG - - @enabled = value - end - - def before_emit=(value) - check_callable!("metrics.before_emit", value) - - @before_emit = value - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/counter_metric.rb b/sentry-ruby/lib/sentry/metrics/counter_metric.rb deleted file mode 100644 index 6ef9d4d48..000000000 --- a/sentry-ruby/lib/sentry/metrics/counter_metric.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class CounterMetric < Metric - attr_reader :value - - def initialize(value) - @value = value.to_f - end - - def add(value) - @value += value.to_f - end - - def serialize - [value] - end - - def weight - 1 - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/distribution_metric.rb b/sentry-ruby/lib/sentry/metrics/distribution_metric.rb deleted file mode 100644 index eae9aff2a..000000000 --- a/sentry-ruby/lib/sentry/metrics/distribution_metric.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class DistributionMetric < Metric - attr_reader :value - - def initialize(value) - @value = [value.to_f] - end - - def add(value) - @value << value.to_f - end - - def serialize - value - end - - def weight - value.size - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/gauge_metric.rb b/sentry-ruby/lib/sentry/metrics/gauge_metric.rb deleted file mode 100644 index f0ba98514..000000000 --- a/sentry-ruby/lib/sentry/metrics/gauge_metric.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class GaugeMetric < Metric - attr_reader :last, :min, :max, :sum, :count - - def initialize(value) - value = value.to_f - @last = value - @min = value - @max = value - @sum = value - @count = 1 - end - - def add(value) - value = value.to_f - @last = value - @min = [@min, value].min - @max = [@max, value].max - @sum += value - @count += 1 - end - - def serialize - [last, min, max, sum, count] - end - - def weight - 5 - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/local_aggregator.rb b/sentry-ruby/lib/sentry/metrics/local_aggregator.rb deleted file mode 100644 index 99d50a5b1..000000000 --- a/sentry-ruby/lib/sentry/metrics/local_aggregator.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class LocalAggregator - # exposed only for testing - attr_reader :buckets - - def initialize - @buckets = {} - end - - def add(key, value) - if @buckets[key] - @buckets[key].add(value) - else - @buckets[key] = GaugeMetric.new(value) - end - end - - def to_hash - return nil if @buckets.empty? - - @buckets.map do |bucket_key, metric| - type, key, unit, tags = bucket_key - - payload_key = "#{type}:#{key}@#{unit}" - payload_value = { - tags: deserialize_tags(tags), - min: metric.min, - max: metric.max, - count: metric.count, - sum: metric.sum - } - - [payload_key, payload_value] - end.to_h - end - - private - - def deserialize_tags(tags) - tags.inject({}) do |h, tag| - k, v = tag - old = h[k] - # make it an array if key repeats - h[k] = old ? (old.is_a?(Array) ? old << v : [old, v]) : v - h - end - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/metric.rb b/sentry-ruby/lib/sentry/metrics/metric.rb deleted file mode 100644 index dbf4a17e0..000000000 --- a/sentry-ruby/lib/sentry/metrics/metric.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - class Metric - def add(value) - raise NotImplementedError - end - - def serialize - raise NotImplementedError - end - - def weight - raise NotImplementedError - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/set_metric.rb b/sentry-ruby/lib/sentry/metrics/set_metric.rb deleted file mode 100644 index b38af2743..000000000 --- a/sentry-ruby/lib/sentry/metrics/set_metric.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -require "set" -require "zlib" - -module Sentry - module Metrics - class SetMetric < Metric - attr_reader :value - - def initialize(value) - @value = Set[value] - end - - def add(value) - @value << value - end - - def serialize - value.map { |x| x.is_a?(String) ? Zlib.crc32(x) : x.to_i } - end - - def weight - value.size - end - end - end -end diff --git a/sentry-ruby/lib/sentry/metrics/timing.rb b/sentry-ruby/lib/sentry/metrics/timing.rb deleted file mode 100644 index 6d4d9b66d..000000000 --- a/sentry-ruby/lib/sentry/metrics/timing.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -module Sentry - module Metrics - module Timing - class << self - def nanosecond - time = Sentry.utc_now - time.to_i * (10 ** 9) + time.nsec - end - - def microsecond - time = Sentry.utc_now - time.to_i * (10 ** 6) + time.usec - end - - def millisecond - Sentry.utc_now.to_i * (10 ** 3) - end - - def second - Sentry.utc_now.to_i - end - - def minute - Sentry.utc_now.to_i / 60.0 - end - - def hour - Sentry.utc_now.to_i / 3600.0 - end - - def day - Sentry.utc_now.to_i / (3600.0 * 24.0) - end - - def week - Sentry.utc_now.to_i / (3600.0 * 24.0 * 7.0) - end - - def duration_start - Process.clock_gettime(Process::CLOCK_MONOTONIC) - end - - def duration_end(start) - Process.clock_gettime(Process::CLOCK_MONOTONIC) - start - end - end - end - end -end diff --git a/sentry-ruby/lib/sentry/profiler.rb b/sentry-ruby/lib/sentry/profiler.rb index d1fd733f7..ba5b5d525 100644 --- a/sentry-ruby/lib/sentry/profiler.rb +++ b/sentry-ruby/lib/sentry/profiler.rb @@ -10,8 +10,6 @@ class Profiler VERSION = "1" PLATFORM = "ruby" - # 101 Hz in microseconds - DEFAULT_INTERVAL = 1e6 / 101 MICRO_TO_NANO_SECONDS = 1e3 MIN_SAMPLES_REQUIRED = 2 @@ -24,6 +22,7 @@ def initialize(configuration) @profiling_enabled = defined?(StackProf) && configuration.profiling_enabled? @profiles_sample_rate = configuration.profiles_sample_rate + @profiles_sample_interval = configuration.profiles_sample_interval @project_root = configuration.project_root @app_dirs_pattern = configuration.app_dirs_pattern @in_app_pattern = Regexp.new("^(#{@project_root}/)?#{@app_dirs_pattern}") @@ -32,7 +31,7 @@ def initialize(configuration) def start return unless @sampled - @started = StackProf.start(interval: DEFAULT_INTERVAL, + @started = StackProf.start(interval: @profiles_sample_interval, mode: :wall, raw: true, aggregate: false) @@ -81,9 +80,9 @@ def set_initial_sample_decision(transaction_sampled) log("Discarding profile due to sampling decision") unless @sampled end - def to_hash + def to_h unless @sampled - record_lost_event(:sample_rate) + record_lost_event(:sample_rate) if @profiling_enabled return {} end diff --git a/sentry-ruby/lib/sentry/rspec.rb b/sentry-ruby/lib/sentry/rspec.rb index 9c7c49730..5eb0e2b4e 100644 --- a/sentry-ruby/lib/sentry/rspec.rb +++ b/sentry-ruby/lib/sentry/rspec.rb @@ -70,7 +70,7 @@ def find_matched_event(event_message, sentry_events) end def dump_events(sentry_events) - sentry_events.map(&Kernel.method(:Hash)).map do |hash| + sentry_events.map(&:to_h).map do |hash| hash.select { |k, _| [:message, :contexts, :tags, :exception].include?(k) } end.map do |hash| JSON.pretty_generate(hash) diff --git a/sentry-ruby/lib/sentry/span.rb b/sentry-ruby/lib/sentry/span.rb index e2c278a2d..5ba4b7cf8 100644 --- a/sentry-ruby/lib/sentry/span.rb +++ b/sentry-ruby/lib/sentry/span.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "securerandom" -require "sentry/metrics/local_aggregator" require "sentry/utils/uuid" module Sentry @@ -173,8 +172,8 @@ def get_dynamic_sampling_context end # @return [Hash] - def to_hash - hash = { + def to_h + { trace_id: @trace_id, span_id: @span_id, parent_span_id: @parent_span_id, @@ -187,11 +186,6 @@ def to_hash data: @data, origin: @origin } - - summary = metrics_summary - hash[:_metrics_summary] = summary if summary - - hash end # Returns the span's context that can be used to embed in an Event. @@ -307,14 +301,5 @@ def set_tag(key, value) def set_origin(origin) @origin = origin end - - # Collects gauge metrics on the span for metric summaries. - def metrics_local_aggregator - @metrics_local_aggregator ||= Sentry::Metrics::LocalAggregator.new - end - - def metrics_summary - @metrics_local_aggregator&.to_hash - end end end diff --git a/sentry-ruby/lib/sentry/test_helper.rb b/sentry-ruby/lib/sentry/test_helper.rb index bcee3d9df..288bbc383 100644 --- a/sentry-ruby/lib/sentry/test_helper.rb +++ b/sentry-ruby/lib/sentry/test_helper.rb @@ -27,6 +27,7 @@ def setup_sentry_test(&block) # set transport to DummyTransport, so we can easily intercept the captured events dummy_config.transport.transport_class = Sentry::DummyTransport # make sure SDK allows sending under the current environment + dummy_config.enabled_environments ||= [] dummy_config.enabled_environments += [dummy_config.environment] unless dummy_config.enabled_environments.include?(dummy_config.environment) # disble async event sending dummy_config.background_worker_threads = 0 diff --git a/sentry-ruby/lib/sentry/transaction.rb b/sentry-ruby/lib/sentry/transaction.rb index 91eb3effe..75f425dd2 100644 --- a/sentry-ruby/lib/sentry/transaction.rb +++ b/sentry-ruby/lib/sentry/transaction.rb @@ -7,9 +7,6 @@ module Sentry class Transaction < Span - # @deprecated Use Sentry::PropagationContext::SENTRY_TRACE_REGEXP instead. - SENTRY_TRACE_REGEXP = PropagationContext::SENTRY_TRACE_REGEXP - UNLABELD_NAME = "" MESSAGE_PREFIX = "[Tracing]" @@ -40,12 +37,6 @@ class Transaction < Span # @return [Hash] attr_reader :measurements - # @deprecated Use Sentry.get_current_hub instead. - attr_reader :hub - - # @deprecated Use Sentry.configuration instead. - attr_reader :configuration - # The effective sample rate at which this transaction was sampled. # @return [Float, nil] attr_reader :effective_sample_rate @@ -63,7 +54,6 @@ class Transaction < Span attr_reader :sample_rand def initialize( - hub:, name: nil, source: :custom, parent_sampled: nil, @@ -75,26 +65,14 @@ def initialize( set_name(name, source: source) @parent_sampled = parent_sampled - @hub = hub @baggage = baggage - @configuration = hub.configuration # to be removed - @tracing_enabled = hub.configuration.tracing_enabled? - @traces_sampler = hub.configuration.traces_sampler - @traces_sample_rate = hub.configuration.traces_sample_rate - @sdk_logger = hub.configuration.sdk_logger - @release = hub.configuration.release - @environment = hub.configuration.environment - @dsn = hub.configuration.dsn @effective_sample_rate = nil @contexts = {} @measurements = {} @sample_rand = sample_rand - unless @hub.profiler_running? - @profiler = @configuration.profiler_class.new(@configuration) - end - init_span_recorder + init_profiler unless @sample_rand generator = Utils::SampleRand.new(trace_id: @trace_id) @@ -102,65 +80,8 @@ def initialize( end end - # @deprecated use Sentry.continue_trace instead. - # - # Initalizes a Transaction instance with a Sentry trace string from another transaction (usually from an external request). - # - # The original transaction will become the parent of the new Transaction instance. And they will share the same `trace_id`. - # - # The child transaction will also store the parent's sampling decision in its `parent_sampled` attribute. - # @param sentry_trace [String] the trace string from the previous transaction. - # @param baggage [String, nil] the incoming baggage header string. - # @param hub [Hub] the hub that'll be responsible for sending this transaction when it's finished. - # @param options [Hash] the options you want to use to initialize a Transaction instance. - # @return [Transaction, nil] - def self.from_sentry_trace(sentry_trace, baggage: nil, hub: Sentry.get_current_hub, **options) - return unless hub.configuration.tracing_enabled? - return unless sentry_trace - - sentry_trace_data = extract_sentry_trace(sentry_trace) - return unless sentry_trace_data - - trace_id, parent_span_id, parent_sampled = sentry_trace_data - - baggage = - if baggage && !baggage.empty? - Baggage.from_incoming_header(baggage) - else - # If there's an incoming sentry-trace but no incoming baggage header, - # for instance in traces coming from older SDKs, - # baggage will be empty and frozen and won't be populated as head SDK. - Baggage.new({}) - end - - baggage.freeze! - - sample_rand = extract_sample_rand_from_baggage(baggage, trace_id, parent_sampled) - - new( - trace_id: trace_id, - parent_span_id: parent_span_id, - parent_sampled: parent_sampled, - hub: hub, - baggage: baggage, - sample_rand: sample_rand, - **options - ) - end - - # @deprecated Use Sentry::PropagationContext.extract_sentry_trace instead. - # @return [Array, nil] - def self.extract_sentry_trace(sentry_trace) - PropagationContext.extract_sentry_trace(sentry_trace) - end - - def self.extract_sample_rand_from_baggage(baggage, trace_id, parent_sampled) - PropagationContext.extract_sample_rand_from_baggage(baggage, trace_id) || - PropagationContext.generate_sample_rand(baggage, trace_id, parent_sampled) - end - # @return [Hash] - def to_hash + def to_h hash = super hash.merge!( @@ -207,7 +128,9 @@ def set_measurement(name, value, unit = "") # @param sampling_context [Hash] a context Hash that'll be passed to `traces_sampler` (if provided). # @return [void] def set_initial_sample_decision(sampling_context:) - unless @tracing_enabled + configuration = Sentry.configuration + + unless configuration && configuration.tracing_enabled? @sampled = false return end @@ -218,12 +141,12 @@ def set_initial_sample_decision(sampling_context:) end sample_rate = - if @traces_sampler.is_a?(Proc) - @traces_sampler.call(sampling_context) + if configuration.traces_sampler.is_a?(Proc) + configuration.traces_sampler.call(sampling_context) elsif !sampling_context[:parent_sampled].nil? sampling_context[:parent_sampled] else - @traces_sample_rate + configuration.traces_sample_rate end transaction_description = generate_transaction_description @@ -265,29 +188,28 @@ def set_initial_sample_decision(sampling_context:) end # Finishes the transaction's recording and send it to Sentry. - # @param hub [Hub] the hub that'll send this transaction. (Deprecated) # @return [TransactionEvent] - def finish(hub: nil, end_timestamp: nil) - if hub - log_warn( - <<~MSG - Specifying a different hub in `Transaction#finish` will be deprecated in version 5.0. - Please use `Hub#start_transaction` with the designated hub. - MSG - ) - end - - hub ||= @hub - + def finish(end_timestamp: nil) super(end_timestamp: end_timestamp) if @name.nil? @name = UNLABELD_NAME end - @hub.stop_profiler!(self) + hub = Sentry.get_current_hub + return unless hub - if @sampled + hub.stop_profiler!(self) + + if @sampled && ignore_status_code? + @sampled = false + + status_code = get_http_status_code + log_debug("#{MESSAGE_PREFIX} Discarding #{generate_transaction_description} due to ignored HTTP status code: #{status_code}") + + hub.current_client.transport.record_lost_event(:event_processor, "transaction") + hub.current_client.transport.record_lost_event(:event_processor, "span") + elsif @sampled event = hub.current_client.event_from_transaction(self) hub.capture_event(event) else @@ -345,6 +267,15 @@ def init_span_recorder(limit = 1000) @span_recorder.add(self) end + def init_profiler + hub = Sentry.get_current_hub + return unless hub + + unless hub.profiler_running? + @profiler = hub.configuration.profiler_class.new(hub.configuration) + end + end + private def generate_transaction_description @@ -355,14 +286,16 @@ def generate_transaction_description end def populate_head_baggage + configuration = Sentry.configuration + items = { "trace_id" => trace_id, "sample_rate" => effective_sample_rate&.to_s, "sample_rand" => Utils::SampleRand.format(@sample_rand), "sampled" => sampled&.to_s, - "environment" => @environment, - "release" => @release, - "public_key" => @dsn&.public_key + "environment" => configuration&.environment, + "release" => configuration&.release, + "public_key" => configuration&.dsn&.public_key } items["transaction"] = name unless source_low_quality? @@ -371,6 +304,22 @@ def populate_head_baggage @baggage = Baggage.new(items, mutable: false) end + def ignore_status_code? + trace_ignore_status_codes = Sentry.configuration&.trace_ignore_status_codes + return false unless trace_ignore_status_codes + + status_code = get_http_status_code + return false unless status_code + + trace_ignore_status_codes.any? do |ignored| + ignored.is_a?(Range) ? ignored.include?(status_code) : status_code == ignored + end + end + + def get_http_status_code + @data && @data[Span::DataConventions::HTTP_STATUS_CODE] + end + class SpanRecorder attr_reader :max_length, :spans diff --git a/sentry-ruby/lib/sentry/transaction_event.rb b/sentry-ruby/lib/sentry/transaction_event.rb index 21741df40..781a078e8 100644 --- a/sentry-ruby/lib/sentry/transaction_event.rb +++ b/sentry-ruby/lib/sentry/transaction_event.rb @@ -17,9 +17,6 @@ class TransactionEvent < Event # @return [Hash, nil] attr_accessor :profile - # @return [Hash, nil] - attr_accessor :metrics_summary - def initialize(transaction:, **options) super(**options) @@ -32,10 +29,9 @@ def initialize(transaction:, **options) self.tags = transaction.tags self.dynamic_sampling_context = transaction.get_baggage.dynamic_sampling_context self.measurements = transaction.measurements - self.metrics_summary = transaction.metrics_summary finished_spans = transaction.span_recorder.spans.select { |span| span.timestamp && span != transaction } - self.spans = finished_spans.map(&:to_hash) + self.spans = finished_spans.map(&:to_h) populate_profile(transaction) end @@ -48,12 +44,11 @@ def start_timestamp=(time) end # @return [Hash] - def to_hash + def to_h data = super - data[:spans] = @spans.map(&:to_hash) if @spans + data[:spans] = @spans.map(&:to_h) if @spans data[:start_timestamp] = @start_timestamp data[:measurements] = @measurements - data[:_metrics_summary] = @metrics_summary if @metrics_summary data end @@ -62,7 +57,7 @@ def to_hash EMPTY_PROFILE = {}.freeze def populate_profile(transaction) - profile_hash = transaction.profiler&.to_hash || EMPTY_PROFILE + profile_hash = transaction.profiler&.to_h || EMPTY_PROFILE return if profile_hash.empty? diff --git a/sentry-ruby/lib/sentry/transport.rb b/sentry-ruby/lib/sentry/transport.rb index 0c93e7dfa..3c2a1ac43 100644 --- a/sentry-ruby/lib/sentry/transport.rb +++ b/sentry-ruby/lib/sentry/transport.rb @@ -113,7 +113,7 @@ def any_rate_limited? def envelope_from_event(event) # Convert to hash - event_payload = event.to_hash + event_payload = event.to_h event_id = event_payload[:event_id] || event_payload["event_id"] item_type = event_payload[:type] || event_payload["type"] @@ -124,10 +124,7 @@ def envelope_from_event(event) sent_at: Sentry.utc_now.iso8601 } - if event.is_a?(Event) && event.dynamic_sampling_context - envelope_headers[:trace] = event.dynamic_sampling_context - end - + envelope_headers[:trace] = event.dynamic_sampling_context if event.dynamic_sampling_context envelope = Envelope.new(envelope_headers) if event.is_a?(LogEvent) diff --git a/sentry-ruby/lib/sentry/utils/logging_helper.rb b/sentry-ruby/lib/sentry/utils/logging_helper.rb index e7bf25c13..e383a66d4 100644 --- a/sentry-ruby/lib/sentry/utils/logging_helper.rb +++ b/sentry-ruby/lib/sentry/utils/logging_helper.rb @@ -3,27 +3,29 @@ module Sentry # @private module LoggingHelper - # @!visibility private - attr_reader :sdk_logger - # @!visibility private def log_error(message, exception, debug: false) message = "#{message}: #{exception.message}" message += "\n#{exception.backtrace.join("\n")}" if debug - sdk_logger.error(LOGGER_PROGNAME) do + sdk_logger&.error(LOGGER_PROGNAME) do message end end # @!visibility private def log_debug(message) - sdk_logger.debug(LOGGER_PROGNAME) { message } + sdk_logger&.debug(LOGGER_PROGNAME) { message } end # @!visibility private def log_warn(message) - sdk_logger.warn(LOGGER_PROGNAME) { message } + sdk_logger&.warn(LOGGER_PROGNAME) { message } + end + + # @!visibility private + def sdk_logger + @sdk_logger ||= Sentry.sdk_logger end end end diff --git a/sentry-ruby/lib/sentry/vernier/profiler.rb b/sentry-ruby/lib/sentry/vernier/profiler.rb index 450ed496a..028f85979 100644 --- a/sentry-ruby/lib/sentry/vernier/profiler.rb +++ b/sentry-ruby/lib/sentry/vernier/profiler.rb @@ -20,6 +20,7 @@ def initialize(configuration) @profiling_enabled = defined?(Vernier) && configuration.profiling_enabled? @profiles_sample_rate = configuration.profiles_sample_rate + @profiles_sample_interval = configuration.profiles_sample_interval @project_root = configuration.project_root @app_dirs_pattern = configuration.app_dirs_pattern @in_app_pattern = Regexp.new("^(#{@project_root}/)?#{@app_dirs_pattern}") @@ -56,7 +57,7 @@ def start return unless @sampled return if @started - @started = ::Vernier.start_profile + @started = ::Vernier.start_profile(interval: @profiles_sample_interval) log("Started") @@ -90,9 +91,9 @@ def active_thread_id Thread.current.object_id end - def to_hash + def to_h unless @sampled - record_lost_event(:sample_rate) + record_lost_event(:sample_rate) if @profiling_enabled return EMPTY_RESULT end diff --git a/sentry-ruby/sentry-ruby-core.gemspec b/sentry-ruby/sentry-ruby-core.gemspec index 4bd423750..baa67d01a 100644 --- a/sentry-ruby/sentry-ruby-core.gemspec +++ b/sentry-ruby/sentry-ruby-core.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |spec| spec.homepage = "https://github.com/getsentry/sentry-ruby" spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") diff --git a/sentry-ruby/sentry-ruby.gemspec b/sentry-ruby/sentry-ruby.gemspec index ba183705c..e7346b7f1 100644 --- a/sentry-ruby/sentry-ruby.gemspec +++ b/sentry-ruby/sentry-ruby.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") diff --git a/sentry-ruby/spec/sentry/background_worker_spec.rb b/sentry-ruby/spec/sentry/background_worker_spec.rb index 7295db97d..2e8afd797 100644 --- a/sentry-ruby/spec/sentry/background_worker_spec.rb +++ b/sentry-ruby/spec/sentry/background_worker_spec.rb @@ -10,22 +10,6 @@ end describe "#initialize" do - context "when config.async is set" do - before do - configuration.async = proc { } - end - - it "initializes a background_worker with ImmediateExecutor" do - worker = described_class.new(configuration) - - expect(string_io.string).to match( - /config.async is set, BackgroundWorker is disabled/ - ) - - expect(worker.instance_variable_get(:@executor)).to be_a(Concurrent::ImmediateExecutor) - end - end - context "when config.background_worker_threads is set" do it "initializes a background worker with correct number of threads and queue size" do configuration.background_worker_threads = 4 diff --git a/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb b/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb index 7efb67ae7..7093a53a3 100644 --- a/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb +++ b/sentry-ruby/spec/sentry/breadcrumb_buffer_spec.rb @@ -55,13 +55,13 @@ end end - describe "#to_hash" do + describe "#to_h" do it "doesn't break because of 1 problematic crumb" do subject.record(crumb_1) subject.record(crumb_2) subject.record(problematic_crumb) - result = subject.to_hash[:values] + result = subject.to_h[:values] expect(result[0][:category]).to eq("foo") expect(result[0][:data]).to eq({ "name" => "John", "age" => 25 }) diff --git a/sentry-ruby/spec/sentry/breadcrumb_spec.rb b/sentry-ruby/spec/sentry/breadcrumb_spec.rb index 008f1741e..3e040cfc8 100644 --- a/sentry-ruby/spec/sentry/breadcrumb_spec.rb +++ b/sentry-ruby/spec/sentry/breadcrumb_spec.rb @@ -64,7 +64,7 @@ end end - describe "#to_hash" do + describe "#to_h" do let(:problematic_crumb) do # circular reference a = [] @@ -90,7 +90,7 @@ end it "serializes data correctly" do - result = crumb.to_hash + result = crumb.to_h expect(result[:category]).to eq("foo") expect(result[:message]).to eq("crumb") @@ -98,7 +98,7 @@ end it "rescues data serialization issue and ditch the data" do - result = problematic_crumb.to_hash + result = problematic_crumb.to_h expect(result[:category]).to eq("baz") expect(result[:message]).to eq("I cause issues") @@ -107,7 +107,7 @@ end it "rescues data serialization issue for extremely nested data and ditch the data" do - result = very_deep_crumb.to_hash + result = very_deep_crumb.to_h expect(result[:category]).to eq("cow") expect(result[:message]).to eq("I cause too much recursion") diff --git a/sentry-ruby/spec/sentry/client/event_sending_spec.rb b/sentry-ruby/spec/sentry/client/event_sending_spec.rb index b24739f16..95d489d35 100644 --- a/sentry-ruby/spec/sentry/client/event_sending_spec.rb +++ b/sentry-ruby/spec/sentry/client/event_sending_spec.rb @@ -11,6 +11,7 @@ before do stub_request(:post, Sentry::TestHelper::DUMMY_DSN) + allow(Sentry).to receive(:configuration).and_return configuration end subject(:client) { Sentry::Client.new(configuration) } @@ -20,7 +21,9 @@ end let(:transaction) do - transaction = Sentry::Transaction.new(name: "test transaction", op: "rack.request", hub: hub) + configuration.traces_sample_rate = 1.0 + + transaction = hub.start_transaction(name: "test transaction", op: "rack.request") 5.times { |i| transaction.with_child_span(description: "span_#{i}") { } } transaction end @@ -61,84 +64,6 @@ end end - context 'with config.async set' do - let(:async_block) do - lambda do |event| - client.send_event(event) - end - end - - around do |example| - prior_async = configuration.async - configuration.async = async_block - example.run - configuration.async = prior_async - end - - it "executes the given block" do - expect(async_block).to receive(:call).and_call_original - - returned = client.capture_event(event, scope) - - expect(returned).to be_a(Sentry::ErrorEvent) - expect(client.transport.events.first).to eq(event.to_json_compatible) - end - - it "doesn't call the async block if not allow sending events" do - allow(configuration).to receive(:sending_allowed?).and_return(false) - - expect(async_block).not_to receive(:call) - - returned = client.capture_event(event, scope) - - expect(returned).to eq(nil) - end - - context "with to json conversion failed" do - let(:logger) { ::Logger.new(string_io) } - let(:string_io) { StringIO.new } - let(:event) { client.event_from_message("Bad data '\x80\xF8'") } - - it "does not mask the exception" do - configuration.sdk_logger = logger - - client.capture_event(event, scope) - - expect(string_io.string).to match(/Converting event \(#{event.event_id}\) to JSON compatible hash failed:.*illegal\/malformed utf-8/i) - end - end - - context "with nil as value (the legacy way to disable it)" do - let(:async_block) { nil } - - it "doesn't cause any issue" do - returned = client.capture_event(event, scope, { background: false }) - - expect(returned).to be_a(Sentry::ErrorEvent) - expect(client.transport.events.first).to eq(event) - end - end - - context "with 2 arity block" do - let(:async_block) do - lambda do |event, hint| - event["tags"]["hint"] = hint - client.send_event(event) - end - end - - it "serializes hint and supplies it as the second argument" do - expect(configuration.async).to receive(:call).and_call_original - - returned = client.capture_event(event, scope, { foo: "bar" }) - - expect(returned).to be_a(Sentry::ErrorEvent) - event = client.transport.events.first - expect(event.dig("tags", "hint")).to eq({ "foo" => "bar" }) - end - end - end - context "with background_worker enabled (default)" do before do Sentry.background_worker = Sentry::BackgroundWorker.new(configuration) @@ -206,6 +131,8 @@ client.event_from_exception(ZeroDivisionError.new("divided by 0")) end + let(:check_in_event) { client.event_from_check_in("test_slug", :ok) } + shared_examples "Event in send_event" do context "when there's an exception" do before do @@ -218,6 +145,7 @@ end.to raise_error(Sentry::ExternalError, "networking error") end end + it "sends data through the transport" do expect(client.transport).to receive(:send_event).with(event) client.send_event(event) @@ -225,34 +153,12 @@ it "applies before_send callback before sending the event" do configuration.before_send = lambda do |event, _hint| - if event.is_a?(Sentry::Event) - event.tags[:called] = true - else - event["tags"]["called"] = true - end - + event.tags[:called] = true event end client.send_event(event) - - if event.is_a?(Sentry::Event) - expect(event.tags[:called]).to eq(true) - else - expect(event["tags"]["called"]).to eq(true) - end - end - - context "for check in events" do - let(:event_object) { client.event_from_check_in("test_slug", :ok) } - - it "does not fail due to before_send" do - configuration.before_send = lambda { |e, _h| e } - client.send_event(event) - - expect(client.transport).to receive(:send_event).with(event) - client.send_event(event) - end + expect(event.tags[:called]).to eq(true) end it "doesn't apply before_send_transaction to Event" do @@ -288,29 +194,12 @@ expect(string_io.string).to include("Discarded event because before_send didn't return a Sentry::ErrorEvent object but an instance of Integer") expect(return_value).to eq(nil) end - - it "warns about Hash value's deprecation" do - string_io = StringIO.new - logger = Logger.new(string_io, level: :debug) - configuration.sdk_logger = logger - configuration.before_send = lambda do |_event, _hint| - { foo: "bar" } - end - - return_value = client.send_event(event) - expect(string_io.string).to include("Returning a Hash from before_send is deprecated and will be removed in the next major version.") - expect(return_value).to eq({ foo: "bar" }) - end end it_behaves_like "Event in send_event" do let(:event) { event_object } end - it_behaves_like "Event in send_event" do - let(:event) { event_object.to_json_compatible } - end - shared_examples "TransactionEvent in send_event" do it "sends data through the transport" do client.send_event(event) @@ -326,22 +215,12 @@ it "applies before_send_transaction callback before sending the event" do configuration.before_send_transaction = lambda do |event, _hint| - if event.is_a?(Sentry::TransactionEvent) - event.tags[:called] = true - else - event["tags"]["called"] = true - end - + event.tags[:called] = true event end client.send_event(event) - - if event.is_a?(Sentry::Event) - expect(event.tags[:called]).to eq(true) - else - expect(event["tags"]["called"]).to eq(true) - end + expect(event.tags[:called]).to eq(true) end it "warns if before_send_transaction returns nil" do @@ -356,27 +235,60 @@ expect(string_io.string).to include("Discarded event because before_send_transaction didn't return a Sentry::TransactionEvent object but an instance of NilClass") expect(return_value).to be_nil end + end + + it_behaves_like "TransactionEvent in send_event" do + let(:event) { transaction_event } + end + + shared_examples "CheckInEvent in send_event" do + it "sends data through the transport" do + client.send_event(event) + end + + it "doesn't apply before_send to CheckInEvent" do + configuration.before_send = lambda do |event, _hint| + raise "shouldn't trigger me" + end + + client.send_event(event) + end + + it "doesn't apply before_send_transaction to CheckInEvent" do + configuration.before_send_transaction = lambda do |event, _hint| + raise "shouldn't trigger me" + end + + client.send_event(event) + end - it "warns about Hash value's deprecation" do + it "applies before_send_check_in callback before sending the event" do + called = false + configuration.before_send_check_in = lambda do |event, _hint| + called = true + event + end + + client.send_event(event) + expect(called).to eq(true) + end + + it "warns if before_send_check_in returns nil" do string_io = StringIO.new logger = Logger.new(string_io, level: :debug) configuration.sdk_logger = logger - configuration.before_send_transaction = lambda do |_event, _hint| - { foo: "bar" } + configuration.before_send_check_in = lambda do |_event, _hint| + nil end return_value = client.send_event(event) - expect(string_io.string).to include("Returning a Hash from before_send_transaction is deprecated and will be removed in the next major version.") - expect(return_value).to eq({ foo: "bar" }) + expect(string_io.string).to include("Discarded event because before_send_check_in didn't return a Sentry::CheckInEvent object but an instance of NilClass") + expect(return_value).to be_nil end end - it_behaves_like "TransactionEvent in send_event" do - let(:event) { transaction_event } - end - - it_behaves_like "TransactionEvent in send_event" do - let(:event) { transaction_event.to_json_compatible } + it_behaves_like "CheckInEvent in send_event" do + let(:event) { check_in_event } end end @@ -397,12 +309,6 @@ let(:event) { client.event_from_message(message) } describe "#capture_event" do - around do |example| - prior_async = configuration.async - example.run - configuration.async = prior_async - end - context "when scope.apply_to_event returns nil" do before do scope.add_event_processor do |event, hint| @@ -542,28 +448,6 @@ expect(client.transport).to have_recorded_lost_event(:network_error, 'span', num: 6) end end - - context "when config.async causes error" do - before do - expect(client).to receive(:send_event) - end - - it "swallows Redis related error and send the event synchronizely" do - configuration.async = ->(_, _) { raise Redis::ConnectionError } - - client.capture_event(event, scope) - - expect(string_io.string).to match(/Async event sending failed: Redis::ConnectionError/) - end - - it "swallows and logs the exception" do - configuration.async = ->(_, _) { raise TypeError } - - client.capture_event(event, scope) - - expect(string_io.string).to match(/Async event sending failed: TypeError/) - end - end end describe "#send_event" do diff --git a/sentry-ruby/spec/sentry/client_spec.rb b/sentry-ruby/spec/sentry/client_spec.rb index 55b9129ee..56bab2e9e 100644 --- a/sentry-ruby/spec/sentry/client_spec.rb +++ b/sentry-ruby/spec/sentry/client_spec.rb @@ -17,19 +17,19 @@ def sentry_context end subject { Sentry::Client.new(configuration) } + let(:hub) do + Sentry::Hub.new(subject, Sentry::Scope.new) + end + let(:transaction) do - hub = Sentry::Hub.new(subject, Sentry::Scope.new) - Sentry::Transaction.new( - name: "test transaction", - hub: hub, - sampled: true - ) + hub.start_transaction(name: "test transaction") end let(:fake_time) { Time.now } before do allow(Time).to receive(:now).and_return fake_time + allow(Sentry).to receive(:configuration).and_return configuration end describe "#transport" do @@ -99,7 +99,6 @@ def sentry_context let(:envelope) do envelope = Sentry::Envelope.new({ env_header: 1 }) envelope.add_item({ type: 'event' }, { payload: 'test' }) - envelope.add_item({ type: 'statsd' }, { payload: 'test2' }) envelope.add_item({ type: 'transaction' }, { payload: 'test3' }) envelope.add_item({ type: 'log' }, { level: 'info', message: 'test4' }) envelope @@ -159,7 +158,6 @@ def sentry_context end.to raise_error(Sentry::ExternalError) expect(subject.transport).to have_recorded_lost_event(:network_error, 'error') - expect(subject.transport).to have_recorded_lost_event(:network_error, 'metric_bucket') expect(subject.transport).to have_recorded_lost_event(:network_error, 'transaction') expect(subject.transport).to have_recorded_lost_event(:network_error, 'log') end @@ -190,7 +188,7 @@ def sentry_context it 'returns an event' do event = subject.event_from_message(message) - hash = event.to_hash + hash = event.to_h expect(event).to be_a(Sentry::ErrorEvent) expect(hash[:message]).to eq(message) @@ -206,7 +204,7 @@ def sentry_context end t.join - hash = event.to_hash + hash = event.to_h thread = hash[:threads][:values][0] expect(thread[:id]).to eq(t.object_id) @@ -217,14 +215,6 @@ def sentry_context end describe "#event_from_transaction" do - let(:hub) do - Sentry::Hub.new(subject, Sentry::Scope.new) - end - - let(:transaction) do - hub.start_transaction(name: "test transaction") - end - before do configuration.traces_sample_rate = 1.0 @@ -234,7 +224,7 @@ def sentry_context it "initializes a correct event for the transaction" do event = subject.event_from_transaction(transaction) - event_hash = event.to_hash + event_hash = event.to_h expect(event_hash[:type]).to eq("transaction") expect(event_hash[:contexts][:trace]).to eq(transaction.get_trace_context) @@ -256,7 +246,7 @@ def sentry_context "other-vendor-value-2=foo;bar;" ) - transaction = Sentry::Transaction.new(name: "test transaction", hub: hub, baggage: baggage, sampled: true) + transaction = hub.start_transaction(name: "test transaction", baggage: baggage, sampled: true) event = subject.event_from_transaction(transaction) expect(event.dynamic_sampling_context).to eq({ @@ -286,23 +276,13 @@ def sentry_context event = subject.event_from_transaction(transaction) expect(event.contexts).to include({ foo: { bar: 42 } }) end - - it 'adds metric summary on transaction if any' do - key = [:c, 'incr', 'none', []] - transaction.metrics_local_aggregator.add(key, 10) - hash = subject.event_from_transaction(transaction).to_hash - - expect(hash[:_metrics_summary]).to eq({ - 'c:incr@none' => { count: 1, max: 10.0, min: 10.0, sum: 10.0, tags: {} } - }) - end end describe "#event_from_exception" do let(:message) { 'This is a message' } let(:exception) { Exception.new(message) } let(:event) { subject.event_from_exception(exception) } - let(:hash) { event.to_hash } + let(:hash) { event.to_h } it "sets the message to the exception's value and type" do expect(hash[:exception][:values][0][:type]).to eq("Exception") @@ -351,7 +331,7 @@ def detailed_message(*) end event = subject.event_from_exception(NonStringMessageError.new) - hash = event.to_hash + hash = event.to_h expect(event).to be_a(Sentry::ErrorEvent) if RUBY_VERSION >= "3.4" @@ -372,7 +352,7 @@ def detailed_message(*) t.join - event_hash = event.to_hash + event_hash = event.to_h thread = event_hash[:threads][:values][0] expect(thread[:id]).to eq(t.object_id) @@ -393,7 +373,7 @@ def detailed_message(*) it 'returns an event' do event = subject.event_from_exception(ZeroDivisionError.new("divided by 0")) expect(event).to be_a(Sentry::ErrorEvent) - hash = event.to_hash + hash = event.to_h expect(hash[:exception][:values][0][:type]).to match("ZeroDivisionError") expect(hash[:exception][:values][0][:value]).to match("divided by 0") end @@ -593,7 +573,7 @@ module ExcTag; end context 'when the exception responds to sentry_context' do let(:hash) do event = subject.event_from_exception(ExceptionWithContext.new) - event.to_hash + event.to_h end it "merges the context into event's extra" do @@ -671,7 +651,7 @@ module ExcTag; end it 'has correct custom mechanism when passed' do mech = Sentry::Mechanism.new(type: 'custom', handled: false) event = subject.event_from_exception(exception, mechanism: mech) - hash = event.to_hash + hash = event.to_h mechanism = hash[:exception][:values][0][:mechanism] expect(mechanism).to eq({ type: 'custom', handled: false }) end @@ -686,7 +666,7 @@ module ExcTag; end event = subject.event_from_check_in(slug, status) expect(event).to be_a(Sentry::CheckInEvent) - hash = event.to_hash + hash = event.to_h expect(hash[:monitor_slug]).to eq(slug) expect(hash[:status]).to eq(status) expect(hash[:check_in_id].length).to eq(32) @@ -703,7 +683,7 @@ module ExcTag; end expect(event).to be_a(Sentry::CheckInEvent) - hash = event.to_hash + hash = event.to_h expect(hash[:monitor_slug]).to eq(slug) expect(hash[:status]).to eq(status) expect(hash[:check_in_id]).to eq("xxx-yyy") @@ -722,7 +702,7 @@ module ExcTag; end expect(event).to be_a(Sentry::CheckInEvent) - hash = event.to_hash + hash = event.to_h expect(hash[:monitor_slug]).to eq(slug) expect(hash[:status]).to eq(status) expect(hash[:check_in_id]).to eq("xxx-yyy") @@ -730,84 +710,4 @@ module ExcTag; end expect(hash[:monitor_config]).to eq({ schedule: { type: :interval, value: 30, unit: :minute } }) end end - - describe "#generate_sentry_trace" do - let(:string_io) { StringIO.new } - let(:logger) do - ::Logger.new(string_io) - end - - before do - configuration.sdk_logger = logger - end - - let(:span) { Sentry::Span.new(transaction: transaction) } - - it "generates the trace with given span and logs correct message" do - expect(subject.generate_sentry_trace(span)).to eq(span.to_sentry_trace) - expect(string_io.string).to match( - /\[Tracing\] Adding sentry-trace header to outgoing request: #{span.to_sentry_trace}/ - ) - end - - context "with config.propagate_traces = false" do - before do - configuration.propagate_traces = false - end - - it "returns nil" do - expect(subject.generate_sentry_trace(span)).to eq(nil) - end - end - end - - describe "#generate_baggage" do - before { configuration.sdk_logger = logger } - - let(:string_io) { StringIO.new } - let(:logger) { ::Logger.new(string_io) } - let(:baggage) do - Sentry::Baggage.from_incoming_header( - "other-vendor-value-1=foo;bar;baz, sentry-trace_id=771a43a4192642f0b136d5159a501700, "\ - "sentry-public_key=49d0f7386ad645858ae85020e393bef3, sentry-sample_rate=0.01337, "\ - "sentry-user_id=Am%C3%A9lie, other-vendor-value-2=foo;bar;" - ) - end - - let(:span) do - hub = Sentry::Hub.new(subject, Sentry::Scope.new) - transaction = Sentry::Transaction.new(name: "test transaction", - baggage: baggage, - hub: hub, - sampled: true) - - transaction.start_child(op: "finished child", timestamp: Time.now.utc.iso8601) - end - - it "generates the baggage header with given span and logs correct message" do - generated_baggage = subject.generate_baggage(span) - expect(generated_baggage).to eq(span.to_baggage) - - expect(generated_baggage).to eq( - "sentry-trace_id=771a43a4192642f0b136d5159a501700,"\ - "sentry-public_key=49d0f7386ad645858ae85020e393bef3,"\ - "sentry-sample_rate=0.01337,"\ - "sentry-user_id=Am%C3%A9lie" - ) - - expect(string_io.string).to match( - /\[Tracing\] Adding baggage header to outgoing request: #{span.to_baggage}/ - ) - end - - context "with config.propagate_traces = false" do - before do - configuration.propagate_traces = false - end - - it "returns nil" do - expect(subject.generate_baggage(span)).to eq(nil) - end - end - end end diff --git a/sentry-ruby/spec/sentry/configuration_spec.rb b/sentry-ruby/spec/sentry/configuration_spec.rb index 92e831466..17a7d9730 100644 --- a/sentry-ruby/spec/sentry/configuration_spec.rb +++ b/sentry-ruby/spec/sentry/configuration_spec.rb @@ -1,29 +1,6 @@ # frozen_string_literal: true RSpec.describe Sentry::Configuration do - describe "#capture_exception_frame_locals" do - it "passes/received the value to #include_local_variables" do - subject.capture_exception_frame_locals = true - expect(subject.include_local_variables).to eq(true) - expect(subject.capture_exception_frame_locals).to eq(true) - - subject.capture_exception_frame_locals = false - expect(subject.include_local_variables).to eq(false) - expect(subject.capture_exception_frame_locals).to eq(false) - end - - it "prints deprecation message when being assigned" do - string_io = StringIO.new - subject.logger = Logger.new(string_io) - - subject.capture_exception_frame_locals = true - - expect(string_io.string).to include( - "WARN -- sentry: `capture_exception_frame_locals` is now deprecated in favor of `include_local_variables`." - ) - end - end - describe "#background_worker_threads" do it "sets to have of the processors count" do allow_any_instance_of(Sentry::Configuration).to receive(:processor_count).and_return(8) @@ -114,25 +91,6 @@ expect(subject.tracing_enabled?).to eq(false) end end - - context "when enable_tracing is set" do - it "returns false" do - subject.enable_tracing = true - - expect(subject.tracing_enabled?).to eq(false) - end - - it "prints deprecation message when being assigned" do - string_io = StringIO.new - subject.logger = Logger.new(string_io) - - subject.enable_tracing = true - - expect(string_io.string).to include( - "WARN -- sentry: `enable_tracing` is now deprecated in favor of `traces_sample_rate = 1.0`." - ) - end - end end context "when sending allowed" do @@ -175,29 +133,6 @@ expect(subject.tracing_enabled?).to eq(true) end end - - context "when enable_tracing is true" do - it "returns true" do - subject.enable_tracing = true - - expect(subject.tracing_enabled?).to eq(true) - end - end - - context "when enable_tracing is false" do - it "returns false" do - subject.enable_tracing = false - - expect(subject.tracing_enabled?).to eq(false) - end - - it "returns false even with explicit traces_sample_rate" do - subject.traces_sample_rate = 1.0 - subject.enable_tracing = false - - expect(subject.tracing_enabled?).to eq(false) - end - end end end @@ -227,19 +162,19 @@ describe "#profiling_enabled?" do it "returns false unless tracing enabled" do - subject.enable_tracing = false + subject.traces_sample_rate = nil expect(subject.profiling_enabled?).to eq(false) end it "returns false unless sending enabled" do - subject.enable_tracing = true + subject.traces_sample_rate = 1.0 subject.profiles_sample_rate = 1.0 allow(subject).to receive(:sending_allowed?).and_return(false) expect(subject.profiling_enabled?).to eq(false) end context 'when tracing and sending enabled' do - before { subject.enable_tracing = true } + before { subject.traces_sample_rate = 1.0 } before { allow(subject).to receive(:sending_allowed?).and_return(true) } it "returns false if nil sample rate" do @@ -259,16 +194,9 @@ end end - describe "#enable_tracing=" do - it "sets traces_sample_rate to 1.0 automatically" do - subject.enable_tracing = true - expect(subject.traces_sample_rate).to eq(1.0) - end - - it "doesn't override existing traces_sample_rate" do - subject.traces_sample_rate = 0.5 - subject.enable_tracing = true - expect(subject.traces_sample_rate).to eq(0.5) + describe "#profiles_sample_interval" do + it "defaults to 101 Hz" do + expect(subject.profiles_sample_interval).to eq(1e6 / 101) end end @@ -372,24 +300,11 @@ end end - context 'configuring for async' do - it 'should be configurable to send events async' do - subject.async = ->(_e) { :ok } - expect(subject.async.call('event')).to eq(:ok) - end - end - it 'raises error when setting release to anything other than String' do subject.release = "foo" expect { subject.release = 42 }.to raise_error(ArgumentError, "expect the argument to be a String or NilClass, got Integer (42)") end - it 'raises error when setting async to anything other than callable or nil' do - subject.async = -> { } - subject.async = nil - expect { subject.async = true }.to raise_error(ArgumentError, "async must be callable (or nil to disable)") - end - it 'raises error when setting before_send to anything other than callable or nil' do subject.before_send = -> { } subject.before_send = nil @@ -402,6 +317,12 @@ expect { subject.before_send_transaction = true }.to raise_error(ArgumentError, "before_send_transaction must be callable (or nil to disable)") end + it 'raises error when setting before_send_check_in to anything other than callable or nil' do + subject.before_send_check_in = -> { } + subject.before_send_check_in = nil + expect { subject.before_send_check_in = true }.to raise_error(ArgumentError, "before_send_check_in must be callable (or nil to disable)") + end + it 'raises error when setting before_breadcrumb to anything other than callable or nil' do subject.before_breadcrumb = -> { } subject.before_breadcrumb = nil @@ -416,9 +337,8 @@ it 'should send events if test is whitelisted' do subject.enabled_environments = %w[test] - subject.sending_allowed? - puts subject.errors expect(subject.sending_allowed?).to eq(true) + expect(subject.errors).to be_empty end it 'should not send events if test is not whitelisted' do @@ -798,19 +718,43 @@ class SentryConfigurationSample < Sentry::Configuration end end - describe "#logger" do - it "returns configured sdk_logger and prints deprecation warning" do - expect { - expect(subject.logger).to be(subject.sdk_logger) - }.to output(/`config.logger` is deprecated/).to_stderr + describe "#trace_ignore_status_codes" do + it "has default values" do + expect(subject.trace_ignore_status_codes).to eq([(301..303), (305..399), (401..404)]) end - end - describe "#logger=" do - it "sets sdk_logger and prints deprecation warning" do - expect { - subject.logger = Logger.new($stdout) - }.to output(/`config.logger=` is deprecated/).to_stderr + it "can be configured with individual status codes" do + subject.trace_ignore_status_codes = [404, 500] + expect(subject.trace_ignore_status_codes).to eq([404, 500]) + end + + it "can be configured with ranges" do + subject.trace_ignore_status_codes = [(300..399), (500..599)] + expect(subject.trace_ignore_status_codes).to eq([(300..399), (500..599)]) + end + + it "can be configured with mixed individual codes and ranges" do + subject.trace_ignore_status_codes = [404, (500..599)] + expect(subject.trace_ignore_status_codes).to eq([404, (500..599)]) + end + + it "raises ArgumentError when not an Array" do + expect { subject.trace_ignore_status_codes = 404 }.to raise_error(ArgumentError, /must be an Array/) + expect { subject.trace_ignore_status_codes = "404" }.to raise_error(ArgumentError, /must be an Array/) + end + + it "raises ArgumentError for invalid status codes" do + expect { subject.trace_ignore_status_codes = [99] }.to raise_error(ArgumentError, /must be.* between \(100-599\)/) + expect { subject.trace_ignore_status_codes = [600] }.to raise_error(ArgumentError, /must be.* between \(100-599\)/) + expect { subject.trace_ignore_status_codes = ["404"] }.to raise_error(ArgumentError, /must be an Array of integers/) + end + + it "raises ArgumentError for invalid ranges" do + expect { subject.trace_ignore_status_codes = [[400]] }.to raise_error(ArgumentError, /must be.* ranges/) + expect { subject.trace_ignore_status_codes = [[400, 500, 600]] }.to raise_error(ArgumentError, /must be.* ranges/) + expect { subject.trace_ignore_status_codes = [[500, 400]] }.to raise_error(ArgumentError, /must be.* begin <= end/) + expect { subject.trace_ignore_status_codes = [[99, 200]] }.to raise_error(ArgumentError, /must be.* between \(100-599\)/) + expect { subject.trace_ignore_status_codes = [[400, 600]] }.to raise_error(ArgumentError, /must be.* between \(100-599\)/) end end end diff --git a/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb b/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb index c6266908b..11dd57952 100644 --- a/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb +++ b/sentry-ruby/spec/sentry/cron/monitor_config_spec.rb @@ -43,7 +43,7 @@ end end - describe '#to_hash' do + describe '#to_h' do it 'returns hash with correct attributes for crontab' do subject = described_class.from_crontab( '5 * * * *', @@ -52,7 +52,7 @@ timezone: 'Europe/Vienna' ) - hash = subject.to_hash + hash = subject.to_h expect(hash).to eq({ schedule: { type: :crontab, value: '5 * * * *' }, checkin_margin: 10, @@ -70,7 +70,7 @@ timezone: 'Europe/Vienna' ) - hash = subject.to_hash + hash = subject.to_h expect(hash).to eq({ schedule: { type: :interval, value: 5, unit: :hour }, checkin_margin: 10, diff --git a/sentry-ruby/spec/sentry/cron/monitor_schedule_spec.rb b/sentry-ruby/spec/sentry/cron/monitor_schedule_spec.rb index 9acad1319..fdaf0f549 100644 --- a/sentry-ruby/spec/sentry/cron/monitor_schedule_spec.rb +++ b/sentry-ruby/spec/sentry/cron/monitor_schedule_spec.rb @@ -9,9 +9,9 @@ end end - describe '#to_hash' do + describe '#to_h' do it 'has correct attributes' do - expect(subject.to_hash).to eq({ type: :crontab, value: subject.value }) + expect(subject.to_h).to eq({ type: :crontab, value: subject.value }) end end end @@ -31,9 +31,9 @@ end end - describe '#to_hash' do + describe '#to_h' do it 'has correct attributes' do - expect(subject.to_hash).to eq({ type: :interval, value: subject.value, unit: subject.unit }) + expect(subject.to_h).to eq({ type: :interval, value: subject.value, unit: subject.unit }) end end end diff --git a/sentry-ruby/spec/sentry/envelope/item_spec.rb b/sentry-ruby/spec/sentry/envelope/item_spec.rb index bdf01dd6c..516dfd465 100644 --- a/sentry-ruby/spec/sentry/envelope/item_spec.rb +++ b/sentry-ruby/spec/sentry/envelope/item_spec.rb @@ -11,8 +11,6 @@ ['profile', 'profile'], ['log', 'log'], ['check_in', 'monitor'], - ['statsd', 'metric_bucket'], - ['metric_meta', 'metric_bucket'], ['event', 'error'], ['client_report', 'internal'], ['unknown', 'default'] diff --git a/sentry-ruby/spec/sentry/event_spec.rb b/sentry-ruby/spec/sentry/event_spec.rb index dc8eb9c5c..0f00ced00 100644 --- a/sentry-ruby/spec/sentry/event_spec.rb +++ b/sentry-ruby/spec/sentry/event_spec.rb @@ -97,14 +97,14 @@ it "filters out pii data" do scope.apply_to_event(event) - expect(event.to_hash[:request]).to eq( + expect(event.to_h[:request]).to eq( env: { 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => '80' }, headers: { 'Host' => 'localhost', 'X-Request-Id' => 'abcd-1234-abcd-1234' }, method: 'POST', url: 'http://localhost/lol', ) - expect(event.to_hash[:tags][:request_id]).to eq("abcd-1234-abcd-1234") - expect(event.to_hash[:user][:ip_address]).to eq(nil) + expect(event.to_h[:tags][:request_id]).to eq("abcd-1234-abcd-1234") + expect(event.to_h[:user][:ip_address]).to eq(nil) end it "removes ip address headers" do @@ -127,7 +127,7 @@ it "adds correct data" do Sentry.get_current_scope.apply_to_event(event) - expect(event.to_hash[:request]).to eq( + expect(event.to_h[:request]).to eq( data: { 'foo' => 'bar' }, env: { 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => '80', "REMOTE_ADDR" => "192.168.1.1" }, headers: { 'Host' => 'localhost', "X-Forwarded-For" => "1.1.1.1, 2.2.2.2", "X-Request-Id" => "abcd-1234-abcd-1234" }, @@ -137,14 +137,14 @@ cookies: {} ) - expect(event.to_hash[:tags][:request_id]).to eq("abcd-1234-abcd-1234") - expect(event.to_hash[:user][:ip_address]).to eq("2.2.2.2") + expect(event.to_h[:tags][:request_id]).to eq("abcd-1234-abcd-1234") + expect(event.to_h[:user][:ip_address]).to eq("2.2.2.2") end it "doesn't overwrite already set ip address" do Sentry.set_user({ ip_address: "3.3.3.3" }) Sentry.get_current_scope.apply_to_event(event) - expect(event.to_hash[:user][:ip_address]).to eq("3.3.3.3") + expect(event.to_h[:user][:ip_address]).to eq("3.3.3.3") end context "with config.trusted_proxies = [\"2.2.2.2\"]" do @@ -155,7 +155,7 @@ it "calculates the correct ip address" do Sentry.get_current_scope.apply_to_event(event) - expect(event.to_hash[:request]).to eq( + expect(event.to_h[:request]).to eq( data: { "foo"=>"bar" }, env: { 'SERVER_NAME' => 'localhost', 'SERVER_PORT' => '80', "REMOTE_ADDR" => "192.168.1.1" }, headers: { 'Host' => 'localhost', "X-Forwarded-For" => "1.1.1.1, 2.2.2.2", "X-Request-Id" => "abcd-1234-abcd-1234" }, @@ -165,8 +165,8 @@ cookies: {} ) - expect(event.to_hash[:tags][:request_id]).to eq("abcd-1234-abcd-1234") - expect(event.to_hash[:user][:ip_address]).to eq("1.1.1.1") + expect(event.to_h[:tags][:request_id]).to eq("abcd-1234-abcd-1234") + expect(event.to_h[:user][:ip_address]).to eq("1.1.1.1") end end end diff --git a/sentry-ruby/spec/sentry/hub_spec.rb b/sentry-ruby/spec/sentry/hub_spec.rb index f2f549d0d..737cb7edb 100644 --- a/sentry-ruby/spec/sentry/hub_spec.rb +++ b/sentry-ruby/spec/sentry/hub_spec.rb @@ -147,7 +147,7 @@ it "takes backtrace option" do event = subject.capture_message(message, backtrace: ["#{__FILE__}:10:in `foo'"]) - event_hash = event.to_hash + event_hash = event.to_h expect(event_hash.dig(:threads, :values, 0, :stacktrace, :frames, 0, :function)).to eq("foo") end @@ -159,7 +159,7 @@ it "assigns default backtrace with caller" do event = subject.capture_message(message) - event_hash = event.to_hash + event_hash = event.to_h expect(event_hash.dig(:threads, :values, 0, :stacktrace, :frames, 0, :function)).to eq("
") end @@ -211,7 +211,7 @@ monitor_config: Sentry::Cron::MonitorConfig.from_crontab("* * * * *") ) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event).to include( monitor_slug: slug, status: :ok, @@ -358,11 +358,15 @@ end context "when event is a transaction" do + before do + configuration.traces_sample_rate = 1.0 + end + it "transaction.set_context merges and takes precedence over scope.set_context" do scope.set_context(:foo, { val: 42 }) scope.set_context(:bar, { val: 43 }) - transaction = Sentry::Transaction.new(hub: subject, name: 'test') + transaction = subject.start_transaction(name: 'test') transaction.set_context(:foo, { val: 44 }) transaction.set_context(:baz, { val: 45 }) @@ -581,21 +585,27 @@ expect(subject.last_event_id).to eq(event.event_id) end - it 'only records last_event_id for error events' do - exception = ZeroDivisionError.new("divided by 0") - transaction = Sentry::Transaction.new(name: "test transaction", op: "rack.request", hub: subject) + context "with tracing" do + before do + configuration.traces_sample_rate = 1.0 + end + + it 'only records last_event_id for error events' do + exception = ZeroDivisionError.new("divided by 0") + transaction = subject.start_transaction(name: "test transaction", op: "rack.request") - error_event = client.event_from_exception(exception) - transaction_event = client.event_from_transaction(transaction) - check_in_event = client.event_from_check_in("test_slug", :ok) + error_event = client.event_from_exception(exception) + transaction_event = client.event_from_transaction(transaction) + check_in_event = client.event_from_check_in("test_slug", :ok) - subject.capture_event(error_event) - subject.capture_event(transaction_event) - subject.capture_event(check_in_event) + subject.capture_event(error_event) + subject.capture_event(transaction_event) + subject.capture_event(check_in_event) - expect(subject.last_event_id).to eq(error_event.event_id) - expect(subject.last_event_id).not_to eq(transaction_event.event_id) - expect(subject.last_event_id).not_to eq(check_in_event.event_id) + expect(subject.last_event_id).to eq(error_event.event_id) + expect(subject.last_event_id).not_to eq(transaction_event.event_id) + expect(subject.last_event_id).not_to eq(check_in_event.event_id) + end end end diff --git a/sentry-ruby/spec/sentry/integrable_spec.rb b/sentry-ruby/spec/sentry/integrable_spec.rb index 02a2ed102..4a6677a87 100644 --- a/sentry-ruby/spec/sentry/integrable_spec.rb +++ b/sentry-ruby/spec/sentry/integrable_spec.rb @@ -82,7 +82,7 @@ module AnotherIntegration; end it "generates Sentry::FakeIntegration.capture_check_in" do hint = nil - Sentry.configuration.before_send = lambda do |event, h| + Sentry.configuration.before_send_check_in = lambda do |event, h| hint = h event end diff --git a/sentry-ruby/spec/sentry/interface_spec.rb b/sentry-ruby/spec/sentry/interface_spec.rb index ade88af2a..e67bd5fbf 100644 --- a/sentry-ruby/spec/sentry/interface_spec.rb +++ b/sentry-ruby/spec/sentry/interface_spec.rb @@ -11,6 +11,6 @@ class TestInterface < Sentry::Interface interface = TestInterface.new interface.some_attr = "test" - expect(interface.to_hash).to eq(some_attr: "test") + expect(interface.to_h).to eq(some_attr: "test") end end diff --git a/sentry-ruby/spec/sentry/interfaces/request_interface_spec.rb b/sentry-ruby/spec/sentry/interfaces/request_interface_spec.rb index 041979e74..1ca2a5b67 100644 --- a/sentry-ruby/spec/sentry/interfaces/request_interface_spec.rb +++ b/sentry-ruby/spec/sentry/interfaces/request_interface_spec.rb @@ -61,7 +61,7 @@ let(:additional_headers) { { "HTTP_FOO" => "Tekirda\xC4" } } it "doesn't cause any issue" do - json = JSON.generate(subject.to_hash) + json = JSON.generate(subject.to_h) expect(JSON.parse(json)["headers"]).to include("Foo"=>"Tekirda�") end @@ -192,7 +192,7 @@ def to_s env.merge!(::Rack::RACK_INPUT => StringIO.new("あ")) expect do - JSON.generate(subject.to_hash) + JSON.generate(subject.to_h) end.not_to raise_error end diff --git a/sentry-ruby/spec/sentry/interfaces/stacktrace_builder_spec.rb b/sentry-ruby/spec/sentry/interfaces/stacktrace_builder_spec.rb index 77a33fee8..fa46f5809 100644 --- a/sentry-ruby/spec/sentry/interfaces/stacktrace_builder_spec.rb +++ b/sentry-ruby/spec/sentry/interfaces/stacktrace_builder_spec.rb @@ -97,17 +97,4 @@ end end end - - describe '#metrics_code_location' do - it 'builds metrics code location hash for line' do - hash = subject.metrics_code_location(backtrace.first) - - expect(hash[:filename]).to match(/stacktrace_test_fixture.rb/) - expect(hash[:function]).to eq("bar") - expect(hash[:lineno]).to eq(8) - expect(hash[:pre_context]).to eq(["end\n", "\n", "def bar\n"]) - expect(hash[:context_line]).to eq(" baz\n") - expect(hash[:post_context]).to eq(["end\n", nil, nil]) - end - end end diff --git a/sentry-ruby/spec/sentry/log_event_spec.rb b/sentry-ruby/spec/sentry/log_event_spec.rb index f2580c495..0591c1dd7 100644 --- a/sentry-ruby/spec/sentry/log_event_spec.rb +++ b/sentry-ruby/spec/sentry/log_event_spec.rb @@ -48,7 +48,7 @@ end end - describe "#to_hash" do + describe "#to_h" do before do configuration.release = "1.2.3" configuration.environment = "test" @@ -65,7 +65,7 @@ attributes: attributes ) - hash = event.to_hash + hash = event.to_h expect(hash[:body]).to eq("Hello John, today is Monday") @@ -82,7 +82,7 @@ body: "User John has logged in!" ) - hash = event.to_hash + hash = event.to_h expect(hash[:level]).to eq("info") expect(hash[:body]).to eq("User John has logged in!") @@ -102,7 +102,7 @@ body: "User John has logged in!" ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]).not_to have_key("sentry.message.template") end @@ -114,7 +114,7 @@ body: "Hello %{name}, today is %{day}" ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]).not_to have_key("sentry.message.template") expect(hash[:attributes]).not_to have_key("sentry.message.parameter.name") @@ -133,7 +133,7 @@ attributes: attributes ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]).to have_key("sentry.message.template") expect(hash[:attributes]["sentry.message.template"]).to eq({ value: "User %s has logged in!", type: "string" }) @@ -155,7 +155,7 @@ attributes: attributes ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]["string_attr"]).to eq({ value: "string value", type: "string" }) expect(hash[:attributes]["integer_attr"]).to eq({ value: 42, type: "integer" }) @@ -177,7 +177,7 @@ user: user ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]["user.id"]).to eq(123) expect(hash[:attributes]["user.name"]).to eq("john_doe") @@ -192,7 +192,7 @@ origin: "auto.db.rails" ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]["sentry.origin"]).to eq({ value: "auto.db.rails", type: "string" }) end @@ -204,7 +204,7 @@ body: "Manual log message" ) - hash = event.to_hash + hash = event.to_h expect(hash[:attributes]).not_to have_key("sentry.origin") end diff --git a/sentry-ruby/spec/sentry/metrics/aggregator_spec.rb b/sentry-ruby/spec/sentry/metrics/aggregator_spec.rb deleted file mode 100644 index 6094578e9..000000000 --- a/sentry-ruby/spec/sentry/metrics/aggregator_spec.rb +++ /dev/null @@ -1,485 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::Aggregator do - let(:string_io) { StringIO.new } - - # fix at 3 second offset to check rollup - let(:fake_time) { Time.new(2024, 1, 1, 1, 1, 3) } - - before do - perform_basic_setup do |config| - config.metrics.enabled = true - config.traces_sample_rate = 1.0 - config.release = 'test-release' - config.environment = 'test' - config.sdk_logger = Logger.new(string_io) - end - end - - subject { Sentry.metrics_aggregator } - - describe '#add' do - it 'spawns new thread' do - expect { subject.add(:c, 'incr', 1) }.to change { Thread.list.count }.by(1) - expect(subject.thread).to be_a(Thread) - end - - it 'spawns only one thread' do - expect { subject.add(:c, 'incr', 1) }.to change { Thread.list.count }.by(1) - - expect(subject.thread).to receive(:alive?).and_call_original - expect { subject.add(:c, 'incr', 1) }.to change { Thread.list.count }.by(0) - end - - context 'when thread creation fails' do - before do - expect(Thread).to receive(:new).and_raise(ThreadError) - end - - it 'does not create new thread' do - expect { subject.add(:c, 'incr', 1) }.to change { Thread.list.count }.by(0) - end - - it 'noops' do - subject.add(:c, 'incr', 1) - expect(subject.buckets).to eq({}) - end - - it 'logs error' do - subject.add(:c, 'incr', 1) - expect(string_io.string).to include("[#{described_class.name}] thread creation failed") - end - end - - context 'when killed' do - before { subject.kill } - - it 'noops' do - subject.add(:c, 'incr', 1) - expect(subject.buckets).to eq({}) - end - - it 'does not create new thread' do - expect(Thread).not_to receive(:new) - expect { subject.add(:c, 'incr', 1) }.to change { Thread.list.count }.by(0) - end - end - - it 'does not add unsupported metric type' do - subject.add(:foo, 'foo', 1) - expect(subject.buckets).to eq({}) - end - - it 'has the correct bucket timestamp key rolled up to 10 seconds' do - allow(Time).to receive(:now).and_return(fake_time) - subject.add(:c, 'incr', 1) - expect(subject.buckets.keys.first).to eq(fake_time.to_i - 3) - end - - it 'has the correct bucket timestamp key rolled up to 10 seconds when passed explicitly' do - subject.add(:c, 'incr', 1, timestamp: fake_time + 9) - expect(subject.buckets.keys.first).to eq(fake_time.to_i + 7) - end - - it 'has the correct type in the bucket metric key' do - subject.add(:c, 'incr', 1) - type, _, _, _ = subject.buckets.values.first.keys.first - expect(type).to eq(:c) - end - - it 'has the correct key in the bucket metric key' do - subject.add(:c, 'incr', 1) - _, key, _, _ = subject.buckets.values.first.keys.first - expect(key).to eq('incr') - end - - it 'has the default unit \'none\' in the bucket metric key' do - subject.add(:c, 'incr', 1) - _, _, unit, _ = subject.buckets.values.first.keys.first - expect(unit).to eq('none') - end - - it 'has the correct custom unit in the bucket metric key' do - subject.add(:c, 'incr', 1, unit: 'second') - _, _, unit, _ = subject.buckets.values.first.keys.first - expect(unit).to eq('second') - end - - it 'has the correct default tags serialized in the bucket metric key' do - subject.add(:c, 'incr', 1) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).to eq([['environment', 'test'], ['release', 'test-release']]) - end - - it 'has the correct custom tags serialized in the bucket metric key' do - subject.add(:c, 'incr', 1, tags: { foo: 42 }) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).to include(['foo', '42']) - end - - it 'has the correct array value tags serialized in the bucket metric key' do - subject.add(:c, 'incr', 1, tags: { foo: [42, 43] }) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).to include(['foo', '42'], ['foo', '43']) - end - - context 'with running transaction' do - it 'has the transaction name in tags serialized in the bucket metric key' do - Sentry.get_current_scope.set_transaction_name('foo') - subject.add(:c, 'incr', 1) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).to include(['transaction', 'foo']) - end - - it 'does not has the low quality transaction name in tags serialized in the bucket metric key' do - Sentry.get_current_scope.set_transaction_name('foo', source: :url) - subject.add(:c, 'incr', 1) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).not_to include(['transaction', 'foo']) - end - end - - it 'creates a new CounterMetric instance if not existing' do - expect(Sentry::Metrics::CounterMetric).to receive(:new).and_call_original - subject.add(:c, 'incr', 1) - - metric = subject.buckets.values.first.values.first - expect(metric).to be_a(Sentry::Metrics::CounterMetric) - expect(metric.value).to eq(1.0) - end - - it 'reuses the existing CounterMetric instance' do - allow(Time).to receive(:now).and_return(fake_time) - - subject.add(:c, 'incr', 1) - metric = subject.buckets.values.first.values.first - expect(metric.value).to eq(1.0) - - expect(Sentry::Metrics::CounterMetric).not_to receive(:new) - expect(metric).to receive(:add).with(2).and_call_original - subject.add(:c, 'incr', 2) - expect(metric.value).to eq(3.0) - end - - it 'creates a new DistributionMetric instance if not existing' do - expect(Sentry::Metrics::DistributionMetric).to receive(:new).and_call_original - subject.add(:d, 'dist', 1) - - metric = subject.buckets.values.first.values.first - expect(metric).to be_a(Sentry::Metrics::DistributionMetric) - expect(metric.value).to eq([1.0]) - end - - it 'creates a new GaugeMetric instance if not existing' do - expect(Sentry::Metrics::GaugeMetric).to receive(:new).and_call_original - subject.add(:g, 'gauge', 1) - - metric = subject.buckets.values.first.values.first - expect(metric).to be_a(Sentry::Metrics::GaugeMetric) - expect(metric.serialize).to eq([1.0, 1.0, 1.0, 1.0, 1]) - end - - it 'creates a new SetMetric instance if not existing' do - expect(Sentry::Metrics::SetMetric).to receive(:new).and_call_original - subject.add(:s, 'set', 1) - - metric = subject.buckets.values.first.values.first - expect(metric).to be_a(Sentry::Metrics::SetMetric) - expect(metric.value).to eq(Set[1]) - end - - describe 'with before_emit callback' do - before do - perform_basic_setup do |config| - config.metrics.enabled = true - config.traces_sample_rate = 1.0 - config.release = 'test-release' - config.environment = 'test' - config.sdk_logger = Logger.new(string_io) - - config.metrics.before_emit = lambda do |key, tags| - return nil if key == 'foo' - tags[:add_tag] = 42 - tags.delete(:remove_tag) - true - end - end - end - - it 'does not emit metric with filtered key' do - expect(Sentry::Metrics::CounterMetric).not_to receive(:new) - subject.add(:c, 'foo', 1) - expect(subject.buckets).to eq({}) - end - - it 'updates the tags according to the callback' do - subject.add(:c, 'bar', 1, tags: { remove_tag: 99 }) - _, _, _, tags = subject.buckets.values.first.keys.first - expect(tags).not_to include(['remove_tag', '99']) - expect(tags).to include(['add_tag', '42']) - end - end - - describe 'local aggregation for span metric summaries' do - it 'does nothing without an active scope span' do - expect_any_instance_of(Sentry::Metrics::LocalAggregator).not_to receive(:add) - subject.add(:c, 'incr', 1) - end - - context 'with running transaction and active span' do - let(:span) { Sentry.start_transaction } - - before do - Sentry.get_current_scope.set_span(span) - Sentry.get_current_scope.set_transaction_name('metric', source: :view) - end - - it 'does nothing if transaction name is low quality' do - expect_any_instance_of(Sentry::Metrics::LocalAggregator).not_to receive(:add) - - Sentry.get_current_scope.set_transaction_name('/123', source: :url) - subject.add(:c, 'incr', 1) - end - - it 'proxies bucket key and value to local aggregator' do - expect(span.metrics_local_aggregator).to receive(:add).with( - array_including(:c, 'incr', 'none'), - 1 - ) - subject.add(:c, 'incr', 1) - end - - context 'for set metrics' do - before { subject.add(:s, 'set', 'foo') } - - it 'proxies bucket key and value 0 when existing element' do - expect(span.metrics_local_aggregator).to receive(:add).with( - array_including(:s, 'set', 'none'), - 0 - ) - subject.add(:s, 'set', 'foo') - end - - it 'proxies bucket key and value 1 when new element' do - expect(span.metrics_local_aggregator).to receive(:add).with( - array_including(:s, 'set', 'none'), - 1 - ) - subject.add(:s, 'set', 'bar') - end - end - end - end - - describe 'code location reporting' do - it 'does not record location if off' do - perform_basic_setup do |config| - config.metrics.enabled = true - config.metrics.enable_code_locations = false - end - - subject.add(:c, 'incr', 1) - expect(subject.code_locations).to eq({}) - end - - it 'records the code location with a timestamp for the day' do - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - - timestamp = Time.now.utc - start_of_day = Time.utc(timestamp.year, timestamp.month, timestamp.day).to_i - expect(subject.code_locations.keys.first).to eq(start_of_day) - end - - it 'has the code location keyed with mri (metric resource identifier) from type/key/unit' do - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - mri = subject.code_locations.values.first.keys.first - expect(mri).to eq([:c, 'incr', 'second']) - end - - it 'has the code location information in the hash' do - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - - location = subject.code_locations.values.first.values.first - expect(location).to include(:abs_path, :filename, :pre_context, :context_line, :post_context, :lineno) - expect(location[:abs_path]).to match(/aggregator_spec.rb/) - expect(location[:filename]).to match(/aggregator_spec.rb/) - expect(location[:context_line]).to include("subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3)") - end - - it 'does not add code location for the same mri twice' do - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - expect(subject.code_locations.values.first.size).to eq(1) - end - - it 'adds code location for different mris twice' do - subject.add(:c, 'incr', 1, unit: 'second', stacklevel: 3) - subject.add(:c, 'incr', 1, unit: 'none', stacklevel: 3) - expect(subject.code_locations.values.first.size).to eq(2) - end - end - end - - describe '#flush' do - context 'with empty buckets and empty locations' do - it 'returns early and does nothing' do - expect(sentry_envelopes.count).to eq(0) - subject.flush - end - - it 'returns early and does nothing with force' do - expect(sentry_envelopes.count).to eq(0) - subject.flush(force: true) - end - end - - context 'with pending buckets' do - before do - allow(Time).to receive(:now).and_return(fake_time) - 10.times { subject.add(:c, 'incr', 1) } - 5.times { |i| subject.add(:d, 'disöt', i, unit: 'second', tags: { "foö$-bar" => "snöwmän% 23{}" }) } - - allow(Time).to receive(:now).and_return(fake_time + 9) - 5.times { subject.add(:c, 'incr', 1) } - 5.times { |i| subject.add(:d, 'disöt', i + 5, unit: 'second', tags: { "foö$-bar" => "snöwmän% 23{}" }) } - - expect(subject.buckets.keys).to eq([fake_time.to_i - 3, fake_time.to_i + 7]) - expect(subject.buckets.values[0].length).to eq(2) - expect(subject.buckets.values[1].length).to eq(2) - - # set the time such that the first set of metrics above are picked - allow(Time).to receive(:now).and_return(fake_time + 9 + subject.flush_shift) - end - - context 'without force' do - it 'updates the pending buckets in place' do - subject.flush - - expect(subject.buckets.keys).to eq([fake_time.to_i + 7]) - expect(subject.buckets.values[0].length).to eq(2) - end - - it 'empties the pending code locations in place' do - subject.flush - expect(subject.code_locations).to eq({}) - end - - it 'captures the envelope' do - expect(subject.client).to receive(:capture_envelope) - subject.flush - end - - it 'sends the flushable buckets in statsd envelope item with correct payload' do - subject.flush - - envelope = sentry_envelopes.first - expect(envelope.headers).to eq({}) - - item = envelope.items.first - expect(item.headers).to eq({ type: 'statsd', length: item.payload.bytesize }) - - incr, dist = item.payload.split("\n") - expect(incr).to eq("incr@none:10.0|c|#environment:test,release:test-release|T#{fake_time.to_i - 3}") - expect(dist).to eq("dis_t@second:0.0:1.0:2.0:3.0:4.0|d|" + - "#environment:test,fo-bar:snöwmän% 23{},release:test-release|" + - "T#{fake_time.to_i - 3}") - end - - it 'sends the pending code locations in metric_meta envelope item with correct payload' do - subject.flush - - envelope = sentry_envelopes.first - expect(envelope.headers).to eq({}) - - item = envelope.items.last - expect(item.headers).to eq({ type: 'metric_meta', content_type: 'application/json' }) - expect(item.payload[:timestamp]).to be_a(Integer) - - mapping = item.payload[:mapping] - expect(mapping.keys).to eq(['c:incr@none', 'd:dis_t@second']) - - location_1 = mapping['c:incr@none'].first - expect(location_1[:type]).to eq('location') - expect(location_1).to include(:abs_path, :filename, :lineno) - - location_2 = mapping['d:dis_t@second'].first - expect(location_2[:type]).to eq('location') - expect(location_2).to include(:abs_path, :filename, :lineno) - end - end - - context 'with force' do - it 'empties the pending buckets in place' do - subject.flush(force: true) - expect(subject.buckets).to eq({}) - end - - it 'captures the envelope' do - expect(Sentry.background_worker).to receive(:perform) - subject.flush(force: true) - end - - it 'sends all buckets in statsd envelope item with correct payload' do - subject.flush(force: true) - - envelope = sentry_envelopes.first - expect(envelope.headers).to eq({}) - - item = envelope.items.first - expect(item.headers).to eq({ type: 'statsd', length: item.payload.bytesize }) - - incr1, dist1, incr2, dist2 = item.payload.split("\n") - expect(incr1).to eq("incr@none:10.0|c|#environment:test,release:test-release|T#{fake_time.to_i - 3}") - expect(dist1).to eq("dis_t@second:0.0:1.0:2.0:3.0:4.0|d|" + - "#environment:test,fo-bar:snöwmän% 23{},release:test-release|" + - "T#{fake_time.to_i - 3}") - expect(incr2).to eq("incr@none:5.0|c|#environment:test,release:test-release|T#{fake_time.to_i + 7}") - expect(dist2).to eq("dis_t@second:5.0:6.0:7.0:8.0:9.0|d|" + - "#environment:test,fo-bar:snöwmän% 23{},release:test-release|" + - "T#{fake_time.to_i + 7}") - end - end - end - - context 'sanitization' do - it 'sanitizes the metric key' do - subject.add(:c, 'foo.disöt_12-bar', 1) - subject.flush(force: true) - - sanitized_key = 'foo.dis_t_12-bar' - statsd, metrics_meta = sentry_envelopes.first.items.map(&:payload) - expect(statsd).to include(sanitized_key) - expect(metrics_meta[:mapping].keys.first).to include(sanitized_key) - end - - it 'sanitizes the metric unit' do - subject.add(:c, 'incr', 1, unit: 'disöt_12-/.test') - subject.flush(force: true) - - sanitized_unit = '@dist_12test' - statsd, metrics_meta = sentry_envelopes.first.items.map(&:payload) - expect(statsd).to include(sanitized_unit) - expect(metrics_meta[:mapping].keys.first).to include(sanitized_unit) - end - - it 'sanitizes tag keys and values' do - tags = { "get.foö-$bar/12" => "hello!\n\r\t\\ 42 this | or , that" } - subject.add(:c, 'incr', 1, tags: tags) - subject.flush(force: true) - - sanitized_tags = "get.fo-bar/12:hello!\\n\\r\\t\\\\ 42 this \\u{7c} or \\u{2c} that" - statsd = sentry_envelopes.first.items.first.payload - expect(statsd).to include(sanitized_tags) - end - end - end - - describe '#kill' do - before { subject.add(:c, 'incr', 1) } - it 'logs message when killing the thread' do - expect(subject.thread).to receive(:kill) - subject.kill - expect(string_io.string).to include("[#{described_class.name}] thread killed") - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/configuration_spec.rb b/sentry-ruby/spec/sentry/metrics/configuration_spec.rb deleted file mode 100644 index ca7e7f9e6..000000000 --- a/sentry-ruby/spec/sentry/metrics/configuration_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::Configuration do - let(:string_io) { StringIO.new } - let(:sdk_logger) { Logger.new(string_io) } - - let(:subject) { described_class.new(sdk_logger) } - - describe '#enabled=' do - it 'logs deprecation warning' do - subject.enabled = true - - expect(string_io.string).to include( - "WARN -- sentry: `config.metrics` is now deprecated and will be removed in the next major." - ) - end - end - - describe '#before_emit=' do - it 'raises error when setting before_emit to anything other than callable or nil' do - subject.before_emit = -> { } - subject.before_emit = nil - expect { subject.before_emit = true }.to raise_error(ArgumentError, 'metrics.before_emit must be callable (or nil to disable)') - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/counter_metric_spec.rb b/sentry-ruby/spec/sentry/metrics/counter_metric_spec.rb deleted file mode 100644 index 198679ed9..000000000 --- a/sentry-ruby/spec/sentry/metrics/counter_metric_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::CounterMetric do - subject { described_class.new(1) } - before { subject.add(2) } - - describe '#add' do - it 'adds float value' do - subject.add(3.0) - expect(subject.value).to eq(6.0) - end - end - - describe '#serialize' do - it 'returns value in array' do - expect(subject.serialize).to eq([3.0]) - end - end - - describe '#weight' do - it 'returns fixed value of 1' do - expect(subject.weight).to eq(1) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/distribution_metric_spec.rb b/sentry-ruby/spec/sentry/metrics/distribution_metric_spec.rb deleted file mode 100644 index 832cb917b..000000000 --- a/sentry-ruby/spec/sentry/metrics/distribution_metric_spec.rb +++ /dev/null @@ -1,25 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::DistributionMetric do - subject { described_class.new(1) } - before { subject.add(2) } - - describe '#add' do - it 'appends float value to array' do - subject.add(3.0) - expect(subject.value).to eq([1.0, 2.0, 3.0]) - end - end - - describe '#serialize' do - it 'returns whole array' do - expect(subject.serialize).to eq([1.0, 2.0]) - end - end - - describe '#weight' do - it 'returns length of array' do - expect(subject.weight).to eq(2) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/gauge_metric_spec.rb b/sentry-ruby/spec/sentry/metrics/gauge_metric_spec.rb deleted file mode 100644 index d043bb7f8..000000000 --- a/sentry-ruby/spec/sentry/metrics/gauge_metric_spec.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::GaugeMetric do - subject { described_class.new(0) } - before { 9.times { |i| subject.add(i + 1) } } - - describe '#add' do - it 'appends float value to array' do - subject.add(11) - expect(subject.last).to eq(11.0) - expect(subject.min).to eq(0.0) - expect(subject.max).to eq(11.0) - expect(subject.sum).to eq(56.0) - expect(subject.count).to eq(11) - end - end - - describe '#serialize' do - it 'returns array of statistics' do - expect(subject.serialize).to eq([9.0, 0.0, 9.0, 45.0, 10]) - end - end - - describe '#weight' do - it 'returns fixed value of 5' do - expect(subject.weight).to eq(5) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/local_aggregator_spec.rb b/sentry-ruby/spec/sentry/metrics/local_aggregator_spec.rb deleted file mode 100644 index a41280d6e..000000000 --- a/sentry-ruby/spec/sentry/metrics/local_aggregator_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::LocalAggregator do - let(:tags) { [['foo', 1], ['foo', 2], ['bar', 'baz']] } - let(:key) { [:c, 'incr', 'second', tags] } - let(:key2) { [:s, 'set', 'none', []] } - - describe '#add' do - it 'creates new GaugeMetric and adds it to bucket if key not existing' do - expect(Sentry::Metrics::GaugeMetric).to receive(:new).with(10).and_call_original - - subject.add(key, 10) - - metric = subject.buckets[key] - expect(metric).to be_a(Sentry::Metrics::GaugeMetric) - expect(metric.last).to eq(10.0) - expect(metric.min).to eq(10.0) - expect(metric.max).to eq(10.0) - expect(metric.sum).to eq(10.0) - expect(metric.count).to eq(1) - end - - it 'adds value to existing GaugeMetric' do - subject.add(key, 10) - - metric = subject.buckets[key] - expect(metric).to be_a(Sentry::Metrics::GaugeMetric) - expect(metric).to receive(:add).with(20).and_call_original - expect(Sentry::Metrics::GaugeMetric).not_to receive(:new) - - subject.add(key, 20) - expect(metric.last).to eq(20.0) - expect(metric.min).to eq(10.0) - expect(metric.max).to eq(20.0) - expect(metric.sum).to eq(30.0) - expect(metric.count).to eq(2) - end - end - - describe '#to_hash' do - it 'returns nil if empty buckets' do - expect(subject.to_hash).to eq(nil) - end - - context 'with filled buckets' do - before do - subject.add(key, 10) - subject.add(key, 20) - subject.add(key2, 1) - end - - it 'has the correct payload keys in the hash' do - expect(subject.to_hash.keys).to eq([ - 'c:incr@second', - 's:set@none' - ]) - end - - it 'has the tags deserialized correctly with array values' do - expect(subject.to_hash['c:incr@second'][:tags]).to eq({ - 'foo' => [1, 2], - 'bar' => 'baz' - }) - end - - it 'has the correct gauge metric values' do - expect(subject.to_hash['c:incr@second']).to include({ - min: 10.0, - max: 20.0, - count: 2, - sum: 30.0 - }) - - expect(subject.to_hash['s:set@none']).to include({ - min: 1.0, - max: 1.0, - count: 1, - sum: 1.0 - }) - end - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/metric_spec.rb b/sentry-ruby/spec/sentry/metrics/metric_spec.rb deleted file mode 100644 index 787d1cb24..000000000 --- a/sentry-ruby/spec/sentry/metrics/metric_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::Metric do - describe '#add' do - it 'raises not implemented error' do - expect { subject.add(1) }.to raise_error(NotImplementedError) - end - end - - describe '#serialize' do - it 'raises not implemented error' do - expect { subject.serialize }.to raise_error(NotImplementedError) - end - end - - describe '#weight' do - it 'raises not implemented error' do - expect { subject.weight }.to raise_error(NotImplementedError) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/set_metric_spec.rb b/sentry-ruby/spec/sentry/metrics/set_metric_spec.rb deleted file mode 100644 index 59205c7ea..000000000 --- a/sentry-ruby/spec/sentry/metrics/set_metric_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::SetMetric do - subject { described_class.new('foo') } - - before do - 2.times { subject.add('foo') } - 2.times { subject.add('bar') } - 2.times { subject.add(42) } - end - - describe '#add' do - it 'appends new value to set' do - subject.add('baz') - expect(subject.value).to eq(Set['foo', 'bar', 'baz', 42]) - end - end - - describe '#serialize' do - it 'returns array of hashed values' do - expect(subject.serialize).to eq([Zlib.crc32('foo'), Zlib.crc32('bar'), 42]) - end - end - - describe '#weight' do - it 'returns length of set' do - expect(subject.weight).to eq(3) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics/timing_spec.rb b/sentry-ruby/spec/sentry/metrics/timing_spec.rb deleted file mode 100644 index dbc947e7a..000000000 --- a/sentry-ruby/spec/sentry/metrics/timing_spec.rb +++ /dev/null @@ -1,54 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics::Timing do - let(:fake_time) { Time.new(2024, 1, 2, 3, 4, 5) } - before { allow(Time).to receive(:now).and_return(fake_time) } - - describe '.nanosecond' do - it 'returns nanoseconds' do - expect(described_class.nanosecond).to eq(fake_time.to_i * 10 ** 9) - end - end - - describe '.microsecond' do - it 'returns microseconds' do - expect(described_class.microsecond).to eq(fake_time.to_i * 10 ** 6) - end - end - - describe '.millisecond' do - it 'returns milliseconds' do - expect(described_class.millisecond).to eq(fake_time.to_i * 10 ** 3) - end - end - - describe '.second' do - it 'returns seconds' do - expect(described_class.second).to eq(fake_time.to_i) - end - end - - describe '.minute' do - it 'returns minutes' do - expect(described_class.minute).to eq(fake_time.to_i / 60.0) - end - end - - describe '.hour' do - it 'returns hours' do - expect(described_class.hour).to eq(fake_time.to_i / 3600.0) - end - end - - describe '.day' do - it 'returns days' do - expect(described_class.day).to eq(fake_time.to_i / (3600.0 * 24.0)) - end - end - - describe '.week' do - it 'returns weeks' do - expect(described_class.week).to eq(fake_time.to_i / (3600.0 * 24.0 * 7.0)) - end - end -end diff --git a/sentry-ruby/spec/sentry/metrics_spec.rb b/sentry-ruby/spec/sentry/metrics_spec.rb deleted file mode 100644 index bca1aa196..000000000 --- a/sentry-ruby/spec/sentry/metrics_spec.rb +++ /dev/null @@ -1,180 +0,0 @@ -# frozen_string_literal: true - -RSpec.describe Sentry::Metrics do - let(:aggregator) { Sentry.metrics_aggregator } - let(:fake_time) { Time.new(2024, 1, 1, 1, 1, 3) } - let(:string_io) { StringIO.new } - let(:sdk_logger) { Logger.new(string_io) } - - before do - perform_basic_setup do |config| - config.metrics.enabled = true - config.sdk_logger = sdk_logger - end - end - - describe '.increment' do - it 'passes default value of 1.0 with only key' do - expect(aggregator).to receive(:add).with( - :c, - 'foo', - 1.0, - unit: 'none', - tags: {}, - timestamp: nil - ) - - described_class.increment('foo') - end - - it 'passes through args to aggregator' do - expect(aggregator).to receive(:add).with( - :c, - 'foo', - 5.0, - unit: 'second', - tags: { fortytwo: 42 }, - timestamp: fake_time - ) - - described_class.increment('foo', 5.0, unit: 'second', tags: { fortytwo: 42 }, timestamp: fake_time) - end - - it 'logs deprecation warning' do - described_class.increment('foo') - - expect(string_io.string).to include( - "WARN -- sentry: `Sentry::Metrics` is now deprecated and will be removed in the next major." - ) - end - end - - describe '.distribution' do - it 'passes through args to aggregator' do - expect(aggregator).to receive(:add).with( - :d, - 'foo', - 5.0, - unit: 'second', - tags: { fortytwo: 42 }, - timestamp: fake_time - ) - - described_class.distribution('foo', 5.0, unit: 'second', tags: { fortytwo: 42 }, timestamp: fake_time) - end - - it 'logs deprecation warning' do - described_class.distribution('foo', 5.0, unit: 'second', tags: { fortytwo: 42 }, timestamp: fake_time) - - expect(string_io.string).to include( - "WARN -- sentry: `Sentry::Metrics` is now deprecated and will be removed in the next major." - ) - end - end - - describe '.set' do - it 'passes through args to aggregator' do - expect(aggregator).to receive(:add).with( - :s, - 'foo', - 'jane', - unit: 'none', - tags: { fortytwo: 42 }, - timestamp: fake_time - ) - - described_class.set('foo', 'jane', tags: { fortytwo: 42 }, timestamp: fake_time) - end - - it 'logs deprecation warning' do - described_class.set('foo', 'jane', tags: { fortytwo: 42 }, timestamp: fake_time) - - expect(string_io.string).to include( - "WARN -- sentry: `Sentry::Metrics` is now deprecated and will be removed in the next major." - ) - end - end - - describe '.gauge' do - it 'passes through args to aggregator' do - expect(aggregator).to receive(:add).with( - :g, - 'foo', - 5.0, - unit: 'second', - tags: { fortytwo: 42 }, - timestamp: fake_time - ) - - described_class.gauge('foo', 5.0, unit: 'second', tags: { fortytwo: 42 }, timestamp: fake_time) - end - - it 'logs deprecation warning' do - described_class.gauge('foo', 5.0, unit: 'second', tags: { fortytwo: 42 }, timestamp: fake_time) - - expect(string_io.string).to include( - "WARN -- sentry: `Sentry::Metrics` is now deprecated and will be removed in the next major." - ) - end - end - - describe '.timing' do - it 'does nothing without a block' do - expect(aggregator).not_to receive(:add) - described_class.timing('foo') - end - - it 'does nothing with a non-duration unit' do - expect(aggregator).not_to receive(:add) - result = described_class.timing('foo', unit: 'ratio') { 42 } - expect(result).to eq(42) - end - - it 'measures time taken as distribution and passes through args to aggregator' do - expect(aggregator).to receive(:add).with( - :d, - 'foo', - an_instance_of(Integer), - unit: 'millisecond', - tags: { fortytwo: 42 }, - timestamp: fake_time - ) - - result = described_class.timing('foo', unit: 'millisecond', tags: { fortytwo: 42 }, timestamp: fake_time) { sleep(0.1); 42 } - expect(result).to eq(42) - end - - it 'logs deprecation warning' do - described_class.timing('foo', unit: 'millisecond', tags: { fortytwo: 42 }, timestamp: fake_time) { sleep(0.1); 42 } - - expect(string_io.string).to include( - "WARN -- sentry: `Sentry::Metrics` is now deprecated and will be removed in the next major." - ) - end - - context 'with running transaction' do - let(:transaction) { transaction = Sentry.start_transaction(name: 'metrics') } - - before do - perform_basic_setup do |config| - config.traces_sample_rate = 1.0 - config.metrics.enabled = true - end - - Sentry.get_current_scope.set_span(transaction) - end - - it 'starts a span' do - expect(Sentry).to receive(:with_child_span).with(op: Sentry::Metrics::OP_NAME, description: 'foo', origin: Sentry::Metrics::SPAN_ORIGIN).and_call_original - - described_class.timing('foo') { sleep(0.1) } - end - - it 'has the correct tags on the new span' do - described_class.timing('foo', tags: { a: 42, b: [1, 2] }) { sleep(0.1) } - span = transaction.span_recorder.spans.last - expect(span.tags).to eq(a: '42', b: '1, 2') - end - end - end -end diff --git a/sentry-ruby/spec/sentry/profiler_spec.rb b/sentry-ruby/spec/sentry/profiler_spec.rb index 310ae0d59..2de41ca13 100644 --- a/sentry-ruby/spec/sentry/profiler_spec.rb +++ b/sentry-ruby/spec/sentry/profiler_spec.rb @@ -74,6 +74,30 @@ expect(subject.started).to eq(false) end end + + context 'with custom profiles_sample_interval' do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + config.profiles_sample_rate = 1.0 + config.profiles_sample_interval = 1e5 / 101 + end + end + + it 'starts StackProf with custom interval' do + subject.set_initial_sample_decision(true) + + expect(StackProf).to receive(:start).with( + interval: 1e5 / 101, + mode: :wall, + raw: true, + aggregate: false + ).and_call_original + + subject.start + expect(subject.started).to eq(true) + end + end end describe '#stop' do @@ -148,25 +172,25 @@ end end - describe '#to_hash' do + describe '#to_h' do let (:transport) { Sentry.get_current_client.transport } context 'when not sampled' do before { subject.set_initial_sample_decision(false) } it 'returns nil' do - expect(subject.to_hash).to eq({}) + expect(subject.to_h).to eq({}) end it 'records lost event' do expect(transport).to receive(:record_lost_event).with(:sample_rate, 'profile') - subject.to_hash + subject.to_h end end it 'returns nil unless started' do subject.set_initial_sample_decision(true) - expect(subject.to_hash).to eq({}) + expect(subject.to_h).to eq({}) end context 'with empty results' do @@ -179,12 +203,12 @@ end it 'returns empty' do - expect(subject.to_hash).to eq({}) + expect(subject.to_h).to eq({}) end it 'records lost event' do expect(transport).to receive(:record_lost_event).with(:insufficient_data, 'profile') - subject.to_hash + subject.to_h end end @@ -204,12 +228,12 @@ end it 'returns empty' do - expect(subject.to_hash).to eq({}) + expect(subject.to_h).to eq({}) end it 'records lost event' do expect(transport).to receive(:record_lost_event).with(:insufficient_data, 'profile') - subject.to_hash + subject.to_h end end @@ -222,7 +246,7 @@ end it 'has correct attributes' do - hash = subject.to_hash + hash = subject.to_h expect(hash[:event_id]).to eq(subject.event_id) expect(hash[:platform]).to eq('ruby') @@ -231,7 +255,7 @@ end it 'has correct frames' do - frames = subject.to_hash[:profile][:frames] + frames = subject.to_h[:profile][:frames] foo_frame = frames.find { |f| f[:function] =~ /foo/ } expect(foo_frame[:function]).to eq('Foo.foo') @@ -267,7 +291,7 @@ end it 'has correct stacks' do - profile = subject.to_hash[:profile] + profile = subject.to_h[:profile] frames = profile[:frames] stacks = profile[:stacks] @@ -281,7 +305,7 @@ end it 'has correct samples' do - profile = subject.to_hash[:profile] + profile = subject.to_h[:profile] num_stacks = profile[:stacks].size samples = profile[:samples] last_elapsed = 0 diff --git a/sentry-ruby/spec/sentry/rack/capture_exceptions_spec.rb b/sentry-ruby/spec/sentry/rack/capture_exceptions_spec.rb index 10cfa197a..28a2f2736 100644 --- a/sentry-ruby/spec/sentry/rack/capture_exceptions_spec.rb +++ b/sentry-ruby/spec/sentry/rack/capture_exceptions_spec.rb @@ -18,7 +18,7 @@ expect { stack.call(env) }.to raise_error(ZeroDivisionError) - event = last_sentry_event.to_hash + event = last_sentry_event.to_h expect(event.dig(:request, :url)).to eq("http://example.org/test") expect(env["sentry.error_event_id"]).to eq(event[:event_id]) last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last @@ -31,7 +31,7 @@ expect { stack.call(env) }.to raise_error(ZeroDivisionError) - event = last_sentry_event.to_hash + event = last_sentry_event.to_h mechanism = event.dig(:exception, :values, 0, :mechanism) expect(mechanism).to eq({ type: 'rack', handled: false }) end @@ -49,7 +49,7 @@ event = last_sentry_event expect(env["sentry.error_event_id"]).to eq(event.event_id) - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") end it 'captures the exception from sinatra.error' do @@ -64,7 +64,7 @@ end.to change { sentry_events.count }.by(1) event = last_sentry_event - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") end it 'sets the transaction and rack env' do @@ -78,7 +78,7 @@ event = last_sentry_event expect(event.transaction).to eq("/test") - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") expect(Sentry.get_current_scope.transaction_name).to be_nil expect(Sentry.get_current_scope.rack_env).to eq({}) end @@ -115,7 +115,7 @@ expect { stack.call(env) }.to raise_error(ZeroDivisionError) - event = last_sentry_event.to_hash + event = last_sentry_event.to_h expect(event.dig(:request, :url)).to eq("http://example.org/test") last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last expect(last_frame[:vars]).to include({ a: "1", b: "0" }) @@ -139,7 +139,7 @@ def inspect expect { stack.call(env) }.to raise_error(ZeroDivisionError) - event = last_sentry_event.to_hash + event = last_sentry_event.to_h expect(event.dig(:request, :url)).to eq("http://example.org/test") last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last expect(last_frame[:vars]).to include({ a: "1", b: "0", f: "[ignored due to error]" }) @@ -157,7 +157,7 @@ def inspect expect { stack.call(env) }.to raise_error(ZeroDivisionError) - event = last_sentry_event.to_hash + event = last_sentry_event.to_h expect(event.dig(:request, :url)).to eq("http://example.org/test") last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last expect(last_frame[:vars]).to include({ a: "1", b: "0", long: "*" * 1024 + "..." }) @@ -240,12 +240,11 @@ def inspect context "when sentry-trace header is sent" do let(:external_transaction) do - Sentry::Transaction.new( + Sentry.start_transaction( op: "pageload", status: "ok", sampled: true, name: "a/path", - hub: Sentry.get_current_hub ) end @@ -560,7 +559,6 @@ def will_be_sampled_by_sdk status: "ok", sampled: true, name: "a/path", - hub: Sentry.get_current_hub ) end diff --git a/sentry-ruby/spec/sentry/scope/setters_spec.rb b/sentry-ruby/spec/sentry/scope/setters_spec.rb index a688e5c68..15354a254 100644 --- a/sentry-ruby/spec/sentry/scope/setters_spec.rb +++ b/sentry-ruby/spec/sentry/scope/setters_spec.rb @@ -24,10 +24,14 @@ end describe "#set_span" do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end + end + let(:transaction) do - client = Sentry::Client.new(Sentry::Configuration.new) - hub = Sentry::Hub.new(client, subject) - Sentry::Transaction.new(name: "test transaction", hub: hub) + Sentry.start_transaction(name: "test transaction") end let(:span) { Sentry::Span.new(op: "foo", transaction: transaction) } diff --git a/sentry-ruby/spec/sentry/scope_spec.rb b/sentry-ruby/spec/sentry/scope_spec.rb index 59dec2ee1..5b24dbcd0 100644 --- a/sentry-ruby/spec/sentry/scope_spec.rb +++ b/sentry-ruby/spec/sentry/scope_spec.rb @@ -45,7 +45,7 @@ copy.set_transaction_name("foo", source: :url) copy.fingerprint << "bar" - expect(subject.breadcrumbs.to_hash).to eq({ values: [] }) + expect(subject.breadcrumbs.to_h).to eq({ values: [] }) expect(subject.contexts[:os].keys).to match_array([:name, :version, :build, :kernel_version, :machine]) expect(subject.contexts.dig(:runtime, :version)).to match(/ruby/) expect(subject.extra).to eq({}) @@ -60,7 +60,7 @@ it "deep-copies span as well" do perform_basic_setup - span = Sentry::Transaction.new(sampled: true, hub: hub) + span = Sentry::Transaction.new(sampled: true) subject.set_span(span) copy = subject.dup @@ -128,7 +128,7 @@ subject.set_extras({ additional_info: "hello" }) subject.set_user({ id: 1 }) subject.set_transaction_name("WelcomeController#index") - subject.set_span(Sentry::Transaction.new(op: "foo", hub: hub)) + subject.set_span(Sentry::Transaction.new(op: "foo")) subject.set_fingerprint(["foo"]) scope_id = subject.object_id @@ -155,7 +155,7 @@ end let(:transaction) do - Sentry::Transaction.new(op: "parent", hub: hub) + Sentry::Transaction.new(op: "parent") end context "with span in the scope" do @@ -246,7 +246,7 @@ scope.apply_to_event(log_event) - log_hash = log_event.to_hash + log_hash = log_event.to_h expect(log_hash[:attributes]["user.id"]).to eq(123) expect(log_hash[:attributes]["user.name"]).to eq("john_doe") @@ -257,7 +257,7 @@ scope = described_class.new scope.apply_to_event(log_event) - log_hash = log_event.to_hash + log_hash = log_event.to_h expect(log_hash[:attributes]).not_to have_key("user.id") expect(log_hash[:attributes]).not_to have_key("user.name") @@ -321,7 +321,7 @@ end it "sets trace context and dynamic_sampling_context from span if there's a span" do - transaction = Sentry::Transaction.new(op: "foo", hub: hub) + transaction = Sentry::Transaction.new(op: "foo") subject.set_span(transaction) subject.apply_to_event(event) @@ -351,7 +351,7 @@ it "sets the request info the Event" do subject.apply_to_event(event) - expect(event.to_hash.dig(:request, :url)).to eq("http://example.org/test") + expect(event.to_h.dig(:request, :url)).to eq("http://example.org/test") end end end diff --git a/sentry-ruby/spec/sentry/span_spec.rb b/sentry-ruby/spec/sentry/span_spec.rb index 3a74d4673..f4c533d39 100644 --- a/sentry-ruby/spec/sentry/span_spec.rb +++ b/sentry-ruby/spec/sentry/span_spec.rb @@ -7,9 +7,8 @@ end let(:transaction) do - Sentry::Transaction.new( + hub.start_transaction( name: "test transaction", - hub: hub, sampled: true ) end @@ -57,14 +56,14 @@ end end - describe "#to_hash" do + describe "#to_h" do before do subject.set_data("controller", "WelcomeController") subject.set_tag("foo", "bar") end it "returns correct data" do - hash = subject.to_hash + hash = subject.to_h expect(hash[:op]).to eq("sql.query") expect(hash[:description]).to eq("SELECT * FROM users;") @@ -75,16 +74,6 @@ expect(hash[:span_id].length).to eq(16) expect(hash[:origin]).to eq('manual') end - - it 'has metric summary if present' do - key = [:c, 'incr', 'none', []] - subject.metrics_local_aggregator.add(key, 10) - - hash = subject.to_hash - expect(hash[:_metrics_summary]).to eq({ - 'c:incr@none' => { count: 1, max: 10.0, min: 10.0, sum: 10.0, tags: {} } - }) - end end describe "#to_sentry_trace" do @@ -110,7 +99,9 @@ describe "#to_baggage" do before do # because initializing transactions requires an active hub - perform_basic_setup + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end end subject do @@ -123,7 +114,7 @@ "other-vendor-value-2=foo;bar;" ) - Sentry::Transaction.new(hub: Sentry.get_current_hub, baggage: baggage).start_child + Sentry.start_transaction(baggage: baggage).start_child end it "propagates sentry baggage values" do @@ -139,7 +130,9 @@ describe "#get_dynamic_sampling_context" do before do # because initializing transactions requires an active hub - perform_basic_setup + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end end subject do @@ -152,7 +145,7 @@ "other-vendor-value-2=foo;bar;" ) - Sentry::Transaction.new(hub: Sentry.get_current_hub, baggage: baggage).start_child + Sentry.start_transaction(baggage: baggage).start_child end it "propagates sentry dynamic_sampling_context" do @@ -168,7 +161,9 @@ describe "#start_child" do before do # because initializing transactions requires an active hub - perform_basic_setup + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end end it "initializes a new child Span" do @@ -208,7 +203,7 @@ context "when the parent span has a span_recorder" do subject do # inherits the span recorder from the transaction - Sentry::Transaction.new(hub: Sentry.get_current_hub).start_child + Sentry.start_transaction(name: "test").start_child end it "gives the child span its span_recorder" do diff --git a/sentry-ruby/spec/sentry/structured_logger_spec.rb b/sentry-ruby/spec/sentry/structured_logger_spec.rb index 0deaf8229..d5705315f 100644 --- a/sentry-ruby/spec/sentry/structured_logger_spec.rb +++ b/sentry-ruby/spec/sentry/structured_logger_spec.rb @@ -8,8 +8,8 @@ end end - it "configures default SDK logger" do - expect(Sentry.logger).to be(Sentry.configuration.sdk_logger) + it "initializes" do + expect(Sentry.logger).to be_a(described_class) end end diff --git a/sentry-ruby/spec/sentry/transaction_spec.rb b/sentry-ruby/spec/sentry/transaction_spec.rb index 7adc67186..4b2b61572 100644 --- a/sentry-ruby/spec/sentry/transaction_spec.rb +++ b/sentry-ruby/spec/sentry/transaction_spec.rb @@ -14,96 +14,11 @@ parent_sampled: true, name: "foo", source: :view, - hub: Sentry.get_current_hub ) end - describe ".from_sentry_trace" do - let(:sentry_trace) { subject.to_sentry_trace } - - let(:baggage) { - "other-vendor-value-1=foo;bar;baz, "\ - "sentry-trace_id=771a43a4192642f0b136d5159a501700, "\ - "sentry-public_key=49d0f7386ad645858ae85020e393bef3, "\ - "sentry-sample_rate=0.01337, "\ - "sentry-user_id=Am%C3%A9lie, "\ - "other-vendor-value-2=foo;bar;" - } - - let(:configuration) do - Sentry.configuration - end - - context "when tracing is enabled (> 0)" do - before do - configuration.traces_sample_rate = 1.0 - end - - it "returns correctly-formatted value" do - child_transaction = described_class.from_sentry_trace(sentry_trace, op: "child") - - expect(child_transaction.trace_id).to eq(subject.trace_id) - expect(child_transaction.parent_span_id).to eq(subject.span_id) - expect(child_transaction.parent_sampled).to eq(true) - # doesn't set the sampled value - expect(child_transaction.sampled).to eq(nil) - expect(child_transaction.op).to eq("child") - end - - it "handles invalid values without crashing" do - child_transaction = described_class.from_sentry_trace("dummy", op: "child") - - expect(child_transaction).to be_nil - end - - it "stores frozen empty baggage on incoming traces from older SDKs" do - child_transaction = described_class.from_sentry_trace(sentry_trace, baggage: nil, op: "child") - expect(child_transaction.baggage).not_to be_nil - expect(child_transaction.baggage.mutable).to be(false) - expect(child_transaction.baggage.items).to eq({}) - end - - it "stores correct baggage on incoming baggage header" do - child_transaction = described_class.from_sentry_trace(sentry_trace, baggage: baggage, op: "child") - expect(child_transaction.baggage).not_to be_nil - expect(child_transaction.baggage.mutable).to be(false) - - expect(child_transaction.baggage.items).to eq({ - "sample_rate" => "0.01337", - "public_key" => "49d0f7386ad645858ae85020e393bef3", - "trace_id" => "771a43a4192642f0b136d5159a501700", - "user_id" => "Amélie" - }) - end - end - - context "when tracing is enabled (= 0)" do - before do - configuration.traces_sample_rate = 0.0 - end - - it "returns correctly-formatted value" do - child_transaction = described_class.from_sentry_trace(sentry_trace, op: "child") - - expect(child_transaction.trace_id).to eq(subject.trace_id) - expect(child_transaction.parent_span_id).to eq(subject.span_id) - expect(child_transaction.parent_sampled).to eq(true) - # doesn't set the sampled value - expect(child_transaction.sampled).to eq(nil) - expect(child_transaction.op).to eq("child") - end - end - - context "when tracing is disabled" do - before do - configuration.traces_sample_rate = nil - end - - it "returns nil" do - expect(described_class.from_sentry_trace(sentry_trace, op: "child")).to be_nil - end - end - end + let(:string_io) { StringIO.new } + let(:sdk_logger) { Logger.new(string_io) } describe "#deep_dup" do before do @@ -197,14 +112,9 @@ end describe "#set_initial_sample_decision" do - let(:string_io) { StringIO.new } - let(:logger) do - ::Logger.new(string_io) - end - before do perform_basic_setup do |config| - config.sdk_logger = logger + config.sdk_logger = sdk_logger end end @@ -216,14 +126,14 @@ it "sets @sampled to false and return" do allow(Sentry.configuration).to receive(:tracing_enabled?).and_return(false) - transaction = described_class.new(sampled: true, hub: Sentry.get_current_hub) + transaction = described_class.new(sampled: true) transaction.set_initial_sample_decision(sampling_context: {}) expect(transaction.sampled).to eq(false) end end context "when tracing is enabled" do - let(:subject) { described_class.new(op: "rack.request", hub: Sentry.get_current_hub) } + let(:subject) { described_class.new(op: "rack.request") } before do allow(Sentry.configuration).to receive(:tracing_enabled?).and_return(true) @@ -231,12 +141,12 @@ context "when the transaction already has a decision" do it "doesn't change it" do - transaction = described_class.new(sampled: true, hub: Sentry.get_current_hub) + transaction = described_class.new(sampled: true) transaction.set_initial_sample_decision(sampling_context: {}) expect(transaction.sampled).to eq(true) expect(transaction.effective_sample_rate).to eq(1.0) - transaction = described_class.new(sampled: false, hub: Sentry.get_current_hub) + transaction = described_class.new(sampled: false) transaction.set_initial_sample_decision(sampling_context: {}) expect(transaction.sampled).to eq(false) expect(transaction.effective_sample_rate).to eq(0.0) @@ -258,7 +168,7 @@ it "uses traces_sample_rate for sampling (positive result)" do # Create transaction with sample_rand < sample_rate (0.5) to ensure sampled - transaction = described_class.new(op: "rack.request", hub: Sentry.get_current_hub, sample_rand: 0.4) + transaction = described_class.new(op: "rack.request", sample_rand: 0.4) transaction.set_initial_sample_decision(sampling_context: {}) expect(transaction.sampled).to eq(true) @@ -270,7 +180,7 @@ it "uses traces_sample_rate for sampling (negative result)" do # Create transaction with sample_rand > sample_rate (0.5) to ensure not sampled - transaction = described_class.new(op: "rack.request", hub: Sentry.get_current_hub, sample_rand: 0.6) + transaction = described_class.new(op: "rack.request", sample_rand: 0.6) transaction.set_initial_sample_decision(sampling_context: {}) expect(transaction.sampled).to eq(false) @@ -330,19 +240,19 @@ expect(Sentry.configuration.sdk_logger).to receive(:debug).exactly(3).and_call_original Sentry.configuration.traces_sampler = ->(_) { true } - subject = described_class.new(hub: Sentry.get_current_hub) + subject = described_class.new subject.set_initial_sample_decision(sampling_context: {}) expect(subject.sampled).to eq(true) expect(subject.effective_sample_rate).to eq(1.0) Sentry.configuration.traces_sampler = ->(_) { 1.0 } - subject = described_class.new(hub: Sentry.get_current_hub) + subject = described_class.new subject.set_initial_sample_decision(sampling_context: {}) expect(subject.sampled).to eq(true) expect(subject.effective_sample_rate).to eq(1.0) Sentry.configuration.traces_sampler = ->(_) { 1 } - subject = described_class.new(hub: Sentry.get_current_hub) + subject = described_class.new subject.set_initial_sample_decision(sampling_context: {}) expect(subject.sampled).to eq(true) expect(subject.effective_sample_rate).to eq(1.0) @@ -356,13 +266,13 @@ expect(Sentry.configuration.sdk_logger).to receive(:debug).exactly(2).and_call_original Sentry.configuration.traces_sampler = ->(_) { false } - subject = described_class.new(hub: Sentry.get_current_hub) + subject = described_class.new subject.set_initial_sample_decision(sampling_context: {}) expect(subject.sampled).to eq(false) expect(subject.effective_sample_rate).to eq(0.0) Sentry.configuration.traces_sampler = ->(_) { 0.0 } - subject = described_class.new(hub: Sentry.get_current_hub) + subject = described_class.new subject.set_initial_sample_decision(sampling_context: {}) expect(subject.sampled).to eq(false) expect(subject.effective_sample_rate).to eq(0.0) @@ -392,9 +302,9 @@ end end - describe "#to_hash" do + describe "#to_h" do it "returns correct data" do - hash = subject.to_hash + hash = subject.to_h expect(hash[:op]).to eq("sql.query") expect(hash[:description]).to eq("SELECT * FROM users;") @@ -413,15 +323,11 @@ Sentry.get_current_client.transport.events end - let(:another_hub) do - Sentry.get_current_hub.clone - end - it "finishes the transaction, converts it into an Event and send it" do subject.finish expect(events.count).to eq(1) - event = events.last.to_hash + event = events.last.to_h # don't contain itself expect(event[:spans]).to be_empty @@ -431,7 +337,7 @@ subject.finish expect(events.count).to eq(1) - event = events.last.to_hash + event = events.last.to_h expect(event[:transaction]).to eq("foo") end @@ -441,7 +347,7 @@ subject.finish(end_timestamp: timestamp) expect(events.count).to eq(1) - event = events.last.to_hash + event = events.last.to_h expect(event[:timestamp]).to eq(timestamp) end @@ -454,48 +360,22 @@ subject.finish expect(events.count).to eq(1) - event = events.last.to_hash + event = events.last.to_h expect(event[:tags]).to eq({ foo: 'bar', name: "apple" }) end it "only follows sampling decision" do Sentry.configuration.traces_sampler = proc { false } - subject = described_class.new(parent_sampled: true, hub: Sentry.get_current_hub) + subject = described_class.new(parent_sampled: true) subject.finish expect(events.count).to eq(0) end - describe "hub selection" do - it "prioritizes the optional hub argument and uses it to submit the transaction" do - expect(another_hub).to receive(:capture_event) - - subject.finish(hub: another_hub) - end - - it "submits the event with the transaction's hub by default" do - # Create transaction with the specific hub from the beginning - transaction = described_class.new( - op: "sql.query", - description: "SELECT * FROM users;", - status: "ok", - sampled: true, - parent_sampled: true, - name: "foo", - source: :view, - hub: another_hub - ) - - expect(another_hub).to receive(:capture_event) - - transaction.finish - end - end - context "if the transaction is not sampled" do - subject { described_class.new(sampled: false, hub: Sentry.get_current_hub) } + subject { described_class.new(sampled: false) } it "doesn't send it" do subject.finish @@ -518,8 +398,6 @@ end end - subject { described_class.new(hub: Sentry.get_current_hub) } - it "records lost event with reason backpressure" do expect(Sentry.get_current_client.transport).to receive(:any_rate_limited?).and_return(true) Sentry.backpressure_monitor.run @@ -527,7 +405,7 @@ # Create transaction with sample_rand that will be rejected after backpressure downsampling # With traces_sample_rate = 1.0 and downsample_factor = 1, effective rate becomes 0.5 # So sample_rand = 0.6 > 0.5 will be rejected - transaction = described_class.new(hub: Sentry.get_current_hub, sample_rand: 0.6) + transaction = described_class.new(sample_rand: 0.6) transaction.finish expect(Sentry.get_current_client.transport).to have_recorded_lost_event(:backpressure, 'transaction') @@ -536,7 +414,7 @@ end context "if the transaction doesn't have a name" do - subject { described_class.new(sampled: true, hub: Sentry.get_current_hub) } + subject { described_class.new(sampled: true) } it "adds a default name" do subject.finish @@ -550,12 +428,59 @@ subject.set_measurement("metric.foo", 0.5, "second") subject.finish - transaction = events.last.to_hash + transaction = events.last.to_h expect(transaction[:measurements]).to eq( { "metric.foo" => { value: 0.5, unit: "second" } } ) end end + + describe "with trace_ignore_status_codes" do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + config.sdk_logger = sdk_logger + config.trace_ignore_status_codes = [404, (500..503)] + end + end + + it "drops transaction with individual status code match" do + subject.set_http_status(404) + subject.finish + + expect(sentry_events).to be_empty + expect(Sentry.get_current_client.transport).to have_recorded_lost_event(:event_processor, 'transaction') + expect(Sentry.get_current_client.transport).to have_recorded_lost_event(:event_processor, 'span') + expect(string_io.string).to include("Discarding") + expect(string_io.string).to include("due to ignored HTTP status code: 404") + end + + it "drops transaction with range status code match" do + subject.set_http_status(502) + subject.finish + + expect(sentry_events).to be_empty + expect(Sentry.get_current_client.transport).to have_recorded_lost_event(:event_processor, 'transaction') + expect(Sentry.get_current_client.transport).to have_recorded_lost_event(:event_processor, 'span') + expect(string_io.string).to include("Discarding") + expect(string_io.string).to include("due to ignored HTTP status code: 502") + end + + it "does not drop transaction with status code outside ignore list" do + subject.set_http_status(200) + subject.finish + + expect(sentry_events).not_to be_empty + expect(sentry_events.last).to be_a(Sentry::TransactionEvent) + end + + it "does not drop transaction without a status code set" do + subject.finish + + expect(sentry_events).not_to be_empty + expect(sentry_events.first).to be_a(Sentry::TransactionEvent) + end + end end describe "#get_baggage" do @@ -571,7 +496,6 @@ parent_sampled: true, name: "foo", source: source, - hub: Sentry.get_current_hub, baggage: incoming_baggage, sample_rand: 0.123456 # Use a known value for predictable testing ) @@ -658,46 +582,6 @@ end end - describe ".extract_sample_rand_from_baggage" do - let(:trace_id) { "771a43a4192642f0b136d5159a501700" } - - it "returns trace_id generation when baggage is nil" do - result = described_class.extract_sample_rand_from_baggage(nil, trace_id, true) - - generator = Sentry::Utils::SampleRand.new(trace_id: trace_id) - expected = generator.generate_from_trace_id - - expect(result).to eq(expected) - end - - it "returns trace_id generation when baggage has no items" do - baggage = double("baggage", items: nil) - result = described_class.extract_sample_rand_from_baggage(baggage, trace_id, true) - - generator = Sentry::Utils::SampleRand.new(trace_id: trace_id) - expected = generator.generate_from_trace_id - - expect(result).to eq(expected) - end - - it "returns trace_id generation when sample_rand is invalid" do - baggage = double("baggage", items: { "sample_rand" => "1.5" }) - result = described_class.extract_sample_rand_from_baggage(baggage, trace_id, true) - - generator = Sentry::Utils::SampleRand.new(trace_id: trace_id) - expected = generator.generate_from_trace_id - - expect(result).to eq(expected) - end - - it "returns valid sample_rand from baggage when present" do - baggage = double("baggage", items: { "sample_rand" => "0.5" }) - result = described_class.extract_sample_rand_from_baggage(baggage, trace_id, true) - - expect(result).to eq(0.5) - end - end - describe "#set_name" do it "sets name and source directly" do subject.set_name("bar", source: :url) diff --git a/sentry-ruby/spec/sentry/transactions/trace_propagation_spec.rb b/sentry-ruby/spec/sentry/transactions/trace_propagation_spec.rb index 63eb34713..4b175bfe3 100644 --- a/sentry-ruby/spec/sentry/transactions/trace_propagation_spec.rb +++ b/sentry-ruby/spec/sentry/transactions/trace_propagation_spec.rb @@ -36,10 +36,7 @@ sentry_trace = headers["sentry-trace"] baggage_header = headers["baggage"] - child_transaction = Sentry::Transaction.from_sentry_trace( - sentry_trace, - baggage: baggage_header - ) + child_transaction = Sentry.continue_trace(headers) expect(child_transaction).not_to be_nil @@ -65,7 +62,7 @@ baggage_header = "sentry-trace_id=#{sentry_trace},sentry-sample_rate=0.25" expected_sample_rand = Sentry::Utils::SampleRand.new(trace_id: "771a43a4192642f0b136d5159a501700").generate_from_trace_id - transaction = Sentry::Transaction.from_sentry_trace(sentry_trace, baggage: baggage_header) + transaction = Sentry.continue_trace({ "sentry-trace" => sentry_trace, "baggage" => baggage_header }) expect(transaction.sample_rand).to eql(expected_sample_rand) expect(transaction.baggage.items["sample_rate"]).to eql("0.25") @@ -76,7 +73,7 @@ baggage_header = "sentry-trace_id=771a43a4192642f0b136d5159a501700,sentry-sample_rand=1.5" expected_sample_rand = Sentry::Utils::SampleRand.new(trace_id: "771a43a4192642f0b136d5159a501700").generate_from_trace_id - transaction = Sentry::Transaction.from_sentry_trace(sentry_trace, baggage: baggage_header) + transaction = Sentry.continue_trace({ "sentry-trace" => sentry_trace, "baggage" => baggage_header }) expect(transaction.sample_rand).to eq(expected_sample_rand) @@ -107,15 +104,14 @@ trace_id = "771a43a4192642f0b136d5159a501700" results = 5.times.map do - transaction = Sentry::Transaction.new(trace_id: trace_id, hub: Sentry.get_current_hub) - Sentry.start_transaction(transaction: transaction) + transaction = Sentry.start_transaction(trace_id: trace_id) transaction.sampled end expect(results.uniq.length).to eq(1) sample_rands = 5.times.map do - transaction = Sentry::Transaction.new(trace_id: trace_id, hub: Sentry.get_current_hub) + transaction = Sentry.start_transaction(trace_id: trace_id) baggage = transaction.get_baggage baggage.items["sample_rand"] end @@ -138,8 +134,7 @@ baggage = Sentry::Baggage.new({ "sample_rate" => "0.75" }) - parent_transaction = Sentry::Transaction.new( - hub: Sentry.get_current_hub, + parent_transaction = Sentry.start_transaction( baggage: baggage, sample_rand: 0.6 ) diff --git a/sentry-ruby/spec/sentry/transport/http_transport_rate_limiting_spec.rb b/sentry-ruby/spec/sentry/transport/http_transport_rate_limiting_spec.rb index d1c1081d6..02d90f23f 100644 --- a/sentry-ruby/spec/sentry/transport/http_transport_rate_limiting_spec.rb +++ b/sentry-ruby/spec/sentry/transport/http_transport_rate_limiting_spec.rb @@ -15,7 +15,7 @@ let(:configuration) { Sentry.configuration } let(:client) { Sentry.get_current_client } let(:data) do - subject.envelope_from_event(client.event_from_message("foobarbaz").to_hash).to_s + subject.envelope_from_event(client.event_from_message("foobarbaz")).to_s end subject { Sentry::HTTPTransport.new(configuration) } diff --git a/sentry-ruby/spec/sentry/transport/http_transport_spec.rb b/sentry-ruby/spec/sentry/transport/http_transport_spec.rb index 7b4b39b97..170660b76 100644 --- a/sentry-ruby/spec/sentry/transport/http_transport_spec.rb +++ b/sentry-ruby/spec/sentry/transport/http_transport_spec.rb @@ -15,7 +15,7 @@ let(:event) { client.event_from_message("foobarbaz") } let(:fake_time) { Time.now } let(:data) do - subject.serialize_envelope(subject.envelope_from_event(event.to_hash)).first + subject.serialize_envelope(subject.envelope_from_event(event)).first end subject { client.transport } diff --git a/sentry-ruby/spec/sentry/transport/spotlight_transport_spec.rb b/sentry-ruby/spec/sentry/transport/spotlight_transport_spec.rb index 2b54a7fd3..d6ae7bf95 100644 --- a/sentry-ruby/spec/sentry/transport/spotlight_transport_spec.rb +++ b/sentry-ruby/spec/sentry/transport/spotlight_transport_spec.rb @@ -18,7 +18,7 @@ let(:client) { Sentry::Client.new(configuration) } let(:event) { client.event_from_message("foobarbaz") } let(:data) do - subject.serialize_envelope(subject.envelope_from_event(event.to_hash)).first + subject.serialize_envelope(subject.envelope_from_event(event)).first end subject { described_class.new(configuration) } diff --git a/sentry-ruby/spec/sentry/transport_spec.rb b/sentry-ruby/spec/sentry/transport_spec.rb index 002ede4f5..49285704e 100644 --- a/sentry-ruby/spec/sentry/transport_spec.rb +++ b/sentry-ruby/spec/sentry/transport_spec.rb @@ -11,9 +11,6 @@ end let(:client) { Sentry::Client.new(configuration) } - let(:hub) do - Sentry::Hub.new(client, Sentry::Scope.new) - end let(:dynamic_sampling_context) do { @@ -54,13 +51,13 @@ '{"type":"event","content_type":"application/json"}' ) - expect(item).to eq(event.to_hash.to_json) + expect(item).to eq(event.to_h.to_json) end end context "transaction event" do let(:transaction) do - Sentry::Transaction.new(name: "test transaction", op: "rack.request", hub: hub) + Sentry::Transaction.new(name: "test transaction", op: "rack.request") end let(:event) do @@ -89,7 +86,7 @@ '{"type":"transaction","content_type":"application/json"}' ) - expect(item).to eq(event.to_hash.to_json) + expect(item).to eq(event.to_h.to_json) end context "with profiling on transaction" do @@ -211,30 +208,6 @@ end end - context "metrics/statsd item" do - let(:payload) do - "foo@none:10.0|c|#tag1:42,tag2:bar|T1709042970\n" + - "bar@second:0.3:0.1:0.9:49.8:100|g|#|T1709042980" - end - - let(:envelope) do - envelope = Sentry::Envelope.new - envelope.add_item( - { type: 'statsd', length: payload.bytesize }, - payload - ) - envelope - end - - it "adds raw payload to envelope item" do - result, _ = subject.serialize_envelope(envelope) - item = result.split("\n", 2).last - item_header, item_payload = item.split("\n", 2) - expect(JSON.parse(item_header)).to eq({ 'type' => 'statsd', 'length' => 93 }) - expect(item_payload).to eq(payload) - end - end - context "log events" do let(:log_events) do 5.times.map do |i| @@ -260,7 +233,7 @@ item_count: log_events.size, content_type: "application/vnd.sentry.items.log+json" }, - { items: log_events.map(&:to_hash) } + { items: log_events.map(&:to_h) } ) envelope @@ -309,7 +282,7 @@ it "gracefully removes bad encoding breadcrumb message" do expect do - JSON.generate(event.to_hash) + JSON.generate(event.to_h) end.not_to raise_error end end @@ -324,7 +297,7 @@ 1000.times do |i| event.breadcrumbs.record Sentry::Breadcrumb.new(category: i.to_s, message: "x" * Sentry::Event::MAX_MESSAGE_SIZE_IN_BYTES) end - serialized_result = JSON.generate(event.to_hash) + serialized_result = JSON.generate(event.to_h) expect(serialized_result.bytesize).to be > Sentry::Envelope::Item::MAX_SERIALIZED_PAYLOAD_SIZE end @@ -353,79 +326,6 @@ end end end - - context "due to stacktrace frames" do - let(:event) { client.event_from_exception(SystemStackError.new("stack level too deep")) } - let(:envelope) { subject.envelope_from_event(event) } - - let(:in_app_pattern) do - project_root = "/fake/project_root" - Regexp.new("^(#{project_root}/)?#{Sentry::Configuration::APP_DIRS_PATTERN}") - end - let(:frame_list_limit) { 500 } - let(:frame_list_size) { frame_list_limit * 20 } - - before do - single_exception = event.exception.values[0] - new_stacktrace = Sentry::StacktraceInterface.new( - frames: frame_list_size.times.map do |zero_based_index| - Sentry::StacktraceInterface::Frame.new( - "/fake/path", - Sentry::Backtrace::Line.parse("app.rb:#{zero_based_index + 1}:in `/'", in_app_pattern) - ) - end, - ) - single_exception.instance_variable_set(:@stacktrace, new_stacktrace) - - serialized_result = JSON.generate(event.to_hash) - expect(serialized_result.bytesize).to be > Sentry::Envelope::Item::MAX_SERIALIZED_PAYLOAD_SIZE - end - - it "keeps some stacktrace frames and carry on" do - data, _ = subject.serialize_envelope(envelope) - expect(data.bytesize).to be < Sentry::Envelope::Item::MAX_SERIALIZED_PAYLOAD_SIZE - - expect(envelope.items.count).to eq(1) - - event_item = envelope.items.first - frames = event_item.payload[:exception][:values][0][:stacktrace][:frames] - expect(frames.length).to eq(frame_list_limit) - - # Last N lines kept - # N = Frame limit / 2 - expect(frames[-1][:lineno]).to eq(frame_list_size) - expect(frames[-1][:filename]).to eq('app.rb') - expect(frames[-1][:function]).to eq('/') - # - expect(frames[-(frame_list_limit / 2)][:lineno]).to eq(frame_list_size - ((frame_list_limit / 2) - 1)) - expect(frames[-(frame_list_limit / 2)][:filename]).to eq('app.rb') - expect(frames[-(frame_list_limit / 2)][:function]).to eq('/') - - # First N lines kept - # N = Frame limit / 2 - expect(frames[0][:lineno]).to eq(1) - expect(frames[0][:filename]).to eq('app.rb') - expect(frames[0][:function]).to eq('/') - expect(frames[(frame_list_limit / 2) - 1][:lineno]).to eq(frame_list_limit / 2) - expect(frames[(frame_list_limit / 2) - 1][:filename]).to eq('app.rb') - expect(frames[(frame_list_limit / 2) - 1][:function]).to eq('/') - end - - context "if it's still oversized" do - before do - 1000.times do |i| - event.contexts["context_#{i}"] = "s" * Sentry::Event::MAX_MESSAGE_SIZE_IN_BYTES - end - end - - it "rejects the item and logs attributes size breakdown" do - data, _ = subject.serialize_envelope(envelope) - expect(data).to be_nil - expect(io.string).not_to match(/Sending envelope with items \[event\]/) - expect(io.string).to match(/tags: 2, contexts: 8208891, extra: 2/) - end - end - end end end @@ -445,7 +345,7 @@ context "transaction event" do let(:transaction) do - Sentry::Transaction.new(name: "test transaction", op: "rack.request", hub: hub) + Sentry::Transaction.new(name: "test transaction", op: "rack.request") end let(:event) { client.event_from_transaction(transaction) } let(:envelope) { subject.envelope_from_event(event) } @@ -487,7 +387,7 @@ 1000.times do |i| event.breadcrumbs.record Sentry::Breadcrumb.new(category: i.to_s, message: "x" * Sentry::Event::MAX_MESSAGE_SIZE_IN_BYTES) end - serialized_result = JSON.generate(event.to_hash) + serialized_result = JSON.generate(event.to_h) expect(serialized_result.bytesize).to be > Sentry::Envelope::Item::MAX_SERIALIZED_PAYLOAD_SIZE end @@ -499,18 +399,6 @@ expect(io.string).to match(/Sending envelope with items \[event\]/) end - context "when the event hash has string keys" do - let(:envelope) { subject.envelope_from_event(event.to_json_compatible) } - - it "deletes the event's breadcrumbs and sends it" do - expect(subject).to receive(:send_data) - - subject.send_envelope(envelope) - - expect(io.string).to match(/Sending envelope with items \[event\]/) - end - end - context "if it's still oversized" do before do 1000.times do |i| @@ -594,7 +482,7 @@ item_count: log_events.size, content_type: "application/vnd.sentry.items.log+json" }, - { items: log_events.map(&:to_hash) } + { items: log_events.map(&:to_h) } ) envelope @@ -625,12 +513,6 @@ expect(subject.send_event(event)).to eq(event) end - it "sends Event hash" do - expect(subject).not_to receive(:failed_send) - - expect(subject.send_event(event.to_json_compatible)).to eq(event.to_json_compatible) - end - it "logs correct message" do expect(subject.send_event(event)).to eq(event) diff --git a/sentry-ruby/spec/sentry/vernier/profiler_spec.rb b/sentry-ruby/spec/sentry/vernier/profiler_spec.rb index b8ef3a105..d6c564a77 100644 --- a/sentry-ruby/spec/sentry/vernier/profiler_spec.rb +++ b/sentry-ruby/spec/sentry/vernier/profiler_spec.rb @@ -74,7 +74,7 @@ end it 'starts Vernier if sampled' do - expect(Vernier).to receive(:start_profile).and_return(true) + expect(Vernier).to receive(:start_profile).with(interval: 1e6 / 101).and_return(true) profiler.start @@ -82,7 +82,7 @@ end it 'does not start Vernier again if already started' do - expect(Vernier).to receive(:start_profile).and_return(true).once + expect(Vernier).to receive(:start_profile).with(interval: 1e6 / 101).and_return(true).once profiler.start profiler.start @@ -110,6 +110,25 @@ expect(profiler.started).to eq(false) end end + + context 'with custom profiles_sample_interval' do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + config.profiles_sample_rate = 1.0 + config.profiles_sample_interval = 1e5 / 101 + end + end + + it 'starts Vernier with custom interval' do + expect(Vernier).to receive(:start_profile).with(interval: 1e5 / 101).and_return(true) + + profiler.set_initial_sample_decision(true) + profiler.start + + expect(profiler.started).to eq(true) + end + end end describe '#stop' do @@ -147,7 +166,7 @@ end end - describe "#to_hash" do + describe "#to_h" do let (:transport) { Sentry.get_current_client.transport } it "records lost event if not sampled" do @@ -157,7 +176,7 @@ profiler.start profiler.set_initial_sample_decision(false) - expect(profiler.to_hash).to eq({}) + expect(profiler.to_h).to eq({}) end end @@ -166,9 +185,9 @@ profiler.set_initial_sample_decision(true) end - describe '#to_hash' do + describe '#to_h' do it "returns empty hash if not started" do - expect(profiler.to_hash).to eq({}) + expect(profiler.to_h).to eq({}) end context 'with single-thread profiled code' do @@ -179,7 +198,7 @@ end it 'has correct frames' do - frames = profiler.to_hash[:profile][:frames] + frames = profiler.to_h[:profile][:frames] foo_frame = frames.find { |f| f[:function] =~ /foo/ } @@ -192,7 +211,7 @@ end it 'has correct stacks' do - profile = profiler.to_hash[:profile] + profile = profiler.to_h[:profile] frames = profile[:frames] stacks = profile[:stacks] @@ -210,7 +229,7 @@ end it 'has correct samples' do - profile = profiler.to_hash[:profile] + profile = profiler.to_h[:profile] samples = profile[:samples] last_elapsed = 0 @@ -249,7 +268,7 @@ end it "has correct thread metadata" do - thread_metadata = profiler.to_hash[:profile][:thread_metadata] + thread_metadata = profiler.to_h[:profile][:thread_metadata] main_thread = thread_metadata.values.find { |metadata| metadata[:name].include?("rspec") } thread1 = thread_metadata.values.find { |metadata| metadata[:name] == "thread-bar-0" } @@ -265,7 +284,7 @@ end it 'has correct frames', when: { ruby_version?: [:>=, "3.3"], ruby_engine?: "ruby" } do - frames = profiler.to_hash[:profile][:frames] + frames = profiler.to_h[:profile][:frames] foo_frame = frames.find { |f| f[:function] =~ /foo/ } @@ -278,7 +297,7 @@ end it 'has correct stacks', when: { ruby_version?: [:>=, "3.3"], ruby_engine?: "ruby" } do - profile = profiler.to_hash[:profile] + profile = profiler.to_h[:profile] frames = profile[:frames] stacks = profile[:stacks] @@ -296,7 +315,7 @@ end it 'has correct samples' do - profile = profiler.to_hash[:profile] + profile = profiler.to_h[:profile] samples = profile[:samples] samples.group_by { |sample| sample[:thread_id] }.each do |thread_id, thread_samples| diff --git a/sentry-ruby/spec/sentry_spec.rb b/sentry-ruby/spec/sentry_spec.rb index a2a94c43e..7a4419ecc 100644 --- a/sentry-ruby/spec/sentry_spec.rb +++ b/sentry-ruby/spec/sentry_spec.rb @@ -280,7 +280,7 @@ described_class.capture_exception(e) end - event = last_sentry_event.to_hash + event = last_sentry_event.to_h last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last expect(last_frame[:vars]).to eq(nil) end @@ -306,7 +306,7 @@ described_class.capture_exception(e) end - event = last_sentry_event.to_hash + event = last_sentry_event.to_h last_frame = event.dig(:exception, :values, 0, :stacktrace, :frames).last expect(last_frame[:vars]).to include({ a: "1", b: "0" }) end @@ -390,8 +390,8 @@ Sentry.get_current_client.flush - # 3 envelopes: log, transaction, and client_report about dropped profile - expect(sentry_envelopes.size).to be(3) + # 2 envelopes: log and transaction + expect(sentry_envelopes.size).to be(2) log_event = sentry_logs.first @@ -503,50 +503,34 @@ end it "gives /payment 0.5 of rate" do - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/payment", sample_rand: 0.4) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/payment", sample_rand: 0.4) expect(transaction.sampled).to eq(true) - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/payment", sample_rand: 0.6) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/payment", sample_rand: 0.6) expect(transaction.sampled).to eq(false) end it "gives /api 0.2 of rate" do - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/api", sample_rand: 0.1) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/api", sample_rand: 0.1) expect(transaction.sampled).to eq(true) - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/api", sample_rand: 0.3) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/api", sample_rand: 0.3) expect(transaction.sampled).to eq(false) end it "gives other paths 0.1 of rate" do - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/orders", sample_rand: 0.05) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/orders", sample_rand: 0.05) expect(transaction.sampled).to eq(true) - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "rack.request", name: "/orders", sample_rand: 0.2) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "rack.request", name: "/orders", sample_rand: 0.2) expect(transaction.sampled).to eq(false) end it "gives sidekiq ops 0.01 of rate" do - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "sidekiq", sample_rand: 0.005) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "sidekiq", sample_rand: 0.005) expect(transaction.sampled).to eq(true) - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub, op: "sidekiq", sample_rand: 0.02) - - described_class.start_transaction(transaction: transaction) + transaction = described_class.start_transaction(op: "sidekiq", sample_rand: 0.02) expect(transaction.sampled).to eq(false) end end @@ -564,10 +548,8 @@ context "when given an transaction object" do it "adds sample decision to it" do - transaction = Sentry::Transaction.new(hub: Sentry.get_current_hub) - - described_class.start_transaction(transaction: transaction) - + transaction = Sentry::Transaction.new(name: "test") + transaction = described_class.start_transaction(transaction: transaction) expect(transaction.sampled).to eq(true) end @@ -577,9 +559,7 @@ context = sampling_context end - transaction = Sentry::Transaction.new(op: "foo", hub: Sentry.get_current_hub) - - described_class.start_transaction(transaction: transaction) + described_class.start_transaction(op: "foo") expect(context[:parent_sampled]).to be_nil expect(context[:transaction_context][:op]).to eq("foo") @@ -591,10 +571,7 @@ context = sampling_context end - transaction = Sentry::Transaction.new(parent_sampled: true, hub: Sentry.get_current_hub) - - described_class.start_transaction(transaction: transaction) - + described_class.start_transaction(parent_sampled: true) expect(context[:parent_sampled]).to eq(true) end end @@ -681,7 +658,7 @@ context "when the current span is present" do let(:parent_span) do - transaction = Sentry::Transaction.new(op: "foo", hub: Sentry.get_current_hub) + transaction = described_class.start_transaction(op: "foo") Sentry::Span.new(op: "parent", transaction: transaction) end @@ -884,15 +861,23 @@ expect(traceparent).to eq("#{propagation_context.trace_id}-#{propagation_context.span_id}") end - it "returns a valid traceparent header from scope current span" do - transaction = Sentry::Transaction.new(op: "foo", hub: Sentry.get_current_hub, sampled: true) - span = transaction.start_child(op: "parent") - described_class.get_current_scope.set_span(span) + context "with tracing" do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end + end - traceparent = described_class.get_traceparent + it "returns a valid traceparent header from scope current span" do + transaction = described_class.start_transaction(op: "foo", sampled: true) + span = transaction.start_child(op: "parent") + described_class.get_current_scope.set_span(span) - expect(traceparent).to match(Sentry::PropagationContext::SENTRY_TRACE_REGEXP) - expect(traceparent).to eq("#{span.trace_id}-#{span.span_id}-1") + traceparent = described_class.get_traceparent + + expect(traceparent).to match(Sentry::PropagationContext::SENTRY_TRACE_REGEXP) + expect(traceparent).to eq("#{span.trace_id}-#{span.span_id}-1") + end end end @@ -904,14 +889,22 @@ expect(baggage).to eq("sentry-trace_id=#{propagation_context.trace_id},sentry-sample_rand=#{Sentry::Utils::SampleRand.format(propagation_context.sample_rand)},sentry-environment=development,sentry-public_key=12345") end - it "returns a valid baggage header from scope current span" do - transaction = Sentry::Transaction.new(op: "foo", hub: Sentry.get_current_hub, sampled: true) - span = transaction.start_child(op: "parent") - described_class.get_current_scope.set_span(span) + context "with tracing" do + before do + perform_basic_setup do |config| + config.traces_sample_rate = 1.0 + end + end - baggage = described_class.get_baggage + it "returns a valid baggage header from scope current span" do + transaction = described_class.start_transaction(op: "foo", sampled: true) + span = transaction.start_child(op: "parent") + described_class.get_current_scope.set_span(span) - expect(baggage).to eq("sentry-trace_id=#{span.trace_id},sentry-sample_rand=#{Sentry::Utils::SampleRand.format(transaction.sample_rand)},sentry-sampled=true,sentry-environment=development,sentry-public_key=12345") + baggage = described_class.get_baggage + + expect(baggage).to eq("sentry-trace_id=#{span.trace_id},sentry-sample_rate=1.0,sentry-sample_rand=#{Sentry::Utils::SampleRand.format(transaction.sample_rand)},sentry-sampled=true,sentry-environment=development,sentry-public_key=12345") + end end end @@ -1355,14 +1348,6 @@ expect(described_class.backpressure_monitor).to eq(nil) end - it "flushes and kills metrics aggregator" do - perform_basic_setup { |c| c.metrics.enabled = true } - expect(described_class.metrics_aggregator).to receive(:flush).with(force: true) - expect(described_class.metrics_aggregator).to receive(:kill) - described_class.close - expect(described_class.metrics_aggregator).to eq(nil) - end - it "flushes transport" do expect(described_class.get_current_client).to receive(:flush) described_class.close diff --git a/sentry-sidekiq/Gemfile b/sentry-sidekiq/Gemfile index a62e0da59..04bb4285d 100644 --- a/sentry-sidekiq/Gemfile +++ b/sentry-sidekiq/Gemfile @@ -11,10 +11,6 @@ gemspec gem "sentry-ruby", path: "../sentry-ruby" gem "sentry-rails", path: "../sentry-rails" -# https://github.com/flavorjones/loofah/pull/267 -# loofah changed the required ruby version in a patch so we need to explicitly pin it -gem "loofah", "2.20.0" if RUBY_VERSION.to_f < 2.5 - if ENV["SIDEKIQ_MAIN"] gem "sidekiq", github: "sidekiq/sidekiq", branch: "main" sidekiq_version = "main" @@ -26,7 +22,7 @@ else gem "sidekiq", "~> #{sidekiq_version}" end -if sidekiq_version == "main" || RUBY_VERSION.to_f >= 2.7 && sidekiq_version >= Gem::Version.new("6.0") +if sidekiq_version == "main" || sidekiq_version >= Gem::Version.new("6.0") gem "sidekiq-cron" if sidekiq_version == "main" || sidekiq_version >= Gem::Version.new("8.0") @@ -36,7 +32,7 @@ if sidekiq_version == "main" || RUBY_VERSION.to_f >= 2.7 && sidekiq_version >= G end end -gem "rails", "> 5.0.0" +gem "rails", "> 5.2.0" gem "timecop" diff --git a/sentry-sidekiq/example/Gemfile b/sentry-sidekiq/example/Gemfile deleted file mode 100644 index 9834edf07..000000000 --- a/sentry-sidekiq/example/Gemfile +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" - -gem "sidekiq" -gem "sentry-sidekiq", path: "../" -gem "sentry-ruby", path: "../../sentry-ruby" - -gem "debug", github: "ruby/debug" diff --git a/sentry-sidekiq/example/README.md b/sentry-sidekiq/example/README.md deleted file mode 100644 index 1e1969d68..000000000 --- a/sentry-sidekiq/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# sentry-sidekiq example - -## Usage - -1. run `bundle install` -2. change the `dsn` inside `error_worker.rb` -3. run `bundle exec sidekiq -r ./error_worker.rb` -4. you should see the event from your Sentry dashboard diff --git a/sentry-sidekiq/example/config/sidekiq.yml b/sentry-sidekiq/example/config/sidekiq.yml deleted file mode 100644 index 8ff28b74d..000000000 --- a/sentry-sidekiq/example/config/sidekiq.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -:verbose: false -:concurrency: 10 -:timeout: 25 - -:queues: - - default - diff --git a/sentry-sidekiq/example/error_worker.rb b/sentry-sidekiq/example/error_worker.rb deleted file mode 100644 index 8782dd2d7..000000000 --- a/sentry-sidekiq/example/error_worker.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require "sidekiq" -require "sentry-sidekiq" - -Sentry.init do |config| - config.breadcrumbs_logger = [:sentry_logger] - # replace it with your sentry dsn - config.dsn = 'https://2fb45f003d054a7ea47feb45898f7649@o447951.ingest.sentry.io/5434472' -end - -class ErrorWorker - include Sidekiq::Worker - - sidekiq_options retry: 0 - - def perform - 1 / 0 - end -end - -ErrorWorker.perform_async diff --git a/sentry-sidekiq/sentry-sidekiq.gemspec b/sentry-sidekiq/sentry-sidekiq.gemspec index 95efbcd39..f9e125e6a 100644 --- a/sentry-sidekiq/sentry-sidekiq.gemspec +++ b/sentry-sidekiq/sentry-sidekiq.gemspec @@ -11,7 +11,7 @@ Gem::Specification.new do |spec| spec.license = 'MIT' spec.platform = Gem::Platform::RUBY - spec.required_ruby_version = '>= 2.4' + spec.required_ruby_version = '>= 2.7' spec.extra_rdoc_files = ["README.md", "LICENSE.txt"] spec.files = `git ls-files | grep -Ev '^(spec|benchmarks|examples|\.rubocop\.yml)'`.split("\n") @@ -31,5 +31,5 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency "sentry-ruby", "~> 5.28.0" - spec.add_dependency "sidekiq", ">= 3.0" + spec.add_dependency "sidekiq", ">= 5.0" end diff --git a/sentry-sidekiq/spec/sentry/sidekiq-scheduler/scheduler_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq-scheduler/scheduler_spec.rb index 02efd1ccc..661042fd8 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq-scheduler/scheduler_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq-scheduler/scheduler_spec.rb @@ -57,7 +57,7 @@ expect(EveryHappyWorker.sentry_monitor_slug).to eq('regularly_happy') expect(EveryHappyWorker.sentry_monitor_config).to be_a(Sentry::Cron::MonitorConfig) expect(EveryHappyWorker.sentry_monitor_config.schedule).to be_a(Sentry::Cron::MonitorSchedule::Interval) - expect(EveryHappyWorker.sentry_monitor_config.schedule.to_hash).to eq({ value: 10, type: :interval, unit: :minute }) + expect(EveryHappyWorker.sentry_monitor_config.schedule.to_h).to eq({ value: 10, type: :interval, unit: :minute }) end it "does not add monitors for a one-off job" do diff --git a/sentry-sidekiq/spec/sentry/sidekiq/error_handler_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq/error_handler_spec.rb index d1e835d6b..42acd8615 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq/error_handler_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq/error_handler_spec.rb @@ -59,7 +59,7 @@ processor.fire_event(:startup) end - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:exception][:values][0][:type]).to eq("RuntimeError") expect(event[:exception][:values][0][:value]).to match("Uhoh!") expect(event[:transaction]).to eq "Sidekiq/startup" @@ -71,7 +71,7 @@ subject.call(exception, context) expect(transport.events.count).to eq(1) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event[:contexts][:sidekiq]).to eq(context) end @@ -87,7 +87,7 @@ subject.call(exception, aj_context) expect(transport.events.count).to eq(1) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event[:contexts][:sidekiq]).to eq(expected_context) end @@ -100,7 +100,7 @@ subject.call(exception, context) expect(transport.events.count).to eq(1) - event = transport.events.first.to_hash + event = transport.events.first.to_h expect(event[:transaction]).to eq("Sidekiq/HardWorker") end end diff --git a/sentry-sidekiq/spec/sentry/sidekiq_spec.rb b/sentry-sidekiq/spec/sentry/sidekiq_spec.rb index de65bb074..cd11d3cd9 100644 --- a/sentry-sidekiq/spec/sentry/sidekiq_spec.rb +++ b/sentry-sidekiq/spec/sentry/sidekiq_spec.rb @@ -54,7 +54,7 @@ it "captures exception raised in the worker" do expect { execute_worker(processor, SadWorker) }.to change { transport.events.size }.by(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:sdk]).to eq({ name: "sentry.ruby.sidekiq", version: described_class::VERSION }) expect(event[:exception][:values][0][:type]).to eq("RuntimeError") expect(event[:exception][:values][0][:value]).to match("I'm sad!") @@ -63,7 +63,7 @@ it "doesn't store the private `_config` context", skip: !WITH_SIDEKIQ_7 do expect { execute_worker(processor, SadWorker) }.to change { transport.events.size }.by(1) - event = transport.events.last.to_hash + event = transport.events.last.to_h expect(event[:contexts][:sidekiq].keys.map(&:to_s)).not_to include("_config") end @@ -317,7 +317,7 @@ def retry_last_failed_job first = transport.events[0] check_in_id = first.check_in_id expect(first).to be_a(Sentry::CheckInEvent) - expect(first.to_hash).to include( + expect(first.to_h).to include( type: 'check_in', check_in_id: check_in_id, monitor_slug: "happyworkerwithcron", @@ -326,7 +326,7 @@ def retry_last_failed_job second = transport.events[1] expect(second).to be_a(Sentry::CheckInEvent) - expect(second.to_hash).to include( + expect(second.to_h).to include( :duration, type: 'check_in', check_in_id: check_in_id, @@ -342,7 +342,7 @@ def retry_last_failed_job first = transport.events[0] check_in_id = first.check_in_id expect(first).to be_a(Sentry::CheckInEvent) - expect(first.to_hash).to include( + expect(first.to_h).to include( type: 'check_in', check_in_id: check_in_id, monitor_slug: "failed_job", @@ -352,7 +352,7 @@ def retry_last_failed_job second = transport.events[1] expect(second).to be_a(Sentry::CheckInEvent) - expect(second.to_hash).to include( + expect(second.to_h).to include( :duration, type: 'check_in', check_in_id: check_in_id,