From 523859ba97aa2638c4f4e125fbeb7b2645e5cd41 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 30 Mar 2023 11:02:08 -0400 Subject: [PATCH 01/44] Replace specs for expressions with shared library --- Gemfile | 1 + Guardfile | 3 + lib/flipper/expression.rb | 10 ++-- lib/flipper/expressions/duration.rb | 2 +- .../expressions/percentage_of_actors.rb | 2 +- lib/flipper/expressions/time.rb | 2 +- package.json | 5 ++ spec/flipper/expressions/all_spec.rb | 15 ----- spec/flipper/expressions/any_spec.rb | 15 ----- spec/flipper/expressions/boolean_spec.rb | 15 ----- spec/flipper/expressions/duration_spec.rb | 43 -------------- spec/flipper/expressions/equal_spec.rb | 24 -------- .../greater_than_or_equal_to_spec.rb | 28 ---------- spec/flipper/expressions/greater_than_spec.rb | 28 ---------- .../expressions/less_than_or_equal_to_spec.rb | 28 ---------- spec/flipper/expressions/less_than_spec.rb | 32 ----------- spec/flipper/expressions/not_equal_spec.rb | 15 ----- spec/flipper/expressions/now_spec.rb | 11 ---- spec/flipper/expressions/number_spec.rb | 21 ------- .../expressions/percentage_of_actors_spec.rb | 20 ------- spec/flipper/expressions/percentage_spec.rb | 15 ----- spec/flipper/expressions/property_spec.rb | 13 ----- spec/flipper/expressions/random_spec.rb | 9 --- spec/flipper/expressions/string_spec.rb | 11 ---- spec/flipper/expressions/time_spec.rb | 13 ----- spec/flipper/expressions_schema_spec.rb | 56 +++++++++++++++++++ yarn.lock | 54 ++++++++++++++++++ 27 files changed, 128 insertions(+), 363 deletions(-) create mode 100644 package.json delete mode 100644 spec/flipper/expressions/all_spec.rb delete mode 100644 spec/flipper/expressions/any_spec.rb delete mode 100644 spec/flipper/expressions/boolean_spec.rb delete mode 100644 spec/flipper/expressions/duration_spec.rb delete mode 100644 spec/flipper/expressions/equal_spec.rb delete mode 100644 spec/flipper/expressions/greater_than_or_equal_to_spec.rb delete mode 100644 spec/flipper/expressions/greater_than_spec.rb delete mode 100644 spec/flipper/expressions/less_than_or_equal_to_spec.rb delete mode 100644 spec/flipper/expressions/less_than_spec.rb delete mode 100644 spec/flipper/expressions/not_equal_spec.rb delete mode 100644 spec/flipper/expressions/now_spec.rb delete mode 100644 spec/flipper/expressions/number_spec.rb delete mode 100644 spec/flipper/expressions/percentage_of_actors_spec.rb delete mode 100644 spec/flipper/expressions/percentage_spec.rb delete mode 100644 spec/flipper/expressions/property_spec.rb delete mode 100644 spec/flipper/expressions/random_spec.rb delete mode 100644 spec/flipper/expressions/string_spec.rb delete mode 100644 spec/flipper/expressions/time_spec.rb create mode 100644 spec/flipper/expressions_schema_spec.rb create mode 100644 yarn.lock diff --git a/Gemfile b/Gemfile index 6caddc9e2..cdabdbd62 100644 --- a/Gemfile +++ b/Gemfile @@ -23,6 +23,7 @@ gem 'stackprof' gem 'benchmark-ips' gem 'stackprof-webnav' gem 'flamegraph' +gem "json_schemer", "~> 0.2.24" group(:guard) do gem 'guard', '~> 2.15' diff --git a/Guardfile b/Guardfile index 4777b30ee..ee0570a03 100644 --- a/Guardfile +++ b/Guardfile @@ -22,6 +22,9 @@ guard 'rspec', rspec_options do watch(/shared_adapter_specs\.rb$/) { 'spec' } watch('spec/helper.rb') { 'spec' } + watch(%r{lib/flipper/expressions}) { 'spec/flipper/expressions_schema_spec.rb' } + watch(%r{node_modules/@flippercloud.io/expressions}) { 'spec/flipper/expressions_schema_spec.rb' } + # To run all specs on every change... (useful with focus and fit) # watch(%r{.*}) { 'spec' } end diff --git a/lib/flipper/expression.rb b/lib/flipper/expression.rb index 8d08988c0..cddd114bb 100644 --- a/lib/flipper/expression.rb +++ b/lib/flipper/expression.rb @@ -10,13 +10,15 @@ def self.build(object) case object when Hash - name = object.keys.first - args = object.values.first - unless name + if(object.keys.size != 1) raise ArgumentError, "#{object.inspect} cannot be converted into an expression" end - new(name, Array(args).map { |o| build(o) }) + name = object.keys.first + args = object.values.first + args = [args] unless args.is_a?(Array) + + new(name, args.map { |o| build(o) }) when String, Numeric, FalseClass, TrueClass Expression::Constant.new(object) when Symbol diff --git a/lib/flipper/expressions/duration.rb b/lib/flipper/expressions/duration.rb index b1ca50747..2a11ba658 100644 --- a/lib/flipper/expressions/duration.rb +++ b/lib/flipper/expressions/duration.rb @@ -11,7 +11,7 @@ class Duration "year" => 31_556_952 # length of a gregorian year (365.2425 days) }.freeze - def self.call(scalar, unit = 'second') + def self.call(scalar, unit) unit = unit.to_s.downcase.chomp("s") unless scalar.is_a?(Numeric) diff --git a/lib/flipper/expressions/percentage_of_actors.rb b/lib/flipper/expressions/percentage_of_actors.rb index 869c2a2ad..efadab6b2 100644 --- a/lib/flipper/expressions/percentage_of_actors.rb +++ b/lib/flipper/expressions/percentage_of_actors.rb @@ -5,7 +5,7 @@ class PercentageOfActors def self.call(text, percentage, context: {}) prefix = context[:feature_name] || "" - Zlib.crc32("#{prefix}#{text}") % (100 * SCALING_FACTOR) < percentage * SCALING_FACTOR + Zlib.crc32("#{prefix}#{text}") % (100 * SCALING_FACTOR) < percentage.clamp(0, 100) * SCALING_FACTOR end end end diff --git a/lib/flipper/expressions/time.rb b/lib/flipper/expressions/time.rb index 93780749a..0c8dd83c7 100644 --- a/lib/flipper/expressions/time.rb +++ b/lib/flipper/expressions/time.rb @@ -2,7 +2,7 @@ module Flipper module Expressions class Time def self.call(value) - ::Time.parse(value) + ::Time.iso8601(value) end end end diff --git a/package.json b/package.json new file mode 100644 index 000000000..5f82829c7 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@flippercloud.io/expressions": "https://github.com/fewerandfaster/expressions.js" + } +} diff --git a/spec/flipper/expressions/all_spec.rb b/spec/flipper/expressions/all_spec.rb deleted file mode 100644 index c12fe54ac..000000000 --- a/spec/flipper/expressions/all_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -RSpec.describe Flipper::Expressions::All do - describe "#call" do - it "returns true if all args evaluate as true" do - expect(described_class.call(true, true)).to be(true) - end - - it "returns false if any args evaluate as false" do - expect(described_class.call(false, true)).to be(false) - end - - it "returns true with empty args" do - expect(described_class.call).to be(true) - end - end -end diff --git a/spec/flipper/expressions/any_spec.rb b/spec/flipper/expressions/any_spec.rb deleted file mode 100644 index cd6b07f8a..000000000 --- a/spec/flipper/expressions/any_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -RSpec.describe Flipper::Expressions::Any do - describe "#call" do - it "returns true if any args evaluate as true" do - expect(described_class.call(true, false)).to be(true) - end - - it "returns false if all args evaluate as false" do - expect(described_class.call(false, false)).to be(false) - end - - it "returns false with empty args" do - expect(described_class.call).to be(false) - end - end -end diff --git a/spec/flipper/expressions/boolean_spec.rb b/spec/flipper/expressions/boolean_spec.rb deleted file mode 100644 index c85921e79..000000000 --- a/spec/flipper/expressions/boolean_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -RSpec.describe Flipper::Expressions::Boolean do - describe "#call" do - [true, 'true', 1, '1'].each do |value| - it "returns a true for #{value.inspect}" do - expect(described_class.call(value)).to be(true) - end - end - - [false, 'false', 0, '0', nil].each do |value| - it "returns a true for #{value.inspect}" do - expect(described_class.call(value)).to be(false) - end - end - end -end diff --git a/spec/flipper/expressions/duration_spec.rb b/spec/flipper/expressions/duration_spec.rb deleted file mode 100644 index e19e2aff0..000000000 --- a/spec/flipper/expressions/duration_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -RSpec.describe Flipper::Expressions::Duration do - describe "#call" do - it "raises error with invalid value" do - expect { described_class.call(false, 'minute') }.to raise_error(ArgumentError) - end - - it "raises error with invalid unit" do - expect { described_class.call(4, 'score') }.to raise_error(ArgumentError) - end - - it 'defaults unit to seconds' do - expect(described_class.call(10)).to eq(10) - end - - it "evaluates seconds" do - expect(described_class.call(10, 'seconds')).to eq(10) - end - - it "evaluates minutes" do - expect(described_class.call(2, 'minutes')).to eq(120) - end - - it "evaluates hours" do - expect(described_class.call(2, 'hours')).to eq(7200) - end - - it "evaluates days" do - expect(described_class.call(2, 'days')).to eq(172_800) - end - - it "evaluates weeks" do - expect(described_class.call(2, 'weeks')).to eq(1_209_600) - end - - it "evaluates months" do - expect(described_class.call(2, 'months')).to eq(5_259_492) - end - - it "evaluates years" do - expect(described_class.call(2, 'years')).to eq(63_113_904) - end - end -end diff --git a/spec/flipper/expressions/equal_spec.rb b/spec/flipper/expressions/equal_spec.rb deleted file mode 100644 index a2722810d..000000000 --- a/spec/flipper/expressions/equal_spec.rb +++ /dev/null @@ -1,24 +0,0 @@ -RSpec.describe Flipper::Expressions::Equal do - describe "#call" do - it "returns true when equal" do - expect(described_class.call("basic", "basic")).to be(true) - end - - it "returns false when not equal" do - expect(described_class.call("basic", "plus")).to be(false) - end - - it "returns false when value evaluates to nil" do - expect(described_class.call(nil, 1)).to be(false) - expect(described_class.call(1, nil)).to be(false) - end - - it "raises ArgumentError with no arguments" do - expect { described_class.call }.to raise_error(ArgumentError) - end - - it "raises ArgumentError with one argument" do - expect { described_class.call(10) }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/greater_than_or_equal_to_spec.rb b/spec/flipper/expressions/greater_than_or_equal_to_spec.rb deleted file mode 100644 index 7e2e065a8..000000000 --- a/spec/flipper/expressions/greater_than_or_equal_to_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -RSpec.describe Flipper::Expressions::GreaterThanOrEqualTo do - describe "#call" do - it "returns true when equal" do - expect(described_class.call(2, 2)).to be(true) - end - - it "returns true when greater" do - expect(described_class.call(2, 1)).to be(true) - end - - it "returns false when less" do - expect(described_class.call(1, 2)).to be(false) - end - - it "returns false when value evaluates to nil" do - expect(described_class.call(nil, 1)).to be(false) - expect(described_class.call(1, nil)).to be(false) - end - - it "raises ArgumentError with no arguments" do - expect { described_class.call }.to raise_error(ArgumentError) - end - - it "raises ArgumentError with one argument" do - expect { described_class.call(10) }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/greater_than_spec.rb b/spec/flipper/expressions/greater_than_spec.rb deleted file mode 100644 index 9a89a858a..000000000 --- a/spec/flipper/expressions/greater_than_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -RSpec.describe Flipper::Expressions::GreaterThan do - describe "#call" do - it "returns false when equal" do - expect(described_class.call(2, 2)).to be(false) - end - - it "returns true when greater" do - expect(described_class.call(2, 1)).to be(true) - end - - it "returns false when less" do - expect(described_class.call(1, 2)).to be(false) - end - - it "returns false when value evaluates to nil" do - expect(described_class.call(nil, 1)).to be(false) - expect(described_class.call(1, nil)).to be(false) - end - - it "raises ArgumentError with no arguments" do - expect { described_class.call }.to raise_error(ArgumentError) - end - - it "raises ArgumentError with one argument" do - expect { described_class.call(10) }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/less_than_or_equal_to_spec.rb b/spec/flipper/expressions/less_than_or_equal_to_spec.rb deleted file mode 100644 index 9fa1182cc..000000000 --- a/spec/flipper/expressions/less_than_or_equal_to_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -RSpec.describe Flipper::Expressions::LessThanOrEqualTo do - describe "#call" do - it "returns true when equal" do - expect(described_class.call(2, 2)).to be(true) - end - - it "returns true when less" do - expect(described_class.call(1, 2)).to be(true) - end - - it "returns false when greater" do - expect(described_class.call(2, 1)).to be(false) - end - - it "returns false when value evaluates to nil" do - expect(described_class.call(nil, 1)).to be(false) - expect(described_class.call(1, nil)).to be(false) - end - - it "raises ArgumentError with no arguments" do - expect { described_class.call }.to raise_error(ArgumentError) - end - - it "raises ArgumentError with one argument" do - expect { described_class.call(10) }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/less_than_spec.rb b/spec/flipper/expressions/less_than_spec.rb deleted file mode 100644 index 414c0eaea..000000000 --- a/spec/flipper/expressions/less_than_spec.rb +++ /dev/null @@ -1,32 +0,0 @@ -RSpec.describe Flipper::Expressions::LessThan do - describe "#call" do - it "returns false when equal" do - expect(described_class.call(2, 2)).to be(false) - end - - it "returns true when less" do - expect(described_class.call(1, 2)).to be(true) - end - - it "returns true when less with args that need evaluation" do - expect(described_class.call(1, 2)).to be(true) - end - - it "returns false when greater" do - expect(described_class.call(2, 1)).to be(false) - end - - it "returns false when value evaluates to nil" do - expect(described_class.call(nil, 1)).to be(false) - expect(described_class.call(1, nil)).to be(false) - end - - it "raises ArgumentError with no arguments" do - expect { described_class.call }.to raise_error(ArgumentError) - end - - it "raises ArgumentError with one argument" do - expect { described_class.call(10) }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/not_equal_spec.rb b/spec/flipper/expressions/not_equal_spec.rb deleted file mode 100644 index 91d8584ba..000000000 --- a/spec/flipper/expressions/not_equal_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -RSpec.describe Flipper::Expressions::NotEqual do - describe "#call" do - it "returns true when not equal" do - expect(described_class.call("basic", "plus")).to be(true) - end - - it "returns false when equal" do - expect(described_class.call("basic", "basic")).to be(false) - end - - it "raises ArgumentError for more arguments" do - expect { described_class.call(20, 10, 20).evaluate }.to raise_error(ArgumentError) - end - end -end diff --git a/spec/flipper/expressions/now_spec.rb b/spec/flipper/expressions/now_spec.rb deleted file mode 100644 index 95868f2bd..000000000 --- a/spec/flipper/expressions/now_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -RSpec.describe Flipper::Expressions::Now do - describe "#call" do - it "returns current time" do - expect(described_class.call).to be_within(2).of(Time.now.utc) - end - - it "defaults to UTC" do - expect(described_class.call.zone).to eq("UTC") - end - end -end diff --git a/spec/flipper/expressions/number_spec.rb b/spec/flipper/expressions/number_spec.rb deleted file mode 100644 index 003e61cc9..000000000 --- a/spec/flipper/expressions/number_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -RSpec.describe Flipper::Expressions::Number do - describe "#call" do - it "returns Integer for Integer" do - expect(described_class.call(10)).to be(10) - end - - it "returns Float for Float" do - expect(described_class.call(10.1)).to be(10.1) - expect(described_class.call(10.0)).to be(10.0) - end - - it "returns Integer for String" do - expect(described_class.call('10')).to be(10) - end - - it "returns Float for String" do - expect(described_class.call('10.0')).to be(10.0) - expect(described_class.call('10.1')).to be(10.1) - end - end -end diff --git a/spec/flipper/expressions/percentage_of_actors_spec.rb b/spec/flipper/expressions/percentage_of_actors_spec.rb deleted file mode 100644 index 180a4b881..000000000 --- a/spec/flipper/expressions/percentage_of_actors_spec.rb +++ /dev/null @@ -1,20 +0,0 @@ -RSpec.describe Flipper::Expressions::PercentageOfActors do - describe "#call" do - it "returns true when string in percentage enabled" do - expect(described_class.call("User;1", 42)).to be(true) - end - - it "returns true when string in fractional percentage enabled" do - expect(described_class.call("User;1", 41.687)).to be(true) - end - - it "returns false when string in percentage enabled" do - expect(described_class.call("User;1", 0)).to be(false) - end - - it "changes value based on feature_name so not all actors get all features first" do - expect(described_class.call("User;1", 70, context: {feature_name: "a"})).to be(true) - expect(described_class.call("User;1", 70, context: {feature_name: "b"})).to be(false) - end - end -end diff --git a/spec/flipper/expressions/percentage_spec.rb b/spec/flipper/expressions/percentage_spec.rb deleted file mode 100644 index 1b31347b5..000000000 --- a/spec/flipper/expressions/percentage_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -RSpec.describe Flipper::Expressions::Percentage do - describe "#call" do - it "returns numeric" do - expect(described_class.call(10)).to be(10.0) - end - - it "returns 0 if less than 0" do - expect(described_class.call(-1)).to be(0) - end - - it "returns 100 if greater than 100" do - expect(described_class.call(101)).to be(100) - end - end -end diff --git a/spec/flipper/expressions/property_spec.rb b/spec/flipper/expressions/property_spec.rb deleted file mode 100644 index 3d168f215..000000000 --- a/spec/flipper/expressions/property_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -RSpec.describe Flipper::Expressions::Property do - describe "#call" do - it "returns value for property key" do - context = { properties: { "flipper_id" => "User;1" } } - expect(described_class.call("flipper_id", context: context)).to eq("User;1") - end - - it "returns nil if key not found in properties" do - context = { properties: { } } - expect(described_class.call("flipper_id", context: context)).to be(nil) - end - end -end diff --git a/spec/flipper/expressions/random_spec.rb b/spec/flipper/expressions/random_spec.rb deleted file mode 100644 index 708f0f716..000000000 --- a/spec/flipper/expressions/random_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -RSpec.describe Flipper::Expressions::Random do - describe "#call" do - it "returns random number based on max" do - 100.times do - expect(described_class.call(10)).to be_between(0, 10) - end - end - end -end diff --git a/spec/flipper/expressions/string_spec.rb b/spec/flipper/expressions/string_spec.rb deleted file mode 100644 index 9107e33fd..000000000 --- a/spec/flipper/expressions/string_spec.rb +++ /dev/null @@ -1,11 +0,0 @@ -RSpec.describe Flipper::Expressions::String do - describe "#call" do - it "returns String for Numeric" do - expect(described_class.call(10)).to eq("10") - end - - it "returns String" do - expect(described_class.call("test")).to eq("test") - end - end -end diff --git a/spec/flipper/expressions/time_spec.rb b/spec/flipper/expressions/time_spec.rb deleted file mode 100644 index 55674cd08..000000000 --- a/spec/flipper/expressions/time_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -RSpec.describe Flipper::Expressions::Time do - let(:time) { Time.now.round } - - describe "#call" do - it "returns time for #to_s format" do - expect(described_class.call(time.to_s)).to eq(time) - end - - it "returns time for #iso8601 format" do - expect(described_class.call(time.iso8601)).to eq(time) - end - end -end diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expressions_schema_spec.rb new file mode 100644 index 000000000..b864348c4 --- /dev/null +++ b/spec/flipper/expressions_schema_spec.rb @@ -0,0 +1,56 @@ +require 'json_schemer' + +RSpec.describe Flipper::Expressions do + EXPRESSION_JS_PATH = File.expand_path('../../node_modules/@flippercloud.io/expressions', __dir__) + + SCHEMAS = Hash[Dir.glob(File.join(EXPRESSION_JS_PATH, 'schemas/*.json')).map do |path| + [File.basename(path), JSON.parse(File.read(path))] + end] + + EXAMPLES = Dir.glob(File.join(EXPRESSION_JS_PATH, 'test/examples/*.json')) + + let(:schema) do + JSONSchemer.schema(SCHEMAS["schema.json"], ref_resolver: lambda {|url| + SCHEMAS[File.basename(url.path)] + }) + end + + EXAMPLES.each do |path| + describe(File.basename(path, '.json')) do + examples = JSON.parse(File.read(path)) + examples["valid"].each do |example| + expression, context, result = example.values_at("expression", "context", "result") + context&.transform_keys!(&:to_sym) + + describe expression.inspect do + it "is valid" do + expect(schema.validate(expression).to_a).to eq([]) + end + + it "evaluates to #{result.inspect}#{ " with context " + context.inspect if context}" do + evaluated_result = Flipper::Expression.build(expression).evaluate(context || {} ) + expected_schema = JSONSchemer.schema(result, before_property_validation: lambda {|data, property, property_schema, _parent| + puts "BEFORE: #{[data, property, property_schema, _parent].inspect}" + }) + expect(expected_schema.validate(evaluated_result).to_a).to eq([]) + end + end + + end + + examples["invalid"].each do |example| + context example.inspect do + it "is invalid" do + expect(schema.valid?(example)).not_to be(true) + end + + it "should not evaluate" do + expect { Flipper::Expression.build(example).evaluate }.to raise_error { |error| + expect([ArgumentError, TypeError]).to include(error.class) + } + end + end + end + end + end +end diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 000000000..832680c40 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,54 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@flippercloud.io/expressions@https://github.com/fewerandfaster/expressions.js": + version "1.0.0" + resolved "https://github.com/fewerandfaster/expressions.js#9dd0dbf42b2794c1ec00d31fd8ae0f4c22c953aa" + dependencies: + ajv "^8.12.0" + ajv-formats "^2.1.1" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv@^8.0.0, ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" From 10fa1b4dfbf22a88f79bffb132038a5bfd52eff3 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 30 Mar 2023 18:56:40 -0400 Subject: [PATCH 02/44] Move expressions schemas into this repo --- package.json | 5 - packages/expressions/.gitignore | 3 + packages/expressions/README.md | 267 ++ packages/expressions/jest.config.js | 195 + packages/expressions/lib/index.js | 2 + packages/expressions/lib/schemas.js | 19 + packages/expressions/lib/validator.js | 9 + packages/expressions/package.json | 35 + packages/expressions/schemas/All.schema.json | 9 + packages/expressions/schemas/Any.schema.json | 9 + .../expressions/schemas/Boolean.schema.json | 7 + .../expressions/schemas/Duration.schema.json | 25 + .../expressions/schemas/Equal.schema.json | 7 + .../schemas/GreaterThan.schema.json | 7 + .../schemas/GreaterThanOrEqualTo.schema.json | 7 + .../expressions/schemas/LessThan.schema.json | 7 + .../schemas/LessThanOrEqualTo.schema.json | 7 + .../expressions/schemas/NotEqual.schema.json | 7 + packages/expressions/schemas/Now.schema.json | 8 + .../expressions/schemas/Number.schema.json | 7 + .../schemas/Percentage.schema.json | 10 + .../schemas/PercentageOfActors.schema.json | 13 + .../expressions/schemas/Property.schema.json | 10 + .../expressions/schemas/Random.schema.json | 10 + .../expressions/schemas/String.schema.json | 5 + packages/expressions/schemas/Time.schema.json | 18 + packages/expressions/schemas/schema.json | 69 + packages/expressions/test/examples/All.json | 37 + packages/expressions/test/examples/Any.json | 41 + .../expressions/test/examples/Boolean.json | 65 + .../expressions/test/examples/Durations.json | 37 + packages/expressions/test/examples/Equal.json | 36 + .../test/examples/GreaterThan.json | 36 + .../test/examples/GreaterThanOrEqualTo.json | 48 + .../expressions/test/examples/LessThan.json | 45 + .../test/examples/LessThanOrEqualTo.json | 45 + .../expressions/test/examples/NotEqual.json | 40 + packages/expressions/test/examples/Now.json | 17 + .../expressions/test/examples/Number.json | 50 + .../expressions/test/examples/Percentage.json | 34 + .../test/examples/PercentageOfActors.json | 48 + .../expressions/test/examples/Property.json | 27 + .../expressions/test/examples/Random.json | 25 + .../expressions/test/examples/String.json | 57 + packages/expressions/test/examples/Time.json | 24 + .../test/examples/expressions.json | 29 + packages/expressions/test/examples/index.js | 10 + packages/expressions/test/schemas.test.js | 36 + packages/expressions/vite.config.js | 19 + packages/expressions/yarn.lock | 3634 +++++++++++++++++ spec/flipper/expressions_schema_spec.rb | 2 +- yarn.lock | 54 - 52 files changed, 5213 insertions(+), 60 deletions(-) delete mode 100644 package.json create mode 100644 packages/expressions/.gitignore create mode 100644 packages/expressions/README.md create mode 100644 packages/expressions/jest.config.js create mode 100644 packages/expressions/lib/index.js create mode 100644 packages/expressions/lib/schemas.js create mode 100644 packages/expressions/lib/validator.js create mode 100644 packages/expressions/package.json create mode 100644 packages/expressions/schemas/All.schema.json create mode 100644 packages/expressions/schemas/Any.schema.json create mode 100644 packages/expressions/schemas/Boolean.schema.json create mode 100644 packages/expressions/schemas/Duration.schema.json create mode 100644 packages/expressions/schemas/Equal.schema.json create mode 100644 packages/expressions/schemas/GreaterThan.schema.json create mode 100644 packages/expressions/schemas/GreaterThanOrEqualTo.schema.json create mode 100644 packages/expressions/schemas/LessThan.schema.json create mode 100644 packages/expressions/schemas/LessThanOrEqualTo.schema.json create mode 100644 packages/expressions/schemas/NotEqual.schema.json create mode 100644 packages/expressions/schemas/Now.schema.json create mode 100644 packages/expressions/schemas/Number.schema.json create mode 100644 packages/expressions/schemas/Percentage.schema.json create mode 100644 packages/expressions/schemas/PercentageOfActors.schema.json create mode 100644 packages/expressions/schemas/Property.schema.json create mode 100644 packages/expressions/schemas/Random.schema.json create mode 100644 packages/expressions/schemas/String.schema.json create mode 100644 packages/expressions/schemas/Time.schema.json create mode 100644 packages/expressions/schemas/schema.json create mode 100644 packages/expressions/test/examples/All.json create mode 100644 packages/expressions/test/examples/Any.json create mode 100644 packages/expressions/test/examples/Boolean.json create mode 100644 packages/expressions/test/examples/Durations.json create mode 100644 packages/expressions/test/examples/Equal.json create mode 100644 packages/expressions/test/examples/GreaterThan.json create mode 100644 packages/expressions/test/examples/GreaterThanOrEqualTo.json create mode 100644 packages/expressions/test/examples/LessThan.json create mode 100644 packages/expressions/test/examples/LessThanOrEqualTo.json create mode 100644 packages/expressions/test/examples/NotEqual.json create mode 100644 packages/expressions/test/examples/Now.json create mode 100644 packages/expressions/test/examples/Number.json create mode 100644 packages/expressions/test/examples/Percentage.json create mode 100644 packages/expressions/test/examples/PercentageOfActors.json create mode 100644 packages/expressions/test/examples/Property.json create mode 100644 packages/expressions/test/examples/Random.json create mode 100644 packages/expressions/test/examples/String.json create mode 100644 packages/expressions/test/examples/Time.json create mode 100644 packages/expressions/test/examples/expressions.json create mode 100644 packages/expressions/test/examples/index.js create mode 100644 packages/expressions/test/schemas.test.js create mode 100644 packages/expressions/vite.config.js create mode 100644 packages/expressions/yarn.lock delete mode 100644 yarn.lock diff --git a/package.json b/package.json deleted file mode 100644 index 5f82829c7..000000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "@flippercloud.io/expressions": "https://github.com/fewerandfaster/expressions.js" - } -} diff --git a/packages/expressions/.gitignore b/packages/expressions/.gitignore new file mode 100644 index 000000000..1ca025f62 --- /dev/null +++ b/packages/expressions/.gitignore @@ -0,0 +1,3 @@ +node_modules +dist +yarn-error.log diff --git a/packages/expressions/README.md b/packages/expressions/README.md new file mode 100644 index 000000000..7738ac4a1 --- /dev/null +++ b/packages/expressions/README.md @@ -0,0 +1,267 @@ +# Flipper Expressions + +> A schema for Flipper Expressions + +``` + PASS test/schemas.test.js + expressions.schema.json + expressions + valid + ✓ "string" (2 ms) + ✓ true + ✓ false (1 ms) + ✓ 1 + ✓ 1.1 + invalid + ✓ null + ✓ {} + ✓ [] + Time + valid + ✓ {"Number":{"Time":["2021-01-01T00:00:00Z"]}} (1 ms) + ✓ {"Number":{"Time":"2021-01-01T00:00:00-05:00"}} (1 ms) + ✓ {"Number":{"Time":{"Property":"created_at"}}} + invalid + ✓ {"Time":"2021-01-01"} (1 ms) + ✓ {"Time":"January 1, 2021 10:00"} + ✓ {"Time":null} + ✓ {"Time":false} (1 ms) + ✓ {"Time":[{"Property":"created_at"},{"Property":"updated_at"}]} + String + valid + ✓ {"String":true} + ✓ {"String":false} + ✓ {"String":"already a string"} + ✓ {"String":1} (1 ms) + ✓ {"String":1.1} + ✓ {"String":[true]} + ✓ {"String":[false]} + ✓ {"String":["already a string"]} + ✓ {"String":[1]} + ✓ {"String":[1.1]} + ✓ {"String":{"All":[]}} + ✓ {"String":[{"Any":[]}]} + invalid + ✓ {"String":null} + ✓ {"String":[true,false]} + ✓ {"String":true,"Any":[]} + Random + valid + ✓ {"Random":[]} + ✓ {"Random":2} + ✓ {"Random":[100]} + ✓ {"Random":[{"Property":"max_rand"}]} (1 ms) + invalid + ✓ {"Random":null} + ✓ {"Random":[1,2]} + Property + valid + ✓ {"Property":"name"} + ✓ {"Property":["flipper_id"]} + ✓ {"Property":["flipper_id"]} + ✓ {"Property":["flipper_id"]} + invalid + ✓ {"Property":[]} + ✓ {"Property":null} + PercentageOfActors + valid + ✓ {"PercentageOfActors":["User;1",42]} (1 ms) + ✓ {"PercentageOfActors":["User;1",0]} + ✓ {"PercentageOfActors":["string",99.99]} + ✓ {"PercentageOfActors":["string",100]} + ✓ {"PercentageOfActors":[{"Property":["flipper_id"]},{"Property":["probability"]}]} + ✓ {"PercentageOfActors":["User;1",70]} + ✓ {"PercentageOfActors":["User;1",70]} + ✓ {"PercentageOfActors":["string",-1]} + ✓ {"PercentageOfActors":["string",101]} + invalid + ✓ {"PercentageOfActors":["string"]} + ✓ {"PercentageOfActors":[100]} + ✓ {"PercentageOfActors":[{"Property":["flipper_id"]}]} (1 ms) + Percentage + valid + ✓ {"Percentage":[0]} + ✓ {"Percentage":[99.999]} + ✓ {"Percentage":[100]} + ✓ {"Percentage":[{"Property":["nines"]}]} + ✓ {"Percentage":[-1]} + ✓ {"Percentage":[101]} (1 ms) + invalid + ✓ {"Percentage":[1,2]} + ✓ {"Percentage":[null]} + ✓ {"Percentage":null} + Number + valid + ✓ {"Number":0} + ✓ {"Number":1} + ✓ {"Number":1} (1 ms) + ✓ {"Number":"0"} + ✓ {"Number":"1"} + ✓ {"Number":"1.0"} + ✓ {"Number":[0]} + ✓ {"Number":[1]} + ✓ {"Number":[1]} + ✓ {"Number":{"Property":"age"}} + invalid + ✓ {"Number":null} + ✓ {"Number":[true,false]} + ✓ {"Number":true,"Any":[]} + Now + valid + ✓ {"Now":[]} + ✓ {"String":{"Now":[]}} + invalid + ✓ {"Now":null} + ✓ {"Now":[1]} (2 ms) + ✓ {"Now":1} + NotEqual + valid + ✓ {"NotEqual":[1,1]} (1 ms) + ✓ {"NotEqual":["a","a"]} + ✓ {"NotEqual":[1,2]} + ✓ {"NotEqual":["a","b"]} + ✓ {"NotEqual":[true,false]} + ✓ {"NotEqual":[true,true]} (1 ms) + ✓ {"NotEqual":[{"Property":"age"},21]} + invalid + ✓ {"NotEqual":[1,2,3]} + ✓ {"NotEqual":[1]} + ✓ {"NotEqual":1} + ✓ {"NotEqual":null} + ✓ {"NotEqual":[1,2],"Any":[]} + LessThanOrEqualTo + valid + ✓ {"LessThanOrEqualTo":[1,1]} + ✓ {"LessThanOrEqualTo":[2,1]} + ✓ {"LessThanOrEqualTo":["a","b"]} (1 ms) + ✓ {"LessThanOrEqualTo":["b","b"]} + ✓ {"LessThanOrEqualTo":[1,2]} + ✓ {"LessThanOrEqualTo":["b","a"]} + ✓ {"LessThanOrEqualTo":[{"Property":"age"},21]} + ✓ {"LessThanOrEqualTo":[{"Property":"age"},18]} + invalid + ✓ {"LessThanOrEqualTo":[1,2,3]} + ✓ {"LessThanOrEqualTo":[1]} + ✓ {"LessThanOrEqualTo":1} + ✓ {"LessThanOrEqualTo":null} + ✓ {"LessThanOrEqualTo":[1,2],"Any":[]} + LessThan + valid + ✓ {"LessThan":[1,1]} + ✓ {"LessThan":["a","a"]} + ✓ {"LessThan":[2,1]} + ✓ {"LessThan":[1,2]} + ✓ {"LessThan":["b","a"]} + ✓ {"LessThan":["a","b"]} + ✓ {"LessThan":[{"Property":"age"},18]} + ✓ {"LessThan":[{"Property":"age"},18]} + invalid + ✓ {"LessThan":[1,2,3]} + ✓ {"LessThan":[1]} + ✓ {"LessThan":1} + ✓ {"LessThan":null} (1 ms) + ✓ {"LessThan":[1,2],"Any":[]} + GreaterThanOrEqualTo + valid + ✓ {"GreaterThanOrEqualTo":[1,1]} + ✓ {"GreaterThanOrEqualTo":[2,1]} + ✓ {"GreaterThanOrEqualTo":["a","b"]} + ✓ {"GreaterThanOrEqualTo":["b","b"]} + ✓ {"GreaterThanOrEqualTo":[1,2]} + ✓ {"GreaterThanOrEqualTo":["b","a"]} + ✓ {"GreaterThanOrEqualTo":["a","b"]} + ✓ {"GreaterThanOrEqualTo":[true,false]} + ✓ {"GreaterThanOrEqualTo":[{"Property":"age"},18]} + invalid + ✓ {"GreaterThanOrEqualTo":[1,2,3]} + ✓ {"GreaterThanOrEqualTo":[1]} + ✓ {"GreaterThanOrEqualTo":1} + ✓ {"GreaterThanOrEqualTo":null} + ✓ {"GreaterThanOrEqualTo":[1,2],"Any":[]} + GreaterThan + valid + ✓ {"GreaterThan":[1,1]} + ✓ {"GreaterThan":["a","a"]} + ✓ {"GreaterThan":[2,1]} + ✓ {"GreaterThan":["b","a"]} + ✓ {"GreaterThan":["a","b"]} + ✓ {"GreaterThan":[{"Property":"age"},18]} + invalid + ✓ {"GreaterThan":[1,2,3]} + ✓ {"GreaterThan":[1]} + ✓ {"GreaterThan":1} + ✓ {"GreaterThan":null} + ✓ {"GreaterThan":[1,2],"Any":[]} + Equal + valid + ✓ {"Equal":[1,1]} + ✓ {"Equal":["a","a"]} + ✓ {"Equal":[1,2]} + ✓ {"Equal":["a","b"]} + ✓ {"Equal":[true,false]} + ✓ {"Equal":[{"Property":"age"},21]} + invalid + ✓ {"Equal":[1,2,3]} (1 ms) + ✓ {"Equal":[1]} + ✓ {"Equal":1} + ✓ {"Equal":null} + ✓ {"Equal":[1,2],"Any":[]} + Durations + valid + ✓ {"Duration":[2,"seconds"]} (1 ms) + ✓ {"Duration":[2,"minutes"]} + ✓ {"Duration":[2,"hours"]} + ✓ {"Duration":[2,"days"]} + ✓ {"Duration":[2,"weeks"]} + ✓ {"Duration":[2,"months"]} (1 ms) + ✓ {"Duration":[2,"years"]} + invalid + ✓ {"Duration":2} + ✓ {"Duration":[2]} + ✓ {"Duration":[4,"score"]} + Boolean + valid + ✓ {"Boolean":true} + ✓ {"Boolean":"true"} + ✓ {"Boolean":1} + ✓ {"Boolean":[true]} + ✓ {"Boolean":["true"]} + ✓ {"Boolean":[1]} + ✓ {"Boolean":{"All":[]}} + ✓ {"Boolean":false} + ✓ {"Boolean":"false"} + ✓ {"Boolean":0} + ✓ {"Boolean":[false]} + ✓ {"Boolean":["false"]} + ✓ {"Boolean":[0]} + ✓ {"Boolean":[{"Any":[]}]} + invalid + ✓ {"Boolean":null} + ✓ {"Boolean":[true,false]} + ✓ {"Boolean":true,"Any":[]} + Any + valid + ✓ {"Any":[]} (1 ms) + ✓ {"Any":[true]} + ✓ {"Any":[true,false]} + ✓ {"Any":[false,false]} + ✓ {"Any":[1,true,"string"]} + ✓ {"Any":true} (1 ms) + ✓ {"Any":false} + ✓ {"Any":[{"Boolean":false},{"Property":"admin"}]} + invalid + ✓ {"Any":null} + ✓ {"Any":[],"All":[]} + All + valid + ✓ {"All":[]} + ✓ {"All":[true]} + ✓ {"All":[true,false]} + ✓ {"All":[1,true,"string"]} + ✓ {"All":true} + ✓ {"All":false} + ✓ {"All":[{"Boolean":true},{"Property":"admin"}]} + invalid + ✓ {"All":null} + ✓ {"All":[],"Any":[]} +❯``` diff --git a/packages/expressions/jest.config.js b/packages/expressions/jest.config.js new file mode 100644 index 000000000..49fa67e76 --- /dev/null +++ b/packages/expressions/jest.config.js @@ -0,0 +1,195 @@ +/* + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +export default { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/wb/8vw5x4q52r7ggd26st909mp00000gn/T/jest_dx", + + // Automatically clear mock calls, instances, contexts and results before every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: 'v8', + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state before every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state and implementation before every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + // testEnvironment: "jest-environment-node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // A map from regular expressions to paths to transformers + transform: {} + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +} diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js new file mode 100644 index 000000000..04a10baa1 --- /dev/null +++ b/packages/expressions/lib/index.js @@ -0,0 +1,2 @@ +export * as schemas from './schemas' +export { default as validator } from './validator' diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js new file mode 100644 index 000000000..2915183c4 --- /dev/null +++ b/packages/expressions/lib/schemas.js @@ -0,0 +1,19 @@ +export { default } from '../schemas/schema.json' +export { default as All } from '../schemas/All.schema.json' +export { default as Any } from '../schemas/Any.schema.json' +export { default as Boolean } from '../schemas/Boolean.schema.json' +export { default as Duration } from '../schemas/Duration.schema.json' +export { default as Equal } from '../schemas/Equal.schema.json' +export { default as GreaterThan } from '../schemas/GreaterThan.schema.json' +export { default as GreaterThanOrEqualTo } from '../schemas/GreaterThanOrEqualTo.schema.json' +export { default as LessThan } from '../schemas/LessThan.schema.json' +export { default as LessThanOrEqualTo } from '../schemas/LessThanOrEqualTo.schema.json' +export { default as NotEqual } from '../schemas/NotEqual.schema.json' +export { default as Now } from '../schemas/Now.schema.json' +export { default as Number } from '../schemas/Number.schema.json' +export { default as Percentage } from '../schemas/Percentage.schema.json' +export { default as PercentageOfActors } from '../schemas/PercentageOfActors.schema.json' +export { default as Property } from '../schemas/Property.schema.json' +export { default as Random } from '../schemas/Random.schema.json' +export { default as String } from '../schemas/String.schema.json' +export { default as Time } from '../schemas/Time.schema.json' diff --git a/packages/expressions/lib/validator.js b/packages/expressions/lib/validator.js new file mode 100644 index 000000000..77807bbbd --- /dev/null +++ b/packages/expressions/lib/validator.js @@ -0,0 +1,9 @@ +import Ajv from 'ajv' +import addFormats from 'ajv-formats' +import * as schemas from './schemas' + +export default function (options = { allErrors: true, verbose: true }) { + const ajv = new Ajv({ schemas: Object.values(schemas) }) + addFormats(ajv) + return ajv.getSchema(schemas.default.$id) +} diff --git a/packages/expressions/package.json b/packages/expressions/package.json new file mode 100644 index 000000000..8f6df76e1 --- /dev/null +++ b/packages/expressions/package.json @@ -0,0 +1,35 @@ +{ + "name": "@flippercloud.io/expressions", + "version": "1.0.0", + "description": "Library and Schema for evaluating Flipper Expressions", + "type": "module", + "files": [ + "dist", + "schemas" + ], + "main": "./dist/expressions.umd.cjs", + "module": "./dist/expressions.js", + "exports": { + ".": { + "import": "./dist/expressions.js", + "require": "./dist/expressions.umd.cjs" + } + }, + "repository": "https:://github.com/jnunemaker/flipper", + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1" + }, + "devDependencies": { + "glob": "^9.3.2", + "jest": "^29.5.0", + "standard": "^17.0.0", + "vite": "^4.2.1" + }, + "scripts": { + "build": "vite build", + "lint": "standard", + "test": "yarn node --experimental-vm-modules $(yarn bin jest)" + } +} diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json new file mode 100644 index 000000000..241e59b52 --- /dev/null +++ b/packages/expressions/schemas/All.schema.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/All.schema.json", + "title": "All", + "oneOf": [ + { "$ref": "schema.json#/$defs/expression" }, + { "type": "array", "items": { "$ref": "schema.json#/$defs/expression" } } + ] +} diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json new file mode 100644 index 000000000..d7878cddc --- /dev/null +++ b/packages/expressions/schemas/Any.schema.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Any.schema.json", + "title": "Any", + "oneOf": [ + { "$ref": "schema.json#/$defs/expression" }, + { "type": "array", "items": { "$ref": "schema.json#/$defs/expression" } } + ] +} diff --git a/packages/expressions/schemas/Boolean.schema.json b/packages/expressions/schemas/Boolean.schema.json new file mode 100644 index 000000000..4852cd7af --- /dev/null +++ b/packages/expressions/schemas/Boolean.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Boolean.schema.json", + "title": "Boolean", + "description": "Cast a value to a boolean.", + "$ref": "schema.json#/$defs/argument" +} diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json new file mode 100644 index 000000000..1ebf5e82f --- /dev/null +++ b/packages/expressions/schemas/Duration.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Duration.schema.json", + "title": "Duration", + "description": "A period of time expressed as a number of seconds, minutes, hours, days, weeks, months, or years.", + "type": "array", + "items": [ + { "$ref": "schema.json#/$defs/number" }, + { + "oneOf": [ + { "$ref": "schema.json#/$defs/function" }, + { "$ref": "#/$defs/unit" } + ] + } + ], + "minItems": 2, + "maxItems": 2, + "$defs": { + "unit": { + "type": "string", + "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], + "default": "seconds" + } + } +} diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json new file mode 100644 index 000000000..e5c91cb31 --- /dev/null +++ b/packages/expressions/schemas/Equal.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", + "title": "Equal", + "description": "Compare two values for equality", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json new file mode 100644 index 000000000..406a40ce1 --- /dev/null +++ b/packages/expressions/schemas/GreaterThan.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", + "title": "GreaterThan", + "description": "Compare if the first argument is > the second argument.", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json new file mode 100644 index 000000000..47588bef9 --- /dev/null +++ b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", + "title": "GreaterThanOrEqualTo", + "description": "Compare if the first argument is >= the second argument.", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json new file mode 100644 index 000000000..b8333becc --- /dev/null +++ b/packages/expressions/schemas/LessThan.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", + "title": "LessThan", + "description": "Compare if the first argument is < the second argument.", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json new file mode 100644 index 000000000..ff00509b2 --- /dev/null +++ b/packages/expressions/schemas/LessThanOrEqualTo.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", + "title": "LessThanOrEqualTo", + "description": "Compare if the first argument is < the second argument.", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json new file mode 100644 index 000000000..1d8868bde --- /dev/null +++ b/packages/expressions/schemas/NotEqual.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", + "title": "NotEqual", + "description": "Compare two values for equality", + "$ref": "schema.json#/$defs/comparison" +} diff --git a/packages/expressions/schemas/Now.schema.json b/packages/expressions/schemas/Now.schema.json new file mode 100644 index 000000000..1d40f327e --- /dev/null +++ b/packages/expressions/schemas/Now.schema.json @@ -0,0 +1,8 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Now.schema.json", + "title": "Now", + "description": "The current time in UTC", + "type": "array", + "maxItems": 0 +} diff --git a/packages/expressions/schemas/Number.schema.json b/packages/expressions/schemas/Number.schema.json new file mode 100644 index 000000000..110b7f513 --- /dev/null +++ b/packages/expressions/schemas/Number.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Number.schema.json", + "title": "Number", + "description": "Cast a value to a number.", + "$ref": "schema.json#/$defs/argument" +} diff --git a/packages/expressions/schemas/Percentage.schema.json b/packages/expressions/schemas/Percentage.schema.json new file mode 100644 index 000000000..b9234e571 --- /dev/null +++ b/packages/expressions/schemas/Percentage.schema.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Percentage.schema.json", + "title": "Percentage", + "description": "Cast a value to a percentage between 0 and 100.", + "oneOf": [ + { "$ref": "schema.json#/$defs/number" }, + { "type": "array", "items": { "$ref": "schema.json#/$defs/number" }, "minItems": 1, "maxItems": 1 } + ] +} diff --git a/packages/expressions/schemas/PercentageOfActors.schema.json b/packages/expressions/schemas/PercentageOfActors.schema.json new file mode 100644 index 000000000..98853acbc --- /dev/null +++ b/packages/expressions/schemas/PercentageOfActors.schema.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/PercentageOfActors.schema.json", + "title": "PercentageOfActors", + "description": "", + "type": "array", + "items": [ + { "$ref": "schema.json#/$defs/string" }, + { "$ref": "schema.json#/$defs/number" } + ], + "minItems": 2, + "maxItems": 2 +} diff --git a/packages/expressions/schemas/Property.schema.json b/packages/expressions/schemas/Property.schema.json new file mode 100644 index 000000000..9e3dd19f5 --- /dev/null +++ b/packages/expressions/schemas/Property.schema.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Property.schema.json", + "title": "Property", + "description": "Extract a property from context[properties].", + "oneOf": [ + { "$ref": "schema.json#/$defs/string" }, + { "type": "array", "items": { "$ref": "schema.json#/$defs/string" }, "minItems": 1, "maxItems": 1 } + ] +} diff --git a/packages/expressions/schemas/Random.schema.json b/packages/expressions/schemas/Random.schema.json new file mode 100644 index 000000000..724557781 --- /dev/null +++ b/packages/expressions/schemas/Random.schema.json @@ -0,0 +1,10 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Random.schema.json", + "title": "Random", + "description": "Return a random number", + "oneOf": [ + { "$ref": "schema.json#/$defs/number" }, + { "type": "array", "items": { "$ref": "schema.json#/$defs/number" }, "maxItems": 1 } + ] +} diff --git a/packages/expressions/schemas/String.schema.json b/packages/expressions/schemas/String.schema.json new file mode 100644 index 000000000..7bfccf374 --- /dev/null +++ b/packages/expressions/schemas/String.schema.json @@ -0,0 +1,5 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/String.schema.json", + "$ref": "schema.json#/$defs/argument" +} diff --git a/packages/expressions/schemas/Time.schema.json b/packages/expressions/schemas/Time.schema.json new file mode 100644 index 000000000..ef40e34ef --- /dev/null +++ b/packages/expressions/schemas/Time.schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Time.schema.json", + "title": "Time", + "description": "A time in ISO8601 format", + "oneOf": [ + { "$ref": "#/$defs/argument" }, + { "type": "array", "minItems": 1, "maxItems": 1, "items": { "$ref": "#/$defs/argument" } } + ], + "$defs": { + "argument": { + "oneOf": [ + { "$ref": "schema.json#/$defs/function" }, + { "type": "string", "format": "date-time" } + ] + } + } +} diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json new file mode 100644 index 000000000..e0b704c53 --- /dev/null +++ b/packages/expressions/schemas/schema.json @@ -0,0 +1,69 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/schema.json", + "title": "Flipper Expressions", + "description": "TODO", + "$ref": "#/$defs/expression", + "$defs": { + "expression": { + "oneOf": [ + { "$ref": "#/$defs/function" }, + { "type": "string" }, + { "type": "boolean" }, + { "type": "number" } + ] + }, + "string": { + "oneOf": [ + { "$ref": "#/$defs/function" }, + { "type": "string" } + ] + }, + "number": { + "oneOf": [ + { "$ref": "#/$defs/function" }, + { "type": "number" } + ] + }, + "argument": { + "$comment": "Allow a single expression or an array with a single expression", + "oneOf": [ + { "$ref": "#/$defs/expression" }, + { "type": "array", "items": { "$ref": "#/$defs/expression" }, "maxItems": 1 } + ] + }, + "comparison": { + "$comment": "An array with exactly two expressions", + "type": "array", + "items": { "$ref": "#/$defs/expression" }, + "maxItems": 2, + "minItems": 2 + }, + "function": { + "type": "object", + "maxProperties": 1, + "minProperties": 1, + "properties": { + "All": { "$ref": "All.schema.json" }, + "Any": { "$ref": "Any.schema.json" }, + "Boolean": { "$ref": "Boolean.schema.json" }, + "Duration": { "$ref": "Duration.schema.json" }, + "Equal": { "$ref": "Equal.schema.json" }, + "GreaterThan": { "$ref": "GreaterThan.schema.json" }, + "GreaterThanOrEqualTo": { "$ref": "GreaterThanOrEqualTo.schema.json" }, + "LessThan": { "$ref": "LessThan.schema.json" }, + "LessThanOrEqualTo": { "$ref": "LessThanOrEqualTo.schema.json" }, + "NotEqual": { "$ref": "NotEqual.schema.json" }, + "Now": { "$ref": "Now.schema.json" }, + "Number": { "$ref": "Number.schema.json" }, + "Percentage": { "$ref": "Percentage.schema.json" }, + "PercentageOfActors": { "$ref": "PercentageOfActors.schema.json" }, + "Property": { "$ref": "Property.schema.json" }, + "Random": { "$ref": "Random.schema.json" }, + "String": { "$ref": "String.schema.json" }, + "Time": { "$ref": "Time.schema.json" } + }, + "additionalProperties": false + } + } +} diff --git a/packages/expressions/test/examples/All.json b/packages/expressions/test/examples/All.json new file mode 100644 index 000000000..71ef2aa66 --- /dev/null +++ b/packages/expressions/test/examples/All.json @@ -0,0 +1,37 @@ +{ + "valid": [ + { + "expression": { "All": [] }, + "result": { "enum": [true] } + }, + { + "expression": { "All": [true] }, + "result": { "enum": [true] } + }, + { + "expression": { "All": [true, false] }, + "result": { "enum": [false] } + }, + { + "expression": { "All": [1, true, "string"] }, + "result": { "enum": [true] } + }, + { + "expression": { "All": true }, + "result": { "enum": [true] } + }, + { + "expression": { "All": false }, + "result": { "enum": [false] } + }, + { + "expression": { "All": [{ "Boolean": true }, { "Property": "admin" }] }, + "context": { "properties": { "admin": true } }, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "All": null }, + { "All": [], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Any.json b/packages/expressions/test/examples/Any.json new file mode 100644 index 000000000..15e08741f --- /dev/null +++ b/packages/expressions/test/examples/Any.json @@ -0,0 +1,41 @@ +{ + "valid": [ + { + "expression": { "Any": [] }, + "result": { "enum": [false] } + }, + { + "expression": { "Any": [true] }, + "result": { "enum": [true] } + }, + { + "expression": { "Any": [true, false] }, + "result": { "enum": [true] } + }, + { + "expression": { "Any": [false, false] }, + "result": { "enum": [false] } + }, + { + "expression": { "Any": [1, true, "string"] }, + "result": { "enum": [true] } + }, + { + "expression": { "Any": true }, + "result": { "enum": [true] } + }, + { + "expression": { "Any": false }, + "result": { "enum": [false] } + }, + { + "expression": { "Any": [{ "Boolean": false }, { "Property": "admin" }] }, + "context": { "properties": { "admin": true } }, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "Any": null }, + { "Any": [], "All": [] } + ] +} diff --git a/packages/expressions/test/examples/Boolean.json b/packages/expressions/test/examples/Boolean.json new file mode 100644 index 000000000..58298972a --- /dev/null +++ b/packages/expressions/test/examples/Boolean.json @@ -0,0 +1,65 @@ +{ + "valid": [ + { + "expression": { "Boolean": true }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": "true" }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": 1 }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": [true] }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": ["true"] }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": [1] }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": { "All": [] } }, + "result": { "enum": [true] } + }, + { + "expression": { "Boolean": false }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": "false" }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": 0 }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": [false] }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": ["false"] }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": [0] }, + "result": { "enum": [false] } + }, + { + "expression": { "Boolean": [{ "Any": [] }] }, + "result": { "enum": [false] } + } + ], + "invalid": [ + { "Boolean": null }, + { "Boolean": [true, false] }, + { "Boolean": true, "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Durations.json b/packages/expressions/test/examples/Durations.json new file mode 100644 index 000000000..6bac7e4dd --- /dev/null +++ b/packages/expressions/test/examples/Durations.json @@ -0,0 +1,37 @@ +{ + "valid": [ + { + "expression": { "Duration": [2, "seconds"] }, + "result": { "enum": [2] } + }, + { + "expression": { "Duration": [2, "minutes"] }, + "result": { "enum": [120] } + }, + { + "expression": { "Duration": [2, "hours"] }, + "result": { "enum": [7200] } + }, + { + "expression": { "Duration": [2, "days"] }, + "result": { "enum": [172800] } + }, + { + "expression": { "Duration": [2, "weeks"] }, + "result": { "enum": [1209600] } + }, + { + "expression": { "Duration": [2, "months"] }, + "result": { "enum": [5259492] } + }, + { + "expression": { "Duration": [2, "years"] }, + "result": { "enum": [63113904] } + } + ], + "invalid": [ + { "Duration": 2 }, + { "Duration": [2] }, + { "Duration": [4, "score"] } + ] +} diff --git a/packages/expressions/test/examples/Equal.json b/packages/expressions/test/examples/Equal.json new file mode 100644 index 000000000..4531e3c41 --- /dev/null +++ b/packages/expressions/test/examples/Equal.json @@ -0,0 +1,36 @@ +{ + "valid": [ + { + "expression": { "Equal": [1, 1] }, + "result": { "enum": [true] } + }, + { + "expression": { "Equal": ["a", "a"] }, + "result": { "enum": [true] } + }, + { + "expression": { "Equal": [1, 2] }, + "result": { "enum": [false] } + }, + { + "expression": { "Equal": ["a", "b"] }, + "result": { "enum": [false] } + }, + { + "expression": { "Equal": [true, false] }, + "result": { "enum": [false] } + }, + { + "expression": { "Equal": [{ "Property": "age" }, 21] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "Equal": [1, 2, 3] }, + { "Equal": [1] }, + { "Equal": 1 }, + { "Equal": null }, + { "Equal": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/GreaterThan.json b/packages/expressions/test/examples/GreaterThan.json new file mode 100644 index 000000000..84fea5bfb --- /dev/null +++ b/packages/expressions/test/examples/GreaterThan.json @@ -0,0 +1,36 @@ +{ + "valid": [ + { + "expression": { "GreaterThan": [1, 1] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThan": ["a", "a"] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThan": [2, 1] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThan": ["b", "a"] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThan": ["a", "b"] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThan": [{ "Property": "age" }, 18] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "GreaterThan": [1, 2, 3] }, + { "GreaterThan": [1] }, + { "GreaterThan": 1 }, + { "GreaterThan": null }, + { "GreaterThan": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/GreaterThanOrEqualTo.json b/packages/expressions/test/examples/GreaterThanOrEqualTo.json new file mode 100644 index 000000000..10ce0a101 --- /dev/null +++ b/packages/expressions/test/examples/GreaterThanOrEqualTo.json @@ -0,0 +1,48 @@ +{ + "valid": [ + { + "expression": { "GreaterThanOrEqualTo": [1, 1] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThanOrEqualTo": [2, 1] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThanOrEqualTo": ["a", "b"] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThanOrEqualTo": ["b", "b"] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThanOrEqualTo": [1, 2] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThanOrEqualTo": ["b", "a"] }, + "result": { "enum": [true] } + }, + { + "expression": { "GreaterThanOrEqualTo": ["a", "b"] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThanOrEqualTo": [true, false] }, + "result": { "enum": [false] } + }, + { + "expression": { "GreaterThanOrEqualTo": [{ "Property": "age" }, 18] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "GreaterThanOrEqualTo": [1, 2, 3] }, + { "GreaterThanOrEqualTo": [1] }, + { "GreaterThanOrEqualTo": 1 }, + { "GreaterThanOrEqualTo": null }, + { "GreaterThanOrEqualTo": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/LessThan.json b/packages/expressions/test/examples/LessThan.json new file mode 100644 index 000000000..d38820605 --- /dev/null +++ b/packages/expressions/test/examples/LessThan.json @@ -0,0 +1,45 @@ +{ + "valid": [ + { + "expression": { "LessThan": [1, 1] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThan": ["a", "a"] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThan": [2, 1] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThan": [1, 2] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThan": ["b", "a"] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThan": ["a", "b"] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThan": [{ "Property": "age" }, 18] }, + "context": { "properties": { "age": 17 }}, + "result": { "enum": [true] } + }, + { + "expression": { "LessThan": [{ "Property": "age" }, 18] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [false] } + } + ], + "invalid": [ + { "LessThan": [1, 2, 3] }, + { "LessThan": [1] }, + { "LessThan": 1 }, + { "LessThan": null }, + { "LessThan": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/LessThanOrEqualTo.json b/packages/expressions/test/examples/LessThanOrEqualTo.json new file mode 100644 index 000000000..bb65681bb --- /dev/null +++ b/packages/expressions/test/examples/LessThanOrEqualTo.json @@ -0,0 +1,45 @@ +{ + "valid": [ + { + "expression": { "LessThanOrEqualTo": [1, 1] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThanOrEqualTo": [2, 1] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThanOrEqualTo": ["a", "b"] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThanOrEqualTo": ["b", "b"] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThanOrEqualTo": [1, 2] }, + "result": { "enum": [true] } + }, + { + "expression": { "LessThanOrEqualTo": ["b", "a"] }, + "result": { "enum": [false] } + }, + { + "expression": { "LessThanOrEqualTo": [{ "Property": "age" }, 21] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [true] } + }, + { + "expression": { "LessThanOrEqualTo": [{ "Property": "age" }, 18] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [false] } + } + ], + "invalid": [ + { "LessThanOrEqualTo": [1, 2, 3] }, + { "LessThanOrEqualTo": [1] }, + { "LessThanOrEqualTo": 1 }, + { "LessThanOrEqualTo": null }, + { "LessThanOrEqualTo": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/NotEqual.json b/packages/expressions/test/examples/NotEqual.json new file mode 100644 index 000000000..23bd9d17b --- /dev/null +++ b/packages/expressions/test/examples/NotEqual.json @@ -0,0 +1,40 @@ +{ + "valid": [ + { + "expression": { "NotEqual": [1, 1] }, + "result": { "enum": [false] } + }, + { + "expression": { "NotEqual": ["a", "a"] }, + "result": { "enum": [false] } + }, + { + "expression": { "NotEqual": [1, 2] }, + "result": { "enum": [true] } + }, + { + "expression": { "NotEqual": ["a", "b"] }, + "result": { "enum": [true] } + }, + { + "expression": { "NotEqual": [true, false] }, + "result": { "enum": [true] } + }, + { + "expression": { "NotEqual": [true, true] }, + "result": { "enum": [false] } + }, + { + "expression": { "NotEqual": [{ "Property": "age" }, 21] }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [false] } + } + ], + "invalid": [ + { "NotEqual": [1, 2, 3] }, + { "NotEqual": [1] }, + { "NotEqual": 1 }, + { "NotEqual": null }, + { "NotEqual": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Now.json b/packages/expressions/test/examples/Now.json new file mode 100644 index 000000000..58595258c --- /dev/null +++ b/packages/expressions/test/examples/Now.json @@ -0,0 +1,17 @@ +{ + "valid": [ + { + "expression": { "Now": [] }, + "result": { "format": "date-time" } + }, + { + "expression": { "String": {"Now": []} }, + "result": { "pattern": "UTC$" } + } + ], + "invalid": [ + { "Now": null }, + { "Now": [1] }, + { "Now": 1 } + ] +} diff --git a/packages/expressions/test/examples/Number.json b/packages/expressions/test/examples/Number.json new file mode 100644 index 000000000..78aa9d344 --- /dev/null +++ b/packages/expressions/test/examples/Number.json @@ -0,0 +1,50 @@ +{ + "valid": [ + { + "expression": { "Number": 0 }, + "result": { "enum": [0] } + }, + { + "expression": { "Number": 1 }, + "result": { "enum": [1] } + }, + { + "expression": { "Number": 1.0 }, + "result": { "enum": [1.0] } + }, + { + "expression": { "Number": "0" }, + "result": { "enum": [0] } + }, + { + "expression": { "Number": "1" }, + "result": { "enum": [1] } + }, + { + "expression": { "Number": "1.0" }, + "result": { "enum": [1.0] } + }, + { + "expression": { "Number": [0] }, + "result": { "enum": [0] } + }, + { + "expression": { "Number": [1] }, + "result": { "enum": [1] } + }, + { + "expression": { "Number": [1.0] }, + "result": { "enum": [1.0] } + }, + { + "expression": { "Number": { "Property": "age" } }, + "context": { "properties": { "age": 21 }}, + "result": { "enum": [21] } + } + ], + "invalid": [ + { "Number": null }, + { "Number": [true, false] }, + { "Number": true, "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Percentage.json b/packages/expressions/test/examples/Percentage.json new file mode 100644 index 000000000..9d38d1b7b --- /dev/null +++ b/packages/expressions/test/examples/Percentage.json @@ -0,0 +1,34 @@ +{ + "valid": [ + { + "expression": { "Percentage": [0] }, + "result": { "enum": [0] } + }, + { + "expression": { "Percentage": [99.999] }, + "result": { "enum": [99.999] } + }, + { + "expression": { "Percentage": [100] }, + "result": { "enum": [100] } + }, + { + "expression": { "Percentage": [{ "Property": ["nines"] }] }, + "context": { "properties": { "nines": 99.99 } }, + "result": { "enum": [99.99] } + }, + { + "expression": { "Percentage": [-1] }, + "result": { "enum": [0] } + }, + { + "expression": { "Percentage": [101] }, + "result": { "enum": [100] } + } + ], + "invalid": [ + { "Percentage": [1, 2] }, + { "Percentage": [null] }, + { "Percentage": null } + ] +} diff --git a/packages/expressions/test/examples/PercentageOfActors.json b/packages/expressions/test/examples/PercentageOfActors.json new file mode 100644 index 000000000..af85dbca7 --- /dev/null +++ b/packages/expressions/test/examples/PercentageOfActors.json @@ -0,0 +1,48 @@ +{ + "valid": [ + { + "expression": { "PercentageOfActors": ["User;1", 42] }, + "result": { "enum": [true] } + }, + { + "expression": { "PercentageOfActors": ["User;1", 0] }, + "result": { "enum": [false] } + }, + { + "expression": { "PercentageOfActors": ["string", 99.99] }, + "result": { "enum": [true] } + }, + { + "expression": { "PercentageOfActors": ["string", 100] }, + "result": { "enum": [true] } + }, + { + "expression": { "PercentageOfActors": [{ "Property": ["flipper_id"] }, { "Property": ["probability"] }] }, + "context": { "properties": {"flipper_id": "User;1", "probability": 100} }, + "result": { "enum": [true] } + }, + { + "expression": { "PercentageOfActors": ["User;1", 70] }, + "context": { "feature_name": "a" }, + "result": { "enum": [true] } + }, + { + "expression": { "PercentageOfActors": ["User;1", 70] }, + "context": { "feature_name": "b" }, + "result": { "enum": [false] } + }, + { + "expression": { "PercentageOfActors": ["string", -1] }, + "result": { "enum": [false] } + }, + { + "expression": { "PercentageOfActors": ["string", 101] }, + "result": { "enum": [true] } + } + ], + "invalid": [ + { "PercentageOfActors": ["string"] }, + { "PercentageOfActors": [100] }, + { "PercentageOfActors": [{ "Property": ["flipper_id"] }]} + ] +} diff --git a/packages/expressions/test/examples/Property.json b/packages/expressions/test/examples/Property.json new file mode 100644 index 000000000..03879a929 --- /dev/null +++ b/packages/expressions/test/examples/Property.json @@ -0,0 +1,27 @@ +{ + "valid": [ + { + "expression": { "Property": "name" }, + "context": { "properties": { "name": "value" } }, + "result": { "enum": ["value"] } + }, + { + "expression": { "Property": ["flipper_id"] }, + "context": { "properties": { "flipper_id": "User;1" } }, + "result": { "enum": ["User;1"] } + }, + { + "expression": { "Property": ["flipper_id"] }, + "context": { "properties": { } }, + "result": { "enum": [null] } + }, + { + "expression": { "Property": ["flipper_id"] }, + "result": { "enum": [null] } + } + ], + "invalid": [ + { "Property": [] }, + { "Property": null } + ] +} diff --git a/packages/expressions/test/examples/Random.json b/packages/expressions/test/examples/Random.json new file mode 100644 index 000000000..723d9edd0 --- /dev/null +++ b/packages/expressions/test/examples/Random.json @@ -0,0 +1,25 @@ +{ + "valid": [ + { + "expression": { "Random": [] }, + "result": { "type": "float", "minimum": 0, "maximum": 1 } + }, + { + "expression": { "Random": 2 }, + "result": { "type": "integer", "minimum": 0, "maximum": 1 } + }, + { + "expression": { "Random": [100] }, + "result": { "type": "integer", "minimum": 0, "maximum": 99 } + }, + { + "expression": { "Random": [{ "Property": "max_rand" }] }, + "context": { "properties": { "max_rand": 50 }}, + "result": { "type": "integer", "minimum": 0, "maximum": 49 } + } + ], + "invalid": [ + { "Random": null }, + { "Random": [1, 2] } + ] +} diff --git a/packages/expressions/test/examples/String.json b/packages/expressions/test/examples/String.json new file mode 100644 index 000000000..4a3212459 --- /dev/null +++ b/packages/expressions/test/examples/String.json @@ -0,0 +1,57 @@ +{ + "valid": [ + { + "expression": { "String": true }, + "result": { "enum": ["true"] } + }, + { + "expression": { "String": false }, + "result": { "enum": ["false"] } + }, + { + "expression": { "String": "already a string" }, + "result": { "enum": ["already a string"] } + }, + { + "expression": { "String": 1 }, + "result": { "enum": ["1"] } + }, + { + "expression": { "String": 1.1 }, + "result": { "enum": ["1.1"] } + }, + { + "expression": { "String": [true] }, + "result": { "enum": ["true"] } + }, + { + "expression": { "String": [false] }, + "result": { "enum": ["false"] } + }, + { + "expression": { "String": ["already a string"] }, + "result": { "enum": ["already a string"] } + }, + { + "expression": { "String": [1] }, + "result": { "enum": ["1"] } + }, + { + "expression": { "String": [1.1] }, + "result": { "enum": ["1.1"] } + }, + { + "expression": { "String": { "All": [] } }, + "result": { "enum": ["true"] } + }, + { + "expression": { "String": [{ "Any": [] }] }, + "result": { "enum": ["false"] } + } + ], + "invalid": [ + { "String": null }, + { "String": [true, false] }, + { "String": true, "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Time.json b/packages/expressions/test/examples/Time.json new file mode 100644 index 000000000..d82172dfd --- /dev/null +++ b/packages/expressions/test/examples/Time.json @@ -0,0 +1,24 @@ +{ + "valid": [ + { + "expression": { "Number": { "Time": ["2021-01-01T00:00:00Z"] } }, + "result": { "enum": [1609459200.0] } + }, + { + "expression": { "Number": { "Time": "2021-01-01T00:00:00-05:00" } }, + "result": { "enum": [1609477200.0] } + }, + { + "expression": { "Number": { "Time": { "Property": "created_at" } } }, + "context": { "properties": { "created_at": "2021-01-01T00:00:00Z" } }, + "result": { "enum": [1609459200.0] } + } + ], + "invalid": [ + { "Time": "2021-01-01" }, + { "Time": "January 1, 2021 10:00" }, + { "Time": null }, + { "Time": false }, + { "Time": [{ "Property": "created_at" }, { "Property": "updated_at" }] } + ] +} diff --git a/packages/expressions/test/examples/expressions.json b/packages/expressions/test/examples/expressions.json new file mode 100644 index 000000000..3ad836e3b --- /dev/null +++ b/packages/expressions/test/examples/expressions.json @@ -0,0 +1,29 @@ +{ + "valid": [ + { + "expression": "string", + "result": { "enum": ["string"] } + }, + { + "expression": true, + "result": { "enum": [true] } + }, + { + "expression": false, + "result": { "enum": [false] } + }, + { + "expression": 1, + "result": { "enum": [1] } + }, + { + "expression": 1.1, + "result": { "enum": [1.1] } + } + ], + "invalid": [ + null, + {}, + [] + ] +} diff --git a/packages/expressions/test/examples/index.js b/packages/expressions/test/examples/index.js new file mode 100644 index 000000000..f7f065211 --- /dev/null +++ b/packages/expressions/test/examples/index.js @@ -0,0 +1,10 @@ +import { globSync } from 'glob' +import { readFileSync } from 'fs' +import { basename } from 'path' + +const pattern = new URL('./*.json', import.meta.url).pathname + +export default Object.fromEntries(globSync(pattern).map(file => { + const contents = JSON.parse(readFileSync(file, 'utf8')) + return [basename(file, '.json'), contents] +})) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js new file mode 100644 index 000000000..b2ca05a68 --- /dev/null +++ b/packages/expressions/test/schemas.test.js @@ -0,0 +1,36 @@ +import { describe, test, expect } from '@jest/globals' +import { validator } from '../lib' +import examples from './examples' + +const expressionsValidator = validator() + +expect.extend({ + toBeValid (received, validate = expressionsValidator) { + return { + pass: validate(received), + message: () => JSON.stringify(validate.errors, null, 2) + } + } +}) + +describe('expressions.schema.json', () => { + for (const [name, example] of Object.entries(examples)) { + describe(name, () => { + describe('valid', () => { + example.valid.forEach(({ expression }) => { + test(JSON.stringify(expression), () => { + expect(expression).toBeValid() + }) + }) + }) + + describe('invalid', () => { + example.invalid.forEach(expression => { + test(JSON.stringify(expression), () => { + expect(expression).not.toBeValid() + }) + }) + }) + }) + } +}) diff --git a/packages/expressions/vite.config.js b/packages/expressions/vite.config.js new file mode 100644 index 000000000..13f9e9ae7 --- /dev/null +++ b/packages/expressions/vite.config.js @@ -0,0 +1,19 @@ +// vite.config.js +import { resolve } from 'path' +import { defineConfig } from 'vite' + +export default defineConfig({ + build: { + lib: { + entry: resolve(__dirname, 'lib/index.js'), + name: '@flippercloud.io/expressions' + }, + rollupOptions: { + external: [ + 'ajv', + 'ajv-formats' + ], + output: {} + } + } +}) diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock new file mode 100644 index 000000000..24bd81620 --- /dev/null +++ b/packages/expressions/yarn.lock @@ -0,0 +1,3634 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" + integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.2" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.3" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.21.3", "@babel/generator@^7.7.2": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" + integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== + dependencies: + "@babel/types" "^7.21.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== + +"@babel/plugin-syntax-async-generators@^7.8.4": + 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-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + 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-jsx@^7.7.2": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + 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.3": + 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.8.3": + 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.3": + 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.3": + 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.3": + 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.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + +"@babel/template@^7.20.7", "@babel/template@^7.3.3": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3", "@babel/traverse@^7.7.2": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" + integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.3" + "@babel/types" "^7.21.3" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" + integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@esbuild/android-arm64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.14.tgz#4624cea3c8941c91f9e9c1228f550d23f1cef037" + integrity sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg== + +"@esbuild/android-arm@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.14.tgz#74fae60fcab34c3f0e15cb56473a6091ba2b53a6" + integrity sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g== + +"@esbuild/android-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.14.tgz#f002fbc08d5e939d8314bd23bcfb1e95d029491f" + integrity sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng== + +"@esbuild/darwin-arm64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.14.tgz#b8dcd79a1dd19564950b4ca51d62999011e2e168" + integrity sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw== + +"@esbuild/darwin-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.14.tgz#4b49f195d9473625efc3c773fc757018f2c0d979" + integrity sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g== + +"@esbuild/freebsd-arm64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.14.tgz#480923fd38f644c6342c55e916cc7c231a85eeb7" + integrity sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A== + +"@esbuild/freebsd-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.14.tgz#a6b6b01954ad8562461cb8a5e40e8a860af69cbe" + integrity sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw== + +"@esbuild/linux-arm64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.14.tgz#1fe2f39f78183b59f75a4ad9c48d079916d92418" + integrity sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g== + +"@esbuild/linux-arm@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.14.tgz#18d594a49b64e4a3a05022c005cb384a58056a2a" + integrity sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg== + +"@esbuild/linux-ia32@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.14.tgz#f7f0182a9cfc0159e0922ed66c805c9c6ef1b654" + integrity sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ== + +"@esbuild/linux-loong64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.14.tgz#5f5305fdffe2d71dd9a97aa77d0c99c99409066f" + integrity sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ== + +"@esbuild/linux-mips64el@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.14.tgz#a602e85c51b2f71d2aedfe7f4143b2f92f97f3f5" + integrity sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg== + +"@esbuild/linux-ppc64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.14.tgz#32d918d782105cbd9345dbfba14ee018b9c7afdf" + integrity sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ== + +"@esbuild/linux-riscv64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.14.tgz#38612e7b6c037dff7022c33f49ca17f85c5dec58" + integrity sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw== + +"@esbuild/linux-s390x@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.14.tgz#4397dff354f899e72fd035d72af59a700c465ccb" + integrity sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww== + +"@esbuild/linux-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.14.tgz#6c5cb99891b6c3e0c08369da3ef465e8038ad9c2" + integrity sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw== + +"@esbuild/netbsd-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.14.tgz#5fa5255a64e9bf3947c1b3bef5e458b50b211994" + integrity sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ== + +"@esbuild/openbsd-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.14.tgz#74d14c79dcb6faf446878cc64284aa4e02f5ca6f" + integrity sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g== + +"@esbuild/sunos-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.14.tgz#5c7d1c7203781d86c2a9b2ff77bd2f8036d24cfa" + integrity sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA== + +"@esbuild/win32-arm64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.14.tgz#dc36ed84f1390e73b6019ccf0566c80045e5ca3d" + integrity sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ== + +"@esbuild/win32-ia32@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.14.tgz#0802a107afa9193c13e35de15a94fe347c588767" + integrity sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w== + +"@esbuild/win32-x64@0.17.14": + version "0.17.14" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.14.tgz#e81fb49de05fed91bf74251c9ca0343f4fc77d31" + integrity sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.4.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.1.tgz#087cb8d9d757bb22e9c9946c9c0c2bf8806830f1" + integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw== + +"@eslint/eslintrc@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" + integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.36.0": + version "8.36.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" + integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + 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.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@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.14", "@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sinclair/typebox@^0.25.16": + version "0.25.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + +"@types/babel__core@^7.1.14": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" + integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.18.3" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" + integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + dependencies: + "@babel/types" "^7.3.0" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/node@*": + version "18.15.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.10.tgz#4ee2171c3306a185d1208dad5f44dae3dee4cfe3" + integrity sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ== + +"@types/prettier@^2.1.5": + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0, ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +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" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +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" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +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" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +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" + +browserslist@^4.21.3: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +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== + +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + 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" + +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@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001449: + version "1.0.30001472" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz#3f484885f2a2986c019dc416e65d9d62798cdd64" + integrity sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg== + +chalk@^2.0.0: + 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" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +color-convert@^1.9.0: + 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-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +electron-to-chromium@^1.4.284: + version "1.4.341" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.341.tgz#ab31e9e57ef7758a14c7a7977a1978d599514470" + integrity sha512-R4A8VfUBQY9WmAhuqY5tjHRf5fH2AAf6vqitBOE0y6u2PgHgqHSrhZmu78dIX3fVZtjqlwJNX1i2zwC3VpHtQQ== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +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.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +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" + +esbuild@^0.17.5: + version "0.17.14" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.14.tgz#d61a22de751a3133f3c6c7f9c1c3e231e91a3245" + integrity sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw== + optionalDependencies: + "@esbuild/android-arm" "0.17.14" + "@esbuild/android-arm64" "0.17.14" + "@esbuild/android-x64" "0.17.14" + "@esbuild/darwin-arm64" "0.17.14" + "@esbuild/darwin-x64" "0.17.14" + "@esbuild/freebsd-arm64" "0.17.14" + "@esbuild/freebsd-x64" "0.17.14" + "@esbuild/linux-arm" "0.17.14" + "@esbuild/linux-arm64" "0.17.14" + "@esbuild/linux-ia32" "0.17.14" + "@esbuild/linux-loong64" "0.17.14" + "@esbuild/linux-mips64el" "0.17.14" + "@esbuild/linux-ppc64" "0.17.14" + "@esbuild/linux-riscv64" "0.17.14" + "@esbuild/linux-s390x" "0.17.14" + "@esbuild/linux-x64" "0.17.14" + "@esbuild/netbsd-x64" "0.17.14" + "@esbuild/openbsd-x64" "0.17.14" + "@esbuild/sunos-x64" "0.17.14" + "@esbuild/win32-arm64" "0.17.14" + "@esbuild/win32-ia32" "0.17.14" + "@esbuild/win32-x64" "0.17.14" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-standard-jsx@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" + integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== + +eslint-config-standard@17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf" + integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.26.0: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-n@^15.1.0: + version "15.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz#f7e77f24abb92a550115cf11e29695da122c398c" + integrity sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-promise@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-plugin-react@^7.28.0: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== + +eslint@^8.13.0: + version "8.36.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf" + integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.1" + "@eslint/js" "8.36.0" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.5.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" + integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +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== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +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== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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, fast-json-stable-stringify@^2.1.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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +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" + +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, find-up@^4.1.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" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +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== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + 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, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" + integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.2.tgz#8528522e003819e63d11c979b30896e0eaf52eda" + integrity sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA== + dependencies: + fs.realpath "^1.0.0" + minimatch "^7.4.1" + minipass "^4.2.4" + path-scurry "^1.6.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== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.15, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +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-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, 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-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +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" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.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 sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +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-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.5.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" + +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + +jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== + dependencies: + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" + integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== + dependencies: + "@jest/core" "^29.5.0" + "@jest/types" "^29.5.0" + import-local "^3.0.2" + jest-cli "^29.5.0" + +js-sdsl@^4.1.4: + version "4.4.0" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" + integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + +"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.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-better-errors@^1.0.1: + 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-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +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-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +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== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-json-file@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + dependencies: + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" + +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" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.4.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" + +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" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +make-dir@^3.0.0: + 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" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +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== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^7.4.1: + version "7.4.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.3.tgz#012cbf110a65134bb354ae9773b55256cdb045a2" + integrity sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^4.0.2, minipass@^4.2.4: + version "4.2.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.4: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +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== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.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 sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +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.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.0.0, p-limit@^2.2.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-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.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-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +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== + +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-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.6.1: + version "1.6.3" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.3.tgz#4eba7183d64ef88b63c7d330bddc3ba279dc6c40" + integrity sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g== + dependencies: + lru-cache "^7.14.1" + minipass "^4.0.2" + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +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== + +pirates@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" + integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + +pkg-conf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" + integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== + dependencies: + find-up "^3.0.0" + load-json-file "^5.2.0" + +pkg-dir@^4.2.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" + +postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" + integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +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-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.20.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^3.18.0: + version "3.20.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" + integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +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@^7.0.0, semver@^7.3.5, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +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.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +standard-engine@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.0.0.tgz#e37ca2e1a589ef85431043a3e87cb9ce95a4ca4e" + integrity sha512-4xwUhJNo1g/L2cleysUqUv7/btn7GEbYJvmgKrQ2vd/8pkTmN8cpqAZg+BT8Z1hNeEH787iWUdOpL8fmApLtxA== + dependencies: + get-stdin "^8.0.0" + minimist "^1.2.6" + pkg-conf "^3.1.0" + xdg-basedir "^4.0.0" + +standard@^17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/standard/-/standard-17.0.0.tgz#85718ecd04dc4133908434660788708cca855aa1" + integrity sha512-GlCM9nzbLUkr+TYR5I2WQoIah4wHA2lMauqbyPLV/oI5gJxqhHzhjl9EG2N0lr/nRqI3KCbCvm/W3smxvLaChA== + dependencies: + eslint "^8.13.0" + eslint-config-standard "17.0.0" + eslint-config-standard-jsx "^11.0.0" + eslint-plugin-import "^2.26.0" + eslint-plugin-n "^15.1.0" + eslint-plugin-promise "^6.0.0" + eslint-plugin-react "^7.28.0" + standard-engine "^15.0.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +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@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +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" + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vite@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" + integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== + dependencies: + esbuild "^0.17.5" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.18.0" + optionalDependencies: + fsevents "~2.3.2" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +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== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expressions_schema_spec.rb index b864348c4..a0c6d85fc 100644 --- a/spec/flipper/expressions_schema_spec.rb +++ b/spec/flipper/expressions_schema_spec.rb @@ -1,7 +1,7 @@ require 'json_schemer' RSpec.describe Flipper::Expressions do - EXPRESSION_JS_PATH = File.expand_path('../../node_modules/@flippercloud.io/expressions', __dir__) + EXPRESSION_JS_PATH = File.expand_path('../../packages/expressions', __dir__) SCHEMAS = Hash[Dir.glob(File.join(EXPRESSION_JS_PATH, 'schemas/*.json')).map do |path| [File.basename(path), JSON.parse(File.read(path))] diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 832680c40..000000000 --- a/yarn.lock +++ /dev/null @@ -1,54 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@flippercloud.io/expressions@https://github.com/fewerandfaster/expressions.js": - version "1.0.0" - resolved "https://github.com/fewerandfaster/expressions.js#9dd0dbf42b2794c1ec00d31fd8ae0f4c22c953aa" - dependencies: - ajv "^8.12.0" - ajv-formats "^2.1.1" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv@^8.0.0, ajv@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -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== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" From a72ae3596bb259126f06a5e557bde929b4234d42 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 30 Mar 2023 19:16:11 -0400 Subject: [PATCH 03/44] Make Ruby 2.6 happy --- spec/flipper/expressions_schema_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expressions_schema_spec.rb index a0c6d85fc..cb3d5dcd6 100644 --- a/spec/flipper/expressions_schema_spec.rb +++ b/spec/flipper/expressions_schema_spec.rb @@ -46,7 +46,7 @@ it "should not evaluate" do expect { Flipper::Expression.build(example).evaluate }.to raise_error { |error| - expect([ArgumentError, TypeError]).to include(error.class) + expect([ArgumentError, TypeError, NoMethodError]).to include(error.class) } end end From 87c3de4d95d7b5ce0ea8b52263758733a2bbc5f2 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 11:14:08 -0400 Subject: [PATCH 04/44] Use vitest to run tests --- packages/expressions/lib/index.js | 2 +- packages/expressions/lib/schemas.js | 19 - packages/expressions/lib/validator.js | 2 +- packages/expressions/package.json | 7 +- packages/expressions/schemas/index.js | 7 + packages/expressions/test/examples/index.js | 9 +- packages/expressions/test/schemas.test.js | 2 +- packages/expressions/yarn.lock | 2098 +++---------------- 8 files changed, 306 insertions(+), 1840 deletions(-) delete mode 100644 packages/expressions/lib/schemas.js create mode 100644 packages/expressions/schemas/index.js diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 04a10baa1..891c6f913 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,2 +1,2 @@ -export * as schemas from './schemas' +export { default as schemas } from '../schemas' export { default as validator } from './validator' diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js deleted file mode 100644 index 2915183c4..000000000 --- a/packages/expressions/lib/schemas.js +++ /dev/null @@ -1,19 +0,0 @@ -export { default } from '../schemas/schema.json' -export { default as All } from '../schemas/All.schema.json' -export { default as Any } from '../schemas/Any.schema.json' -export { default as Boolean } from '../schemas/Boolean.schema.json' -export { default as Duration } from '../schemas/Duration.schema.json' -export { default as Equal } from '../schemas/Equal.schema.json' -export { default as GreaterThan } from '../schemas/GreaterThan.schema.json' -export { default as GreaterThanOrEqualTo } from '../schemas/GreaterThanOrEqualTo.schema.json' -export { default as LessThan } from '../schemas/LessThan.schema.json' -export { default as LessThanOrEqualTo } from '../schemas/LessThanOrEqualTo.schema.json' -export { default as NotEqual } from '../schemas/NotEqual.schema.json' -export { default as Now } from '../schemas/Now.schema.json' -export { default as Number } from '../schemas/Number.schema.json' -export { default as Percentage } from '../schemas/Percentage.schema.json' -export { default as PercentageOfActors } from '../schemas/PercentageOfActors.schema.json' -export { default as Property } from '../schemas/Property.schema.json' -export { default as Random } from '../schemas/Random.schema.json' -export { default as String } from '../schemas/String.schema.json' -export { default as Time } from '../schemas/Time.schema.json' diff --git a/packages/expressions/lib/validator.js b/packages/expressions/lib/validator.js index 77807bbbd..e415b58b2 100644 --- a/packages/expressions/lib/validator.js +++ b/packages/expressions/lib/validator.js @@ -1,6 +1,6 @@ import Ajv from 'ajv' import addFormats from 'ajv-formats' -import * as schemas from './schemas' +import schemas from '../schemas' export default function (options = { allErrors: true, verbose: true }) { const ajv = new Ajv({ schemas: Object.values(schemas) }) diff --git a/packages/expressions/package.json b/packages/expressions/package.json index 8f6df76e1..f3929ad39 100644 --- a/packages/expressions/package.json +++ b/packages/expressions/package.json @@ -22,14 +22,13 @@ "ajv-formats": "^2.1.1" }, "devDependencies": { - "glob": "^9.3.2", - "jest": "^29.5.0", "standard": "^17.0.0", - "vite": "^4.2.1" + "vite": "^4.2.1", + "vitest": "^0.29.8" }, "scripts": { "build": "vite build", "lint": "standard", - "test": "yarn node --experimental-vm-modules $(yarn bin jest)" + "test": "vitest" } } diff --git a/packages/expressions/schemas/index.js b/packages/expressions/schemas/index.js new file mode 100644 index 000000000..61bdcc4bb --- /dev/null +++ b/packages/expressions/schemas/index.js @@ -0,0 +1,7 @@ +const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) +const schemas = Object.fromEntries(Object.entries(modules).map(([path, module]) => { + const name = path.split('/').pop().split('.').shift(); + return [name == 'schema' ? 'default' : name, module]; +})); + +export default schemas; diff --git a/packages/expressions/test/examples/index.js b/packages/expressions/test/examples/index.js index f7f065211..adcde4d79 100644 --- a/packages/expressions/test/examples/index.js +++ b/packages/expressions/test/examples/index.js @@ -1,10 +1,7 @@ -import { globSync } from 'glob' -import { readFileSync } from 'fs' import { basename } from 'path' -const pattern = new URL('./*.json', import.meta.url).pathname +const modules = import.meta.glob("./*.json", { eager: true, import: 'default' }) -export default Object.fromEntries(globSync(pattern).map(file => { - const contents = JSON.parse(readFileSync(file, 'utf8')) - return [basename(file, '.json'), contents] +export default Object.fromEntries(Object.entries(modules).map(([path, module]) => { + return [basename(path, '.json'), module] })) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index b2ca05a68..4421aea73 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,4 +1,4 @@ -import { describe, test, expect } from '@jest/globals' +import { describe, test, expect } from 'vitest' import { validator } from '../lib' import examples from './examples' diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock index 24bd81620..2eeb7d74f 100644 --- a/packages/expressions/yarn.lock +++ b/packages/expressions/yarn.lock @@ -2,303 +2,6 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.5": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.0.tgz#c241dc454e5b5917e40d37e525e2f4530c399298" - integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.21.3", "@babel/generator@^7.7.2": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" - integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== - dependencies: - "@babel/types" "^7.21.3" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" - integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== - -"@babel/plugin-syntax-async-generators@^7.8.4": - 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-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - 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-jsx@^7.7.2": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - 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.3": - 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.8.3": - 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.3": - 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.3": - 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.3": - 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.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/template@^7.20.7", "@babel/template@^7.3.3": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3", "@babel/traverse@^7.7.2": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" - integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.3" - "@babel/types" "^7.21.3" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" - integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - "@esbuild/android-arm64@0.17.14": version "0.17.14" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.14.tgz#4624cea3c8941c91f9e9c1228f550d23f1cef037" @@ -460,254 +163,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" - integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - -"@jest/core@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" - integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/reporters" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.5.0" - jest-config "^29.5.0" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-resolve-dependencies "^29.5.0" - jest-runner "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - jest-watcher "^29.5.0" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" - integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== - dependencies: - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - -"@jest/expect-utils@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" - integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== - dependencies: - jest-get-type "^29.4.3" - -"@jest/expect@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" - integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== - dependencies: - expect "^29.5.0" - jest-snapshot "^29.5.0" - -"@jest/fake-timers@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" - integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== - dependencies: - "@jest/types" "^29.5.0" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -"@jest/globals@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" - integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/types" "^29.5.0" - jest-mock "^29.5.0" - -"@jest/reporters@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" - integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - jest-worker "^29.5.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^29.4.3": - version "29.4.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" - integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" - integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" - integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== - dependencies: - "@jest/test-result" "^29.5.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - slash "^3.0.0" - -"@jest/transform@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" - integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.5.0" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - 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.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@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.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -729,83 +184,17 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - -"@types/babel__core@^7.1.14": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.0.tgz#61bc5a4cae505ce98e1e36c5445e4bee060d8891" - integrity sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== - dependencies: - "@babel/types" "^7.3.0" - -"@types/graceful-fs@^4.1.3": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" - integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== +"@types/chai-subset@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" + integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== dependencies: - "@types/node" "*" + "@types/chai" "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" +"@types/chai@*", "@types/chai@^4.3.4": + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/json5@^0.0.29": version "0.0.29" @@ -817,34 +206,52 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.10.tgz#4ee2171c3306a185d1208dad5f44dae3dee4cfe3" integrity sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ== -"@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== +"@vitest/expect@0.29.8": + version "0.29.8" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.29.8.tgz#6ecdd031b4ea8414717d10b65ccd800908384612" + integrity sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ== + dependencies: + "@vitest/spy" "0.29.8" + "@vitest/utils" "0.29.8" + chai "^4.3.7" -"@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@vitest/runner@0.29.8": + version "0.29.8" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.29.8.tgz#ede8a7be8a074ea1180bc1d1595bd879ed15971c" + integrity sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ== + dependencies: + "@vitest/utils" "0.29.8" + p-limit "^4.0.0" + pathe "^1.1.0" -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== +"@vitest/spy@0.29.8": + version "0.29.8" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.29.8.tgz#2e0c3b30e04d317b2197e3356234448aa432e131" + integrity sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw== + dependencies: + tinyspy "^1.0.2" -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== +"@vitest/utils@0.29.8": + version "0.29.8" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.29.8.tgz#423da85fd0c6633f3ab496cf7d2fc0119b850df8" + integrity sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg== dependencies: - "@types/yargs-parser" "*" + cli-truncate "^3.1.0" + diff "^5.1.0" + loupe "^2.3.6" + pretty-format "^27.5.1" acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.0: +acorn-walk@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -876,26 +283,17 @@ ajv@^8.0.0, ajv@^8.12.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -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" +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -907,20 +305,10 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^3.0.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -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" +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== argparse@^2.0.1: version "2.0.1" @@ -977,71 +365,16 @@ array.prototype.tosorted@^1.1.1: es-shim-unscopables "^1.0.0" get-intrinsic "^1.1.3" +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -babel-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" - integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== - dependencies: - "@jest/transform" "^29.5.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.5.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" - integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" - integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== - dependencies: - babel-plugin-jest-hoist "^29.5.0" - babel-preset-current-node-syntax "^1.0.0" - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1055,42 +388,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -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" - -browserslist@^4.21.3: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -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== - builtins@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -1098,6 +395,11 @@ builtins@^5.0.1: dependencies: semver "^7.0.0" +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -1111,29 +413,18 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -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== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001449: - version "1.0.30001472" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001472.tgz#3f484885f2a2986c019dc416e65d9d62798cdd64" - integrity sha512-xWC/0+hHHQgj3/vrKYY0AAzeIUgr7L9wlELIcAvZdDUHlhL/kNxMdnQLOSOQfP8R51ZzPhmHdyMkI0MMpmxCfg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" chalk@^4.0.0: version "4.1.2" @@ -1143,46 +434,18 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -char-regex@^1.0.2: +check-error@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - 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== +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== dependencies: - color-name "1.1.3" + slice-ansi "^5.0.0" + string-width "^5.0.0" color-convert@^2.0.1: version "2.0.1" @@ -1191,11 +454,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1206,17 +464,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1232,28 +480,25 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: +debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - define-properties@^1.1.3, define-properties@^1.1.4: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -1262,15 +507,10 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" - integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== +diff@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== doctrine@^2.1.0: version "2.1.0" @@ -1286,20 +526,15 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.284: - version "1.4.341" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.341.tgz#ab31e9e57ef7758a14c7a7977a1978d599514470" - integrity sha512-R4A8VfUBQY9WmAhuqY5tjHRf5fH2AAf6vqitBOE0y6u2PgHgqHSrhZmu78dIX3fVZtjqlwJNX1i2zwC3VpHtQQ== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== error-ex@^1.3.1: version "1.3.2" @@ -1401,21 +636,6 @@ esbuild@^0.17.5: "@esbuild/win32-ia32" "0.17.14" "@esbuild/win32-x64" "0.17.14" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -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 sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1608,11 +828,6 @@ espree@^9.5.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.3.0" -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== - esquery@^1.4.2: version "1.5.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" @@ -1637,43 +852,12 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" - integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== - dependencies: - "@jest/expect-utils" "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 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, fast-json-stable-stringify@^2.1.0: +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== @@ -1690,13 +874,6 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1704,13 +881,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -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" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -1718,14 +888,6 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -find-up@^4.0.0, find-up@^4.1.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" - find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1759,7 +921,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -1784,15 +946,10 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - 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-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" @@ -1803,21 +960,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@ has "^1.0.3" has-symbols "^1.0.3" -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - get-stdin@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -1833,7 +980,7 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob@^7.1.3, glob@^7.1.4: +glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -1845,21 +992,6 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.3.2: - version "9.3.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.2.tgz#8528522e003819e63d11c979b30896e0eaf52eda" - integrity sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA== - dependencies: - fs.realpath "^1.0.0" - minimatch "^7.4.1" - minipass "^4.2.4" - path-scurry "^1.6.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== - globals@^13.19.0: version "13.20.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" @@ -1881,7 +1013,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.15, graceful-fs@^4.2.9: +graceful-fs@^4.1.15: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -1896,11 +1028,6 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1937,16 +1064,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - ignore@^5.1.1, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" @@ -1960,14 +1077,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2048,15 +1157,10 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-glob@^4.0.0, is-glob@^4.0.3: version "4.0.3" @@ -2077,11 +1181,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -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-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -2102,11 +1201,6 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -2144,427 +1238,16 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" - integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== - dependencies: - execa "^5.0.0" - p-limit "^3.1.0" - -jest-circus@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" - integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/expect" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.5.0" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-runtime "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - p-limit "^3.1.0" - pretty-format "^29.5.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" - integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== - dependencies: - "@jest/core" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - prompts "^2.0.1" - yargs "^17.3.1" - -jest-config@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" - integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.5.0" - "@jest/types" "^29.5.0" - babel-jest "^29.5.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.5.0" - jest-environment-node "^29.5.0" - jest-get-type "^29.4.3" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-runner "^29.5.0" - jest-util "^29.5.0" - jest-validate "^29.5.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.5.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" - integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.4.3" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-docblock@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" - integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" - integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== - dependencies: - "@jest/types" "^29.5.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - jest-util "^29.5.0" - pretty-format "^29.5.0" - -jest-environment-node@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" - integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-mock "^29.5.0" - jest-util "^29.5.0" - -jest-get-type@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" - integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== - -jest-haste-map@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" - integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== - dependencies: - "@jest/types" "^29.5.0" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.4.3" - jest-util "^29.5.0" - jest-worker "^29.5.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" - integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== - dependencies: - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-matcher-utils@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" - integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== - dependencies: - chalk "^4.0.0" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - pretty-format "^29.5.0" - -jest-message-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" - integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.5.0" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.5.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" - integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - jest-util "^29.5.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.4.3: - version "29.4.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" - integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== - -jest-resolve-dependencies@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" - integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== - dependencies: - jest-regex-util "^29.4.3" - jest-snapshot "^29.5.0" - -jest-resolve@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" - integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.5.0" - jest-validate "^29.5.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" - integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== - dependencies: - "@jest/console" "^29.5.0" - "@jest/environment" "^29.5.0" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.4.3" - jest-environment-node "^29.5.0" - jest-haste-map "^29.5.0" - jest-leak-detector "^29.5.0" - jest-message-util "^29.5.0" - jest-resolve "^29.5.0" - jest-runtime "^29.5.0" - jest-util "^29.5.0" - jest-watcher "^29.5.0" - jest-worker "^29.5.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" - integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== - dependencies: - "@jest/environment" "^29.5.0" - "@jest/fake-timers" "^29.5.0" - "@jest/globals" "^29.5.0" - "@jest/source-map" "^29.4.3" - "@jest/test-result" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.5.0" - jest-message-util "^29.5.0" - jest-mock "^29.5.0" - jest-regex-util "^29.4.3" - jest-resolve "^29.5.0" - jest-snapshot "^29.5.0" - jest-util "^29.5.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" - integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.5.0" - "@jest/transform" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.5.0" - graceful-fs "^4.2.9" - jest-diff "^29.5.0" - jest-get-type "^29.4.3" - jest-matcher-utils "^29.5.0" - jest-message-util "^29.5.0" - jest-util "^29.5.0" - natural-compare "^1.4.0" - pretty-format "^29.5.0" - semver "^7.3.5" - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" - integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== - dependencies: - "@jest/types" "^29.5.0" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.4.3" - leven "^3.1.0" - pretty-format "^29.5.0" - -jest-watcher@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" - integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== - dependencies: - "@jest/test-result" "^29.5.0" - "@jest/types" "^29.5.0" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.5.0" - string-length "^4.0.1" - -jest-worker@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e" - integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ== - dependencies: - "@jest/core" "^29.5.0" - "@jest/types" "^29.5.0" - import-local "^3.0.2" - jest-cli "^29.5.0" - js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2572,21 +1255,11 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - json-parse-better-errors@^1.0.1: 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-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - 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" @@ -2609,10 +1282,10 @@ json5@^1.0.2: dependencies: minimist "^1.2.0" -json5@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.3" @@ -2622,16 +1295,6 @@ json5@^2.2.2: array-includes "^3.1.5" object.assign "^4.1.3" -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -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== - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2640,11 +1303,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - load-json-file@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" @@ -2656,6 +1314,11 @@ load-json-file@^5.2.0: strip-bom "^3.0.0" type-fest "^0.3.0" +local-pkg@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" + integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -2664,13 +1327,6 @@ locate-path@^3.0.0: 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" - locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -2690,12 +1346,12 @@ loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -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== +loupe@^2.3.1, loupe@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: - yallist "^3.0.2" + get-func-name "^2.0.0" lru-cache@^6.0.0: version "6.0.0" @@ -2704,66 +1360,27 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -make-dir@^3.0.0: - 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" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -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== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^7.4.1: - version "7.4.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.3.tgz#012cbf110a65134bb354ae9773b55256cdb045a2" - integrity sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A== - dependencies: - brace-expansion "^2.0.1" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^4.0.2, minipass@^4.2.4: - version "4.2.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" - integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== +mlly@^1.1.0, mlly@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.2.0.tgz#f0f6c2fc8d2d12ea6907cd869066689b5031b613" + integrity sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww== + dependencies: + acorn "^8.8.2" + pathe "^1.1.0" + pkg-types "^1.0.2" + ufo "^1.1.1" ms@2.1.2: version "2.1.2" @@ -2785,28 +1402,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -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== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2874,13 +1469,6 @@ once@^1.3.0: dependencies: wrappy "1" -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -2893,20 +1481,27 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.0.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-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.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" @@ -2914,13 +1509,6 @@ p-locate@^3.0.0: 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-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -2948,16 +1536,6 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -2973,7 +1551,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.0.0, path-key@^3.1.0: +path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -2983,34 +1561,26 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.6.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.3.tgz#4eba7183d64ef88b63c7d330bddc3ba279dc6c40" - integrity sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g== - dependencies: - lru-cache "^7.14.1" - minipass "^4.0.2" +pathe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.0.tgz#e2e13f6c62b31a3289af4ba19886c230f295ec03" + integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - 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== -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - pkg-conf@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" @@ -3019,12 +1589,14 @@ pkg-conf@^3.1.0: find-up "^3.0.0" load-json-file "^5.2.0" -pkg-dir@^4.2.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== +pkg-types@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.2.tgz#c233efc5210a781e160e0cafd60c0d0510a4b12e" + integrity sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ== dependencies: - find-up "^4.0.0" + jsonc-parser "^3.2.0" + mlly "^1.1.1" + pathe "^1.1.0" postcss@^8.4.21: version "8.4.21" @@ -3040,22 +1612,14 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -pretty-format@^29.5.0: - version "29.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" - integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - "@jest/schemas" "^29.4.3" + ansi-regex "^5.0.1" ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" + react-is "^17.0.1" prop-types@^15.8.1: version "15.8.1" @@ -3071,11 +1635,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -pure-rand@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.1.tgz#31207dddd15d43f299fdcdb2f572df65030c19af" - integrity sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -3086,10 +1645,10 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== regexp.prototype.flags@^1.4.3: version "1.4.3" @@ -3105,39 +1664,17 @@ regexpp@^3.0.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - 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-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== - -resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -3190,12 +1727,12 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -semver@^6.0.0, semver@^6.3.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@^7.0.0, semver@^7.3.5, semver@^7.3.8: +semver@^7.0.0, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -3223,50 +1760,33 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -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== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== standard-engine@^15.0.0: version "15.0.0" @@ -3292,22 +1812,19 @@ standard@^17.0.0: eslint-plugin-react "^7.28.0" standard-engine "^15.0.0" -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" +std-env@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.2.tgz#af27343b001616015534292178327b202b9ee955" + integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.matchall@^4.0.8: version "4.0.8" @@ -3350,39 +1867,36 @@ string.prototype.trimstart@^1.0.6: define-properties "^1.1.4" es-abstract "^1.20.4" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -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== +strip-literal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" + integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== dependencies: - has-flag "^3.0.0" + acorn "^8.8.2" supports-color@^7.1.0: version "7.2.0" @@ -3391,48 +1905,30 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== +tinybench@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.4.0.tgz#83f60d9e5545353610fe7993bd783120bc20c7a7" + integrity sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg== -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 sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +tinypool@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.4.0.tgz#3cf3ebd066717f9f837e8d7d31af3c127fdb5446" + integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA== -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" +tinyspy@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" + integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== tsconfig-paths@^3.14.1: version "3.14.2" @@ -3451,7 +1947,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8: +type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -3461,11 +1957,6 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -3480,6 +1971,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +ufo@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.1.tgz#e70265e7152f3aba425bd013d150b2cdf4056d7c" + integrity sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -3490,14 +1986,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -3505,16 +1993,19 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -v8-to-istanbul@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" - integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== +vite-node@0.29.8: + version "0.29.8" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.29.8.tgz#6a1c9d4fb31e7b4e0f825d3a37abe3404e52bd8e" + integrity sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw== dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + cac "^6.7.14" + debug "^4.3.4" + mlly "^1.1.0" + pathe "^1.1.0" + picocolors "^1.0.0" + vite "^3.0.0 || ^4.0.0" -vite@^4.2.1: +"vite@^3.0.0 || ^4.0.0", vite@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== @@ -3526,12 +2017,35 @@ vite@^4.2.1: optionalDependencies: fsevents "~2.3.2" -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== +vitest@^0.29.8: + version "0.29.8" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.29.8.tgz#9c13cfa007c3511e86c26e1fe9a686bb4dbaec80" + integrity sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ== dependencies: - makeerror "1.0.12" + "@types/chai" "^4.3.4" + "@types/chai-subset" "^1.3.3" + "@types/node" "*" + "@vitest/expect" "0.29.8" + "@vitest/runner" "0.29.8" + "@vitest/spy" "0.29.8" + "@vitest/utils" "0.29.8" + acorn "^8.8.1" + acorn-walk "^8.2.0" + cac "^6.7.14" + chai "^4.3.7" + debug "^4.3.4" + local-pkg "^0.4.2" + pathe "^1.1.0" + picocolors "^1.0.0" + source-map "^0.6.1" + std-env "^3.3.1" + strip-literal "^1.0.0" + tinybench "^2.3.1" + tinypool "^0.4.0" + tinyspy "^1.0.2" + vite "^3.0.0 || ^4.0.0" + vite-node "0.29.8" + why-is-node-running "^2.2.2" which-boxed-primitive@^1.0.2: version "1.0.2" @@ -3563,72 +2077,40 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +why-is-node-running@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -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== -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 0d065b5087b6d495e7548e0d1a590c29ae49413c Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 12:00:53 -0400 Subject: [PATCH 05/44] Shuffle around somethings in schema.json and rename defs --- packages/expressions/schemas/All.schema.json | 5 +- packages/expressions/schemas/Any.schema.json | 5 +- .../expressions/schemas/Equal.schema.json | 2 +- .../schemas/GreaterThan.schema.json | 2 +- .../schemas/GreaterThanOrEqualTo.schema.json | 2 +- .../expressions/schemas/LessThan.schema.json | 2 +- .../schemas/LessThanOrEqualTo.schema.json | 2 +- .../expressions/schemas/NotEqual.schema.json | 2 +- packages/expressions/schemas/schema.json | 63 +++++++++++-------- 9 files changed, 45 insertions(+), 40 deletions(-) diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json index 241e59b52..a5029d856 100644 --- a/packages/expressions/schemas/All.schema.json +++ b/packages/expressions/schemas/All.schema.json @@ -2,8 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/All.schema.json", "title": "All", - "oneOf": [ - { "$ref": "schema.json#/$defs/expression" }, - { "type": "array", "items": { "$ref": "schema.json#/$defs/expression" } } - ] + "$ref": "schema.json#/$defs/arguments(n)" } diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json index d7878cddc..8f79194b2 100644 --- a/packages/expressions/schemas/Any.schema.json +++ b/packages/expressions/schemas/Any.schema.json @@ -2,8 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Any.schema.json", "title": "Any", - "oneOf": [ - { "$ref": "schema.json#/$defs/expression" }, - { "type": "array", "items": { "$ref": "schema.json#/$defs/expression" } } - ] + "$ref": "schema.json#/$defs/arguments(n)" } diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json index e5c91cb31..fea063397 100644 --- a/packages/expressions/schemas/Equal.schema.json +++ b/packages/expressions/schemas/Equal.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", "title": "Equal", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json index 406a40ce1..697c69969 100644 --- a/packages/expressions/schemas/GreaterThan.schema.json +++ b/packages/expressions/schemas/GreaterThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", "title": "GreaterThan", "description": "Compare if the first argument is > the second argument.", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json index 47588bef9..5f9fceb14 100644 --- a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", "title": "GreaterThanOrEqualTo", "description": "Compare if the first argument is >= the second argument.", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json index b8333becc..a9f9f5f6e 100644 --- a/packages/expressions/schemas/LessThan.schema.json +++ b/packages/expressions/schemas/LessThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", "title": "LessThan", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json index ff00509b2..0becbebe4 100644 --- a/packages/expressions/schemas/LessThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/LessThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", "title": "LessThanOrEqualTo", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json index 1d8868bde..8f3d15963 100644 --- a/packages/expressions/schemas/NotEqual.schema.json +++ b/packages/expressions/schemas/NotEqual.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", "title": "NotEqual", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/comparison" + "$ref": "schema.json#/$defs/arguments(<=>)" } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index e0b704c53..be4db5d3c 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -6,6 +6,7 @@ "$ref": "#/$defs/expression", "$defs": { "expression": { + "description": "An expression can be a function or a constant (string, boolean, or number)", "oneOf": [ { "$ref": "#/$defs/function" }, { "type": "string" }, @@ -13,33 +14,8 @@ { "type": "number" } ] }, - "string": { - "oneOf": [ - { "$ref": "#/$defs/function" }, - { "type": "string" } - ] - }, - "number": { - "oneOf": [ - { "$ref": "#/$defs/function" }, - { "type": "number" } - ] - }, - "argument": { - "$comment": "Allow a single expression or an array with a single expression", - "oneOf": [ - { "$ref": "#/$defs/expression" }, - { "type": "array", "items": { "$ref": "#/$defs/expression" }, "maxItems": 1 } - ] - }, - "comparison": { - "$comment": "An array with exactly two expressions", - "type": "array", - "items": { "$ref": "#/$defs/expression" }, - "maxItems": 2, - "minItems": 2 - }, "function": { + "description": "A function is an object with a single property that is the name of the function and the value is the arguments to the function", "type": "object", "maxProperties": 1, "minProperties": 1, @@ -64,6 +40,41 @@ "Time": { "$ref": "Time.schema.json" } }, "additionalProperties": false + }, + "string": { + "description": "A constant string value or a function that returns a string", + "oneOf": [ + { "$ref": "#/$defs/function" }, + { "type": "string" } + ] + }, + "number": { + "description": "A constant numeric value or a function that returns a number", + "oneOf": [ + { "$ref": "#/$defs/function" }, + { "type": "number" } + ] + }, + "arguments(n)": { + "description": "A single expression or an array of expressions", + "oneOf": [ + { "$ref": "#/$defs/expression" }, + { "type": "array", "items": { "$ref": "#/$defs/expression" } } + ] + }, + "argument": { + "description": "A single expression or an array with at most one expression", + "oneOf": [ + { "$ref": "#/$defs/expression" }, + { "type": "array", "items": { "$ref": "#/$defs/expression" }, "maxItems": 1 } + ] + }, + "arguments(<=>)": { + "description": "An array with exactly two expressions", + "type": "array", + "items": { "$ref": "#/$defs/expression" }, + "maxItems": 2, + "minItems": 2 } } } From ee46fab0cda21a32c3a921a8ed1fb94b0842b6b4 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 12:14:58 -0400 Subject: [PATCH 06/44] Add Min/Max functions --- lib/flipper/expressions/max.rb | 11 +++++++ lib/flipper/expressions/min.rb | 11 +++++++ packages/expressions/schemas/Max.schema.json | 6 ++++ packages/expressions/schemas/Min.schema.json | 6 ++++ packages/expressions/schemas/schema.json | 2 ++ packages/expressions/test/examples/Max.json | 32 ++++++++++++++++++++ packages/expressions/test/examples/Min.json | 32 ++++++++++++++++++++ 7 files changed, 100 insertions(+) create mode 100644 lib/flipper/expressions/max.rb create mode 100644 lib/flipper/expressions/min.rb create mode 100644 packages/expressions/schemas/Max.schema.json create mode 100644 packages/expressions/schemas/Min.schema.json create mode 100644 packages/expressions/test/examples/Max.json create mode 100644 packages/expressions/test/examples/Min.json diff --git a/lib/flipper/expressions/max.rb b/lib/flipper/expressions/max.rb new file mode 100644 index 000000000..489b999b0 --- /dev/null +++ b/lib/flipper/expressions/max.rb @@ -0,0 +1,11 @@ +require "flipper/expression" + +module Flipper + module Expressions + class Max + def self.call(*args) + args.max + end + end + end +end diff --git a/lib/flipper/expressions/min.rb b/lib/flipper/expressions/min.rb new file mode 100644 index 000000000..c3bef5a71 --- /dev/null +++ b/lib/flipper/expressions/min.rb @@ -0,0 +1,11 @@ +require "flipper/expression" + +module Flipper + module Expressions + class Min + def self.call(*args) + args.min + end + end + end +end diff --git a/packages/expressions/schemas/Max.schema.json b/packages/expressions/schemas/Max.schema.json new file mode 100644 index 000000000..91d4622a6 --- /dev/null +++ b/packages/expressions/schemas/Max.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Max.schema.json", + "title": "Max", + "$ref": "schema.json#/$defs/arguments(n)" +} diff --git a/packages/expressions/schemas/Min.schema.json b/packages/expressions/schemas/Min.schema.json new file mode 100644 index 000000000..f485fbad0 --- /dev/null +++ b/packages/expressions/schemas/Min.schema.json @@ -0,0 +1,6 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Min.schema.json", + "title": "Min", + "$ref": "schema.json#/$defs/arguments(n)" +} diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index be4db5d3c..257cf0639 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -29,6 +29,8 @@ "GreaterThanOrEqualTo": { "$ref": "GreaterThanOrEqualTo.schema.json" }, "LessThan": { "$ref": "LessThan.schema.json" }, "LessThanOrEqualTo": { "$ref": "LessThanOrEqualTo.schema.json" }, + "Max": { "$ref": "Max.schema.json" }, + "Min": { "$ref": "Min.schema.json" }, "NotEqual": { "$ref": "NotEqual.schema.json" }, "Now": { "$ref": "Now.schema.json" }, "Number": { "$ref": "Number.schema.json" }, diff --git a/packages/expressions/test/examples/Max.json b/packages/expressions/test/examples/Max.json new file mode 100644 index 000000000..a7effadeb --- /dev/null +++ b/packages/expressions/test/examples/Max.json @@ -0,0 +1,32 @@ +{ + "valid": [ + { + "expression": { "Max": [] }, + "result": { "enum": [null] } + }, + { + "expression": { "Max": [3, 2, 1] }, + "result": { "enum": [3] } + }, + { + "expression": { "Max": [0.1, 0.2] }, + "result": { "enum": [0.2] } + }, + { + "expression": { "Max": ["a", "b"] }, + "result": { "enum": ["b"] } + }, + { + "expression": { "Max": 100 }, + "result": { "enum": [100] } + }, + { + "expression": { "Max": [{ "Number": "2" }, { "Number": "1" }] }, + "result": { "enum": [2] } + } + ], + "invalid": [ + { "Max": null }, + { "Max": [], "Any": [] } + ] +} diff --git a/packages/expressions/test/examples/Min.json b/packages/expressions/test/examples/Min.json new file mode 100644 index 000000000..47199a5da --- /dev/null +++ b/packages/expressions/test/examples/Min.json @@ -0,0 +1,32 @@ +{ + "valid": [ + { + "expression": { "Min": [] }, + "result": { "enum": [null] } + }, + { + "expression": { "Min": [3, 2, 1] }, + "result": { "enum": [1] } + }, + { + "expression": { "Min": [0.1, 0.2] }, + "result": { "enum": [0.1] } + }, + { + "expression": { "Min": ["a", "b"] }, + "result": { "enum": ["a"] } + }, + { + "expression": { "Min": 100 }, + "result": { "enum": [100] } + }, + { + "expression": { "Min": [{ "Number": "2" }, { "Number": "1" }] }, + "result": { "enum": [1] } + } + ], + "invalid": [ + { "Min": null }, + { "Min": [], "Any": [] } + ] +} From 6a2e622082b2b7404a21d40da1e225e7b9ea5fa6 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 12:19:59 -0400 Subject: [PATCH 07/44] Rename url-unfriendly defs --- packages/expressions/schemas/All.schema.json | 2 +- packages/expressions/schemas/Any.schema.json | 2 +- packages/expressions/schemas/Equal.schema.json | 2 +- .../expressions/schemas/GreaterThan.schema.json | 2 +- .../schemas/GreaterThanOrEqualTo.schema.json | 2 +- .../expressions/schemas/LessThan.schema.json | 2 +- .../schemas/LessThanOrEqualTo.schema.json | 2 +- packages/expressions/schemas/Max.schema.json | 2 +- packages/expressions/schemas/Min.schema.json | 2 +- .../expressions/schemas/NotEqual.schema.json | 2 +- packages/expressions/schemas/String.schema.json | 2 ++ packages/expressions/schemas/schema.json | 16 ++++++++-------- 12 files changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json index a5029d856..d1b242e7c 100644 --- a/packages/expressions/schemas/All.schema.json +++ b/packages/expressions/schemas/All.schema.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/All.schema.json", "title": "All", - "$ref": "schema.json#/$defs/arguments(n)" + "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json index 8f79194b2..fd0b049e7 100644 --- a/packages/expressions/schemas/Any.schema.json +++ b/packages/expressions/schemas/Any.schema.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Any.schema.json", "title": "Any", - "$ref": "schema.json#/$defs/arguments(n)" + "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json index fea063397..118affd93 100644 --- a/packages/expressions/schemas/Equal.schema.json +++ b/packages/expressions/schemas/Equal.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", "title": "Equal", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json index 697c69969..421111414 100644 --- a/packages/expressions/schemas/GreaterThan.schema.json +++ b/packages/expressions/schemas/GreaterThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", "title": "GreaterThan", "description": "Compare if the first argument is > the second argument.", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json index 5f9fceb14..cba53a572 100644 --- a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", "title": "GreaterThanOrEqualTo", "description": "Compare if the first argument is >= the second argument.", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json index a9f9f5f6e..496b7f792 100644 --- a/packages/expressions/schemas/LessThan.schema.json +++ b/packages/expressions/schemas/LessThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", "title": "LessThan", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json index 0becbebe4..dc01097fe 100644 --- a/packages/expressions/schemas/LessThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/LessThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", "title": "LessThanOrEqualTo", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/Max.schema.json b/packages/expressions/schemas/Max.schema.json index 91d4622a6..ecd8c84ab 100644 --- a/packages/expressions/schemas/Max.schema.json +++ b/packages/expressions/schemas/Max.schema.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Max.schema.json", "title": "Max", - "$ref": "schema.json#/$defs/arguments(n)" + "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Min.schema.json b/packages/expressions/schemas/Min.schema.json index f485fbad0..8fcc527fa 100644 --- a/packages/expressions/schemas/Min.schema.json +++ b/packages/expressions/schemas/Min.schema.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Min.schema.json", "title": "Min", - "$ref": "schema.json#/$defs/arguments(n)" + "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json index 8f3d15963..842ae7c6f 100644 --- a/packages/expressions/schemas/NotEqual.schema.json +++ b/packages/expressions/schemas/NotEqual.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", "title": "NotEqual", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/arguments(<=>)" + "$ref": "schema.json#/$defs/arguments-two" } diff --git a/packages/expressions/schemas/String.schema.json b/packages/expressions/schemas/String.schema.json index 7bfccf374..459355dad 100644 --- a/packages/expressions/schemas/String.schema.json +++ b/packages/expressions/schemas/String.schema.json @@ -1,5 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/String.schema.json", + "title": "String", + "description": "Cast a value to a string.", "$ref": "schema.json#/$defs/argument" } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 257cf0639..6bcdf006e 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -57,26 +57,26 @@ { "type": "number" } ] }, - "arguments(n)": { + "arguments-n": { "description": "A single expression or an array of expressions", "oneOf": [ { "$ref": "#/$defs/expression" }, { "type": "array", "items": { "$ref": "#/$defs/expression" } } ] }, + "arguments-two": { + "description": "An array with exactly two expressions", + "type": "array", + "items": { "$ref": "#/$defs/expression" }, + "maxItems": 2, + "minItems": 2 + }, "argument": { "description": "A single expression or an array with at most one expression", "oneOf": [ { "$ref": "#/$defs/expression" }, { "type": "array", "items": { "$ref": "#/$defs/expression" }, "maxItems": 1 } ] - }, - "arguments(<=>)": { - "description": "An array with exactly two expressions", - "type": "array", - "items": { "$ref": "#/$defs/expression" }, - "maxItems": 2, - "minItems": 2 } } } From 08b03c1b0fba262bbb89079c1bad7e35e77c0712 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 13:00:05 -0400 Subject: [PATCH 08/44] Move expression examples out of test dir --- packages/expressions/{test => }/examples/All.json | 0 packages/expressions/{test => }/examples/Any.json | 0 packages/expressions/{test => }/examples/Boolean.json | 0 packages/expressions/{test => }/examples/Durations.json | 0 packages/expressions/{test => }/examples/Equal.json | 0 packages/expressions/{test => }/examples/GreaterThan.json | 0 .../{test => }/examples/GreaterThanOrEqualTo.json | 0 packages/expressions/{test => }/examples/LessThan.json | 0 .../{test => }/examples/LessThanOrEqualTo.json | 0 packages/expressions/{test => }/examples/Max.json | 0 packages/expressions/{test => }/examples/Min.json | 0 packages/expressions/{test => }/examples/NotEqual.json | 0 packages/expressions/{test => }/examples/Now.json | 0 packages/expressions/{test => }/examples/Number.json | 0 packages/expressions/{test => }/examples/Percentage.json | 0 .../{test => }/examples/PercentageOfActors.json | 0 packages/expressions/{test => }/examples/Property.json | 0 packages/expressions/{test => }/examples/Random.json | 0 packages/expressions/{test => }/examples/String.json | 0 packages/expressions/{test => }/examples/Time.json | 0 packages/expressions/{test => }/examples/expressions.json | 0 packages/expressions/{test => }/examples/index.js | 0 packages/expressions/lib/index.js | 1 + packages/expressions/package.json | 3 ++- packages/expressions/test/schemas.test.js | 2 +- spec/flipper/expressions_schema_spec.rb | 8 +++----- 26 files changed, 7 insertions(+), 7 deletions(-) rename packages/expressions/{test => }/examples/All.json (100%) rename packages/expressions/{test => }/examples/Any.json (100%) rename packages/expressions/{test => }/examples/Boolean.json (100%) rename packages/expressions/{test => }/examples/Durations.json (100%) rename packages/expressions/{test => }/examples/Equal.json (100%) rename packages/expressions/{test => }/examples/GreaterThan.json (100%) rename packages/expressions/{test => }/examples/GreaterThanOrEqualTo.json (100%) rename packages/expressions/{test => }/examples/LessThan.json (100%) rename packages/expressions/{test => }/examples/LessThanOrEqualTo.json (100%) rename packages/expressions/{test => }/examples/Max.json (100%) rename packages/expressions/{test => }/examples/Min.json (100%) rename packages/expressions/{test => }/examples/NotEqual.json (100%) rename packages/expressions/{test => }/examples/Now.json (100%) rename packages/expressions/{test => }/examples/Number.json (100%) rename packages/expressions/{test => }/examples/Percentage.json (100%) rename packages/expressions/{test => }/examples/PercentageOfActors.json (100%) rename packages/expressions/{test => }/examples/Property.json (100%) rename packages/expressions/{test => }/examples/Random.json (100%) rename packages/expressions/{test => }/examples/String.json (100%) rename packages/expressions/{test => }/examples/Time.json (100%) rename packages/expressions/{test => }/examples/expressions.json (100%) rename packages/expressions/{test => }/examples/index.js (100%) diff --git a/packages/expressions/test/examples/All.json b/packages/expressions/examples/All.json similarity index 100% rename from packages/expressions/test/examples/All.json rename to packages/expressions/examples/All.json diff --git a/packages/expressions/test/examples/Any.json b/packages/expressions/examples/Any.json similarity index 100% rename from packages/expressions/test/examples/Any.json rename to packages/expressions/examples/Any.json diff --git a/packages/expressions/test/examples/Boolean.json b/packages/expressions/examples/Boolean.json similarity index 100% rename from packages/expressions/test/examples/Boolean.json rename to packages/expressions/examples/Boolean.json diff --git a/packages/expressions/test/examples/Durations.json b/packages/expressions/examples/Durations.json similarity index 100% rename from packages/expressions/test/examples/Durations.json rename to packages/expressions/examples/Durations.json diff --git a/packages/expressions/test/examples/Equal.json b/packages/expressions/examples/Equal.json similarity index 100% rename from packages/expressions/test/examples/Equal.json rename to packages/expressions/examples/Equal.json diff --git a/packages/expressions/test/examples/GreaterThan.json b/packages/expressions/examples/GreaterThan.json similarity index 100% rename from packages/expressions/test/examples/GreaterThan.json rename to packages/expressions/examples/GreaterThan.json diff --git a/packages/expressions/test/examples/GreaterThanOrEqualTo.json b/packages/expressions/examples/GreaterThanOrEqualTo.json similarity index 100% rename from packages/expressions/test/examples/GreaterThanOrEqualTo.json rename to packages/expressions/examples/GreaterThanOrEqualTo.json diff --git a/packages/expressions/test/examples/LessThan.json b/packages/expressions/examples/LessThan.json similarity index 100% rename from packages/expressions/test/examples/LessThan.json rename to packages/expressions/examples/LessThan.json diff --git a/packages/expressions/test/examples/LessThanOrEqualTo.json b/packages/expressions/examples/LessThanOrEqualTo.json similarity index 100% rename from packages/expressions/test/examples/LessThanOrEqualTo.json rename to packages/expressions/examples/LessThanOrEqualTo.json diff --git a/packages/expressions/test/examples/Max.json b/packages/expressions/examples/Max.json similarity index 100% rename from packages/expressions/test/examples/Max.json rename to packages/expressions/examples/Max.json diff --git a/packages/expressions/test/examples/Min.json b/packages/expressions/examples/Min.json similarity index 100% rename from packages/expressions/test/examples/Min.json rename to packages/expressions/examples/Min.json diff --git a/packages/expressions/test/examples/NotEqual.json b/packages/expressions/examples/NotEqual.json similarity index 100% rename from packages/expressions/test/examples/NotEqual.json rename to packages/expressions/examples/NotEqual.json diff --git a/packages/expressions/test/examples/Now.json b/packages/expressions/examples/Now.json similarity index 100% rename from packages/expressions/test/examples/Now.json rename to packages/expressions/examples/Now.json diff --git a/packages/expressions/test/examples/Number.json b/packages/expressions/examples/Number.json similarity index 100% rename from packages/expressions/test/examples/Number.json rename to packages/expressions/examples/Number.json diff --git a/packages/expressions/test/examples/Percentage.json b/packages/expressions/examples/Percentage.json similarity index 100% rename from packages/expressions/test/examples/Percentage.json rename to packages/expressions/examples/Percentage.json diff --git a/packages/expressions/test/examples/PercentageOfActors.json b/packages/expressions/examples/PercentageOfActors.json similarity index 100% rename from packages/expressions/test/examples/PercentageOfActors.json rename to packages/expressions/examples/PercentageOfActors.json diff --git a/packages/expressions/test/examples/Property.json b/packages/expressions/examples/Property.json similarity index 100% rename from packages/expressions/test/examples/Property.json rename to packages/expressions/examples/Property.json diff --git a/packages/expressions/test/examples/Random.json b/packages/expressions/examples/Random.json similarity index 100% rename from packages/expressions/test/examples/Random.json rename to packages/expressions/examples/Random.json diff --git a/packages/expressions/test/examples/String.json b/packages/expressions/examples/String.json similarity index 100% rename from packages/expressions/test/examples/String.json rename to packages/expressions/examples/String.json diff --git a/packages/expressions/test/examples/Time.json b/packages/expressions/examples/Time.json similarity index 100% rename from packages/expressions/test/examples/Time.json rename to packages/expressions/examples/Time.json diff --git a/packages/expressions/test/examples/expressions.json b/packages/expressions/examples/expressions.json similarity index 100% rename from packages/expressions/test/examples/expressions.json rename to packages/expressions/examples/expressions.json diff --git a/packages/expressions/test/examples/index.js b/packages/expressions/examples/index.js similarity index 100% rename from packages/expressions/test/examples/index.js rename to packages/expressions/examples/index.js diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 891c6f913..97cefd8b9 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,2 +1,3 @@ export { default as schemas } from '../schemas' export { default as validator } from './validator' +export { default as examples } from '../examples' diff --git a/packages/expressions/package.json b/packages/expressions/package.json index f3929ad39..76052a980 100644 --- a/packages/expressions/package.json +++ b/packages/expressions/package.json @@ -5,7 +5,8 @@ "type": "module", "files": [ "dist", - "schemas" + "schemas", + "examples" ], "main": "./dist/expressions.umd.cjs", "module": "./dist/expressions.js", diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 4421aea73..782d2341e 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,6 +1,6 @@ import { describe, test, expect } from 'vitest' import { validator } from '../lib' -import examples from './examples' +import examples from '../examples' const expressionsValidator = validator() diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expressions_schema_spec.rb index cb3d5dcd6..30cee1d3e 100644 --- a/spec/flipper/expressions_schema_spec.rb +++ b/spec/flipper/expressions_schema_spec.rb @@ -1,21 +1,19 @@ require 'json_schemer' RSpec.describe Flipper::Expressions do - EXPRESSION_JS_PATH = File.expand_path('../../packages/expressions', __dir__) + PATH = Pathname.new(File.expand_path('../../packages/expressions', __dir__)) - SCHEMAS = Hash[Dir.glob(File.join(EXPRESSION_JS_PATH, 'schemas/*.json')).map do |path| + SCHEMAS = Hash[PATH.glob('schemas/*.json').map do |path| [File.basename(path), JSON.parse(File.read(path))] end] - EXAMPLES = Dir.glob(File.join(EXPRESSION_JS_PATH, 'test/examples/*.json')) - let(:schema) do JSONSchemer.schema(SCHEMAS["schema.json"], ref_resolver: lambda {|url| SCHEMAS[File.basename(url.path)] }) end - EXAMPLES.each do |path| + PATH.glob('examples/*.json').each do |path| describe(File.basename(path, '.json')) do examples = JSON.parse(File.read(path)) examples["valid"].each do |example| From 5004b6f41cb7264b7e82ca52ceb98f5559f9f616 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 13:03:49 -0400 Subject: [PATCH 09/44] Initial docs for implementing functions --- packages/expressions/README.md | 275 ++------------------------------- 1 file changed, 12 insertions(+), 263 deletions(-) diff --git a/packages/expressions/README.md b/packages/expressions/README.md index 7738ac4a1..eb314d83b 100644 --- a/packages/expressions/README.md +++ b/packages/expressions/README.md @@ -2,266 +2,15 @@ > A schema for Flipper Expressions -``` - PASS test/schemas.test.js - expressions.schema.json - expressions - valid - ✓ "string" (2 ms) - ✓ true - ✓ false (1 ms) - ✓ 1 - ✓ 1.1 - invalid - ✓ null - ✓ {} - ✓ [] - Time - valid - ✓ {"Number":{"Time":["2021-01-01T00:00:00Z"]}} (1 ms) - ✓ {"Number":{"Time":"2021-01-01T00:00:00-05:00"}} (1 ms) - ✓ {"Number":{"Time":{"Property":"created_at"}}} - invalid - ✓ {"Time":"2021-01-01"} (1 ms) - ✓ {"Time":"January 1, 2021 10:00"} - ✓ {"Time":null} - ✓ {"Time":false} (1 ms) - ✓ {"Time":[{"Property":"created_at"},{"Property":"updated_at"}]} - String - valid - ✓ {"String":true} - ✓ {"String":false} - ✓ {"String":"already a string"} - ✓ {"String":1} (1 ms) - ✓ {"String":1.1} - ✓ {"String":[true]} - ✓ {"String":[false]} - ✓ {"String":["already a string"]} - ✓ {"String":[1]} - ✓ {"String":[1.1]} - ✓ {"String":{"All":[]}} - ✓ {"String":[{"Any":[]}]} - invalid - ✓ {"String":null} - ✓ {"String":[true,false]} - ✓ {"String":true,"Any":[]} - Random - valid - ✓ {"Random":[]} - ✓ {"Random":2} - ✓ {"Random":[100]} - ✓ {"Random":[{"Property":"max_rand"}]} (1 ms) - invalid - ✓ {"Random":null} - ✓ {"Random":[1,2]} - Property - valid - ✓ {"Property":"name"} - ✓ {"Property":["flipper_id"]} - ✓ {"Property":["flipper_id"]} - ✓ {"Property":["flipper_id"]} - invalid - ✓ {"Property":[]} - ✓ {"Property":null} - PercentageOfActors - valid - ✓ {"PercentageOfActors":["User;1",42]} (1 ms) - ✓ {"PercentageOfActors":["User;1",0]} - ✓ {"PercentageOfActors":["string",99.99]} - ✓ {"PercentageOfActors":["string",100]} - ✓ {"PercentageOfActors":[{"Property":["flipper_id"]},{"Property":["probability"]}]} - ✓ {"PercentageOfActors":["User;1",70]} - ✓ {"PercentageOfActors":["User;1",70]} - ✓ {"PercentageOfActors":["string",-1]} - ✓ {"PercentageOfActors":["string",101]} - invalid - ✓ {"PercentageOfActors":["string"]} - ✓ {"PercentageOfActors":[100]} - ✓ {"PercentageOfActors":[{"Property":["flipper_id"]}]} (1 ms) - Percentage - valid - ✓ {"Percentage":[0]} - ✓ {"Percentage":[99.999]} - ✓ {"Percentage":[100]} - ✓ {"Percentage":[{"Property":["nines"]}]} - ✓ {"Percentage":[-1]} - ✓ {"Percentage":[101]} (1 ms) - invalid - ✓ {"Percentage":[1,2]} - ✓ {"Percentage":[null]} - ✓ {"Percentage":null} - Number - valid - ✓ {"Number":0} - ✓ {"Number":1} - ✓ {"Number":1} (1 ms) - ✓ {"Number":"0"} - ✓ {"Number":"1"} - ✓ {"Number":"1.0"} - ✓ {"Number":[0]} - ✓ {"Number":[1]} - ✓ {"Number":[1]} - ✓ {"Number":{"Property":"age"}} - invalid - ✓ {"Number":null} - ✓ {"Number":[true,false]} - ✓ {"Number":true,"Any":[]} - Now - valid - ✓ {"Now":[]} - ✓ {"String":{"Now":[]}} - invalid - ✓ {"Now":null} - ✓ {"Now":[1]} (2 ms) - ✓ {"Now":1} - NotEqual - valid - ✓ {"NotEqual":[1,1]} (1 ms) - ✓ {"NotEqual":["a","a"]} - ✓ {"NotEqual":[1,2]} - ✓ {"NotEqual":["a","b"]} - ✓ {"NotEqual":[true,false]} - ✓ {"NotEqual":[true,true]} (1 ms) - ✓ {"NotEqual":[{"Property":"age"},21]} - invalid - ✓ {"NotEqual":[1,2,3]} - ✓ {"NotEqual":[1]} - ✓ {"NotEqual":1} - ✓ {"NotEqual":null} - ✓ {"NotEqual":[1,2],"Any":[]} - LessThanOrEqualTo - valid - ✓ {"LessThanOrEqualTo":[1,1]} - ✓ {"LessThanOrEqualTo":[2,1]} - ✓ {"LessThanOrEqualTo":["a","b"]} (1 ms) - ✓ {"LessThanOrEqualTo":["b","b"]} - ✓ {"LessThanOrEqualTo":[1,2]} - ✓ {"LessThanOrEqualTo":["b","a"]} - ✓ {"LessThanOrEqualTo":[{"Property":"age"},21]} - ✓ {"LessThanOrEqualTo":[{"Property":"age"},18]} - invalid - ✓ {"LessThanOrEqualTo":[1,2,3]} - ✓ {"LessThanOrEqualTo":[1]} - ✓ {"LessThanOrEqualTo":1} - ✓ {"LessThanOrEqualTo":null} - ✓ {"LessThanOrEqualTo":[1,2],"Any":[]} - LessThan - valid - ✓ {"LessThan":[1,1]} - ✓ {"LessThan":["a","a"]} - ✓ {"LessThan":[2,1]} - ✓ {"LessThan":[1,2]} - ✓ {"LessThan":["b","a"]} - ✓ {"LessThan":["a","b"]} - ✓ {"LessThan":[{"Property":"age"},18]} - ✓ {"LessThan":[{"Property":"age"},18]} - invalid - ✓ {"LessThan":[1,2,3]} - ✓ {"LessThan":[1]} - ✓ {"LessThan":1} - ✓ {"LessThan":null} (1 ms) - ✓ {"LessThan":[1,2],"Any":[]} - GreaterThanOrEqualTo - valid - ✓ {"GreaterThanOrEqualTo":[1,1]} - ✓ {"GreaterThanOrEqualTo":[2,1]} - ✓ {"GreaterThanOrEqualTo":["a","b"]} - ✓ {"GreaterThanOrEqualTo":["b","b"]} - ✓ {"GreaterThanOrEqualTo":[1,2]} - ✓ {"GreaterThanOrEqualTo":["b","a"]} - ✓ {"GreaterThanOrEqualTo":["a","b"]} - ✓ {"GreaterThanOrEqualTo":[true,false]} - ✓ {"GreaterThanOrEqualTo":[{"Property":"age"},18]} - invalid - ✓ {"GreaterThanOrEqualTo":[1,2,3]} - ✓ {"GreaterThanOrEqualTo":[1]} - ✓ {"GreaterThanOrEqualTo":1} - ✓ {"GreaterThanOrEqualTo":null} - ✓ {"GreaterThanOrEqualTo":[1,2],"Any":[]} - GreaterThan - valid - ✓ {"GreaterThan":[1,1]} - ✓ {"GreaterThan":["a","a"]} - ✓ {"GreaterThan":[2,1]} - ✓ {"GreaterThan":["b","a"]} - ✓ {"GreaterThan":["a","b"]} - ✓ {"GreaterThan":[{"Property":"age"},18]} - invalid - ✓ {"GreaterThan":[1,2,3]} - ✓ {"GreaterThan":[1]} - ✓ {"GreaterThan":1} - ✓ {"GreaterThan":null} - ✓ {"GreaterThan":[1,2],"Any":[]} - Equal - valid - ✓ {"Equal":[1,1]} - ✓ {"Equal":["a","a"]} - ✓ {"Equal":[1,2]} - ✓ {"Equal":["a","b"]} - ✓ {"Equal":[true,false]} - ✓ {"Equal":[{"Property":"age"},21]} - invalid - ✓ {"Equal":[1,2,3]} (1 ms) - ✓ {"Equal":[1]} - ✓ {"Equal":1} - ✓ {"Equal":null} - ✓ {"Equal":[1,2],"Any":[]} - Durations - valid - ✓ {"Duration":[2,"seconds"]} (1 ms) - ✓ {"Duration":[2,"minutes"]} - ✓ {"Duration":[2,"hours"]} - ✓ {"Duration":[2,"days"]} - ✓ {"Duration":[2,"weeks"]} - ✓ {"Duration":[2,"months"]} (1 ms) - ✓ {"Duration":[2,"years"]} - invalid - ✓ {"Duration":2} - ✓ {"Duration":[2]} - ✓ {"Duration":[4,"score"]} - Boolean - valid - ✓ {"Boolean":true} - ✓ {"Boolean":"true"} - ✓ {"Boolean":1} - ✓ {"Boolean":[true]} - ✓ {"Boolean":["true"]} - ✓ {"Boolean":[1]} - ✓ {"Boolean":{"All":[]}} - ✓ {"Boolean":false} - ✓ {"Boolean":"false"} - ✓ {"Boolean":0} - ✓ {"Boolean":[false]} - ✓ {"Boolean":["false"]} - ✓ {"Boolean":[0]} - ✓ {"Boolean":[{"Any":[]}]} - invalid - ✓ {"Boolean":null} - ✓ {"Boolean":[true,false]} - ✓ {"Boolean":true,"Any":[]} - Any - valid - ✓ {"Any":[]} (1 ms) - ✓ {"Any":[true]} - ✓ {"Any":[true,false]} - ✓ {"Any":[false,false]} - ✓ {"Any":[1,true,"string"]} - ✓ {"Any":true} (1 ms) - ✓ {"Any":false} - ✓ {"Any":[{"Boolean":false},{"Property":"admin"}]} - invalid - ✓ {"Any":null} - ✓ {"Any":[],"All":[]} - All - valid - ✓ {"All":[]} - ✓ {"All":[true]} - ✓ {"All":[true,false]} - ✓ {"All":[1,true,"string"]} - ✓ {"All":true} - ✓ {"All":false} - ✓ {"All":[{"Boolean":true},{"Property":"admin"}]} - invalid - ✓ {"All":null} - ✓ {"All":[],"Any":[]} -❯``` +The structure for flipper Expressions is defined in `[`schemas/schema.json`](./schemas/schema.json) using [JSON Schema](https://json-schema.org) ([draft-07](https://json-schema.org/specification-links.html#draft-7)). + +To learn more about JSON Schema, read [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/) or the [Ajv JSON schema validator docs](https://ajv.js.org/json-schema.html). + +## Adding a new expression + +1. Describe arguments by creating a new file in [`schemas/`](schemas/) named `NewName.schema.json`. You can copy an existing function that has similar semantics to get started. +2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `$defs/function`. +3. Create a new file in [`examples/`](./examples) named `NewName.json` with valid and invalid examples for the new function. See other examples for inspiration. +4. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/). + +See [this commit that adds Min/Max functions](https://github.com/jnunemaker/flipper/commit/ee46fab0cda21a32c3a921a8ed1fb94b0842b6b4) for a concrete example. From 4c35f3e33d3f3e5ca5a4a88ebd721c5f3fe68f6b Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 13:12:16 -0400 Subject: [PATCH 10/44] Run JS lint/tests --- .github/workflows/ci.yml | 17 ++++++++++++++++- packages/expressions/examples/index.js | 2 +- packages/expressions/schemas/index.js | 8 ++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07a8f829e..a25396b0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ name: CI on: [push, pull_request] jobs: - test: + ruby: name: Test on ruby ${{ matrix.ruby }} and rails ${{ matrix.rails }} runs-on: ubuntu-latest services: @@ -62,3 +62,18 @@ jobs: bundler-cache: true # 'bundle install' and cache gems - name: Run Rake with Rails ${{ matrix.rails }} run: bundle exec rake + js: + name: JS + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + cache: 'yarn' + cache-dependency-path: packages/expressions/yarn.lock + - name: Run yarn lint + test + run: | + cd packages/expressions + yarn install + yarn lint + yarn test diff --git a/packages/expressions/examples/index.js b/packages/expressions/examples/index.js index adcde4d79..e078e9457 100644 --- a/packages/expressions/examples/index.js +++ b/packages/expressions/examples/index.js @@ -1,6 +1,6 @@ import { basename } from 'path' -const modules = import.meta.glob("./*.json", { eager: true, import: 'default' }) +const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) export default Object.fromEntries(Object.entries(modules).map(([path, module]) => { return [basename(path, '.json'), module] diff --git a/packages/expressions/schemas/index.js b/packages/expressions/schemas/index.js index 61bdcc4bb..0817fd3cf 100644 --- a/packages/expressions/schemas/index.js +++ b/packages/expressions/schemas/index.js @@ -1,7 +1,7 @@ const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) const schemas = Object.fromEntries(Object.entries(modules).map(([path, module]) => { - const name = path.split('/').pop().split('.').shift(); - return [name == 'schema' ? 'default' : name, module]; -})); + const name = path.split('/').pop().split('.').shift() + return [name === 'schema' ? 'default' : name, module] +})) -export default schemas; +export default schemas From c51eda3573f39062835b0057224863c35655dfe1 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 13:23:02 -0400 Subject: [PATCH 11/44] Add not about running tests to expression docs --- packages/expressions/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/expressions/README.md b/packages/expressions/README.md index eb314d83b..245ea2410 100644 --- a/packages/expressions/README.md +++ b/packages/expressions/README.md @@ -11,6 +11,8 @@ To learn more about JSON Schema, read [Understanding JSON Schema](https://json-s 1. Describe arguments by creating a new file in [`schemas/`](schemas/) named `NewName.schema.json`. You can copy an existing function that has similar semantics to get started. 2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `$defs/function`. 3. Create a new file in [`examples/`](./examples) named `NewName.json` with valid and invalid examples for the new function. See other examples for inspiration. -4. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/). +4. Run `yarn test` in `packages/expressions` and ensure tests pass. +5. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/). +6. Run `rspec` to ensure tests pass. See [this commit that adds Min/Max functions](https://github.com/jnunemaker/flipper/commit/ee46fab0cda21a32c3a921a8ed1fb94b0842b6b4) for a concrete example. From 50dc917265903116de0342bf23b7fcf1b4ebbb57 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 31 Mar 2023 13:29:38 -0400 Subject: [PATCH 12/44] Fix README formatting --- packages/expressions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/expressions/README.md b/packages/expressions/README.md index 245ea2410..95a93c09a 100644 --- a/packages/expressions/README.md +++ b/packages/expressions/README.md @@ -2,7 +2,7 @@ > A schema for Flipper Expressions -The structure for flipper Expressions is defined in `[`schemas/schema.json`](./schemas/schema.json) using [JSON Schema](https://json-schema.org) ([draft-07](https://json-schema.org/specification-links.html#draft-7)). +The structure for flipper Expressions is defined in [`schemas/schema.json`](./schemas/schema.json) using [JSON Schema](https://json-schema.org) ([draft-07](https://json-schema.org/specification-links.html#draft-7)). To learn more about JSON Schema, read [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/) or the [Ajv JSON schema validator docs](https://ajv.js.org/json-schema.html). From 6262795f41d2f4010c408d76ed4367c5a3ba2217 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 1 Apr 2023 07:25:02 -0400 Subject: [PATCH 13/44] Remove use of path --- packages/expressions/examples/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/expressions/examples/index.js b/packages/expressions/examples/index.js index e078e9457..cd12fe4a0 100644 --- a/packages/expressions/examples/index.js +++ b/packages/expressions/examples/index.js @@ -1,7 +1,6 @@ -import { basename } from 'path' - const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) export default Object.fromEntries(Object.entries(modules).map(([path, module]) => { - return [basename(path, '.json'), module] + const name = path.split('/').pop().split('.').shift() + return [name, module] })) From 4a10eafd639f6a252242dc05e5417aa1c865034a Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 1 Apr 2023 15:56:31 -0400 Subject: [PATCH 14/44] Simplfy schemas by making implementation cast function arguments to array --- lib/flipper/expression.rb | 9 ++++- lib/flipper/expression/constant.rb | 4 ++ lib/flipper/expression/schema.rb | 34 +++++++++++++++++ lib/flipper/expressions/duration.rb | 2 +- packages/expressions/examples/All.json | 5 ++- packages/expressions/examples/Any.json | 5 ++- .../{Durations.json => Duration.json} | 10 ++++- packages/expressions/examples/Max.json | 5 ++- packages/expressions/examples/Min.json | 5 ++- packages/expressions/examples/Now.json | 5 ++- packages/expressions/examples/Random.json | 5 ++- packages/expressions/lib/index.js | 2 +- packages/expressions/lib/validate.js | 34 +++++++++++++++++ packages/expressions/lib/validator.js | 9 ----- packages/expressions/schemas/All.schema.json | 1 + packages/expressions/schemas/Any.schema.json | 1 + .../expressions/schemas/Duration.schema.json | 11 +++--- packages/expressions/schemas/Max.schema.json | 1 + packages/expressions/schemas/Min.schema.json | 1 + .../schemas/Percentage.schema.json | 8 ++-- .../expressions/schemas/Property.schema.json | 8 ++-- .../expressions/schemas/Random.schema.json | 7 ++-- packages/expressions/schemas/Time.schema.json | 14 +++---- packages/expressions/schemas/schema.json | 37 +++++++++---------- packages/expressions/test/schemas.test.js | 11 +++--- spec/flipper/expressions_schema_spec.rb | 33 +++++------------ 26 files changed, 175 insertions(+), 92 deletions(-) create mode 100644 lib/flipper/expression/schema.rb rename packages/expressions/examples/{Durations.json => Duration.json} (81%) create mode 100644 packages/expressions/lib/validate.js delete mode 100644 packages/expressions/lib/validator.js diff --git a/lib/flipper/expression.rb b/lib/flipper/expression.rb index cddd114bb..ed23c4f90 100644 --- a/lib/flipper/expression.rb +++ b/lib/flipper/expression.rb @@ -1,5 +1,6 @@ require "flipper/expression/builder" require "flipper/expression/constant" +require "flipper/expression/schema" module Flipper class Expression @@ -16,7 +17,9 @@ def self.build(object) name = object.keys.first args = object.values.first - args = [args] unless args.is_a?(Array) + + # Ensure args are an array, but we can't just use Array(args) because it will convert a Hash to Array + args = args.is_a?(Hash) ? [args] : Array(args) new(name, args.map { |o| build(o) }) when String, Numeric, FalseClass, TrueClass @@ -58,6 +61,10 @@ def value } end + def validate + Schema.new.validate(value) + end + private def call_with_context? diff --git a/lib/flipper/expression/constant.rb b/lib/flipper/expression/constant.rb index 35edca9e4..351d8ae7f 100644 --- a/lib/flipper/expression/constant.rb +++ b/lib/flipper/expression/constant.rb @@ -20,6 +20,10 @@ def eql?(other) other.is_a?(self.class) && other.value == value end alias_method :==, :eql? + + def validate + Schema.new.validate(value) + end end end end diff --git a/lib/flipper/expression/schema.rb b/lib/flipper/expression/schema.rb new file mode 100644 index 000000000..3868d8ec7 --- /dev/null +++ b/lib/flipper/expression/schema.rb @@ -0,0 +1,34 @@ +require "json_schemer" + +module Flipper + class Expression + class Schema < JSONSchemer::Schema::Draft7 + PATH = + Pathname.new(File.expand_path("../../../packages/expressions", __dir__)) + + def self.schemas + @schemas ||= + Hash[ + PATH + .glob("schemas/*.json") + .map { |path| [File.basename(path), JSON.parse(File.read(path))] } + ] + end + + def self.examples + PATH + .glob("examples/*.json") + .map { |path| [File.basename(path), JSON.parse(File.read(path))] } + end + + def initialize(schema = self.class.schemas["schema.json"]) + super( + schema, + insert_property_defaults: true, + ref_resolver: + lambda { |url| self.class.schemas[File.basename(url.path)] } + ) + end + end + end +end diff --git a/lib/flipper/expressions/duration.rb b/lib/flipper/expressions/duration.rb index 2a11ba658..535a7ea45 100644 --- a/lib/flipper/expressions/duration.rb +++ b/lib/flipper/expressions/duration.rb @@ -11,7 +11,7 @@ class Duration "year" => 31_556_952 # length of a gregorian year (365.2425 days) }.freeze - def self.call(scalar, unit) + def self.call(scalar, unit = 'seconds') unit = unit.to_s.downcase.chomp("s") unless scalar.is_a?(Numeric) diff --git a/packages/expressions/examples/All.json b/packages/expressions/examples/All.json index 71ef2aa66..49e906278 100644 --- a/packages/expressions/examples/All.json +++ b/packages/expressions/examples/All.json @@ -28,10 +28,13 @@ "expression": { "All": [{ "Boolean": true }, { "Property": "admin" }] }, "context": { "properties": { "admin": true } }, "result": { "enum": [true] } + }, + { + "expression": { "All": null }, + "result": { "enum": [true] } } ], "invalid": [ - { "All": null }, { "All": [], "Any": [] } ] } diff --git a/packages/expressions/examples/Any.json b/packages/expressions/examples/Any.json index 15e08741f..19b779727 100644 --- a/packages/expressions/examples/Any.json +++ b/packages/expressions/examples/Any.json @@ -32,10 +32,13 @@ "expression": { "Any": [{ "Boolean": false }, { "Property": "admin" }] }, "context": { "properties": { "admin": true } }, "result": { "enum": [true] } + }, + { + "expression": { "Any": null }, + "result": { "enum": [false] } } ], "invalid": [ - { "Any": null }, { "Any": [], "All": [] } ] } diff --git a/packages/expressions/examples/Durations.json b/packages/expressions/examples/Duration.json similarity index 81% rename from packages/expressions/examples/Durations.json rename to packages/expressions/examples/Duration.json index 6bac7e4dd..fd299f93f 100644 --- a/packages/expressions/examples/Durations.json +++ b/packages/expressions/examples/Duration.json @@ -27,11 +27,17 @@ { "expression": { "Duration": [2, "years"] }, "result": { "enum": [63113904] } + }, + { + "expression": { "Duration": 2 }, + "result": { "enum": [2] } + }, + { + "expression": { "Duration": [2] }, + "result": { "enum": [2] } } ], "invalid": [ - { "Duration": 2 }, - { "Duration": [2] }, { "Duration": [4, "score"] } ] } diff --git a/packages/expressions/examples/Max.json b/packages/expressions/examples/Max.json index a7effadeb..9d5d024c6 100644 --- a/packages/expressions/examples/Max.json +++ b/packages/expressions/examples/Max.json @@ -4,6 +4,10 @@ "expression": { "Max": [] }, "result": { "enum": [null] } }, + { + "expression": { "Max": null }, + "result": { "enum": [null] } + }, { "expression": { "Max": [3, 2, 1] }, "result": { "enum": [3] } @@ -26,7 +30,6 @@ } ], "invalid": [ - { "Max": null }, { "Max": [], "Any": [] } ] } diff --git a/packages/expressions/examples/Min.json b/packages/expressions/examples/Min.json index 47199a5da..19ffdc45e 100644 --- a/packages/expressions/examples/Min.json +++ b/packages/expressions/examples/Min.json @@ -4,6 +4,10 @@ "expression": { "Min": [] }, "result": { "enum": [null] } }, + { + "expression": { "Min": null }, + "result": { "enum": [null] } + }, { "expression": { "Min": [3, 2, 1] }, "result": { "enum": [1] } @@ -26,7 +30,6 @@ } ], "invalid": [ - { "Min": null }, { "Min": [], "Any": [] } ] } diff --git a/packages/expressions/examples/Now.json b/packages/expressions/examples/Now.json index 58595258c..ee0faa75c 100644 --- a/packages/expressions/examples/Now.json +++ b/packages/expressions/examples/Now.json @@ -4,13 +4,16 @@ "expression": { "Now": [] }, "result": { "format": "date-time" } }, + { + "expression": { "Now": null }, + "result": { "format": "date-time" } + }, { "expression": { "String": {"Now": []} }, "result": { "pattern": "UTC$" } } ], "invalid": [ - { "Now": null }, { "Now": [1] }, { "Now": 1 } ] diff --git a/packages/expressions/examples/Random.json b/packages/expressions/examples/Random.json index 723d9edd0..e6d5085ad 100644 --- a/packages/expressions/examples/Random.json +++ b/packages/expressions/examples/Random.json @@ -4,6 +4,10 @@ "expression": { "Random": [] }, "result": { "type": "float", "minimum": 0, "maximum": 1 } }, + { + "expression": { "Random": null }, + "result": { "type": "float", "minimum": 0, "maximum": 1 } + }, { "expression": { "Random": 2 }, "result": { "type": "integer", "minimum": 0, "maximum": 1 } @@ -19,7 +23,6 @@ } ], "invalid": [ - { "Random": null }, { "Random": [1, 2] } ] } diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 97cefd8b9..16e28e7e7 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,3 +1,3 @@ export { default as schemas } from '../schemas' -export { default as validator } from './validator' +export { default as validate } from './validate' export { default as examples } from '../examples' diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js new file mode 100644 index 000000000..9badb3aee --- /dev/null +++ b/packages/expressions/lib/validate.js @@ -0,0 +1,34 @@ +import Ajv from 'ajv' +import addFormats from 'ajv-formats' +import schemas from '../schemas' + +const ajv = new Ajv({ + schemas: Object.values(schemas), + useDefaults: true, + allErrors: true +}) +addFormats(ajv) +const validator = ajv.getSchema(schemas.default.$id) + +function coerceArgsToArray(object) { + if (object && typeof object === 'object') { + return Object.fromEntries(Object.entries(object).map(([key, value]) => { + if(value === null) { + value = [] + } else if(!Array.isArray(value)){ + value = [value] + } + + return [key, value.map(coerceArgsToArray)] + })) + } else { + return object + } +} + +export default (input) => { + const result = coerceArgsToArray(input) + const valid = validator(result) + const errors = validator.errors + return { valid, errors, result } +} diff --git a/packages/expressions/lib/validator.js b/packages/expressions/lib/validator.js deleted file mode 100644 index e415b58b2..000000000 --- a/packages/expressions/lib/validator.js +++ /dev/null @@ -1,9 +0,0 @@ -import Ajv from 'ajv' -import addFormats from 'ajv-formats' -import schemas from '../schemas' - -export default function (options = { allErrors: true, verbose: true }) { - const ajv = new Ajv({ schemas: Object.values(schemas) }) - addFormats(ajv) - return ajv.getSchema(schemas.default.$id) -} diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json index d1b242e7c..6ebf7831c 100644 --- a/packages/expressions/schemas/All.schema.json +++ b/packages/expressions/schemas/All.schema.json @@ -2,5 +2,6 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/All.schema.json", "title": "All", + "description": "Returns true if all of the expressions return true.", "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json index fd0b049e7..c1fc227bf 100644 --- a/packages/expressions/schemas/Any.schema.json +++ b/packages/expressions/schemas/Any.schema.json @@ -2,5 +2,6 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Any.schema.json", "title": "Any", + "description": "Returns true if any of the expressions return true.", "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index 1ebf5e82f..e3cf51937 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -7,13 +7,14 @@ "items": [ { "$ref": "schema.json#/$defs/number" }, { - "oneOf": [ - { "$ref": "schema.json#/$defs/function" }, - { "$ref": "#/$defs/unit" } - ] + "anyOf": [ + { "$ref": "#/$defs/unit" }, + { "$ref": "schema.json#/$defs/function" } + ], + "default": "seconds" } ], - "minItems": 2, + "minItems": 1, "maxItems": 2, "$defs": { "unit": { diff --git a/packages/expressions/schemas/Max.schema.json b/packages/expressions/schemas/Max.schema.json index ecd8c84ab..d860a70d2 100644 --- a/packages/expressions/schemas/Max.schema.json +++ b/packages/expressions/schemas/Max.schema.json @@ -2,5 +2,6 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Max.schema.json", "title": "Max", + "description": "Returns the maximum value in a list.", "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Min.schema.json b/packages/expressions/schemas/Min.schema.json index 8fcc527fa..564d51f1e 100644 --- a/packages/expressions/schemas/Min.schema.json +++ b/packages/expressions/schemas/Min.schema.json @@ -2,5 +2,6 @@ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/Min.schema.json", "title": "Min", + "description": "Returns the minimum value in a list.", "$ref": "schema.json#/$defs/arguments-n" } diff --git a/packages/expressions/schemas/Percentage.schema.json b/packages/expressions/schemas/Percentage.schema.json index b9234e571..c74652b0a 100644 --- a/packages/expressions/schemas/Percentage.schema.json +++ b/packages/expressions/schemas/Percentage.schema.json @@ -3,8 +3,8 @@ "$id": "https://www.flippercloud.io/expressions/Percentage.schema.json", "title": "Percentage", "description": "Cast a value to a percentage between 0 and 100.", - "oneOf": [ - { "$ref": "schema.json#/$defs/number" }, - { "type": "array", "items": { "$ref": "schema.json#/$defs/number" }, "minItems": 1, "maxItems": 1 } - ] + "type": "array", + "items": { "$ref": "schema.json#/$defs/number" }, + "minItems": 1, + "maxItems": 1 } diff --git a/packages/expressions/schemas/Property.schema.json b/packages/expressions/schemas/Property.schema.json index 9e3dd19f5..303319013 100644 --- a/packages/expressions/schemas/Property.schema.json +++ b/packages/expressions/schemas/Property.schema.json @@ -3,8 +3,8 @@ "$id": "https://www.flippercloud.io/expressions/Property.schema.json", "title": "Property", "description": "Extract a property from context[properties].", - "oneOf": [ - { "$ref": "schema.json#/$defs/string" }, - { "type": "array", "items": { "$ref": "schema.json#/$defs/string" }, "minItems": 1, "maxItems": 1 } - ] + "type": "array", + "items": { "$ref": "schema.json#/$defs/string" }, + "minItems": 1, + "maxItems": 1 } diff --git a/packages/expressions/schemas/Random.schema.json b/packages/expressions/schemas/Random.schema.json index 724557781..45827b0f1 100644 --- a/packages/expressions/schemas/Random.schema.json +++ b/packages/expressions/schemas/Random.schema.json @@ -3,8 +3,7 @@ "$id": "https://www.flippercloud.io/expressions/Random.schema.json", "title": "Random", "description": "Return a random number", - "oneOf": [ - { "$ref": "schema.json#/$defs/number" }, - { "type": "array", "items": { "$ref": "schema.json#/$defs/number" }, "maxItems": 1 } - ] + "type": "array", + "items": { "$ref": "schema.json#/$defs/number" }, + "maxItems": 1 } diff --git a/packages/expressions/schemas/Time.schema.json b/packages/expressions/schemas/Time.schema.json index ef40e34ef..aa98f8e43 100644 --- a/packages/expressions/schemas/Time.schema.json +++ b/packages/expressions/schemas/Time.schema.json @@ -3,15 +3,15 @@ "$id": "https://www.flippercloud.io/expressions/Time.schema.json", "title": "Time", "description": "A time in ISO8601 format", - "oneOf": [ - { "$ref": "#/$defs/argument" }, - { "type": "array", "minItems": 1, "maxItems": 1, "items": { "$ref": "#/$defs/argument" } } - ], + "type": "array", + "minItems": 1, + "maxItems": 1, + "items": { "$ref": "#/$defs/argument" }, "$defs": { "argument": { - "oneOf": [ - { "$ref": "schema.json#/$defs/function" }, - { "type": "string", "format": "date-time" } + "anyOf": [ + { "type": "string", "format": "date-time" }, + { "$ref": "schema.json#/$defs/function" } ] } } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 6bcdf006e..921537f53 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -6,12 +6,13 @@ "$ref": "#/$defs/expression", "$defs": { "expression": { + "title": "Expression", "description": "An expression can be a function or a constant (string, boolean, or number)", - "oneOf": [ + "anyOf": [ { "$ref": "#/$defs/function" }, { "type": "string" }, - { "type": "boolean" }, - { "type": "number" } + { "type": "number" }, + { "type": "boolean" } ] }, "function": { @@ -45,38 +46,36 @@ }, "string": { "description": "A constant string value or a function that returns a string", - "oneOf": [ - { "$ref": "#/$defs/function" }, - { "type": "string" } + "anyOf": [ + { "type": "string" }, + { "$ref": "#/$defs/function" } ] }, "number": { "description": "A constant numeric value or a function that returns a number", - "oneOf": [ - { "$ref": "#/$defs/function" }, - { "type": "number" } + "anyOf": [ + { "type": "number" }, + { "$ref": "#/$defs/function" } ] }, "arguments-n": { "description": "A single expression or an array of expressions", - "oneOf": [ - { "$ref": "#/$defs/expression" }, - { "type": "array", "items": { "$ref": "#/$defs/expression" } } - ] + "type": "array", + "items": { "$ref": "#/$defs/expression" } }, "arguments-two": { "description": "An array with exactly two expressions", "type": "array", "items": { "$ref": "#/$defs/expression" }, - "maxItems": 2, - "minItems": 2 + "minItems": 2, + "maxItems": 2 }, "argument": { "description": "A single expression or an array with at most one expression", - "oneOf": [ - { "$ref": "#/$defs/expression" }, - { "type": "array", "items": { "$ref": "#/$defs/expression" }, "maxItems": 1 } - ] + "type": "array", + "items": { "$ref": "#/$defs/expression" }, + "minItems": 1, + "maxItems": 1 } } } diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 782d2341e..1a6f9962a 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,14 +1,13 @@ import { describe, test, expect } from 'vitest' -import { validator } from '../lib' +import { validate } from '../lib' import examples from '../examples' -const expressionsValidator = validator() - expect.extend({ - toBeValid (received, validate = expressionsValidator) { + toBeValid (received) { + const { valid, errors } = validate(received) return { - pass: validate(received), - message: () => JSON.stringify(validate.errors, null, 2) + pass: valid, + message: () => JSON.stringify(errors, null, 2) } } }) diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expressions_schema_spec.rb index 30cee1d3e..7018e0f3d 100644 --- a/spec/flipper/expressions_schema_spec.rb +++ b/spec/flipper/expressions_schema_spec.rb @@ -1,39 +1,26 @@ -require 'json_schemer' +require "json_schemer" RSpec.describe Flipper::Expressions do - PATH = Pathname.new(File.expand_path('../../packages/expressions', __dir__)) + let(:schema) { Flipper::Expression::Schema.new } - SCHEMAS = Hash[PATH.glob('schemas/*.json').map do |path| - [File.basename(path), JSON.parse(File.read(path))] - end] - - let(:schema) do - JSONSchemer.schema(SCHEMAS["schema.json"], ref_resolver: lambda {|url| - SCHEMAS[File.basename(url.path)] - }) - end - - PATH.glob('examples/*.json').each do |path| - describe(File.basename(path, '.json')) do - examples = JSON.parse(File.read(path)) + Flipper::Expression::Schema.examples.each do |name, examples| + describe(name) do examples["valid"].each do |example| - expression, context, result = example.values_at("expression", "context", "result") + expression, context, result = example.values_at("expression", "context", "result") context&.transform_keys!(&:to_sym) describe expression.inspect do it "is valid" do - expect(schema.validate(expression).to_a).to eq([]) + errors = Flipper::Expression.build(expression).validate + expect(errors.to_a).to eq([]) end - it "evaluates to #{result.inspect}#{ " with context " + context.inspect if context}" do - evaluated_result = Flipper::Expression.build(expression).evaluate(context || {} ) - expected_schema = JSONSchemer.schema(result, before_property_validation: lambda {|data, property, property_schema, _parent| - puts "BEFORE: #{[data, property, property_schema, _parent].inspect}" - }) + it "evaluates to #{result.inspect}#{" with context " + context.inspect if context}" do + evaluated_result = Flipper::Expression.build(expression).evaluate(context || {}) + expected_schema = JSONSchemer.schema(result) expect(expected_schema.validate(evaluated_result).to_a).to eq([]) end end - end examples["invalid"].each do |example| From 48308dd9a427acda54e7b826e4e2e965489e2eb8 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 1 Apr 2023 16:23:13 -0400 Subject: [PATCH 15/44] Add json_schemer as a dependency --- Gemfile | 1 - flipper.gemspec | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index cdabdbd62..6caddc9e2 100644 --- a/Gemfile +++ b/Gemfile @@ -23,7 +23,6 @@ gem 'stackprof' gem 'benchmark-ips' gem 'stackprof-webnav' gem 'flamegraph' -gem "json_schemer", "~> 0.2.24" group(:guard) do gem 'guard', '~> 2.15' diff --git a/flipper.gemspec b/flipper.gemspec index 9e8b21478..573ca5eb1 100644 --- a/flipper.gemspec +++ b/flipper.gemspec @@ -35,4 +35,5 @@ Gem::Specification.new do |gem| gem.metadata = Flipper::METADATA gem.add_dependency 'concurrent-ruby', '< 2' + gem.add_dependency 'json_schemer' end From 81a1d65c81fe1520717a048326bc09f4fa95c62c Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 1 Apr 2023 16:23:32 -0400 Subject: [PATCH 16/44] Fix JS lint --- packages/expressions/lib/validate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js index 9badb3aee..06a3e3563 100644 --- a/packages/expressions/lib/validate.js +++ b/packages/expressions/lib/validate.js @@ -10,12 +10,12 @@ const ajv = new Ajv({ addFormats(ajv) const validator = ajv.getSchema(schemas.default.$id) -function coerceArgsToArray(object) { +function coerceArgsToArray (object) { if (object && typeof object === 'object') { return Object.fromEntries(Object.entries(object).map(([key, value]) => { - if(value === null) { + if (value === null) { value = [] - } else if(!Array.isArray(value)){ + } else if (!Array.isArray(value)) { value = [value] } From b8279c5131a43dafb91f9aec542e07e5df42b4ad Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sun, 2 Apr 2023 08:39:17 -0400 Subject: [PATCH 17/44] Validate schemas in strict mode --- lib/flipper/expressions/duration.rb | 2 +- packages/expressions/examples/Duration.json | 12 +++--------- packages/expressions/lib/validate.js | 3 ++- packages/expressions/schemas/Duration.schema.json | 5 ++--- 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/lib/flipper/expressions/duration.rb b/lib/flipper/expressions/duration.rb index 535a7ea45..2a11ba658 100644 --- a/lib/flipper/expressions/duration.rb +++ b/lib/flipper/expressions/duration.rb @@ -11,7 +11,7 @@ class Duration "year" => 31_556_952 # length of a gregorian year (365.2425 days) }.freeze - def self.call(scalar, unit = 'seconds') + def self.call(scalar, unit) unit = unit.to_s.downcase.chomp("s") unless scalar.is_a?(Numeric) diff --git a/packages/expressions/examples/Duration.json b/packages/expressions/examples/Duration.json index fd299f93f..f8f603615 100644 --- a/packages/expressions/examples/Duration.json +++ b/packages/expressions/examples/Duration.json @@ -27,17 +27,11 @@ { "expression": { "Duration": [2, "years"] }, "result": { "enum": [63113904] } - }, - { - "expression": { "Duration": 2 }, - "result": { "enum": [2] } - }, - { - "expression": { "Duration": [2] }, - "result": { "enum": [2] } } ], "invalid": [ - { "Duration": [4, "score"] } + { "Duration": [4, "score"] }, + { "Duration": 2 }, + { "Duration": [2] } ] } diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js index 06a3e3563..252e92674 100644 --- a/packages/expressions/lib/validate.js +++ b/packages/expressions/lib/validate.js @@ -5,7 +5,8 @@ import schemas from '../schemas' const ajv = new Ajv({ schemas: Object.values(schemas), useDefaults: true, - allErrors: true + allErrors: true, + strict: true }) addFormats(ajv) const validator = ajv.getSchema(schemas.default.$id) diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index e3cf51937..ac8e2f439 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -10,11 +10,10 @@ "anyOf": [ { "$ref": "#/$defs/unit" }, { "$ref": "schema.json#/$defs/function" } - ], - "default": "seconds" + ] } ], - "minItems": 1, + "minItems": 2, "maxItems": 2, "$defs": { "unit": { From 270f290df0bb9e3c0d0ad25af523392f50bf26d5 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 3 Apr 2023 07:44:35 -0400 Subject: [PATCH 18/44] $defs => definitions for draft 7 --- packages/expressions/README.md | 2 +- packages/expressions/schemas/All.schema.json | 2 +- packages/expressions/schemas/Any.schema.json | 2 +- .../expressions/schemas/Boolean.schema.json | 2 +- .../expressions/schemas/Duration.schema.json | 8 ++--- .../expressions/schemas/Equal.schema.json | 2 +- .../schemas/GreaterThan.schema.json | 2 +- .../schemas/GreaterThanOrEqualTo.schema.json | 2 +- .../expressions/schemas/LessThan.schema.json | 2 +- .../schemas/LessThanOrEqualTo.schema.json | 2 +- packages/expressions/schemas/Max.schema.json | 2 +- packages/expressions/schemas/Min.schema.json | 2 +- .../expressions/schemas/NotEqual.schema.json | 2 +- .../expressions/schemas/Number.schema.json | 2 +- .../schemas/Percentage.schema.json | 2 +- .../schemas/PercentageOfActors.schema.json | 4 +-- .../expressions/schemas/Property.schema.json | 2 +- .../expressions/schemas/Random.schema.json | 2 +- .../expressions/schemas/String.schema.json | 2 +- packages/expressions/schemas/Time.schema.json | 6 ++-- packages/expressions/schemas/schema.json | 31 ++++++++++++------- packages/expressions/test/schemas.test.js | 3 +- 22 files changed, 47 insertions(+), 39 deletions(-) diff --git a/packages/expressions/README.md b/packages/expressions/README.md index 95a93c09a..aa19cf8aa 100644 --- a/packages/expressions/README.md +++ b/packages/expressions/README.md @@ -9,7 +9,7 @@ To learn more about JSON Schema, read [Understanding JSON Schema](https://json-s ## Adding a new expression 1. Describe arguments by creating a new file in [`schemas/`](schemas/) named `NewName.schema.json`. You can copy an existing function that has similar semantics to get started. -2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `$defs/function`. +2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `definitions/function`. 3. Create a new file in [`examples/`](./examples) named `NewName.json` with valid and invalid examples for the new function. See other examples for inspiration. 4. Run `yarn test` in `packages/expressions` and ensure tests pass. 5. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/). diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json index 6ebf7831c..adfb0fcc2 100644 --- a/packages/expressions/schemas/All.schema.json +++ b/packages/expressions/schemas/All.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/All.schema.json", "title": "All", "description": "Returns true if all of the expressions return true.", - "$ref": "schema.json#/$defs/arguments-n" + "$ref": "schema.json#/definitions/arguments-n" } diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json index c1fc227bf..2c3c935f2 100644 --- a/packages/expressions/schemas/Any.schema.json +++ b/packages/expressions/schemas/Any.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Any.schema.json", "title": "Any", "description": "Returns true if any of the expressions return true.", - "$ref": "schema.json#/$defs/arguments-n" + "$ref": "schema.json#/definitions/arguments-n" } diff --git a/packages/expressions/schemas/Boolean.schema.json b/packages/expressions/schemas/Boolean.schema.json index 4852cd7af..601034e9b 100644 --- a/packages/expressions/schemas/Boolean.schema.json +++ b/packages/expressions/schemas/Boolean.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Boolean.schema.json", "title": "Boolean", "description": "Cast a value to a boolean.", - "$ref": "schema.json#/$defs/argument" + "$ref": "schema.json#/definitions/argument" } diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index ac8e2f439..6e99d8e0b 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -5,17 +5,17 @@ "description": "A period of time expressed as a number of seconds, minutes, hours, days, weeks, months, or years.", "type": "array", "items": [ - { "$ref": "schema.json#/$defs/number" }, + { "$ref": "schema.json#/definitions/number" }, { "anyOf": [ - { "$ref": "#/$defs/unit" }, - { "$ref": "schema.json#/$defs/function" } + { "$ref": "#/definitions/unit" }, + { "$ref": "schema.json#/definitions/function" } ] } ], "minItems": 2, "maxItems": 2, - "$defs": { + "definitions": { "unit": { "type": "string", "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json index 118affd93..52f5cf1f9 100644 --- a/packages/expressions/schemas/Equal.schema.json +++ b/packages/expressions/schemas/Equal.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", "title": "Equal", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json index 421111414..9d996ac8d 100644 --- a/packages/expressions/schemas/GreaterThan.schema.json +++ b/packages/expressions/schemas/GreaterThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", "title": "GreaterThan", "description": "Compare if the first argument is > the second argument.", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json index cba53a572..3eebfb45e 100644 --- a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", "title": "GreaterThanOrEqualTo", "description": "Compare if the first argument is >= the second argument.", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json index 496b7f792..f7d82f054 100644 --- a/packages/expressions/schemas/LessThan.schema.json +++ b/packages/expressions/schemas/LessThan.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", "title": "LessThan", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json index dc01097fe..8acb178ea 100644 --- a/packages/expressions/schemas/LessThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/LessThanOrEqualTo.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", "title": "LessThanOrEqualTo", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/Max.schema.json b/packages/expressions/schemas/Max.schema.json index d860a70d2..f372a815f 100644 --- a/packages/expressions/schemas/Max.schema.json +++ b/packages/expressions/schemas/Max.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Max.schema.json", "title": "Max", "description": "Returns the maximum value in a list.", - "$ref": "schema.json#/$defs/arguments-n" + "$ref": "schema.json#/definitions/arguments-n" } diff --git a/packages/expressions/schemas/Min.schema.json b/packages/expressions/schemas/Min.schema.json index 564d51f1e..4e5a92d84 100644 --- a/packages/expressions/schemas/Min.schema.json +++ b/packages/expressions/schemas/Min.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Min.schema.json", "title": "Min", "description": "Returns the minimum value in a list.", - "$ref": "schema.json#/$defs/arguments-n" + "$ref": "schema.json#/definitions/arguments-n" } diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json index 842ae7c6f..411312f0f 100644 --- a/packages/expressions/schemas/NotEqual.schema.json +++ b/packages/expressions/schemas/NotEqual.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", "title": "NotEqual", "description": "Compare two values for equality", - "$ref": "schema.json#/$defs/arguments-two" + "$ref": "schema.json#/definitions/arguments-two" } diff --git a/packages/expressions/schemas/Number.schema.json b/packages/expressions/schemas/Number.schema.json index 110b7f513..5dfaf044d 100644 --- a/packages/expressions/schemas/Number.schema.json +++ b/packages/expressions/schemas/Number.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/Number.schema.json", "title": "Number", "description": "Cast a value to a number.", - "$ref": "schema.json#/$defs/argument" + "$ref": "schema.json#/definitions/argument" } diff --git a/packages/expressions/schemas/Percentage.schema.json b/packages/expressions/schemas/Percentage.schema.json index c74652b0a..588dab5cb 100644 --- a/packages/expressions/schemas/Percentage.schema.json +++ b/packages/expressions/schemas/Percentage.schema.json @@ -4,7 +4,7 @@ "title": "Percentage", "description": "Cast a value to a percentage between 0 and 100.", "type": "array", - "items": { "$ref": "schema.json#/$defs/number" }, + "items": { "$ref": "schema.json#/definitions/number" }, "minItems": 1, "maxItems": 1 } diff --git a/packages/expressions/schemas/PercentageOfActors.schema.json b/packages/expressions/schemas/PercentageOfActors.schema.json index 98853acbc..e51210429 100644 --- a/packages/expressions/schemas/PercentageOfActors.schema.json +++ b/packages/expressions/schemas/PercentageOfActors.schema.json @@ -5,8 +5,8 @@ "description": "", "type": "array", "items": [ - { "$ref": "schema.json#/$defs/string" }, - { "$ref": "schema.json#/$defs/number" } + { "$ref": "schema.json#/definitions/string" }, + { "$ref": "schema.json#/definitions/number" } ], "minItems": 2, "maxItems": 2 diff --git a/packages/expressions/schemas/Property.schema.json b/packages/expressions/schemas/Property.schema.json index 303319013..0d564ad05 100644 --- a/packages/expressions/schemas/Property.schema.json +++ b/packages/expressions/schemas/Property.schema.json @@ -4,7 +4,7 @@ "title": "Property", "description": "Extract a property from context[properties].", "type": "array", - "items": { "$ref": "schema.json#/$defs/string" }, + "items": { "$ref": "schema.json#/definitions/string" }, "minItems": 1, "maxItems": 1 } diff --git a/packages/expressions/schemas/Random.schema.json b/packages/expressions/schemas/Random.schema.json index 45827b0f1..e85f18e81 100644 --- a/packages/expressions/schemas/Random.schema.json +++ b/packages/expressions/schemas/Random.schema.json @@ -4,6 +4,6 @@ "title": "Random", "description": "Return a random number", "type": "array", - "items": { "$ref": "schema.json#/$defs/number" }, + "items": { "$ref": "schema.json#/definitions/number" }, "maxItems": 1 } diff --git a/packages/expressions/schemas/String.schema.json b/packages/expressions/schemas/String.schema.json index 459355dad..9c5a4ea2b 100644 --- a/packages/expressions/schemas/String.schema.json +++ b/packages/expressions/schemas/String.schema.json @@ -3,5 +3,5 @@ "$id": "https://www.flippercloud.io/expressions/String.schema.json", "title": "String", "description": "Cast a value to a string.", - "$ref": "schema.json#/$defs/argument" + "$ref": "schema.json#/definitions/argument" } diff --git a/packages/expressions/schemas/Time.schema.json b/packages/expressions/schemas/Time.schema.json index aa98f8e43..64589da3c 100644 --- a/packages/expressions/schemas/Time.schema.json +++ b/packages/expressions/schemas/Time.schema.json @@ -4,14 +4,14 @@ "title": "Time", "description": "A time in ISO8601 format", "type": "array", + "items": { "$ref": "#/definitions/argument" }, "minItems": 1, "maxItems": 1, - "items": { "$ref": "#/$defs/argument" }, - "$defs": { + "definitions": { "argument": { "anyOf": [ { "type": "string", "format": "date-time" }, - { "$ref": "schema.json#/$defs/function" } + { "$ref": "schema.json#/definitions/function" } ] } } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 921537f53..5d7b75c81 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -3,19 +3,27 @@ "$id": "https://www.flippercloud.io/expressions/schema.json", "title": "Flipper Expressions", "description": "TODO", - "$ref": "#/$defs/expression", - "$defs": { + "$ref": "#/definitions/expression", + "definitions": { "expression": { "title": "Expression", - "description": "An expression can be a function or a constant (string, boolean, or number)", + "description": "An expression can be a Function or a Constant", + "anyOf": [ + { "$ref": "#/definitions/constant" }, + { "$ref": "#/definitions/function" } + ] + }, + "constant": { + "title": "Constant", + "description": "A constant value can be a string, number or boolean", "anyOf": [ - { "$ref": "#/$defs/function" }, { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] }, "function": { + "title": "Function", "description": "A function is an object with a single property that is the name of the function and the value is the arguments to the function", "type": "object", "maxProperties": 1, @@ -48,32 +56,33 @@ "description": "A constant string value or a function that returns a string", "anyOf": [ { "type": "string" }, - { "$ref": "#/$defs/function" } + { "$ref": "#/definitions/function" } ] }, "number": { "description": "A constant numeric value or a function that returns a number", "anyOf": [ { "type": "number" }, - { "$ref": "#/$defs/function" } + { "$ref": "#/definitions/function" } ] }, "arguments-n": { - "description": "A single expression or an array of expressions", + "description": "An array of expressions", "type": "array", - "items": { "$ref": "#/$defs/expression" } + "items": { "$ref": "#/definitions/expression" }, + "minItems": 0 }, "arguments-two": { "description": "An array with exactly two expressions", "type": "array", - "items": { "$ref": "#/$defs/expression" }, + "items": { "$ref": "#/definitions/expression" }, "minItems": 2, "maxItems": 2 }, "argument": { - "description": "A single expression or an array with at most one expression", + "description": "An array with exactly one expression", "type": "array", - "items": { "$ref": "#/$defs/expression" }, + "items": { "$ref": "#/definitions/expression" }, "minItems": 1, "maxItems": 1 } diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 1a6f9962a..91438594f 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,6 +1,5 @@ import { describe, test, expect } from 'vitest' -import { validate } from '../lib' -import examples from '../examples' +import { validate, examples } from '../lib' expect.extend({ toBeValid (received) { From 8f69da49f72d42495283aa2dfd4781dee9ecaef8 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 10 Apr 2023 08:50:49 -0400 Subject: [PATCH 19/44] Build sourcemaps --- packages/expressions/vite.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/expressions/vite.config.js b/packages/expressions/vite.config.js index 13f9e9ae7..a4961e27f 100644 --- a/packages/expressions/vite.config.js +++ b/packages/expressions/vite.config.js @@ -4,6 +4,7 @@ import { defineConfig } from 'vite' export default defineConfig({ build: { + sourcemap: true, lib: { entry: resolve(__dirname, 'lib/index.js'), name: '@flippercloud.io/expressions' From a498b3a7dcf89c0b015ea50f4f27bb9de47f6634 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 3 Apr 2023 22:05:18 -0400 Subject: [PATCH 20/44] Add explorer to inspect information about the schema --- packages/expressions/lib/explorer.js | 42 ++++++++++++++++++++++ packages/expressions/lib/index.js | 8 +++-- packages/expressions/lib/validate.js | 4 +-- packages/expressions/package.json | 3 +- packages/expressions/schemas/index.js | 6 ++-- packages/expressions/test/explorer.test.js | 18 ++++++++++ packages/expressions/yarn.lock | 12 +++++++ 7 files changed, 85 insertions(+), 8 deletions(-) create mode 100644 packages/expressions/lib/explorer.js create mode 100644 packages/expressions/test/explorer.test.js diff --git a/packages/expressions/lib/explorer.js b/packages/expressions/lib/explorer.js new file mode 100644 index 000000000..b6f5b2d2c --- /dev/null +++ b/packages/expressions/lib/explorer.js @@ -0,0 +1,42 @@ +import pointer from 'json-pointer' + +export class Explorer { + constructor (schemas, baseURI) { + this.schemas = schemas + this.baseURI = baseURI + } + + // Get a ref from the schema + get (ref, baseURI = this.baseURI) { + const uri = new URL(ref, baseURI).href + const [$id, path] = uri.split('#') + const schema = this.schemas[$id] + return this.proxy(path ? pointer.get(schema, path) : schema, uri) + } + + // Returns a proxy to the schema that resolves $refs + proxy (schema, uri) { + const self = this + return new Proxy(schema, { + get (target, property, receiver) { + const value = target[property] + + if (value !== null && typeof value === 'object') { + // Schema returns an object for this property, proxy it as well + return new Proxy(value, this) + } else if (value !== undefined) { + // Schema returns a value for this property, return it + return value + } else if (target.$ref) { + // Schema includes a ref, so delegate to it + return self.get(target.$ref, uri)[property] + } + } + }) + } + + // Returns a list of the functions defined in the schema + get functions () { + return this.get('#/definitions/function/properties') + } +} diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 16e28e7e7..d4884902b 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,3 +1,7 @@ -export { default as schemas } from '../schemas' -export { default as validate } from './validate' +import schemas, { BaseURI } from '../schemas' +import { Explorer } from './explorer' + +export const explorer = new Explorer(schemas, BaseURI) +export { schemas } export { default as examples } from '../examples' +export { default as validate } from './validate' diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js index 252e92674..aef107751 100644 --- a/packages/expressions/lib/validate.js +++ b/packages/expressions/lib/validate.js @@ -1,6 +1,6 @@ import Ajv from 'ajv' import addFormats from 'ajv-formats' -import schemas from '../schemas' +import schemas, { BaseURI } from '../schemas' const ajv = new Ajv({ schemas: Object.values(schemas), @@ -9,7 +9,7 @@ const ajv = new Ajv({ strict: true }) addFormats(ajv) -const validator = ajv.getSchema(schemas.default.$id) +const validator = ajv.getSchema(BaseURI) function coerceArgsToArray (object) { if (object && typeof object === 'object') { diff --git a/packages/expressions/package.json b/packages/expressions/package.json index 76052a980..c184a33bb 100644 --- a/packages/expressions/package.json +++ b/packages/expressions/package.json @@ -20,7 +20,8 @@ "license": "MIT", "dependencies": { "ajv": "^8.12.0", - "ajv-formats": "^2.1.1" + "ajv-formats": "^2.1.1", + "json-pointer": "^0.6.2" }, "devDependencies": { "standard": "^17.0.0", diff --git a/packages/expressions/schemas/index.js b/packages/expressions/schemas/index.js index 0817fd3cf..468b257fd 100644 --- a/packages/expressions/schemas/index.js +++ b/packages/expressions/schemas/index.js @@ -1,7 +1,7 @@ const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) -const schemas = Object.fromEntries(Object.entries(modules).map(([path, module]) => { - const name = path.split('/').pop().split('.').shift() - return [name === 'schema' ? 'default' : name, module] +const schemas = Object.fromEntries(Object.values(modules).map(module => { + return [module.$id, module] })) +export const BaseURI = modules['./schema.json'].$id export default schemas diff --git a/packages/expressions/test/explorer.test.js b/packages/expressions/test/explorer.test.js new file mode 100644 index 000000000..5c126c59b --- /dev/null +++ b/packages/expressions/test/explorer.test.js @@ -0,0 +1,18 @@ +import { describe, test, expect } from 'vitest' +import { explorer } from '../lib' + +describe('explorer', () => { + test('resolves refs', () => { + const schema = explorer.get('#') + expect(schema.anyOf).not.toBeUndefined() + }) + + describe('functions', () => { + test('returns all functions with their schemas', () => { + expect(Object.keys(explorer.functions)).toEqual(expect.arrayContaining([ + 'All', 'Any', 'Boolean', 'Time' + ])) + expect(explorer.functions.All.title).toEqual('All') + }) + }) +}) diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock index 2eeb7d74f..aef09b24a 100644 --- a/packages/expressions/yarn.lock +++ b/packages/expressions/yarn.lock @@ -916,6 +916,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" +foreach@^2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" + integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1260,6 +1265,13 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-pointer@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" + integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== + dependencies: + foreach "^2.0.4" + 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" From a2c501ac45eb690d7f0f3299419ce9b507e798c2 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Tue, 4 Apr 2023 09:58:39 -0400 Subject: [PATCH 21/44] Add simple js expression model --- packages/expressions/lib/constant.js | 12 +++++++ packages/expressions/lib/explorer.js | 3 ++ packages/expressions/lib/expression.js | 37 ++++++++++++++++++++ packages/expressions/lib/index.js | 9 +++-- packages/expressions/package.json | 3 +- packages/expressions/test/expression.test.js | 32 +++++++++++++++++ packages/expressions/yarn.lock | 5 +++ 7 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 packages/expressions/lib/constant.js create mode 100644 packages/expressions/lib/expression.js create mode 100644 packages/expressions/test/expression.test.js diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js new file mode 100644 index 000000000..ec3c8d671 --- /dev/null +++ b/packages/expressions/lib/constant.js @@ -0,0 +1,12 @@ +// Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). +// +// Implements the same interface as Expression +export class Constant { + constructor (value) { + this.value = value + } + + get args () { + return [this.value] + } +} diff --git a/packages/expressions/lib/explorer.js b/packages/expressions/lib/explorer.js index b6f5b2d2c..5f324259d 100644 --- a/packages/expressions/lib/explorer.js +++ b/packages/expressions/lib/explorer.js @@ -1,3 +1,4 @@ +import schemas, { BaseURI } from '../schemas' import pointer from 'json-pointer' export class Explorer { @@ -40,3 +41,5 @@ export class Explorer { return this.get('#/definitions/function/properties') } } + +export default new Explorer(schemas, BaseURI) diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js new file mode 100644 index 000000000..f00059ab3 --- /dev/null +++ b/packages/expressions/lib/expression.js @@ -0,0 +1,37 @@ +import { v4 as uuidv4 } from 'uuid' +import { Constant } from './constant' +import explorer from './explorer' + +// Simple model to transform this: `{ All: [{ Boolean: [true] }]` +// into this: `{ id: uuidv4(), name: 'All', args: [{ id: uuidv4(), name: 'Boolean', args: [true] }] }` +export class Expression { + static build (expression) { + if (expression instanceof Expression || expression instanceof Constant) { + return expression + } + + if (typeof expression === 'object') { + const name = Object.keys(expression)[0] + const args = expression[name].map(Expression.build) + return new Expression({ name, args }) + } else { + return new Constant(expression) + } + } + + constructor ({ name, args, id = uuidv4() }) { + Object.assign(this, { name, args, id }) + } + + clone ({ id = this.id, name = this.name, args = this.args } = {}) { + return new Expression({ id, name, args: args.map(Expression.build) }) + } + + get value () { + return { [this.name]: this.args.map(arg => arg.value) } + } + + get schema () { + return explorer.functions[this.name] + } +} diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index d4884902b..0c72018fa 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,7 +1,6 @@ -import schemas, { BaseURI } from '../schemas' -import { Explorer } from './explorer' - -export const explorer = new Explorer(schemas, BaseURI) -export { schemas } +export { default as schemas, BaseURI } from '../schemas' export { default as examples } from '../examples' +export { default as explorer } from './explorer' export { default as validate } from './validate' +export { Expression } from './expression' +export { Constant } from './constant' diff --git a/packages/expressions/package.json b/packages/expressions/package.json index c184a33bb..752053e35 100644 --- a/packages/expressions/package.json +++ b/packages/expressions/package.json @@ -21,7 +21,8 @@ "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", - "json-pointer": "^0.6.2" + "json-pointer": "^0.6.2", + "uuid": "^9.0.0" }, "devDependencies": { "standard": "^17.0.0", diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js new file mode 100644 index 000000000..e13cc6193 --- /dev/null +++ b/packages/expressions/test/expression.test.js @@ -0,0 +1,32 @@ +import { describe, test, expect } from 'vitest' +import { Expression, Constant } from '../lib' + +describe('Expression', () => { + describe('build', () => { + test('builds an expression from an object', () => { + const expression = Expression.build({ All: [true] }) + expect(expression.name).toEqual('All') + expect(expression.args[0]).toBeInstanceOf(Constant) + expect(expression.args[0].value).toEqual(true) + expect(expression.value).toEqual({ All: [true] }) + }) + }) + + describe('clone', () => { + test('returns new expression', () => { + const expression = Expression.build({ All: [true] }) + const clone = expression.clone() + expect(clone).not.toBe(expression) + expect(clone.name).toEqual(expression.name) + expect(clone.args).toEqual(expression.args) + expect(clone.id).toEqual(expression.id) + }) + + test('builds args', () => { + const expression = Expression.build({ All: [] }) + const clone = expression.clone({ args: [true] }) + expect(clone.args[0]).toBeInstanceOf(Constant) + expect(clone.value).toEqual({ All: [true] }) + }) + }) +}) diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock index aef09b24a..74c1d15c6 100644 --- a/packages/expressions/yarn.lock +++ b/packages/expressions/yarn.lock @@ -2005,6 +2005,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + vite-node@0.29.8: version "0.29.8" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.29.8.tgz#6a1c9d4fb31e7b4e0f825d3a37abe3404e52bd8e" From a3b20760e6f7f3cfe8fcf1875c59540f1d947abd Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Wed, 5 Apr 2023 10:14:54 -0400 Subject: [PATCH 22/44] Add validate method to Expression/Constant --- packages/expressions/lib/constant.js | 19 +++++++++++ packages/expressions/lib/expression.js | 14 ++++++++ packages/expressions/lib/validate.js | 30 +++++++++------- .../expressions/schemas/Duration.schema.json | 15 ++++---- packages/expressions/schemas/schema.json | 16 +++++++-- packages/expressions/test/constant.test.js | 34 +++++++++++++++++++ packages/expressions/test/expression.test.js | 27 +++++++++++++++ 7 files changed, 130 insertions(+), 25 deletions(-) create mode 100644 packages/expressions/test/constant.test.js diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index ec3c8d671..3bef869d2 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -1,3 +1,5 @@ +import { useValidator } from './validate' + // Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). // // Implements the same interface as Expression @@ -9,4 +11,21 @@ export class Constant { get args () { return [this.value] } + + get schema () { + return { type: typeof this.value } + } + + validate(schema = this.schema) { + const validator = useValidator() + const data = this.value + const valid = validator.validate(schema, data) + const errors = validator.errors + return { valid, errors, data } + } + + matches(schema) { + const { valid } = this.validate(schema) + return valid + } } diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index f00059ab3..2667adf0b 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -1,6 +1,7 @@ import { v4 as uuidv4 } from 'uuid' import { Constant } from './constant' import explorer from './explorer' +import { useValidator } from './validate' // Simple model to transform this: `{ All: [{ Boolean: [true] }]` // into this: `{ id: uuidv4(), name: 'All', args: [{ id: uuidv4(), name: 'Boolean', args: [true] }] }` @@ -34,4 +35,17 @@ export class Expression { get schema () { return explorer.functions[this.name] } + + validate(schema = this.schema) { + const validator = useValidator() + const data = this.value + const valid = validator.validate(schema, data) + const errors = validator.errors + return { valid, errors, data } + } + + matches(schema) { + const { valid } = this.validate(schema) + return valid + } } diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js index aef107751..50f6974e2 100644 --- a/packages/expressions/lib/validate.js +++ b/packages/expressions/lib/validate.js @@ -2,14 +2,16 @@ import Ajv from 'ajv' import addFormats from 'ajv-formats' import schemas, { BaseURI } from '../schemas' -const ajv = new Ajv({ - schemas: Object.values(schemas), - useDefaults: true, - allErrors: true, - strict: true -}) -addFormats(ajv) -const validator = ajv.getSchema(BaseURI) +export function useValidator(schemas = []) { + const ajv = new Ajv({ + schemas, + useDefaults: true, + allErrors: true, + strict: true + }) + addFormats(ajv) + return ajv +} function coerceArgsToArray (object) { if (object && typeof object === 'object') { @@ -27,9 +29,11 @@ function coerceArgsToArray (object) { } } -export default (input) => { - const result = coerceArgsToArray(input) - const valid = validator(result) - const errors = validator.errors - return { valid, errors, result } +export const validator = useValidator(schemas) + +export default (input, validate = validator.getSchema(BaseURI)) => { + const data = coerceArgsToArray(input) + const valid = validate(data) + const errors = validate.errors + return { valid, errors, data } } diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index 6e99d8e0b..4a98d06bb 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -8,18 +8,15 @@ { "$ref": "schema.json#/definitions/number" }, { "anyOf": [ - { "$ref": "#/definitions/unit" }, + { + "type": "string", + "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], + "default": "seconds" + }, { "$ref": "schema.json#/definitions/function" } ] } ], "minItems": 2, - "maxItems": 2, - "definitions": { - "unit": { - "type": "string", - "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], - "default": "seconds" - } - } + "maxItems": 2 } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 5d7b75c81..e625f6e4a 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -17,9 +17,18 @@ "title": "Constant", "description": "A constant value can be a string, number or boolean", "anyOf": [ - { "type": "string" }, - { "type": "number" }, - { "type": "boolean" } + { + "title": "String", + "type": "string" + }, + { + "title": "Number", + "type": "number" + }, + { + "title": "Boolean", + "type": "boolean" + } ] }, "function": { @@ -73,6 +82,7 @@ "minItems": 0 }, "arguments-two": { + "title": "Comparison", "description": "An array with exactly two expressions", "type": "array", "items": { "$ref": "#/definitions/expression" }, diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js new file mode 100644 index 000000000..ec1623550 --- /dev/null +++ b/packages/expressions/test/constant.test.js @@ -0,0 +1,34 @@ +import { describe, test, expect } from 'vitest' +import { Constant } from '../lib' + +describe('Constant', () => { + describe('schema', () => { + test('returns `{ type: "string" }` for string value', () => { + expect(new Constant('string').schema).toEqual({ type: 'string' }) + }) + + test('returns `{ type: "boolean" }` for boolean value', () => { + expect(new Constant(true).schema).toEqual({ type: 'boolean' }) + }) + + test('returns `{ type: "number" }` for number value', () => { + expect(new Constant(42).schema).toEqual({ type: 'number' }) + }) + }) + + describe('validate', () => { + test('returns true for valid value', () => { + expect(new Constant(true).validate().valid).toBe(true) + }) + }) + + describe('matches', () => { + test('returns true matching schema', () => { + expect(new Constant(true).matches({ type: 'boolean' })).toBe(true) + }) + + test('returns false for different schema', () => { + expect(new Constant('string').matches({ type: 'boolean' })).toBe(false) + }) + }) +}) diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index e13cc6193..f63982a43 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -1,5 +1,6 @@ import { describe, test, expect } from 'vitest' import { Expression, Constant } from '../lib' +import { ajv } from '../lib/validate' describe('Expression', () => { describe('build', () => { @@ -29,4 +30,30 @@ describe('Expression', () => { expect(clone.value).toEqual({ All: [true] }) }) }) + + describe('validate', () => { + test('passes for valid expression', () => { + const expression = Expression.build({ All: [true] }) + expect(expression.validate().valid).toBe(true) + }) + + test('fails for invalid expression', () => { + const expression = Expression.build({ Duration: [] }) + expect(expression.validate().valid).toBe(false) + }) + }) + + describe('matches', () => { + test('returns true matching schema', () => { + const expression = Expression.build({ Any: [true] }) + const schema = ajv.getSchema("#/definitions/function") + console.log("DID IT WORK?", schema) + expect(expression.matches(schema)).toBe(true) + }) + + test('returns false for different schema', () => { + expect(new Constant('string').matches({ type: 'boolean' })).toBe(false) + }) + }) + }) From ad07179ae34de60261efccdd92e29700c4c5cb07 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 8 Apr 2023 16:24:37 -0400 Subject: [PATCH 23/44] Add simple schema class to browse and validate schemas --- packages/expressions/lib/constant.js | 19 +++------ packages/expressions/lib/explorer.js | 45 -------------------- packages/expressions/lib/expression.js | 40 ++++++++++------- packages/expressions/lib/index.js | 4 +- packages/expressions/lib/schemas.js | 32 ++++++++++++++ packages/expressions/lib/validate.js | 39 ----------------- packages/expressions/package.json | 1 - packages/expressions/schemas/index.js | 7 --- packages/expressions/schemas/schema.json | 23 ++++------ packages/expressions/test/constant.test.js | 28 ++++++------ packages/expressions/test/explorer.test.js | 18 -------- packages/expressions/test/expression.test.js | 21 +++------ packages/expressions/test/schemas.test.js | 42 ++++++++++++------ packages/expressions/yarn.lock | 12 ------ 14 files changed, 121 insertions(+), 210 deletions(-) delete mode 100644 packages/expressions/lib/explorer.js create mode 100644 packages/expressions/lib/schemas.js delete mode 100644 packages/expressions/lib/validate.js delete mode 100644 packages/expressions/schemas/index.js delete mode 100644 packages/expressions/test/explorer.test.js diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index 3bef869d2..f6bd3ab96 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -1,4 +1,4 @@ -import { useValidator } from './validate' +import { schema } from './schemas' // Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). // @@ -12,20 +12,15 @@ export class Constant { return [this.value] } - get schema () { - return { type: typeof this.value } + get validator () { + return schema.get('#/definitions/constant') } - validate(schema = this.schema) { - const validator = useValidator() - const data = this.value - const valid = validator.validate(schema, data) - const errors = validator.errors - return { valid, errors, data } + validate (validator = this.validator) { + return schema.validate(this.value, validator) } - matches(schema) { - const { valid } = this.validate(schema) - return valid + matches (localSchema) { + return this.validate(localSchema).valid } } diff --git a/packages/expressions/lib/explorer.js b/packages/expressions/lib/explorer.js deleted file mode 100644 index 5f324259d..000000000 --- a/packages/expressions/lib/explorer.js +++ /dev/null @@ -1,45 +0,0 @@ -import schemas, { BaseURI } from '../schemas' -import pointer from 'json-pointer' - -export class Explorer { - constructor (schemas, baseURI) { - this.schemas = schemas - this.baseURI = baseURI - } - - // Get a ref from the schema - get (ref, baseURI = this.baseURI) { - const uri = new URL(ref, baseURI).href - const [$id, path] = uri.split('#') - const schema = this.schemas[$id] - return this.proxy(path ? pointer.get(schema, path) : schema, uri) - } - - // Returns a proxy to the schema that resolves $refs - proxy (schema, uri) { - const self = this - return new Proxy(schema, { - get (target, property, receiver) { - const value = target[property] - - if (value !== null && typeof value === 'object') { - // Schema returns an object for this property, proxy it as well - return new Proxy(value, this) - } else if (value !== undefined) { - // Schema returns a value for this property, return it - return value - } else if (target.$ref) { - // Schema includes a ref, so delegate to it - return self.get(target.$ref, uri)[property] - } - } - }) - } - - // Returns a list of the functions defined in the schema - get functions () { - return this.get('#/definitions/function/properties') - } -} - -export default new Explorer(schemas, BaseURI) diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index 2667adf0b..618e28c84 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -1,7 +1,16 @@ import { v4 as uuidv4 } from 'uuid' import { Constant } from './constant' -import explorer from './explorer' -import { useValidator } from './validate' +import { schema } from './schemas' + +function toArray (arg) { + if (Array.isArray(arg)) { + return arg + } else if (arg === null) { + return [] + } else { + return [arg] + } +} // Simple model to transform this: `{ All: [{ Boolean: [true] }]` // into this: `{ id: uuidv4(), name: 'All', args: [{ id: uuidv4(), name: 'Boolean', args: [true] }] }` @@ -12,11 +21,17 @@ export class Expression { } if (typeof expression === 'object') { + if (Object.keys(expression).length !== 1) { + throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) + } const name = Object.keys(expression)[0] - const args = expression[name].map(Expression.build) + const args = toArray(expression[name]).map(Expression.build) + return new Expression({ name, args }) - } else { + } else if (['number', 'string', 'boolean'].includes(typeof expression)) { return new Constant(expression) + } else { + throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } } @@ -32,20 +47,15 @@ export class Expression { return { [this.name]: this.args.map(arg => arg.value) } } - get schema () { - return explorer.functions[this.name] + get validator () { + return schema.get('#') } - validate(schema = this.schema) { - const validator = useValidator() - const data = this.value - const valid = validator.validate(schema, data) - const errors = validator.errors - return { valid, errors, data } + validate (validator = this.validator) { + return schema.validate(this.value, validator) } - matches(schema) { - const { valid } = this.validate(schema) - return valid + matches (localSchema) { + return this.validate(localSchema).valid } } diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 0c72018fa..010cdd643 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,6 +1,4 @@ -export { default as schemas, BaseURI } from '../schemas' +export { schema, schemas, BaseURI } from './schemas' export { default as examples } from '../examples' -export { default as explorer } from './explorer' -export { default as validate } from './validate' export { Expression } from './expression' export { Constant } from './constant' diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js new file mode 100644 index 000000000..df8323db1 --- /dev/null +++ b/packages/expressions/lib/schemas.js @@ -0,0 +1,32 @@ +import Ajv from 'ajv' +import addFormats from 'ajv-formats' + +const modules = import.meta.glob('../schemas/*.json', { eager: true, import: 'default' }) +export const schemas = Object.values(modules) +export const BaseURI = modules['../schemas/schema.json'].$id + +class Schema { + constructor (schemas, baseURI) { + this.baseURI = baseURI + + this.ajv = new Ajv({ + schemas, + useDefaults: true, + allErrors: true, + strict: true + }) + addFormats(this.ajv) + } + + get (ref, baseURI = this.baseURI) { + return this.ajv.getSchema(new URL(ref, baseURI).href) + } + + validate (data, validator = this.get('#')) { + const valid = validator(data, schema) + const errors = validator.errors + return { valid, errors } + } +} + +export const schema = new Schema(schemas, BaseURI) diff --git a/packages/expressions/lib/validate.js b/packages/expressions/lib/validate.js deleted file mode 100644 index 50f6974e2..000000000 --- a/packages/expressions/lib/validate.js +++ /dev/null @@ -1,39 +0,0 @@ -import Ajv from 'ajv' -import addFormats from 'ajv-formats' -import schemas, { BaseURI } from '../schemas' - -export function useValidator(schemas = []) { - const ajv = new Ajv({ - schemas, - useDefaults: true, - allErrors: true, - strict: true - }) - addFormats(ajv) - return ajv -} - -function coerceArgsToArray (object) { - if (object && typeof object === 'object') { - return Object.fromEntries(Object.entries(object).map(([key, value]) => { - if (value === null) { - value = [] - } else if (!Array.isArray(value)) { - value = [value] - } - - return [key, value.map(coerceArgsToArray)] - })) - } else { - return object - } -} - -export const validator = useValidator(schemas) - -export default (input, validate = validator.getSchema(BaseURI)) => { - const data = coerceArgsToArray(input) - const valid = validate(data) - const errors = validate.errors - return { valid, errors, data } -} diff --git a/packages/expressions/package.json b/packages/expressions/package.json index 752053e35..4a62d9fe7 100644 --- a/packages/expressions/package.json +++ b/packages/expressions/package.json @@ -21,7 +21,6 @@ "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^2.1.1", - "json-pointer": "^0.6.2", "uuid": "^9.0.0" }, "devDependencies": { diff --git a/packages/expressions/schemas/index.js b/packages/expressions/schemas/index.js deleted file mode 100644 index 468b257fd..000000000 --- a/packages/expressions/schemas/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) -const schemas = Object.fromEntries(Object.values(modules).map(module => { - return [module.$id, module] -})) - -export const BaseURI = modules['./schema.json'].$id -export default schemas diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index e625f6e4a..648cdd4fe 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -1,18 +1,13 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://www.flippercloud.io/expressions/schema.json", - "title": "Flipper Expressions", - "description": "TODO", - "$ref": "#/definitions/expression", + "title": "Expression", + "description": "An expression can be a Constant or a Function", + "anyOf": [ + { "$ref": "#/definitions/constant" }, + { "$ref": "#/definitions/function" } + ], "definitions": { - "expression": { - "title": "Expression", - "description": "An expression can be a Function or a Constant", - "anyOf": [ - { "$ref": "#/definitions/constant" }, - { "$ref": "#/definitions/function" } - ] - }, "constant": { "title": "Constant", "description": "A constant value can be a string, number or boolean", @@ -78,21 +73,21 @@ "arguments-n": { "description": "An array of expressions", "type": "array", - "items": { "$ref": "#/definitions/expression" }, + "items": { "$ref": "#" }, "minItems": 0 }, "arguments-two": { "title": "Comparison", "description": "An array with exactly two expressions", "type": "array", - "items": { "$ref": "#/definitions/expression" }, + "items": { "$ref": "#" }, "minItems": 2, "maxItems": 2 }, "argument": { "description": "An array with exactly one expression", "type": "array", - "items": { "$ref": "#/definitions/expression" }, + "items": { "$ref": "#" }, "minItems": 1, "maxItems": 1 } diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index ec1623550..edeccdd56 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -1,34 +1,32 @@ import { describe, test, expect } from 'vitest' -import { Constant } from '../lib' +import { Constant, schema } from '../lib' describe('Constant', () => { - describe('schema', () => { - test('returns `{ type: "string" }` for string value', () => { - expect(new Constant('string').schema).toEqual({ type: 'string' }) - }) - - test('returns `{ type: "boolean" }` for boolean value', () => { - expect(new Constant(true).schema).toEqual({ type: 'boolean' }) - }) - - test('returns `{ type: "number" }` for number value', () => { - expect(new Constant(42).schema).toEqual({ type: 'number' }) + describe('validator', () => { + test('returns Constant validator', () => { + expect(new Constant('string').validator.schema.title).toEqual('Constant') }) }) describe('validate', () => { test('returns true for valid value', () => { expect(new Constant(true).validate().valid).toBe(true) + expect(new Constant(false).validate().valid).toBe(true) + expect(new Constant('string').validate().valid).toBe(true) + expect(new Constant(42).validate().valid).toBe(true) + expect(new Constant(3.14).validate().valid).toBe(true) }) }) describe('matches', () => { - test('returns true matching schema', () => { - expect(new Constant(true).matches({ type: 'boolean' })).toBe(true) + test('returns true for matching validator', () => { + const validator = schema.get('#/definitions/constant/anyOf/0') + expect(new Constant('string').matches(validator)).toBe(true) }) test('returns false for different schema', () => { - expect(new Constant('string').matches({ type: 'boolean' })).toBe(false) + const validator = schema.get('#/definitions/constant/anyOf/0') + expect(new Constant(true).matches(validator)).toBe(false) }) }) }) diff --git a/packages/expressions/test/explorer.test.js b/packages/expressions/test/explorer.test.js deleted file mode 100644 index 5c126c59b..000000000 --- a/packages/expressions/test/explorer.test.js +++ /dev/null @@ -1,18 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { explorer } from '../lib' - -describe('explorer', () => { - test('resolves refs', () => { - const schema = explorer.get('#') - expect(schema.anyOf).not.toBeUndefined() - }) - - describe('functions', () => { - test('returns all functions with their schemas', () => { - expect(Object.keys(explorer.functions)).toEqual(expect.arrayContaining([ - 'All', 'Any', 'Boolean', 'Time' - ])) - expect(explorer.functions.All.title).toEqual('All') - }) - }) -}) diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index f63982a43..37e7ed06f 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -1,6 +1,5 @@ import { describe, test, expect } from 'vitest' import { Expression, Constant } from '../lib' -import { ajv } from '../lib/validate' describe('Expression', () => { describe('build', () => { @@ -11,6 +10,12 @@ describe('Expression', () => { expect(expression.args[0].value).toEqual(true) expect(expression.value).toEqual({ All: [true] }) }) + + test('throws error on invalid expression', () => { + expect(() => Expression.build([])).toThrowError(TypeError) + expect(() => Expression.build(new Date())).toThrowError(TypeError) + expect(() => Expression.build({ All: [], Any: [] })).toThrowError(TypeError) + }) }) describe('clone', () => { @@ -42,18 +47,4 @@ describe('Expression', () => { expect(expression.validate().valid).toBe(false) }) }) - - describe('matches', () => { - test('returns true matching schema', () => { - const expression = Expression.build({ Any: [true] }) - const schema = ajv.getSchema("#/definitions/function") - console.log("DID IT WORK?", schema) - expect(expression.matches(schema)).toBe(true) - }) - - test('returns false for different schema', () => { - expect(new Constant('string').matches({ type: 'boolean' })).toBe(false) - }) - }) - }) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 91438594f..84e422041 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,23 +1,15 @@ import { describe, test, expect } from 'vitest' -import { validate, examples } from '../lib' +import { examples, schema, Expression } from '../lib' -expect.extend({ - toBeValid (received) { - const { valid, errors } = validate(received) - return { - pass: valid, - message: () => JSON.stringify(errors, null, 2) - } - } -}) - -describe('expressions.schema.json', () => { +describe('schema.json', () => { for (const [name, example] of Object.entries(examples)) { describe(name, () => { describe('valid', () => { example.valid.forEach(({ expression }) => { test(JSON.stringify(expression), () => { - expect(expression).toBeValid() + const { valid, errors } = Expression.build(expression).validate() + expect(errors).toBe(null) + expect(valid).toBe(true) }) }) }) @@ -25,10 +17,32 @@ describe('expressions.schema.json', () => { describe('invalid', () => { example.invalid.forEach(expression => { test(JSON.stringify(expression), () => { - expect(expression).not.toBeValid() + try { + const { valid, errors } = Expression.build(expression).validate() + expect(errors).not.toEqual(null) + expect(valid).toBe(false) + } catch (error) { + if (error instanceof TypeError) { + // ok + } else { + throw error + } + } }) }) }) }) } + + describe('get', () => { + test('returns a validator', () => { + const ref = schema.get('#') + expect(ref.schema.title).toEqual('Expression') + }) + + test('resolves refs', () => { + const ref = schema.get('#/definitions/function/properties/Any') + expect(ref.schema.title).toEqual('Any') + }) + }) }) diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock index 74c1d15c6..72e76248b 100644 --- a/packages/expressions/yarn.lock +++ b/packages/expressions/yarn.lock @@ -916,11 +916,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreach@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.6.tgz#87bcc8a1a0e74000ff2bf9802110708cfb02eb6e" - integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1265,13 +1260,6 @@ json-parse-better-errors@^1.0.1: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-pointer@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/json-pointer/-/json-pointer-0.6.2.tgz#f97bd7550be5e9ea901f8c9264c9d436a22a93cd" - integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== - dependencies: - foreach "^2.0.4" - 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" From d96ec7816b91c2ce72db046622e7d34eee0bed3e Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Sat, 8 Apr 2023 22:22:24 -0400 Subject: [PATCH 24/44] Add proxying back to schema to resolve refs --- packages/expressions/lib/constant.js | 12 +-- packages/expressions/lib/expression.js | 10 +-- packages/expressions/lib/schemas.js | 88 ++++++++++++++++--- .../expressions/schemas/Duration.schema.json | 1 + packages/expressions/schemas/schema.json | 2 + packages/expressions/test/constant.test.js | 10 +-- packages/expressions/test/schemas.test.js | 40 +++++++-- 7 files changed, 127 insertions(+), 36 deletions(-) diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index f6bd3ab96..39d0349f2 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -12,15 +12,15 @@ export class Constant { return [this.value] } - get validator () { - return schema.get('#/definitions/constant') + get schema () { + return schema.resolve('#/definitions/constant') } - validate (validator = this.validator) { - return schema.validate(this.value, validator) + validate (schema = this.schema) { + return schema.validate(this.value) } - matches (localSchema) { - return this.validate(localSchema).valid + matches (schema = this.schema) { + return schema.validate(this.value).valid } } diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index 618e28c84..2d78c2a8d 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -47,15 +47,15 @@ export class Expression { return { [this.name]: this.args.map(arg => arg.value) } } - get validator () { - return schema.get('#') + get schema () { + return schema.resolve('#') } - validate (validator = this.validator) { - return schema.validate(this.value, validator) + validate (schema = this.schema) { + return schema.validate(this.value) } matches (localSchema) { - return this.validate(localSchema).valid + return localSchema.validate(this.value).valid } } diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js index df8323db1..e661482b8 100644 --- a/packages/expressions/lib/schemas.js +++ b/packages/expressions/lib/schemas.js @@ -1,32 +1,92 @@ import Ajv from 'ajv' import addFormats from 'ajv-formats' +// Load all schemas in schemas/*.json const modules = import.meta.glob('../schemas/*.json', { eager: true, import: 'default' }) export const schemas = Object.values(modules) export const BaseURI = modules['../schemas/schema.json'].$id +// Create a new Ajv validator instance with all schemas loaded +const ajv = new Ajv({ + schemas, + useDefaults: true, + allErrors: true, + strict: true +}) +addFormats(ajv) + +// Proxy to resolve $refs in schema definitions +const Dereference = { + get (target, property) { + const value = target[property] + + if (Array.isArray(value)) { + // Schema definition returns an array for this property, return the array with all refs resolved + return value.map((item, i) => Schema.proxy(this.join(target.$id, `${property}/${i}`), item)) + } else if (value !== null && typeof value === 'object') { + // Schema definition returns an object for this property, return the subschema and proxy it + return Schema.proxy(this.join(target.$id, property), value) + } else if (value !== undefined) { + // Schema definition returns a value for this property, just return it + return value + } else if (target.$ref) { + // Schema includes a ref, so delegate to it + return Schema.resolve(target.$ref, target.$id)[property] + } + }, + + join ($id, path) { + const url = new URL($id) + url.hash = [url.hash, path].join('/') + return url.toString() + } +} + +// Delegate property access to the schema definition +const DelegateToDefinition = { + get (target, property) { + return target[property] ?? target.definition[property] + }, + + has (target, property) { + return property in target || property in target.definition + } +} + +// Class to browse schemas, resolve refs, and validate data class Schema { - constructor (schemas, baseURI) { - this.baseURI = baseURI + static resolve ($ref, $id = undefined) { + const { href } = new URL($ref, $id) + return this.proxy(href, ajv.getSchema(href).schema) + } + + static proxy ($id, definition) { + return new Proxy(new Schema($id, definition), DelegateToDefinition) + } + + constructor ($id, definition) { + this.definition = new Proxy({ $id, ...definition }, Dereference) + } + + resolve ($ref = this.definition.$ref, $id = this.definition.$id) { + return Schema.resolve($ref, $id) + } - this.ajv = new Ajv({ - schemas, - useDefaults: true, - allErrors: true, - strict: true - }) - addFormats(this.ajv) + resolveAnyOf () { + return this.definition.anyOf?.map(ref => ref.resolveAnyOf())?.flat() || [this] } - get (ref, baseURI = this.baseURI) { - return this.ajv.getSchema(new URL(ref, baseURI).href) + arrayItem (index) { + const items = this.definition.items + return Array.isArray(items) ? items[index] : items } - validate (data, validator = this.get('#')) { - const valid = validator(data, schema) + validate (data) { + const validator = ajv.getSchema(this.definition.$id) + const valid = validator(data) const errors = validator.errors return { valid, errors } } } -export const schema = new Schema(schemas, BaseURI) +export const schema = Schema.resolve(BaseURI) diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index 4a98d06bb..5684d5eaf 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -7,6 +7,7 @@ "items": [ { "$ref": "schema.json#/definitions/number" }, { + "title": "Unit", "anyOf": [ { "type": "string", diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 648cdd4fe..7f321674a 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -57,6 +57,7 @@ "additionalProperties": false }, "string": { + "title": "String", "description": "A constant string value or a function that returns a string", "anyOf": [ { "type": "string" }, @@ -64,6 +65,7 @@ ] }, "number": { + "title": "Number", "description": "A constant numeric value or a function that returns a number", "anyOf": [ { "type": "number" }, diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index edeccdd56..f098584ee 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -2,9 +2,9 @@ import { describe, test, expect } from 'vitest' import { Constant, schema } from '../lib' describe('Constant', () => { - describe('validator', () => { - test('returns Constant validator', () => { - expect(new Constant('string').validator.schema.title).toEqual('Constant') + describe('schema', () => { + test('returns Constant schema', () => { + expect(new Constant('string').schema.title).toEqual('Constant') }) }) @@ -20,12 +20,12 @@ describe('Constant', () => { describe('matches', () => { test('returns true for matching validator', () => { - const validator = schema.get('#/definitions/constant/anyOf/0') + const validator = schema.resolve('#/definitions/constant/anyOf/0') expect(new Constant('string').matches(validator)).toBe(true) }) test('returns false for different schema', () => { - const validator = schema.get('#/definitions/constant/anyOf/0') + const validator = schema.resolve('#/definitions/constant/anyOf/0') expect(new Constant(true).matches(validator)).toBe(false) }) }) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 84e422041..0bf28850a 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -34,15 +34,43 @@ describe('schema.json', () => { }) } - describe('get', () => { - test('returns a validator', () => { - const ref = schema.get('#') - expect(ref.schema.title).toEqual('Expression') + describe('resolve', () => { + test('returns a schema', () => { + const ref = schema.resolve('#/definitions/constant') + expect(ref.title).toEqual('Constant') + expect(ref.validate(true)).toEqual({ valid: true, errors: null }) }) test('resolves refs', () => { - const ref = schema.get('#/definitions/function/properties/Any') - expect(ref.schema.title).toEqual('Any') + expect(schema.resolve('#/definitions/function/properties/Any').title).toEqual('Any') + expect(schema.definitions.function.properties.Any.title).toEqual('Any') + }) + }) + + describe('resolveAnyOf', () => { + test('returns nested anyOf', () => { + expect(schema.resolveAnyOf()).toHaveLength(4) + }) + + test('returns array of schemas', () => { + const ref = schema.resolve('#/definitions/constant') + expect(ref.resolveAnyOf()).toHaveLength(3) + expect(ref.resolveAnyOf()).toEqual(ref.anyOf) + }) + }) + + describe('arrayItem', () => { + test('returns schema for repeated array item', () => { + const any = schema.resolve("Any.schema.json") + expect(any.arrayItem(0).title).toEqual('Expression') + expect(any.arrayItem(99).title).toEqual('Expression') + }) + + test('returns schema for tuple', () => { + const duration = schema.resolve("Duration.schema.json") + expect(duration.arrayItem(0).title).toEqual('Number') + expect(duration.arrayItem(1).title).toEqual('Unit') + expect(duration.arrayItem(2)).toBe(undefined) }) }) }) From d134ae6395504cf719aabbca8000964587fef719 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 10 Apr 2023 14:44:04 -0400 Subject: [PATCH 25/44] Add/Subtract/Multiply/Divide functions --- lib/flipper/expressions/add.rb | 9 +++++++ lib/flipper/expressions/divide.rb | 9 +++++++ lib/flipper/expressions/multiply.rb | 9 +++++++ lib/flipper/expressions/subtract.rb | 9 +++++++ packages/expressions/examples/Add.json | 24 +++++++++++++++++++ packages/expressions/examples/Divide.json | 24 +++++++++++++++++++ packages/expressions/examples/Multiply.json | 24 +++++++++++++++++++ packages/expressions/examples/Subtract.json | 20 ++++++++++++++++ packages/expressions/schemas/Add.schema.json | 7 ++++++ .../expressions/schemas/Divide.schema.json | 7 ++++++ .../expressions/schemas/Multiply.schema.json | 7 ++++++ .../expressions/schemas/Subtract.schema.json | 7 ++++++ packages/expressions/schemas/schema.json | 4 ++++ 13 files changed, 160 insertions(+) create mode 100644 lib/flipper/expressions/add.rb create mode 100644 lib/flipper/expressions/divide.rb create mode 100644 lib/flipper/expressions/multiply.rb create mode 100644 lib/flipper/expressions/subtract.rb create mode 100644 packages/expressions/examples/Add.json create mode 100644 packages/expressions/examples/Divide.json create mode 100644 packages/expressions/examples/Multiply.json create mode 100644 packages/expressions/examples/Subtract.json create mode 100644 packages/expressions/schemas/Add.schema.json create mode 100644 packages/expressions/schemas/Divide.schema.json create mode 100644 packages/expressions/schemas/Multiply.schema.json create mode 100644 packages/expressions/schemas/Subtract.schema.json diff --git a/lib/flipper/expressions/add.rb b/lib/flipper/expressions/add.rb new file mode 100644 index 000000000..ef02e469d --- /dev/null +++ b/lib/flipper/expressions/add.rb @@ -0,0 +1,9 @@ +module Flipper + module Expressions + class Add + def self.call(left, right) + left + right + end + end + end +end diff --git a/lib/flipper/expressions/divide.rb b/lib/flipper/expressions/divide.rb new file mode 100644 index 000000000..b242bc3e4 --- /dev/null +++ b/lib/flipper/expressions/divide.rb @@ -0,0 +1,9 @@ +module Flipper + module Expressions + class Divide + def self.call(left, right) + left / right + end + end + end +end diff --git a/lib/flipper/expressions/multiply.rb b/lib/flipper/expressions/multiply.rb new file mode 100644 index 000000000..cb9002d99 --- /dev/null +++ b/lib/flipper/expressions/multiply.rb @@ -0,0 +1,9 @@ +module Flipper + module Expressions + class Multiply + def self.call(left, right) + left * right + end + end + end +end diff --git a/lib/flipper/expressions/subtract.rb b/lib/flipper/expressions/subtract.rb new file mode 100644 index 000000000..fcd0026f1 --- /dev/null +++ b/lib/flipper/expressions/subtract.rb @@ -0,0 +1,9 @@ +module Flipper + module Expressions + class Subtract + def self.call(left, right) + left - right + end + end + end +end diff --git a/packages/expressions/examples/Add.json b/packages/expressions/examples/Add.json new file mode 100644 index 000000000..06cb581d9 --- /dev/null +++ b/packages/expressions/examples/Add.json @@ -0,0 +1,24 @@ +{ + "valid": [ + { + "expression": { "Add": [2, 2] }, + "result": { "enum": [4] } + }, + { + "expression": { "Add": ["a", "a"] }, + "result": { "enum": ["aa"] } + }, + { + "expression": { "Add": [{ "Property": "age" }, 3] }, + "context": { "properties": { "age": 18 }}, + "result": { "enum": [21] } + } + ], + "invalid": [ + { "Add": [1, 2, 3] }, + { "Add": [1] }, + { "Add": 1 }, + { "Add": null }, + { "Add": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/examples/Divide.json b/packages/expressions/examples/Divide.json new file mode 100644 index 000000000..84b345503 --- /dev/null +++ b/packages/expressions/examples/Divide.json @@ -0,0 +1,24 @@ +{ + "valid": [ + { + "expression": { "Divide": [6, 2] }, + "result": { "enum": [3] } + }, + { + "expression": { "Divide": [3, 1.5] }, + "result": { "enum": [2.0] } + }, + { + "expression": { "Divide": [{ "Property": "age" }, 3] }, + "context": { "properties": { "age": 18 }}, + "result": { "enum": [6] } + } + ], + "invalid": [ + { "Divide": [1, 2, 3] }, + { "Divide": [1] }, + { "Divide": 1 }, + { "Divide": null }, + { "Divide": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/examples/Multiply.json b/packages/expressions/examples/Multiply.json new file mode 100644 index 000000000..ab54e02c2 --- /dev/null +++ b/packages/expressions/examples/Multiply.json @@ -0,0 +1,24 @@ +{ + "valid": [ + { + "expression": { "Multiply": [3, 2] }, + "result": { "enum": [6] } + }, + { + "expression": { "Multiply": ["foo", 2] }, + "result": { "enum": ["foofoo"] } + }, + { + "expression": { "Multiply": [{ "Property": "age" }, 3] }, + "context": { "properties": { "age": 18 }}, + "result": { "enum": [54] } + } + ], + "invalid": [ + { "Multiply": [1, 2, 3] }, + { "Multiply": [1] }, + { "Multiply": 1 }, + { "Multiply": null }, + { "Multiply": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/examples/Subtract.json b/packages/expressions/examples/Subtract.json new file mode 100644 index 000000000..4d5b1c029 --- /dev/null +++ b/packages/expressions/examples/Subtract.json @@ -0,0 +1,20 @@ +{ + "valid": [ + { + "expression": { "Subtract": [3, 2] }, + "result": { "enum": [1] } + }, + { + "expression": { "Subtract": [{ "Property": "age" }, 3] }, + "context": { "properties": { "age": 18 }}, + "result": { "enum": [15] } + } + ], + "invalid": [ + { "Subtract": [1, 2, 3] }, + { "Subtract": [1] }, + { "Subtract": 1 }, + { "Subtract": null }, + { "Subtract": [1, 2], "Any": [] } + ] +} diff --git a/packages/expressions/schemas/Add.schema.json b/packages/expressions/schemas/Add.schema.json new file mode 100644 index 000000000..5b9ba5071 --- /dev/null +++ b/packages/expressions/schemas/Add.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Add.schema.json", + "title": "Add", + "description": "Add two values", + "$ref": "schema.json#/definitions/arguments-two" +} diff --git a/packages/expressions/schemas/Divide.schema.json b/packages/expressions/schemas/Divide.schema.json new file mode 100644 index 000000000..b6cd701ff --- /dev/null +++ b/packages/expressions/schemas/Divide.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Divide.schema.json", + "title": "Divide", + "description": "Divide two values", + "$ref": "schema.json#/definitions/arguments-two" +} diff --git a/packages/expressions/schemas/Multiply.schema.json b/packages/expressions/schemas/Multiply.schema.json new file mode 100644 index 000000000..b3e12e540 --- /dev/null +++ b/packages/expressions/schemas/Multiply.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Multiply.schema.json", + "title": "Multiply", + "description": "Multiply two values", + "$ref": "schema.json#/definitions/arguments-two" +} diff --git a/packages/expressions/schemas/Subtract.schema.json b/packages/expressions/schemas/Subtract.schema.json new file mode 100644 index 000000000..7ab407583 --- /dev/null +++ b/packages/expressions/schemas/Subtract.schema.json @@ -0,0 +1,7 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://www.flippercloud.io/expressions/Subtract.schema.json", + "title": "Subtract", + "description": "Subtract two values", + "$ref": "schema.json#/definitions/arguments-two" +} diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 7f321674a..f4531e259 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -33,9 +33,11 @@ "maxProperties": 1, "minProperties": 1, "properties": { + "Add": { "$ref": "Add.schema.json" }, "All": { "$ref": "All.schema.json" }, "Any": { "$ref": "Any.schema.json" }, "Boolean": { "$ref": "Boolean.schema.json" }, + "Divide": { "$ref": "Divide.schema.json" }, "Duration": { "$ref": "Duration.schema.json" }, "Equal": { "$ref": "Equal.schema.json" }, "GreaterThan": { "$ref": "GreaterThan.schema.json" }, @@ -44,6 +46,7 @@ "LessThanOrEqualTo": { "$ref": "LessThanOrEqualTo.schema.json" }, "Max": { "$ref": "Max.schema.json" }, "Min": { "$ref": "Min.schema.json" }, + "Multiply": { "$ref": "Multiply.schema.json" }, "NotEqual": { "$ref": "NotEqual.schema.json" }, "Now": { "$ref": "Now.schema.json" }, "Number": { "$ref": "Number.schema.json" }, @@ -52,6 +55,7 @@ "Property": { "$ref": "Property.schema.json" }, "Random": { "$ref": "Random.schema.json" }, "String": { "$ref": "String.schema.json" }, + "Subtract": { "$ref": "Subtract.schema.json" }, "Time": { "$ref": "Time.schema.json" } }, "additionalProperties": false From b4e7035b68f4cd176672a38abd0b194476bbf3e9 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 10 Apr 2023 17:36:39 -0400 Subject: [PATCH 26/44] Fix bug where ajv eagerly resolves ref in array items --- packages/expressions/lib/schemas.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js index e661482b8..b642f9d81 100644 --- a/packages/expressions/lib/schemas.js +++ b/packages/expressions/lib/schemas.js @@ -22,7 +22,10 @@ const Dereference = { if (Array.isArray(value)) { // Schema definition returns an array for this property, return the array with all refs resolved - return value.map((item, i) => Schema.proxy(this.join(target.$id, `${property}/${i}`), item)) + return value.map((item, i) => { + const $ref = item.$ref || this.join(target.$id, `${property}/${i}`) + return Schema.resolve($ref, target.$id) + }) } else if (value !== null && typeof value === 'object') { // Schema definition returns an object for this property, return the subschema and proxy it return Schema.proxy(this.join(target.$id, property), value) @@ -54,10 +57,15 @@ const DelegateToDefinition = { } // Class to browse schemas, resolve refs, and validate data -class Schema { - static resolve ($ref, $id = undefined) { +export class Schema { + static resolve ($ref, $id = BaseURI) { const { href } = new URL($ref, $id) - return this.proxy(href, ajv.getSchema(href).schema) + const validator = ajv.getSchema(href) + + if (!validator) throw new TypeError('Schema not found: ' + href) + if (!validator.proxy) validator.proxy = Schema.proxy(href, validator.schema) + + return validator.proxy } static proxy ($id, definition) { @@ -89,4 +97,4 @@ class Schema { } } -export const schema = Schema.resolve(BaseURI) +export const schema = Schema.resolve('#') From 7c5016b3d3754b4b1e3fb0e4e4d4a230ab1fd17a Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 10 Apr 2023 17:37:04 -0400 Subject: [PATCH 27/44] use exported Schema class where possible --- packages/expressions/lib/constant.js | 12 +++++++++--- packages/expressions/lib/expression.js | 4 ++-- packages/expressions/lib/index.js | 4 ++-- packages/expressions/test/constant.test.js | 10 +++++----- packages/expressions/test/schemas.test.js | 17 +++++++++-------- 5 files changed, 27 insertions(+), 20 deletions(-) diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index 39d0349f2..c42ce6474 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -1,11 +1,17 @@ -import { schema } from './schemas' +import { v4 as uuidv4 } from 'uuid' +import { Schema } from './schemas' // Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). // // Implements the same interface as Expression export class Constant { - constructor (value) { + constructor (value, id = uuidv4()) { this.value = value + this.id = id + } + + clone (value, id = this.id) { + return new Constant(value, id) } get args () { @@ -13,7 +19,7 @@ export class Constant { } get schema () { - return schema.resolve('#/definitions/constant') + return Schema.resolve('#/definitions/constant') } validate (schema = this.schema) { diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index 2d78c2a8d..baba64b1b 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -1,6 +1,6 @@ import { v4 as uuidv4 } from 'uuid' import { Constant } from './constant' -import { schema } from './schemas' +import { Schema } from './schemas' function toArray (arg) { if (Array.isArray(arg)) { @@ -48,7 +48,7 @@ export class Expression { } get schema () { - return schema.resolve('#') + return Schema.resolve('#') } validate (schema = this.schema) { diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 010cdd643..0375015ea 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,4 +1,4 @@ -export { schema, schemas, BaseURI } from './schemas' -export { default as examples } from '../examples' +export { Schema, schemas, BaseURI } from './schemas' export { Expression } from './expression' export { Constant } from './constant' +export { default as examples } from '../examples' diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index f098584ee..715ed4f12 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest' -import { Constant, schema } from '../lib' +import { Constant, Schema } from '../lib' describe('Constant', () => { describe('schema', () => { @@ -20,13 +20,13 @@ describe('Constant', () => { describe('matches', () => { test('returns true for matching validator', () => { - const validator = schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant('string').matches(validator)).toBe(true) + const schema = Schema.resolve('#/definitions/constant/anyOf/0') + expect(new Constant('string').matches(schema)).toBe(true) }) test('returns false for different schema', () => { - const validator = schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant(true).matches(validator)).toBe(false) + const schema = Schema.resolve('#/definitions/constant/anyOf/0') + expect(new Constant(true).matches(schema)).toBe(false) }) }) }) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index 0bf28850a..d40c979ec 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest' -import { examples, schema, Expression } from '../lib' +import { examples, Schema, Expression } from '../lib' describe('schema.json', () => { for (const [name, example] of Object.entries(examples)) { @@ -36,24 +36,25 @@ describe('schema.json', () => { describe('resolve', () => { test('returns a schema', () => { - const ref = schema.resolve('#/definitions/constant') + const ref = Schema.resolve('#/definitions/constant') expect(ref.title).toEqual('Constant') expect(ref.validate(true)).toEqual({ valid: true, errors: null }) }) test('resolves refs', () => { - expect(schema.resolve('#/definitions/function/properties/Any').title).toEqual('Any') - expect(schema.definitions.function.properties.Any.title).toEqual('Any') + expect(Schema.resolve('#/definitions/function/properties/Any').title).toEqual('Any') + expect(Schema.resolve('#').definitions.function.properties.Any.title).toEqual('Any') }) }) describe('resolveAnyOf', () => { test('returns nested anyOf', () => { - expect(schema.resolveAnyOf()).toHaveLength(4) + const ref = Schema.resolve('#') + expect(ref.resolveAnyOf()).toHaveLength(4) }) test('returns array of schemas', () => { - const ref = schema.resolve('#/definitions/constant') + const ref = Schema.resolve('#/definitions/constant') expect(ref.resolveAnyOf()).toHaveLength(3) expect(ref.resolveAnyOf()).toEqual(ref.anyOf) }) @@ -61,13 +62,13 @@ describe('schema.json', () => { describe('arrayItem', () => { test('returns schema for repeated array item', () => { - const any = schema.resolve("Any.schema.json") + const any = Schema.resolve('Any.schema.json') expect(any.arrayItem(0).title).toEqual('Expression') expect(any.arrayItem(99).title).toEqual('Expression') }) test('returns schema for tuple', () => { - const duration = schema.resolve("Duration.schema.json") + const duration = Schema.resolve('Duration.schema.json') expect(duration.arrayItem(0).title).toEqual('Number') expect(duration.arrayItem(1).title).toEqual('Unit') expect(duration.arrayItem(2)).toBe(undefined) From 26a08f31c8eb29886e55c2b21c47d554d3f276cd Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Wed, 12 Apr 2023 08:48:29 -0400 Subject: [PATCH 28/44] Pair schema with expression and constant --- packages/expressions/lib/constant.js | 11 ++- packages/expressions/lib/expression.js | 25 +++---- packages/expressions/lib/schemas.js | 74 +++++++++++--------- packages/expressions/test/constant.test.js | 23 +++++- packages/expressions/test/expression.test.js | 17 ++++- packages/expressions/test/schemas.test.js | 9 ++- 6 files changed, 101 insertions(+), 58 deletions(-) diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index c42ce6474..8c2fd35de 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -5,23 +5,20 @@ import { Schema } from './schemas' // // Implements the same interface as Expression export class Constant { - constructor (value, id = uuidv4()) { + constructor (value, { id = uuidv4(), schema = Schema.resolve('#/definitions/constant') } = {}) { this.value = value this.id = id + this.schema = schema } - clone (value, id = this.id) { - return new Constant(value, id) + clone (value, { id = this.id, schema = this.schema } = {}) { + return new Constant(value, { id, schema }) } get args () { return [this.value] } - get schema () { - return Schema.resolve('#/definitions/constant') - } - validate (schema = this.schema) { return schema.validate(this.value) } diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index baba64b1b..3d9b80e09 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -15,7 +15,7 @@ function toArray (arg) { // Simple model to transform this: `{ All: [{ Boolean: [true] }]` // into this: `{ id: uuidv4(), name: 'All', args: [{ id: uuidv4(), name: 'Boolean', args: [true] }] }` export class Expression { - static build (expression) { + static build (expression, schema = undefined) { if (expression instanceof Expression || expression instanceof Constant) { return expression } @@ -25,37 +25,34 @@ export class Expression { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } const name = Object.keys(expression)[0] - const args = toArray(expression[name]).map(Expression.build) - - return new Expression({ name, args }) + return new Expression({ name, args: expression[name] }) } else if (['number', 'string', 'boolean'].includes(typeof expression)) { - return new Constant(expression) + return new Constant(expression, { schema }) } else { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } } constructor ({ name, args, id = uuidv4() }) { - Object.assign(this, { name, args, id }) + this.id = id + this.name = name + this.schema = Schema.resolve(`${name}.schema.json`) + this.args = toArray(args).map((arg, i) => Expression.build(arg, this.schema.arrayItem(i))) } clone ({ id = this.id, name = this.name, args = this.args } = {}) { - return new Expression({ id, name, args: args.map(Expression.build) }) + return new Expression({ id, name, args }) } get value () { return { [this.name]: this.args.map(arg => arg.value) } } - get schema () { - return Schema.resolve('#') - } - validate (schema = this.schema) { - return schema.validate(this.value) + return schema.validate(this.args.map(arg => arg.value)) } - matches (localSchema) { - return localSchema.validate(this.value).valid + matches (schema) { + return this.validate(schema).valid } } diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js index b642f9d81..2b9127265 100644 --- a/packages/expressions/lib/schemas.js +++ b/packages/expressions/lib/schemas.js @@ -15,35 +15,6 @@ const ajv = new Ajv({ }) addFormats(ajv) -// Proxy to resolve $refs in schema definitions -const Dereference = { - get (target, property) { - const value = target[property] - - if (Array.isArray(value)) { - // Schema definition returns an array for this property, return the array with all refs resolved - return value.map((item, i) => { - const $ref = item.$ref || this.join(target.$id, `${property}/${i}`) - return Schema.resolve($ref, target.$id) - }) - } else if (value !== null && typeof value === 'object') { - // Schema definition returns an object for this property, return the subschema and proxy it - return Schema.proxy(this.join(target.$id, property), value) - } else if (value !== undefined) { - // Schema definition returns a value for this property, just return it - return value - } else if (target.$ref) { - // Schema includes a ref, so delegate to it - return Schema.resolve(target.$ref, target.$id)[property] - } - }, - - join ($id, path) { - const url = new URL($id) - url.hash = [url.hash, path].join('/') - return url.toString() - } -} // Delegate property access to the schema definition const DelegateToDefinition = { @@ -62,7 +33,12 @@ export class Schema { const { href } = new URL($ref, $id) const validator = ajv.getSchema(href) - if (!validator) throw new TypeError('Schema not found: ' + href) + if (validator === undefined) throw new TypeError('Schema not found: ' + href) + + // Schema definition is a primitive, just return it + if (typeof validator.schema !== 'object') return validator.schema + + // Create a new proxy to the schema definition if (!validator.proxy) validator.proxy = Schema.proxy(href, validator.schema) return validator.proxy @@ -73,10 +49,11 @@ export class Schema { } constructor ($id, definition) { - this.definition = new Proxy({ $id, ...definition }, Dereference) + this.$id = $id + this.definition = new Proxy(definition, this) } - resolve ($ref = this.definition.$ref, $id = this.definition.$id) { + resolve ($ref = this.definition.$ref, $id = this.$id) { return Schema.resolve($ref, $id) } @@ -90,11 +67,42 @@ export class Schema { } validate (data) { - const validator = ajv.getSchema(this.definition.$id) + const validator = ajv.getSchema(this.$id) const valid = validator(data) const errors = validator.errors return { valid, errors } } + + // This instance acts as a Proxy to resolve $refs in the schema definition + get (target, property) { + const value = target[property] + + if (Array.isArray(value)) { + // Schema definition returns an array for this property, return the array with all refs resolved + return value.map((item, i) => { + if (typeof item === 'object') { + return Schema.resolve(item.$ref || this.join(`${property}/${i}`), this.$id) + } else { + return item + } + }) + } else if (value !== null && typeof value === 'object') { + // Schema definition returns an object for this property, return the subschema and proxy it + return Schema.proxy(this.join(property), value) + } else if (value !== undefined) { + // Schema definition returns a value for this property, just return it + return value + } else if (target.$ref) { + // Schema includes a ref, so delegate to it + return Schema.resolve(target.$ref, this.$id)[property] + } + } + + join (path, $id = this.$id) { + const url = new URL($id) + url.hash = [url.hash, path].join('/') + return url.toString() + } } export const schema = Schema.resolve('#') diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index 715ed4f12..1981f5c1d 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -3,9 +3,16 @@ import { Constant, Schema } from '../lib' describe('Constant', () => { describe('schema', () => { - test('returns Constant schema', () => { + test('defaults to Constant schema', () => { expect(new Constant('string').schema.title).toEqual('Constant') }) + + test('uses provided schema', () => { + const schema = Schema.resolve('#/definitions/number') + const number = new Constant(42, { schema }) + expect(number.schema).toEqual(schema) + expect(number.clone(99).schema).toEqual(schema) + }) }) describe('validate', () => { @@ -16,6 +23,20 @@ describe('Constant', () => { expect(new Constant(42).validate().valid).toBe(true) expect(new Constant(3.14).validate().valid).toBe(true) }) + + test('returns false for invalid value', () => { + expect(new Constant(['array']).validate().valid).toBe(false) + expect(new Constant({Now: []}).validate().valid).toBe(false) + }) + + test('uses provided schema', () => { + const schema = Schema.resolve('#/definitions/number') + expect(new Constant(42, { schema }).validate().valid).toBe(true) + expect(new Constant(42).validate(schema).valid).toBe(true) + + expect(new Constant('nope', { schema }).validate().valid).toBe(false) + expect(new Constant('nope').validate(schema).valid).toBe(false) + }) }) describe('matches', () => { diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index 37e7ed06f..bd96cde76 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -1,5 +1,5 @@ import { describe, test, expect } from 'vitest' -import { Expression, Constant } from '../lib' +import { Expression, Constant, Schema } from '../lib' describe('Expression', () => { describe('build', () => { @@ -16,6 +16,21 @@ describe('Expression', () => { expect(() => Expression.build(new Date())).toThrowError(TypeError) expect(() => Expression.build({ All: [], Any: [] })).toThrowError(TypeError) }) + + test('sets schema for constant args', () => { + const expression = Expression.build({ Duration: [5, 'minutes'] }) + const schema = Schema.resolve('Duration.schema.json') + expect(expression.schema).toEqual(schema) + expect(expression.args[0].schema).toEqual(schema.items[0]) + expect(expression.args[1].schema).toEqual(schema.items[1]) + }) + + test('each subexpression uses its own schema', () => { + const expression = Expression.build({ GreaterThan: [ { Now: [] }, { Property: ['released_at'] } ] }) + expect(expression.schema).toEqual(Schema.resolve('GreaterThan.schema.json')) + expect(expression.args[0].schema).toEqual(Schema.resolve('Now.schema.json')) + expect(expression.args[1].schema).toEqual(Schema.resolve('Property.schema.json')) + }) }) describe('clone', () => { diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index d40c979ec..cff727813 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -45,6 +45,11 @@ describe('schema.json', () => { expect(Schema.resolve('#/definitions/function/properties/Any').title).toEqual('Any') expect(Schema.resolve('#').definitions.function.properties.Any.title).toEqual('Any') }) + + test('returns array values', () => { + const expected = ['seconds', 'minutes', 'hours', 'days', 'weeks', 'months', 'years'] + expect(Schema.resolve('Duration.schema.json#/items/1/anyOf/0').enum).toEqual(expected) + }) }) describe('resolveAnyOf', () => { @@ -69,8 +74,8 @@ describe('schema.json', () => { test('returns schema for tuple', () => { const duration = Schema.resolve('Duration.schema.json') - expect(duration.arrayItem(0).title).toEqual('Number') - expect(duration.arrayItem(1).title).toEqual('Unit') + expect(duration.arrayItem(0).$id).toMatch('schema.json#/definitions/number') + expect(duration.arrayItem(1).$id).toMatch('Duration.schema.json#/items/1') expect(duration.arrayItem(2)).toBe(undefined) }) }) From 82cf6ac947d9ea3b66284a113497464b976236e9 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Wed, 12 Apr 2023 08:49:56 -0400 Subject: [PATCH 29/44] Add operator keyword to schemas --- packages/expressions/lib/schemas.js | 2 +- packages/expressions/schemas/Add.schema.json | 3 ++- packages/expressions/schemas/Divide.schema.json | 3 ++- packages/expressions/schemas/Duration.schema.json | 5 ++--- packages/expressions/schemas/Equal.schema.json | 3 ++- packages/expressions/schemas/GreaterThan.schema.json | 3 ++- .../expressions/schemas/GreaterThanOrEqualTo.schema.json | 3 ++- packages/expressions/schemas/LessThan.schema.json | 3 ++- packages/expressions/schemas/LessThanOrEqualTo.schema.json | 3 ++- packages/expressions/schemas/Multiply.schema.json | 3 ++- packages/expressions/schemas/NotEqual.schema.json | 3 ++- packages/expressions/schemas/Subtract.schema.json | 3 ++- packages/expressions/schemas/schema.json | 7 ++++--- 13 files changed, 27 insertions(+), 17 deletions(-) diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js index 2b9127265..2dd162fe2 100644 --- a/packages/expressions/lib/schemas.js +++ b/packages/expressions/lib/schemas.js @@ -14,7 +14,7 @@ const ajv = new Ajv({ strict: true }) addFormats(ajv) - +ajv.addKeyword('operator') // Delegate property access to the schema definition const DelegateToDefinition = { diff --git a/packages/expressions/schemas/Add.schema.json b/packages/expressions/schemas/Add.schema.json index 5b9ba5071..fb3f164fb 100644 --- a/packages/expressions/schemas/Add.schema.json +++ b/packages/expressions/schemas/Add.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/Add.schema.json", "title": "Add", "description": "Add two values", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "+", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/Divide.schema.json b/packages/expressions/schemas/Divide.schema.json index b6cd701ff..5ec157109 100644 --- a/packages/expressions/schemas/Divide.schema.json +++ b/packages/expressions/schemas/Divide.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/Divide.schema.json", "title": "Divide", "description": "Divide two values", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "/", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json index 5684d5eaf..8da463377 100644 --- a/packages/expressions/schemas/Duration.schema.json +++ b/packages/expressions/schemas/Duration.schema.json @@ -7,12 +7,11 @@ "items": [ { "$ref": "schema.json#/definitions/number" }, { - "title": "Unit", "anyOf": [ { + "title": "Unit", "type": "string", - "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"], - "default": "seconds" + "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"] }, { "$ref": "schema.json#/definitions/function" } ] diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json index 52f5cf1f9..84c533c01 100644 --- a/packages/expressions/schemas/Equal.schema.json +++ b/packages/expressions/schemas/Equal.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", "title": "Equal", "description": "Compare two values for equality", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "==", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json index 9d996ac8d..2f714ad46 100644 --- a/packages/expressions/schemas/GreaterThan.schema.json +++ b/packages/expressions/schemas/GreaterThan.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", "title": "GreaterThan", "description": "Compare if the first argument is > the second argument.", - "$ref": "schema.json#/definitions/arguments-two" + "operator": ">", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json index 3eebfb45e..db4879ee9 100644 --- a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", "title": "GreaterThanOrEqualTo", "description": "Compare if the first argument is >= the second argument.", - "$ref": "schema.json#/definitions/arguments-two" + "operator": ">=", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json index f7d82f054..9c2e07b0f 100644 --- a/packages/expressions/schemas/LessThan.schema.json +++ b/packages/expressions/schemas/LessThan.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", "title": "LessThan", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "<", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json index 8acb178ea..2cc871121 100644 --- a/packages/expressions/schemas/LessThanOrEqualTo.schema.json +++ b/packages/expressions/schemas/LessThanOrEqualTo.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", "title": "LessThanOrEqualTo", "description": "Compare if the first argument is < the second argument.", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "<=", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/Multiply.schema.json b/packages/expressions/schemas/Multiply.schema.json index b3e12e540..6a8b6d517 100644 --- a/packages/expressions/schemas/Multiply.schema.json +++ b/packages/expressions/schemas/Multiply.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/Multiply.schema.json", "title": "Multiply", "description": "Multiply two values", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "*", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json index 411312f0f..007f84cfc 100644 --- a/packages/expressions/schemas/NotEqual.schema.json +++ b/packages/expressions/schemas/NotEqual.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", "title": "NotEqual", "description": "Compare two values for equality", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "!=", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/Subtract.schema.json b/packages/expressions/schemas/Subtract.schema.json index 7ab407583..053bc6ec5 100644 --- a/packages/expressions/schemas/Subtract.schema.json +++ b/packages/expressions/schemas/Subtract.schema.json @@ -3,5 +3,6 @@ "$id": "https://www.flippercloud.io/expressions/Subtract.schema.json", "title": "Subtract", "description": "Subtract two values", - "$ref": "schema.json#/definitions/arguments-two" + "operator": "-", + "$ref": "schema.json#/definitions/operation" } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index f4531e259..8812fc08e 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -22,7 +22,8 @@ }, { "title": "Boolean", - "type": "boolean" + "type": "boolean", + "enum": [true, false] } ] }, @@ -82,8 +83,8 @@ "items": { "$ref": "#" }, "minItems": 0 }, - "arguments-two": { - "title": "Comparison", + "operation": { + "title": "Operation", "description": "An array with exactly two expressions", "type": "array", "items": { "$ref": "#" }, From 3f6d2410d69d37d7dd0cf378b51d73d13361abfd Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Jul 2023 12:25:28 -0400 Subject: [PATCH 30/44] Allow null as a constant --- lib/flipper/expression.rb | 2 +- lib/flipper/expressions/percentage.rb | 2 +- lib/flipper/gates/expression.rb | 2 +- packages/expressions/examples/Equal.json | 8 ++++++ .../expressions/examples/expressions.json | 5 +++- packages/expressions/lib/constant.js | 2 +- packages/expressions/lib/expression.js | 16 +++++------- packages/expressions/schemas/schema.json | 3 +++ packages/expressions/test/constant.test.js | 5 ++-- packages/expressions/test/expression.test.js | 25 ++++++++++++++++++- packages/expressions/test/schemas.test.js | 4 +-- spec/flipper/gates/expression_spec.rb | 5 ++++ 12 files changed, 58 insertions(+), 21 deletions(-) diff --git a/lib/flipper/expression.rb b/lib/flipper/expression.rb index ed23c4f90..def358003 100644 --- a/lib/flipper/expression.rb +++ b/lib/flipper/expression.rb @@ -22,7 +22,7 @@ def self.build(object) args = args.is_a?(Hash) ? [args] : Array(args) new(name, args.map { |o| build(o) }) - when String, Numeric, FalseClass, TrueClass + when String, Numeric, FalseClass, TrueClass, nil Expression::Constant.new(object) when Symbol Expression::Constant.new(object.to_s) diff --git a/lib/flipper/expressions/percentage.rb b/lib/flipper/expressions/percentage.rb index ec79713a5..bdad81461 100644 --- a/lib/flipper/expressions/percentage.rb +++ b/lib/flipper/expressions/percentage.rb @@ -2,7 +2,7 @@ module Flipper module Expressions class Percentage def self.call(value) - value.to_f.clamp(0, 100) + value.clamp(0, 100) end end end diff --git a/lib/flipper/gates/expression.rb b/lib/flipper/gates/expression.rb index 53d4dc31e..2e3ac91df 100644 --- a/lib/flipper/gates/expression.rb +++ b/lib/flipper/gates/expression.rb @@ -39,7 +39,7 @@ def open?(context) end def protects?(thing) - thing.is_a?(Flipper::Expression) || thing.is_a?(Hash) + thing.is_a?(Flipper::Expression) || thing.is_a?(Flipper::Expression::Constant) || thing.is_a?(Hash) end def wrap(thing) diff --git a/packages/expressions/examples/Equal.json b/packages/expressions/examples/Equal.json index 4531e3c41..aeef35c05 100644 --- a/packages/expressions/examples/Equal.json +++ b/packages/expressions/examples/Equal.json @@ -8,6 +8,14 @@ "expression": { "Equal": ["a", "a"] }, "result": { "enum": [true] } }, + { + "expression": { "Equal": [null, null] }, + "result": { "enum": [true] } + }, + { + "expression": { "Equal": [null, false] }, + "result": { "enum": [false] } + }, { "expression": { "Equal": [1, 2] }, "result": { "enum": [false] } diff --git a/packages/expressions/examples/expressions.json b/packages/expressions/examples/expressions.json index 3ad836e3b..277ac5e8f 100644 --- a/packages/expressions/examples/expressions.json +++ b/packages/expressions/examples/expressions.json @@ -19,10 +19,13 @@ { "expression": 1.1, "result": { "enum": [1.1] } + }, + { + "expression": null, + "result": { "enum": [null] } } ], "invalid": [ - null, {}, [] ] diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js index 8c2fd35de..74e44a435 100644 --- a/packages/expressions/lib/constant.js +++ b/packages/expressions/lib/constant.js @@ -5,7 +5,7 @@ import { Schema } from './schemas' // // Implements the same interface as Expression export class Constant { - constructor (value, { id = uuidv4(), schema = Schema.resolve('#/definitions/constant') } = {}) { + constructor (value, { id = uuidv4(), schema = Schema.resolve('#') } = {}) { this.value = value this.id = id this.schema = schema diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index 3d9b80e09..de469af37 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -3,13 +3,9 @@ import { Constant } from './constant' import { Schema } from './schemas' function toArray (arg) { - if (Array.isArray(arg)) { - return arg - } else if (arg === null) { - return [] - } else { - return [arg] - } + if (Array.isArray(arg)) return arg + if (arg === null) return [] + return [arg] } // Simple model to transform this: `{ All: [{ Boolean: [true] }]` @@ -20,14 +16,14 @@ export class Expression { return expression } - if (typeof expression === 'object') { + if (['number', 'string', 'boolean'].includes(typeof expression) || expression === null) { + return new Constant(expression, { schema }) + } else if (typeof expression === 'object') { if (Object.keys(expression).length !== 1) { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } const name = Object.keys(expression)[0] return new Expression({ name, args: expression[name] }) - } else if (['number', 'string', 'boolean'].includes(typeof expression)) { - return new Constant(expression, { schema }) } else { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json index 8812fc08e..ae4d12198 100644 --- a/packages/expressions/schemas/schema.json +++ b/packages/expressions/schemas/schema.json @@ -24,6 +24,9 @@ "title": "Boolean", "type": "boolean", "enum": [true, false] + }, + { + "type": "null" } ] }, diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index 1981f5c1d..67cf5635b 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -3,8 +3,8 @@ import { Constant, Schema } from '../lib' describe('Constant', () => { describe('schema', () => { - test('defaults to Constant schema', () => { - expect(new Constant('string').schema.title).toEqual('Constant') + test('defaults to expression schema', () => { + expect(new Constant('string').schema.title).toEqual('Expression') }) test('uses provided schema', () => { @@ -26,7 +26,6 @@ describe('Constant', () => { test('returns false for invalid value', () => { expect(new Constant(['array']).validate().valid).toBe(false) - expect(new Constant({Now: []}).validate().valid).toBe(false) }) test('uses provided schema', () => { diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index bd96cde76..7ddb6b4f0 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -11,6 +11,24 @@ describe('Expression', () => { expect(expression.value).toEqual({ All: [true] }) }) + test('builds an expression from a boolean constant', () => { + const expression = Expression.build(true) + expect(expression).toBeInstanceOf(Constant) + expect(expression.value).toEqual(true) + }) + + test('builds an expression from a string constant', () => { + const expression = Expression.build('hello') + expect(expression).toBeInstanceOf(Constant) + expect(expression.value).toEqual('hello') + }) + + test('builds an expression from a null constant', () => { + const expression = Expression.build(null) + expect(expression).toBeInstanceOf(Constant) + expect(expression.value).toEqual(null) + }) + test('throws error on invalid expression', () => { expect(() => Expression.build([])).toThrowError(TypeError) expect(() => Expression.build(new Date())).toThrowError(TypeError) @@ -25,8 +43,13 @@ describe('Expression', () => { expect(expression.args[1].schema).toEqual(schema.items[1]) }) + test('sets schema for constant', () => { + const expression = Expression.build(false) + expect(expression.schema.$id).toEqual(Schema.resolve('#').$id) + }) + test('each subexpression uses its own schema', () => { - const expression = Expression.build({ GreaterThan: [ { Now: [] }, { Property: ['released_at'] } ] }) + const expression = Expression.build({ GreaterThan: [{ Now: [] }, { Property: ['released_at'] }] }) expect(expression.schema).toEqual(Schema.resolve('GreaterThan.schema.json')) expect(expression.args[0].schema).toEqual(Schema.resolve('Now.schema.json')) expect(expression.args[1].schema).toEqual(Schema.resolve('Property.schema.json')) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js index cff727813..781e3bbd1 100644 --- a/packages/expressions/test/schemas.test.js +++ b/packages/expressions/test/schemas.test.js @@ -55,12 +55,12 @@ describe('schema.json', () => { describe('resolveAnyOf', () => { test('returns nested anyOf', () => { const ref = Schema.resolve('#') - expect(ref.resolveAnyOf()).toHaveLength(4) + expect(ref.resolveAnyOf()).toHaveLength(5) }) test('returns array of schemas', () => { const ref = Schema.resolve('#/definitions/constant') - expect(ref.resolveAnyOf()).toHaveLength(3) + expect(ref.resolveAnyOf()).toHaveLength(4) expect(ref.resolveAnyOf()).toEqual(ref.anyOf) }) }) diff --git a/spec/flipper/gates/expression_spec.rb b/spec/flipper/gates/expression_spec.rb index 21509d2d7..74361bba7 100644 --- a/spec/flipper/gates/expression_spec.rb +++ b/spec/flipper/gates/expression_spec.rb @@ -83,6 +83,11 @@ def context(expression, properties: {}) expect(subject.protects?(expression)).to be(true) end + it 'returns true for Flipper::Constant' do + expression = Flipper.boolean(true) + expect(subject.protects?(expression)).to be(true) + end + it 'returns true for Hash' do expression = Flipper.number(20).eq(20) expect(subject.protects?(expression.value)).to be(true) From cfecaf54bd7b9a8e98d8ac3244ac2ebcdca0ea38 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Mon, 17 Jul 2023 13:37:23 -0400 Subject: [PATCH 31/44] Specify json_schemer version number --- flipper.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flipper.gemspec b/flipper.gemspec index 573ca5eb1..81875f78a 100644 --- a/flipper.gemspec +++ b/flipper.gemspec @@ -35,5 +35,5 @@ Gem::Specification.new do |gem| gem.metadata = Flipper::METADATA gem.add_dependency 'concurrent-ruby', '< 2' - gem.add_dependency 'json_schemer' + gem.add_dependency 'json_schemer', '~> 1.0' end From e3b32c4182307b39726542c1b6797cdfa0287921 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Wed, 19 Jul 2023 08:48:03 -0400 Subject: [PATCH 32/44] =?UTF-8?q?JS:=20Define=20expression.add(=E2=80=A6)?= =?UTF-8?q?=20to=20build=20new=20expression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/expressions/lib/expression.js | 8 ++++++++ packages/expressions/test/expression.test.js | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index de469af37..7589e9ca4 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -51,4 +51,12 @@ export class Expression { matches (schema) { return this.validate(schema).valid } + + add (expression) { + if (this.schema.maxItems) { + return Expression.build({ All: [this, expression] }) + } else { + return this.clone({ args: [...this.args, expression] }) + } + } } diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index 7ddb6b4f0..15fcf2e7f 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -85,4 +85,21 @@ describe('Expression', () => { expect(expression.validate().valid).toBe(false) }) }) + + describe('add', () => { + test('Any returns new expression with added arg', () => { + const expression = Expression.build({ Any: [] }).add(true) + expect(expression.value).toEqual({ Any: [true] }) + }) + + test('Max returns new expression with added arg', () => { + const expression = Expression.build({ Max: [1] }).add(2) + expect(expression.value).toEqual({ Max: [1, 2] }) + }) + + test('Equal returns new expression wrapped in All', () => { + const expression = Expression.build({ Equal: [1, 1] }).add(false) + expect(expression.value).toEqual({ All: [{ Equal: [1, 1] }, false] }) + }) + }) }) From 0848411c837770e4ab480d18605a5ef8455ad6a2 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Tue, 25 Jul 2023 11:21:07 -0400 Subject: [PATCH 33/44] Add parent to expressions, refactor - Adds `class Function extends Expression` - `class Constant extends Expresson` --- packages/expressions/lib/constant.js | 29 ------- packages/expressions/lib/expression.js | 90 ++++++++++++++------ packages/expressions/lib/index.js | 3 +- packages/expressions/test/constant.test.js | 30 +++---- packages/expressions/test/expression.test.js | 41 ++------- packages/expressions/test/function.test.js | 37 ++++++++ 6 files changed, 124 insertions(+), 106 deletions(-) delete mode 100644 packages/expressions/lib/constant.js create mode 100644 packages/expressions/test/function.test.js diff --git a/packages/expressions/lib/constant.js b/packages/expressions/lib/constant.js deleted file mode 100644 index 74e44a435..000000000 --- a/packages/expressions/lib/constant.js +++ /dev/null @@ -1,29 +0,0 @@ -import { v4 as uuidv4 } from 'uuid' -import { Schema } from './schemas' - -// Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). -// -// Implements the same interface as Expression -export class Constant { - constructor (value, { id = uuidv4(), schema = Schema.resolve('#') } = {}) { - this.value = value - this.id = id - this.schema = schema - } - - clone (value, { id = this.id, schema = this.schema } = {}) { - return new Constant(value, { id, schema }) - } - - get args () { - return [this.value] - } - - validate (schema = this.schema) { - return schema.validate(this.value) - } - - matches (schema = this.schema) { - return schema.validate(this.value).valid - } -} diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js index 7589e9ca4..9f3289550 100644 --- a/packages/expressions/lib/expression.js +++ b/packages/expressions/lib/expression.js @@ -1,43 +1,66 @@ import { v4 as uuidv4 } from 'uuid' -import { Constant } from './constant' import { Schema } from './schemas' -function toArray (arg) { - if (Array.isArray(arg)) return arg - if (arg === null) return [] - return [arg] -} - -// Simple model to transform this: `{ All: [{ Boolean: [true] }]` -// into this: `{ id: uuidv4(), name: 'All', args: [{ id: uuidv4(), name: 'Boolean', args: [true] }] }` export class Expression { - static build (expression, schema = undefined) { - if (expression instanceof Expression || expression instanceof Constant) { - return expression + static build (expression, attrs = {}) { + if (expression instanceof Function || expression instanceof Constant) { + return expression.clone(attrs) } if (['number', 'string', 'boolean'].includes(typeof expression) || expression === null) { - return new Constant(expression, { schema }) + return new Constant({ value: expression, ...attrs }) } else if (typeof expression === 'object') { if (Object.keys(expression).length !== 1) { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } const name = Object.keys(expression)[0] - return new Expression({ name, args: expression[name] }) + return new Function({ name, args: expression[name] }) } else { throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) } } - constructor ({ name, args, id = uuidv4() }) { + constructor ({ id = uuidv4(), parent = undefined }) { this.id = id - this.name = name - this.schema = Schema.resolve(`${name}.schema.json`) - this.args = toArray(args).map((arg, i) => Expression.build(arg, this.schema.arrayItem(i))) + this.parent = parent + } + + clone (attrs = {}) { + return new this.constructor(Object.assign({}, this, attrs)) + } + + matches (schema) { + return this.validate(schema).valid + } + + add (expression) { + if (this.schema.type !== 'array' || this.schema.maxItems) { + return Expression.build({ All: [this, expression] }) + } else { + return this.clone({ args: [...this.args, expression] }) + } + } + + get parents () { + return this.parent ? [this.parent, ...this.parent.parents] : [] } - clone ({ id = this.id, name = this.name, args = this.args } = {}) { - return new Expression({ id, name, args }) + get depth () { + return this.parents.length + } +} + +// Public: A function like "All", "Any", "Equal", "Duration", etc. +export class Function extends Expression { + constructor ({ name, args, ...attrs }) { + super(attrs) + + this.name = name + this.schema = Schema.resolve(`${name}.schema.json`) + this.args = toArray(args).map((arg, i) => Expression.build(arg, { + schema: this.schema.arrayItem(i), + parent: this + })) } get value () { @@ -47,16 +70,27 @@ export class Expression { validate (schema = this.schema) { return schema.validate(this.args.map(arg => arg.value)) } +} - matches (schema) { - return this.validate(schema).valid +// Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). +export class Constant extends Expression { + constructor ({ value, schema = Schema.resolve('#'), ...attrs }) { + super(attrs) + this.value = value + this.schema = schema } - add (expression) { - if (this.schema.maxItems) { - return Expression.build({ All: [this, expression] }) - } else { - return this.clone({ args: [...this.args, expression] }) - } + get args () { + return [this.value] + } + + validate (schema = this.schema) { + return schema.validate(this.value) } } + +function toArray (arg) { + if (Array.isArray(arg)) return arg + if (arg === null) return [] + return [arg] +} diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js index 0375015ea..793334eb5 100644 --- a/packages/expressions/lib/index.js +++ b/packages/expressions/lib/index.js @@ -1,4 +1,3 @@ export { Schema, schemas, BaseURI } from './schemas' -export { Expression } from './expression' -export { Constant } from './constant' +export { Expression, Function, Constant } from './expression' export { default as examples } from '../examples' diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js index 67cf5635b..d538c4a3e 100644 --- a/packages/expressions/test/constant.test.js +++ b/packages/expressions/test/constant.test.js @@ -4,49 +4,49 @@ import { Constant, Schema } from '../lib' describe('Constant', () => { describe('schema', () => { test('defaults to expression schema', () => { - expect(new Constant('string').schema.title).toEqual('Expression') + expect(new Constant({ value: 'string' }).schema.title).toEqual('Expression') }) test('uses provided schema', () => { const schema = Schema.resolve('#/definitions/number') - const number = new Constant(42, { schema }) + const number = new Constant({ value: 42, schema }) expect(number.schema).toEqual(schema) - expect(number.clone(99).schema).toEqual(schema) + expect(number.clone({ value: 99 }).schema).toEqual(schema) }) }) describe('validate', () => { test('returns true for valid value', () => { - expect(new Constant(true).validate().valid).toBe(true) - expect(new Constant(false).validate().valid).toBe(true) - expect(new Constant('string').validate().valid).toBe(true) - expect(new Constant(42).validate().valid).toBe(true) - expect(new Constant(3.14).validate().valid).toBe(true) + expect(new Constant({ value: true }).validate().valid).toBe(true) + expect(new Constant({ value: false }).validate().valid).toBe(true) + expect(new Constant({ value: 'string' }).validate().valid).toBe(true) + expect(new Constant({ value: 42 }).validate().valid).toBe(true) + expect(new Constant({ value: 3.14 }).validate().valid).toBe(true) }) test('returns false for invalid value', () => { - expect(new Constant(['array']).validate().valid).toBe(false) + expect(new Constant({ value: ['array'] }).validate().valid).toBe(false) }) test('uses provided schema', () => { const schema = Schema.resolve('#/definitions/number') - expect(new Constant(42, { schema }).validate().valid).toBe(true) - expect(new Constant(42).validate(schema).valid).toBe(true) + expect(new Constant({ value: 42, schema }).validate().valid).toBe(true) + expect(new Constant({ value: 42 }).validate(schema).valid).toBe(true) - expect(new Constant('nope', { schema }).validate().valid).toBe(false) - expect(new Constant('nope').validate(schema).valid).toBe(false) + expect(new Constant({ value: 'nope', schema }).validate().valid).toBe(false) + expect(new Constant({ value: 'nope' }).validate(schema).valid).toBe(false) }) }) describe('matches', () => { test('returns true for matching validator', () => { const schema = Schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant('string').matches(schema)).toBe(true) + expect(new Constant({ value: 'string' }).matches(schema)).toBe(true) }) test('returns false for different schema', () => { const schema = Schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant(true).matches(schema)).toBe(false) + expect(new Constant({ value: true }).matches(schema)).toBe(false) }) }) }) diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js index 15fcf2e7f..c123f70c4 100644 --- a/packages/expressions/test/expression.test.js +++ b/packages/expressions/test/expression.test.js @@ -1,13 +1,15 @@ import { describe, test, expect } from 'vitest' -import { Expression, Constant, Schema } from '../lib' +import { Expression, Function, Constant, Schema } from '../lib' describe('Expression', () => { describe('build', () => { test('builds an expression from an object', () => { const expression = Expression.build({ All: [true] }) + expect(expression).toBeInstanceOf(Function) expect(expression.name).toEqual('All') expect(expression.args[0]).toBeInstanceOf(Constant) - expect(expression.args[0].value).toEqual(true) + expect(expression.args[0].value).toBe(true) + expect(expression.args[0].parent).toBe(expression) expect(expression.value).toEqual({ All: [true] }) }) @@ -56,36 +58,6 @@ describe('Expression', () => { }) }) - describe('clone', () => { - test('returns new expression', () => { - const expression = Expression.build({ All: [true] }) - const clone = expression.clone() - expect(clone).not.toBe(expression) - expect(clone.name).toEqual(expression.name) - expect(clone.args).toEqual(expression.args) - expect(clone.id).toEqual(expression.id) - }) - - test('builds args', () => { - const expression = Expression.build({ All: [] }) - const clone = expression.clone({ args: [true] }) - expect(clone.args[0]).toBeInstanceOf(Constant) - expect(clone.value).toEqual({ All: [true] }) - }) - }) - - describe('validate', () => { - test('passes for valid expression', () => { - const expression = Expression.build({ All: [true] }) - expect(expression.validate().valid).toBe(true) - }) - - test('fails for invalid expression', () => { - const expression = Expression.build({ Duration: [] }) - expect(expression.validate().valid).toBe(false) - }) - }) - describe('add', () => { test('Any returns new expression with added arg', () => { const expression = Expression.build({ Any: [] }).add(true) @@ -101,5 +73,10 @@ describe('Expression', () => { const expression = Expression.build({ Equal: [1, 1] }).add(false) expect(expression.value).toEqual({ All: [{ Equal: [1, 1] }, false] }) }) + + test('Constant returns new expression wrapped in All', () => { + const expression = Expression.build(true).add(false) + expect(expression.value).toEqual({ All: [true, false] }) + }) }) }) diff --git a/packages/expressions/test/function.test.js b/packages/expressions/test/function.test.js new file mode 100644 index 000000000..ea1a64539 --- /dev/null +++ b/packages/expressions/test/function.test.js @@ -0,0 +1,37 @@ +import { describe, test, expect } from 'vitest' +import { Expression, Function, Constant } from '../lib' + +describe('Function', () => { + describe('clone', () => { + test('returns new expression', () => { + const expression = Expression.build({ All: [true] }) + const clone = expression.clone() + expect(clone).not.toBe(expression) + expect(clone).toBeInstanceOf(Function) + expect(clone.name).toEqual(expression.name) + expect(clone.args).toEqual(expression.args) + expect(clone.id).toEqual(expression.id) + expect(clone.args[0].parent).toBe(clone) + expect(clone.args[0].depth).toBe(1) + }) + + test('builds args', () => { + const expression = Expression.build({ All: [] }) + const clone = expression.clone({ args: [true] }) + expect(clone.args[0]).toBeInstanceOf(Constant) + expect(clone.value).toEqual({ All: [true] }) + }) + }) + + describe('validate', () => { + test('passes for valid expression', () => { + const expression = Expression.build({ All: [true] }) + expect(expression.validate().valid).toBe(true) + }) + + test('fails for invalid expression', () => { + const expression = Expression.build({ Duration: [] }) + expect(expression.validate().valid).toBe(false) + }) + }) +}) From 639d2a7373ff3e9639e67ebbc11426a0cf7adf9f Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 09:57:10 -0400 Subject: [PATCH 34/44] Use external package for schemas --- .github/workflows/ci.yml | 18 +- .gitignore | 2 + .tool-versions | 1 - lib/flipper/expression/schema.rb | 3 +- package-lock.json | 99 + package.json | 6 + packages/expressions/.gitignore | 3 - packages/expressions/README.md | 18 - packages/expressions/examples/Add.json | 24 - packages/expressions/examples/All.json | 40 - packages/expressions/examples/Any.json | 44 - packages/expressions/examples/Boolean.json | 65 - packages/expressions/examples/Divide.json | 24 - packages/expressions/examples/Duration.json | 37 - packages/expressions/examples/Equal.json | 44 - .../expressions/examples/GreaterThan.json | 36 - .../examples/GreaterThanOrEqualTo.json | 48 - packages/expressions/examples/LessThan.json | 45 - .../examples/LessThanOrEqualTo.json | 45 - packages/expressions/examples/Max.json | 35 - packages/expressions/examples/Min.json | 35 - packages/expressions/examples/Multiply.json | 24 - packages/expressions/examples/NotEqual.json | 40 - packages/expressions/examples/Now.json | 20 - packages/expressions/examples/Number.json | 50 - packages/expressions/examples/Percentage.json | 34 - .../examples/PercentageOfActors.json | 48 - packages/expressions/examples/Property.json | 27 - packages/expressions/examples/Random.json | 28 - packages/expressions/examples/String.json | 57 - packages/expressions/examples/Subtract.json | 20 - packages/expressions/examples/Time.json | 24 - .../expressions/examples/expressions.json | 32 - packages/expressions/examples/index.js | 6 - packages/expressions/jest.config.js | 195 -- packages/expressions/lib/expression.js | 96 - packages/expressions/lib/index.js | 3 - packages/expressions/lib/schemas.js | 108 - packages/expressions/package.json | 36 - packages/expressions/schemas/Add.schema.json | 8 - packages/expressions/schemas/All.schema.json | 7 - packages/expressions/schemas/Any.schema.json | 7 - .../expressions/schemas/Boolean.schema.json | 7 - .../expressions/schemas/Divide.schema.json | 8 - .../expressions/schemas/Duration.schema.json | 22 - .../expressions/schemas/Equal.schema.json | 8 - .../schemas/GreaterThan.schema.json | 8 - .../schemas/GreaterThanOrEqualTo.schema.json | 8 - .../expressions/schemas/LessThan.schema.json | 8 - .../schemas/LessThanOrEqualTo.schema.json | 8 - packages/expressions/schemas/Max.schema.json | 7 - packages/expressions/schemas/Min.schema.json | 7 - .../expressions/schemas/Multiply.schema.json | 8 - .../expressions/schemas/NotEqual.schema.json | 8 - packages/expressions/schemas/Now.schema.json | 8 - .../expressions/schemas/Number.schema.json | 7 - .../schemas/Percentage.schema.json | 10 - .../schemas/PercentageOfActors.schema.json | 13 - .../expressions/schemas/Property.schema.json | 10 - .../expressions/schemas/Random.schema.json | 9 - .../expressions/schemas/String.schema.json | 7 - .../expressions/schemas/Subtract.schema.json | 8 - packages/expressions/schemas/Time.schema.json | 18 - packages/expressions/schemas/schema.json | 105 - packages/expressions/test/constant.test.js | 52 - packages/expressions/test/expression.test.js | 82 - packages/expressions/test/function.test.js | 37 - packages/expressions/test/schemas.test.js | 82 - packages/expressions/vite.config.js | 20 - packages/expressions/yarn.lock | 2121 ----------------- script/bootstrap | 1 + 71 files changed, 112 insertions(+), 4127 deletions(-) delete mode 100644 .tool-versions create mode 100644 package-lock.json create mode 100644 package.json delete mode 100644 packages/expressions/.gitignore delete mode 100644 packages/expressions/README.md delete mode 100644 packages/expressions/examples/Add.json delete mode 100644 packages/expressions/examples/All.json delete mode 100644 packages/expressions/examples/Any.json delete mode 100644 packages/expressions/examples/Boolean.json delete mode 100644 packages/expressions/examples/Divide.json delete mode 100644 packages/expressions/examples/Duration.json delete mode 100644 packages/expressions/examples/Equal.json delete mode 100644 packages/expressions/examples/GreaterThan.json delete mode 100644 packages/expressions/examples/GreaterThanOrEqualTo.json delete mode 100644 packages/expressions/examples/LessThan.json delete mode 100644 packages/expressions/examples/LessThanOrEqualTo.json delete mode 100644 packages/expressions/examples/Max.json delete mode 100644 packages/expressions/examples/Min.json delete mode 100644 packages/expressions/examples/Multiply.json delete mode 100644 packages/expressions/examples/NotEqual.json delete mode 100644 packages/expressions/examples/Now.json delete mode 100644 packages/expressions/examples/Number.json delete mode 100644 packages/expressions/examples/Percentage.json delete mode 100644 packages/expressions/examples/PercentageOfActors.json delete mode 100644 packages/expressions/examples/Property.json delete mode 100644 packages/expressions/examples/Random.json delete mode 100644 packages/expressions/examples/String.json delete mode 100644 packages/expressions/examples/Subtract.json delete mode 100644 packages/expressions/examples/Time.json delete mode 100644 packages/expressions/examples/expressions.json delete mode 100644 packages/expressions/examples/index.js delete mode 100644 packages/expressions/jest.config.js delete mode 100644 packages/expressions/lib/expression.js delete mode 100644 packages/expressions/lib/index.js delete mode 100644 packages/expressions/lib/schemas.js delete mode 100644 packages/expressions/package.json delete mode 100644 packages/expressions/schemas/Add.schema.json delete mode 100644 packages/expressions/schemas/All.schema.json delete mode 100644 packages/expressions/schemas/Any.schema.json delete mode 100644 packages/expressions/schemas/Boolean.schema.json delete mode 100644 packages/expressions/schemas/Divide.schema.json delete mode 100644 packages/expressions/schemas/Duration.schema.json delete mode 100644 packages/expressions/schemas/Equal.schema.json delete mode 100644 packages/expressions/schemas/GreaterThan.schema.json delete mode 100644 packages/expressions/schemas/GreaterThanOrEqualTo.schema.json delete mode 100644 packages/expressions/schemas/LessThan.schema.json delete mode 100644 packages/expressions/schemas/LessThanOrEqualTo.schema.json delete mode 100644 packages/expressions/schemas/Max.schema.json delete mode 100644 packages/expressions/schemas/Min.schema.json delete mode 100644 packages/expressions/schemas/Multiply.schema.json delete mode 100644 packages/expressions/schemas/NotEqual.schema.json delete mode 100644 packages/expressions/schemas/Now.schema.json delete mode 100644 packages/expressions/schemas/Number.schema.json delete mode 100644 packages/expressions/schemas/Percentage.schema.json delete mode 100644 packages/expressions/schemas/PercentageOfActors.schema.json delete mode 100644 packages/expressions/schemas/Property.schema.json delete mode 100644 packages/expressions/schemas/Random.schema.json delete mode 100644 packages/expressions/schemas/String.schema.json delete mode 100644 packages/expressions/schemas/Subtract.schema.json delete mode 100644 packages/expressions/schemas/Time.schema.json delete mode 100644 packages/expressions/schemas/schema.json delete mode 100644 packages/expressions/test/constant.test.js delete mode 100644 packages/expressions/test/expression.test.js delete mode 100644 packages/expressions/test/function.test.js delete mode 100644 packages/expressions/test/schemas.test.js delete mode 100644 packages/expressions/vite.config.js delete mode 100644 packages/expressions/yarn.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a25396b0a..fb57d15a2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,20 +60,8 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # 'bundle install' and cache gems + - name: Set up Node + uses: actions/setup-node@v3 + - run: npm clean-install - name: Run Rake with Rails ${{ matrix.rails }} run: bundle exec rake - js: - name: JS - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - cache: 'yarn' - cache-dependency-path: packages/expressions/yarn.lock - - name: Run yarn lint + test - run: | - cd packages/expressions - yarn install - yarn lint - yarn test diff --git a/.gitignore b/.gitignore index c3d16d8d6..8b4f94266 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,5 @@ log .sass-cache bin .DS_Store +node_modules +.tool-versions diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index 0b2d85878..000000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -ruby 3.1.2 diff --git a/lib/flipper/expression/schema.rb b/lib/flipper/expression/schema.rb index 3868d8ec7..7d44f71be 100644 --- a/lib/flipper/expression/schema.rb +++ b/lib/flipper/expression/schema.rb @@ -3,8 +3,7 @@ module Flipper class Expression class Schema < JSONSchemer::Schema::Draft7 - PATH = - Pathname.new(File.expand_path("../../../packages/expressions", __dir__)) + PATH = Pathname.new(File.expand_path("../../../node_modules/@flippercloud.io/expressions", __dir__)) def self.schemas @schemas ||= diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..27a7f95a5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,99 @@ +{ + "name": "flipper", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@flippercloud.io/expressions": "github:flippercloud/expressions.js" + } + }, + "node_modules/@flippercloud.io/expressions": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/flippercloud/expressions.js.git#5ac389113fe4afa0b4a5f7cda0695e7f021f3804", + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "uuid": "^9.0.0" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..43b535668 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "private": true, + "dependencies": { + "@flippercloud.io/expressions": "github:flippercloud/expressions.js" + } +} diff --git a/packages/expressions/.gitignore b/packages/expressions/.gitignore deleted file mode 100644 index 1ca025f62..000000000 --- a/packages/expressions/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -dist -yarn-error.log diff --git a/packages/expressions/README.md b/packages/expressions/README.md deleted file mode 100644 index aa19cf8aa..000000000 --- a/packages/expressions/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Flipper Expressions - -> A schema for Flipper Expressions - -The structure for flipper Expressions is defined in [`schemas/schema.json`](./schemas/schema.json) using [JSON Schema](https://json-schema.org) ([draft-07](https://json-schema.org/specification-links.html#draft-7)). - -To learn more about JSON Schema, read [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/) or the [Ajv JSON schema validator docs](https://ajv.js.org/json-schema.html). - -## Adding a new expression - -1. Describe arguments by creating a new file in [`schemas/`](schemas/) named `NewName.schema.json`. You can copy an existing function that has similar semantics to get started. -2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `definitions/function`. -3. Create a new file in [`examples/`](./examples) named `NewName.json` with valid and invalid examples for the new function. See other examples for inspiration. -4. Run `yarn test` in `packages/expressions` and ensure tests pass. -5. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/). -6. Run `rspec` to ensure tests pass. - -See [this commit that adds Min/Max functions](https://github.com/jnunemaker/flipper/commit/ee46fab0cda21a32c3a921a8ed1fb94b0842b6b4) for a concrete example. diff --git a/packages/expressions/examples/Add.json b/packages/expressions/examples/Add.json deleted file mode 100644 index 06cb581d9..000000000 --- a/packages/expressions/examples/Add.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "valid": [ - { - "expression": { "Add": [2, 2] }, - "result": { "enum": [4] } - }, - { - "expression": { "Add": ["a", "a"] }, - "result": { "enum": ["aa"] } - }, - { - "expression": { "Add": [{ "Property": "age" }, 3] }, - "context": { "properties": { "age": 18 }}, - "result": { "enum": [21] } - } - ], - "invalid": [ - { "Add": [1, 2, 3] }, - { "Add": [1] }, - { "Add": 1 }, - { "Add": null }, - { "Add": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/All.json b/packages/expressions/examples/All.json deleted file mode 100644 index 49e906278..000000000 --- a/packages/expressions/examples/All.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "valid": [ - { - "expression": { "All": [] }, - "result": { "enum": [true] } - }, - { - "expression": { "All": [true] }, - "result": { "enum": [true] } - }, - { - "expression": { "All": [true, false] }, - "result": { "enum": [false] } - }, - { - "expression": { "All": [1, true, "string"] }, - "result": { "enum": [true] } - }, - { - "expression": { "All": true }, - "result": { "enum": [true] } - }, - { - "expression": { "All": false }, - "result": { "enum": [false] } - }, - { - "expression": { "All": [{ "Boolean": true }, { "Property": "admin" }] }, - "context": { "properties": { "admin": true } }, - "result": { "enum": [true] } - }, - { - "expression": { "All": null }, - "result": { "enum": [true] } - } - ], - "invalid": [ - { "All": [], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Any.json b/packages/expressions/examples/Any.json deleted file mode 100644 index 19b779727..000000000 --- a/packages/expressions/examples/Any.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "valid": [ - { - "expression": { "Any": [] }, - "result": { "enum": [false] } - }, - { - "expression": { "Any": [true] }, - "result": { "enum": [true] } - }, - { - "expression": { "Any": [true, false] }, - "result": { "enum": [true] } - }, - { - "expression": { "Any": [false, false] }, - "result": { "enum": [false] } - }, - { - "expression": { "Any": [1, true, "string"] }, - "result": { "enum": [true] } - }, - { - "expression": { "Any": true }, - "result": { "enum": [true] } - }, - { - "expression": { "Any": false }, - "result": { "enum": [false] } - }, - { - "expression": { "Any": [{ "Boolean": false }, { "Property": "admin" }] }, - "context": { "properties": { "admin": true } }, - "result": { "enum": [true] } - }, - { - "expression": { "Any": null }, - "result": { "enum": [false] } - } - ], - "invalid": [ - { "Any": [], "All": [] } - ] -} diff --git a/packages/expressions/examples/Boolean.json b/packages/expressions/examples/Boolean.json deleted file mode 100644 index 58298972a..000000000 --- a/packages/expressions/examples/Boolean.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "valid": [ - { - "expression": { "Boolean": true }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": "true" }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": 1 }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": [true] }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": ["true"] }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": [1] }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": { "All": [] } }, - "result": { "enum": [true] } - }, - { - "expression": { "Boolean": false }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": "false" }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": 0 }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": [false] }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": ["false"] }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": [0] }, - "result": { "enum": [false] } - }, - { - "expression": { "Boolean": [{ "Any": [] }] }, - "result": { "enum": [false] } - } - ], - "invalid": [ - { "Boolean": null }, - { "Boolean": [true, false] }, - { "Boolean": true, "Any": [] } - ] -} diff --git a/packages/expressions/examples/Divide.json b/packages/expressions/examples/Divide.json deleted file mode 100644 index 84b345503..000000000 --- a/packages/expressions/examples/Divide.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "valid": [ - { - "expression": { "Divide": [6, 2] }, - "result": { "enum": [3] } - }, - { - "expression": { "Divide": [3, 1.5] }, - "result": { "enum": [2.0] } - }, - { - "expression": { "Divide": [{ "Property": "age" }, 3] }, - "context": { "properties": { "age": 18 }}, - "result": { "enum": [6] } - } - ], - "invalid": [ - { "Divide": [1, 2, 3] }, - { "Divide": [1] }, - { "Divide": 1 }, - { "Divide": null }, - { "Divide": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Duration.json b/packages/expressions/examples/Duration.json deleted file mode 100644 index f8f603615..000000000 --- a/packages/expressions/examples/Duration.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "valid": [ - { - "expression": { "Duration": [2, "seconds"] }, - "result": { "enum": [2] } - }, - { - "expression": { "Duration": [2, "minutes"] }, - "result": { "enum": [120] } - }, - { - "expression": { "Duration": [2, "hours"] }, - "result": { "enum": [7200] } - }, - { - "expression": { "Duration": [2, "days"] }, - "result": { "enum": [172800] } - }, - { - "expression": { "Duration": [2, "weeks"] }, - "result": { "enum": [1209600] } - }, - { - "expression": { "Duration": [2, "months"] }, - "result": { "enum": [5259492] } - }, - { - "expression": { "Duration": [2, "years"] }, - "result": { "enum": [63113904] } - } - ], - "invalid": [ - { "Duration": [4, "score"] }, - { "Duration": 2 }, - { "Duration": [2] } - ] -} diff --git a/packages/expressions/examples/Equal.json b/packages/expressions/examples/Equal.json deleted file mode 100644 index aeef35c05..000000000 --- a/packages/expressions/examples/Equal.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "valid": [ - { - "expression": { "Equal": [1, 1] }, - "result": { "enum": [true] } - }, - { - "expression": { "Equal": ["a", "a"] }, - "result": { "enum": [true] } - }, - { - "expression": { "Equal": [null, null] }, - "result": { "enum": [true] } - }, - { - "expression": { "Equal": [null, false] }, - "result": { "enum": [false] } - }, - { - "expression": { "Equal": [1, 2] }, - "result": { "enum": [false] } - }, - { - "expression": { "Equal": ["a", "b"] }, - "result": { "enum": [false] } - }, - { - "expression": { "Equal": [true, false] }, - "result": { "enum": [false] } - }, - { - "expression": { "Equal": [{ "Property": "age" }, 21] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [true] } - } - ], - "invalid": [ - { "Equal": [1, 2, 3] }, - { "Equal": [1] }, - { "Equal": 1 }, - { "Equal": null }, - { "Equal": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/GreaterThan.json b/packages/expressions/examples/GreaterThan.json deleted file mode 100644 index 84fea5bfb..000000000 --- a/packages/expressions/examples/GreaterThan.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "valid": [ - { - "expression": { "GreaterThan": [1, 1] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThan": ["a", "a"] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThan": [2, 1] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThan": ["b", "a"] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThan": ["a", "b"] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThan": [{ "Property": "age" }, 18] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [true] } - } - ], - "invalid": [ - { "GreaterThan": [1, 2, 3] }, - { "GreaterThan": [1] }, - { "GreaterThan": 1 }, - { "GreaterThan": null }, - { "GreaterThan": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/GreaterThanOrEqualTo.json b/packages/expressions/examples/GreaterThanOrEqualTo.json deleted file mode 100644 index 10ce0a101..000000000 --- a/packages/expressions/examples/GreaterThanOrEqualTo.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "valid": [ - { - "expression": { "GreaterThanOrEqualTo": [1, 1] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThanOrEqualTo": [2, 1] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThanOrEqualTo": ["a", "b"] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThanOrEqualTo": ["b", "b"] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThanOrEqualTo": [1, 2] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThanOrEqualTo": ["b", "a"] }, - "result": { "enum": [true] } - }, - { - "expression": { "GreaterThanOrEqualTo": ["a", "b"] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThanOrEqualTo": [true, false] }, - "result": { "enum": [false] } - }, - { - "expression": { "GreaterThanOrEqualTo": [{ "Property": "age" }, 18] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [true] } - } - ], - "invalid": [ - { "GreaterThanOrEqualTo": [1, 2, 3] }, - { "GreaterThanOrEqualTo": [1] }, - { "GreaterThanOrEqualTo": 1 }, - { "GreaterThanOrEqualTo": null }, - { "GreaterThanOrEqualTo": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/LessThan.json b/packages/expressions/examples/LessThan.json deleted file mode 100644 index d38820605..000000000 --- a/packages/expressions/examples/LessThan.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "valid": [ - { - "expression": { "LessThan": [1, 1] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThan": ["a", "a"] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThan": [2, 1] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThan": [1, 2] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThan": ["b", "a"] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThan": ["a", "b"] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThan": [{ "Property": "age" }, 18] }, - "context": { "properties": { "age": 17 }}, - "result": { "enum": [true] } - }, - { - "expression": { "LessThan": [{ "Property": "age" }, 18] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [false] } - } - ], - "invalid": [ - { "LessThan": [1, 2, 3] }, - { "LessThan": [1] }, - { "LessThan": 1 }, - { "LessThan": null }, - { "LessThan": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/LessThanOrEqualTo.json b/packages/expressions/examples/LessThanOrEqualTo.json deleted file mode 100644 index bb65681bb..000000000 --- a/packages/expressions/examples/LessThanOrEqualTo.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "valid": [ - { - "expression": { "LessThanOrEqualTo": [1, 1] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThanOrEqualTo": [2, 1] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThanOrEqualTo": ["a", "b"] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThanOrEqualTo": ["b", "b"] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThanOrEqualTo": [1, 2] }, - "result": { "enum": [true] } - }, - { - "expression": { "LessThanOrEqualTo": ["b", "a"] }, - "result": { "enum": [false] } - }, - { - "expression": { "LessThanOrEqualTo": [{ "Property": "age" }, 21] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [true] } - }, - { - "expression": { "LessThanOrEqualTo": [{ "Property": "age" }, 18] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [false] } - } - ], - "invalid": [ - { "LessThanOrEqualTo": [1, 2, 3] }, - { "LessThanOrEqualTo": [1] }, - { "LessThanOrEqualTo": 1 }, - { "LessThanOrEqualTo": null }, - { "LessThanOrEqualTo": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Max.json b/packages/expressions/examples/Max.json deleted file mode 100644 index 9d5d024c6..000000000 --- a/packages/expressions/examples/Max.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "valid": [ - { - "expression": { "Max": [] }, - "result": { "enum": [null] } - }, - { - "expression": { "Max": null }, - "result": { "enum": [null] } - }, - { - "expression": { "Max": [3, 2, 1] }, - "result": { "enum": [3] } - }, - { - "expression": { "Max": [0.1, 0.2] }, - "result": { "enum": [0.2] } - }, - { - "expression": { "Max": ["a", "b"] }, - "result": { "enum": ["b"] } - }, - { - "expression": { "Max": 100 }, - "result": { "enum": [100] } - }, - { - "expression": { "Max": [{ "Number": "2" }, { "Number": "1" }] }, - "result": { "enum": [2] } - } - ], - "invalid": [ - { "Max": [], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Min.json b/packages/expressions/examples/Min.json deleted file mode 100644 index 19ffdc45e..000000000 --- a/packages/expressions/examples/Min.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "valid": [ - { - "expression": { "Min": [] }, - "result": { "enum": [null] } - }, - { - "expression": { "Min": null }, - "result": { "enum": [null] } - }, - { - "expression": { "Min": [3, 2, 1] }, - "result": { "enum": [1] } - }, - { - "expression": { "Min": [0.1, 0.2] }, - "result": { "enum": [0.1] } - }, - { - "expression": { "Min": ["a", "b"] }, - "result": { "enum": ["a"] } - }, - { - "expression": { "Min": 100 }, - "result": { "enum": [100] } - }, - { - "expression": { "Min": [{ "Number": "2" }, { "Number": "1" }] }, - "result": { "enum": [1] } - } - ], - "invalid": [ - { "Min": [], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Multiply.json b/packages/expressions/examples/Multiply.json deleted file mode 100644 index ab54e02c2..000000000 --- a/packages/expressions/examples/Multiply.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "valid": [ - { - "expression": { "Multiply": [3, 2] }, - "result": { "enum": [6] } - }, - { - "expression": { "Multiply": ["foo", 2] }, - "result": { "enum": ["foofoo"] } - }, - { - "expression": { "Multiply": [{ "Property": "age" }, 3] }, - "context": { "properties": { "age": 18 }}, - "result": { "enum": [54] } - } - ], - "invalid": [ - { "Multiply": [1, 2, 3] }, - { "Multiply": [1] }, - { "Multiply": 1 }, - { "Multiply": null }, - { "Multiply": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/NotEqual.json b/packages/expressions/examples/NotEqual.json deleted file mode 100644 index 23bd9d17b..000000000 --- a/packages/expressions/examples/NotEqual.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "valid": [ - { - "expression": { "NotEqual": [1, 1] }, - "result": { "enum": [false] } - }, - { - "expression": { "NotEqual": ["a", "a"] }, - "result": { "enum": [false] } - }, - { - "expression": { "NotEqual": [1, 2] }, - "result": { "enum": [true] } - }, - { - "expression": { "NotEqual": ["a", "b"] }, - "result": { "enum": [true] } - }, - { - "expression": { "NotEqual": [true, false] }, - "result": { "enum": [true] } - }, - { - "expression": { "NotEqual": [true, true] }, - "result": { "enum": [false] } - }, - { - "expression": { "NotEqual": [{ "Property": "age" }, 21] }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [false] } - } - ], - "invalid": [ - { "NotEqual": [1, 2, 3] }, - { "NotEqual": [1] }, - { "NotEqual": 1 }, - { "NotEqual": null }, - { "NotEqual": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Now.json b/packages/expressions/examples/Now.json deleted file mode 100644 index ee0faa75c..000000000 --- a/packages/expressions/examples/Now.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "valid": [ - { - "expression": { "Now": [] }, - "result": { "format": "date-time" } - }, - { - "expression": { "Now": null }, - "result": { "format": "date-time" } - }, - { - "expression": { "String": {"Now": []} }, - "result": { "pattern": "UTC$" } - } - ], - "invalid": [ - { "Now": [1] }, - { "Now": 1 } - ] -} diff --git a/packages/expressions/examples/Number.json b/packages/expressions/examples/Number.json deleted file mode 100644 index 78aa9d344..000000000 --- a/packages/expressions/examples/Number.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "valid": [ - { - "expression": { "Number": 0 }, - "result": { "enum": [0] } - }, - { - "expression": { "Number": 1 }, - "result": { "enum": [1] } - }, - { - "expression": { "Number": 1.0 }, - "result": { "enum": [1.0] } - }, - { - "expression": { "Number": "0" }, - "result": { "enum": [0] } - }, - { - "expression": { "Number": "1" }, - "result": { "enum": [1] } - }, - { - "expression": { "Number": "1.0" }, - "result": { "enum": [1.0] } - }, - { - "expression": { "Number": [0] }, - "result": { "enum": [0] } - }, - { - "expression": { "Number": [1] }, - "result": { "enum": [1] } - }, - { - "expression": { "Number": [1.0] }, - "result": { "enum": [1.0] } - }, - { - "expression": { "Number": { "Property": "age" } }, - "context": { "properties": { "age": 21 }}, - "result": { "enum": [21] } - } - ], - "invalid": [ - { "Number": null }, - { "Number": [true, false] }, - { "Number": true, "Any": [] } - ] -} diff --git a/packages/expressions/examples/Percentage.json b/packages/expressions/examples/Percentage.json deleted file mode 100644 index 9d38d1b7b..000000000 --- a/packages/expressions/examples/Percentage.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "valid": [ - { - "expression": { "Percentage": [0] }, - "result": { "enum": [0] } - }, - { - "expression": { "Percentage": [99.999] }, - "result": { "enum": [99.999] } - }, - { - "expression": { "Percentage": [100] }, - "result": { "enum": [100] } - }, - { - "expression": { "Percentage": [{ "Property": ["nines"] }] }, - "context": { "properties": { "nines": 99.99 } }, - "result": { "enum": [99.99] } - }, - { - "expression": { "Percentage": [-1] }, - "result": { "enum": [0] } - }, - { - "expression": { "Percentage": [101] }, - "result": { "enum": [100] } - } - ], - "invalid": [ - { "Percentage": [1, 2] }, - { "Percentage": [null] }, - { "Percentage": null } - ] -} diff --git a/packages/expressions/examples/PercentageOfActors.json b/packages/expressions/examples/PercentageOfActors.json deleted file mode 100644 index af85dbca7..000000000 --- a/packages/expressions/examples/PercentageOfActors.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "valid": [ - { - "expression": { "PercentageOfActors": ["User;1", 42] }, - "result": { "enum": [true] } - }, - { - "expression": { "PercentageOfActors": ["User;1", 0] }, - "result": { "enum": [false] } - }, - { - "expression": { "PercentageOfActors": ["string", 99.99] }, - "result": { "enum": [true] } - }, - { - "expression": { "PercentageOfActors": ["string", 100] }, - "result": { "enum": [true] } - }, - { - "expression": { "PercentageOfActors": [{ "Property": ["flipper_id"] }, { "Property": ["probability"] }] }, - "context": { "properties": {"flipper_id": "User;1", "probability": 100} }, - "result": { "enum": [true] } - }, - { - "expression": { "PercentageOfActors": ["User;1", 70] }, - "context": { "feature_name": "a" }, - "result": { "enum": [true] } - }, - { - "expression": { "PercentageOfActors": ["User;1", 70] }, - "context": { "feature_name": "b" }, - "result": { "enum": [false] } - }, - { - "expression": { "PercentageOfActors": ["string", -1] }, - "result": { "enum": [false] } - }, - { - "expression": { "PercentageOfActors": ["string", 101] }, - "result": { "enum": [true] } - } - ], - "invalid": [ - { "PercentageOfActors": ["string"] }, - { "PercentageOfActors": [100] }, - { "PercentageOfActors": [{ "Property": ["flipper_id"] }]} - ] -} diff --git a/packages/expressions/examples/Property.json b/packages/expressions/examples/Property.json deleted file mode 100644 index 03879a929..000000000 --- a/packages/expressions/examples/Property.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "valid": [ - { - "expression": { "Property": "name" }, - "context": { "properties": { "name": "value" } }, - "result": { "enum": ["value"] } - }, - { - "expression": { "Property": ["flipper_id"] }, - "context": { "properties": { "flipper_id": "User;1" } }, - "result": { "enum": ["User;1"] } - }, - { - "expression": { "Property": ["flipper_id"] }, - "context": { "properties": { } }, - "result": { "enum": [null] } - }, - { - "expression": { "Property": ["flipper_id"] }, - "result": { "enum": [null] } - } - ], - "invalid": [ - { "Property": [] }, - { "Property": null } - ] -} diff --git a/packages/expressions/examples/Random.json b/packages/expressions/examples/Random.json deleted file mode 100644 index e6d5085ad..000000000 --- a/packages/expressions/examples/Random.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "valid": [ - { - "expression": { "Random": [] }, - "result": { "type": "float", "minimum": 0, "maximum": 1 } - }, - { - "expression": { "Random": null }, - "result": { "type": "float", "minimum": 0, "maximum": 1 } - }, - { - "expression": { "Random": 2 }, - "result": { "type": "integer", "minimum": 0, "maximum": 1 } - }, - { - "expression": { "Random": [100] }, - "result": { "type": "integer", "minimum": 0, "maximum": 99 } - }, - { - "expression": { "Random": [{ "Property": "max_rand" }] }, - "context": { "properties": { "max_rand": 50 }}, - "result": { "type": "integer", "minimum": 0, "maximum": 49 } - } - ], - "invalid": [ - { "Random": [1, 2] } - ] -} diff --git a/packages/expressions/examples/String.json b/packages/expressions/examples/String.json deleted file mode 100644 index 4a3212459..000000000 --- a/packages/expressions/examples/String.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "valid": [ - { - "expression": { "String": true }, - "result": { "enum": ["true"] } - }, - { - "expression": { "String": false }, - "result": { "enum": ["false"] } - }, - { - "expression": { "String": "already a string" }, - "result": { "enum": ["already a string"] } - }, - { - "expression": { "String": 1 }, - "result": { "enum": ["1"] } - }, - { - "expression": { "String": 1.1 }, - "result": { "enum": ["1.1"] } - }, - { - "expression": { "String": [true] }, - "result": { "enum": ["true"] } - }, - { - "expression": { "String": [false] }, - "result": { "enum": ["false"] } - }, - { - "expression": { "String": ["already a string"] }, - "result": { "enum": ["already a string"] } - }, - { - "expression": { "String": [1] }, - "result": { "enum": ["1"] } - }, - { - "expression": { "String": [1.1] }, - "result": { "enum": ["1.1"] } - }, - { - "expression": { "String": { "All": [] } }, - "result": { "enum": ["true"] } - }, - { - "expression": { "String": [{ "Any": [] }] }, - "result": { "enum": ["false"] } - } - ], - "invalid": [ - { "String": null }, - { "String": [true, false] }, - { "String": true, "Any": [] } - ] -} diff --git a/packages/expressions/examples/Subtract.json b/packages/expressions/examples/Subtract.json deleted file mode 100644 index 4d5b1c029..000000000 --- a/packages/expressions/examples/Subtract.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "valid": [ - { - "expression": { "Subtract": [3, 2] }, - "result": { "enum": [1] } - }, - { - "expression": { "Subtract": [{ "Property": "age" }, 3] }, - "context": { "properties": { "age": 18 }}, - "result": { "enum": [15] } - } - ], - "invalid": [ - { "Subtract": [1, 2, 3] }, - { "Subtract": [1] }, - { "Subtract": 1 }, - { "Subtract": null }, - { "Subtract": [1, 2], "Any": [] } - ] -} diff --git a/packages/expressions/examples/Time.json b/packages/expressions/examples/Time.json deleted file mode 100644 index d82172dfd..000000000 --- a/packages/expressions/examples/Time.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "valid": [ - { - "expression": { "Number": { "Time": ["2021-01-01T00:00:00Z"] } }, - "result": { "enum": [1609459200.0] } - }, - { - "expression": { "Number": { "Time": "2021-01-01T00:00:00-05:00" } }, - "result": { "enum": [1609477200.0] } - }, - { - "expression": { "Number": { "Time": { "Property": "created_at" } } }, - "context": { "properties": { "created_at": "2021-01-01T00:00:00Z" } }, - "result": { "enum": [1609459200.0] } - } - ], - "invalid": [ - { "Time": "2021-01-01" }, - { "Time": "January 1, 2021 10:00" }, - { "Time": null }, - { "Time": false }, - { "Time": [{ "Property": "created_at" }, { "Property": "updated_at" }] } - ] -} diff --git a/packages/expressions/examples/expressions.json b/packages/expressions/examples/expressions.json deleted file mode 100644 index 277ac5e8f..000000000 --- a/packages/expressions/examples/expressions.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "valid": [ - { - "expression": "string", - "result": { "enum": ["string"] } - }, - { - "expression": true, - "result": { "enum": [true] } - }, - { - "expression": false, - "result": { "enum": [false] } - }, - { - "expression": 1, - "result": { "enum": [1] } - }, - { - "expression": 1.1, - "result": { "enum": [1.1] } - }, - { - "expression": null, - "result": { "enum": [null] } - } - ], - "invalid": [ - {}, - [] - ] -} diff --git a/packages/expressions/examples/index.js b/packages/expressions/examples/index.js deleted file mode 100644 index cd12fe4a0..000000000 --- a/packages/expressions/examples/index.js +++ /dev/null @@ -1,6 +0,0 @@ -const modules = import.meta.glob('./*.json', { eager: true, import: 'default' }) - -export default Object.fromEntries(Object.entries(modules).map(([path, module]) => { - const name = path.split('/').pop().split('.').shift() - return [name, module] -})) diff --git a/packages/expressions/jest.config.js b/packages/expressions/jest.config.js deleted file mode 100644 index 49fa67e76..000000000 --- a/packages/expressions/jest.config.js +++ /dev/null @@ -1,195 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/wb/8vw5x4q52r7ggd26st909mp00000gn/T/jest_dx", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: undefined, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: 'v8', - - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - // moduleNameMapper: {}, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - // preset: undefined, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: {} - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/packages/expressions/lib/expression.js b/packages/expressions/lib/expression.js deleted file mode 100644 index 9f3289550..000000000 --- a/packages/expressions/lib/expression.js +++ /dev/null @@ -1,96 +0,0 @@ -import { v4 as uuidv4 } from 'uuid' -import { Schema } from './schemas' - -export class Expression { - static build (expression, attrs = {}) { - if (expression instanceof Function || expression instanceof Constant) { - return expression.clone(attrs) - } - - if (['number', 'string', 'boolean'].includes(typeof expression) || expression === null) { - return new Constant({ value: expression, ...attrs }) - } else if (typeof expression === 'object') { - if (Object.keys(expression).length !== 1) { - throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) - } - const name = Object.keys(expression)[0] - return new Function({ name, args: expression[name] }) - } else { - throw new TypeError(`Invalid expression: ${JSON.stringify(expression)}`) - } - } - - constructor ({ id = uuidv4(), parent = undefined }) { - this.id = id - this.parent = parent - } - - clone (attrs = {}) { - return new this.constructor(Object.assign({}, this, attrs)) - } - - matches (schema) { - return this.validate(schema).valid - } - - add (expression) { - if (this.schema.type !== 'array' || this.schema.maxItems) { - return Expression.build({ All: [this, expression] }) - } else { - return this.clone({ args: [...this.args, expression] }) - } - } - - get parents () { - return this.parent ? [this.parent, ...this.parent.parents] : [] - } - - get depth () { - return this.parents.length - } -} - -// Public: A function like "All", "Any", "Equal", "Duration", etc. -export class Function extends Expression { - constructor ({ name, args, ...attrs }) { - super(attrs) - - this.name = name - this.schema = Schema.resolve(`${name}.schema.json`) - this.args = toArray(args).map((arg, i) => Expression.build(arg, { - schema: this.schema.arrayItem(i), - parent: this - })) - } - - get value () { - return { [this.name]: this.args.map(arg => arg.value) } - } - - validate (schema = this.schema) { - return schema.validate(this.args.map(arg => arg.value)) - } -} - -// Public: A constant value like a "string", number (1, 3.5), or boolean (true, false). -export class Constant extends Expression { - constructor ({ value, schema = Schema.resolve('#'), ...attrs }) { - super(attrs) - this.value = value - this.schema = schema - } - - get args () { - return [this.value] - } - - validate (schema = this.schema) { - return schema.validate(this.value) - } -} - -function toArray (arg) { - if (Array.isArray(arg)) return arg - if (arg === null) return [] - return [arg] -} diff --git a/packages/expressions/lib/index.js b/packages/expressions/lib/index.js deleted file mode 100644 index 793334eb5..000000000 --- a/packages/expressions/lib/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { Schema, schemas, BaseURI } from './schemas' -export { Expression, Function, Constant } from './expression' -export { default as examples } from '../examples' diff --git a/packages/expressions/lib/schemas.js b/packages/expressions/lib/schemas.js deleted file mode 100644 index 2dd162fe2..000000000 --- a/packages/expressions/lib/schemas.js +++ /dev/null @@ -1,108 +0,0 @@ -import Ajv from 'ajv' -import addFormats from 'ajv-formats' - -// Load all schemas in schemas/*.json -const modules = import.meta.glob('../schemas/*.json', { eager: true, import: 'default' }) -export const schemas = Object.values(modules) -export const BaseURI = modules['../schemas/schema.json'].$id - -// Create a new Ajv validator instance with all schemas loaded -const ajv = new Ajv({ - schemas, - useDefaults: true, - allErrors: true, - strict: true -}) -addFormats(ajv) -ajv.addKeyword('operator') - -// Delegate property access to the schema definition -const DelegateToDefinition = { - get (target, property) { - return target[property] ?? target.definition[property] - }, - - has (target, property) { - return property in target || property in target.definition - } -} - -// Class to browse schemas, resolve refs, and validate data -export class Schema { - static resolve ($ref, $id = BaseURI) { - const { href } = new URL($ref, $id) - const validator = ajv.getSchema(href) - - if (validator === undefined) throw new TypeError('Schema not found: ' + href) - - // Schema definition is a primitive, just return it - if (typeof validator.schema !== 'object') return validator.schema - - // Create a new proxy to the schema definition - if (!validator.proxy) validator.proxy = Schema.proxy(href, validator.schema) - - return validator.proxy - } - - static proxy ($id, definition) { - return new Proxy(new Schema($id, definition), DelegateToDefinition) - } - - constructor ($id, definition) { - this.$id = $id - this.definition = new Proxy(definition, this) - } - - resolve ($ref = this.definition.$ref, $id = this.$id) { - return Schema.resolve($ref, $id) - } - - resolveAnyOf () { - return this.definition.anyOf?.map(ref => ref.resolveAnyOf())?.flat() || [this] - } - - arrayItem (index) { - const items = this.definition.items - return Array.isArray(items) ? items[index] : items - } - - validate (data) { - const validator = ajv.getSchema(this.$id) - const valid = validator(data) - const errors = validator.errors - return { valid, errors } - } - - // This instance acts as a Proxy to resolve $refs in the schema definition - get (target, property) { - const value = target[property] - - if (Array.isArray(value)) { - // Schema definition returns an array for this property, return the array with all refs resolved - return value.map((item, i) => { - if (typeof item === 'object') { - return Schema.resolve(item.$ref || this.join(`${property}/${i}`), this.$id) - } else { - return item - } - }) - } else if (value !== null && typeof value === 'object') { - // Schema definition returns an object for this property, return the subschema and proxy it - return Schema.proxy(this.join(property), value) - } else if (value !== undefined) { - // Schema definition returns a value for this property, just return it - return value - } else if (target.$ref) { - // Schema includes a ref, so delegate to it - return Schema.resolve(target.$ref, this.$id)[property] - } - } - - join (path, $id = this.$id) { - const url = new URL($id) - url.hash = [url.hash, path].join('/') - return url.toString() - } -} - -export const schema = Schema.resolve('#') diff --git a/packages/expressions/package.json b/packages/expressions/package.json deleted file mode 100644 index 4a62d9fe7..000000000 --- a/packages/expressions/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@flippercloud.io/expressions", - "version": "1.0.0", - "description": "Library and Schema for evaluating Flipper Expressions", - "type": "module", - "files": [ - "dist", - "schemas", - "examples" - ], - "main": "./dist/expressions.umd.cjs", - "module": "./dist/expressions.js", - "exports": { - ".": { - "import": "./dist/expressions.js", - "require": "./dist/expressions.umd.cjs" - } - }, - "repository": "https:://github.com/jnunemaker/flipper", - "license": "MIT", - "dependencies": { - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "uuid": "^9.0.0" - }, - "devDependencies": { - "standard": "^17.0.0", - "vite": "^4.2.1", - "vitest": "^0.29.8" - }, - "scripts": { - "build": "vite build", - "lint": "standard", - "test": "vitest" - } -} diff --git a/packages/expressions/schemas/Add.schema.json b/packages/expressions/schemas/Add.schema.json deleted file mode 100644 index fb3f164fb..000000000 --- a/packages/expressions/schemas/Add.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Add.schema.json", - "title": "Add", - "description": "Add two values", - "operator": "+", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/All.schema.json b/packages/expressions/schemas/All.schema.json deleted file mode 100644 index adfb0fcc2..000000000 --- a/packages/expressions/schemas/All.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/All.schema.json", - "title": "All", - "description": "Returns true if all of the expressions return true.", - "$ref": "schema.json#/definitions/arguments-n" -} diff --git a/packages/expressions/schemas/Any.schema.json b/packages/expressions/schemas/Any.schema.json deleted file mode 100644 index 2c3c935f2..000000000 --- a/packages/expressions/schemas/Any.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Any.schema.json", - "title": "Any", - "description": "Returns true if any of the expressions return true.", - "$ref": "schema.json#/definitions/arguments-n" -} diff --git a/packages/expressions/schemas/Boolean.schema.json b/packages/expressions/schemas/Boolean.schema.json deleted file mode 100644 index 601034e9b..000000000 --- a/packages/expressions/schemas/Boolean.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Boolean.schema.json", - "title": "Boolean", - "description": "Cast a value to a boolean.", - "$ref": "schema.json#/definitions/argument" -} diff --git a/packages/expressions/schemas/Divide.schema.json b/packages/expressions/schemas/Divide.schema.json deleted file mode 100644 index 5ec157109..000000000 --- a/packages/expressions/schemas/Divide.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Divide.schema.json", - "title": "Divide", - "description": "Divide two values", - "operator": "/", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/Duration.schema.json b/packages/expressions/schemas/Duration.schema.json deleted file mode 100644 index 8da463377..000000000 --- a/packages/expressions/schemas/Duration.schema.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Duration.schema.json", - "title": "Duration", - "description": "A period of time expressed as a number of seconds, minutes, hours, days, weeks, months, or years.", - "type": "array", - "items": [ - { "$ref": "schema.json#/definitions/number" }, - { - "anyOf": [ - { - "title": "Unit", - "type": "string", - "enum": ["seconds", "minutes", "hours", "days", "weeks", "months", "years"] - }, - { "$ref": "schema.json#/definitions/function" } - ] - } - ], - "minItems": 2, - "maxItems": 2 -} diff --git a/packages/expressions/schemas/Equal.schema.json b/packages/expressions/schemas/Equal.schema.json deleted file mode 100644 index 84c533c01..000000000 --- a/packages/expressions/schemas/Equal.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Equal.schema.json", - "title": "Equal", - "description": "Compare two values for equality", - "operator": "==", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/GreaterThan.schema.json b/packages/expressions/schemas/GreaterThan.schema.json deleted file mode 100644 index 2f714ad46..000000000 --- a/packages/expressions/schemas/GreaterThan.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/GreaterThan.schema.json", - "title": "GreaterThan", - "description": "Compare if the first argument is > the second argument.", - "operator": ">", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json b/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json deleted file mode 100644 index db4879ee9..000000000 --- a/packages/expressions/schemas/GreaterThanOrEqualTo.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/GreaterThanOrEqualTo.schema.json", - "title": "GreaterThanOrEqualTo", - "description": "Compare if the first argument is >= the second argument.", - "operator": ">=", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/LessThan.schema.json b/packages/expressions/schemas/LessThan.schema.json deleted file mode 100644 index 9c2e07b0f..000000000 --- a/packages/expressions/schemas/LessThan.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/LessThan.schema.json", - "title": "LessThan", - "description": "Compare if the first argument is < the second argument.", - "operator": "<", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/LessThanOrEqualTo.schema.json b/packages/expressions/schemas/LessThanOrEqualTo.schema.json deleted file mode 100644 index 2cc871121..000000000 --- a/packages/expressions/schemas/LessThanOrEqualTo.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/LessThanOrEqualTo.schema.json", - "title": "LessThanOrEqualTo", - "description": "Compare if the first argument is < the second argument.", - "operator": "<=", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/Max.schema.json b/packages/expressions/schemas/Max.schema.json deleted file mode 100644 index f372a815f..000000000 --- a/packages/expressions/schemas/Max.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Max.schema.json", - "title": "Max", - "description": "Returns the maximum value in a list.", - "$ref": "schema.json#/definitions/arguments-n" -} diff --git a/packages/expressions/schemas/Min.schema.json b/packages/expressions/schemas/Min.schema.json deleted file mode 100644 index 4e5a92d84..000000000 --- a/packages/expressions/schemas/Min.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Min.schema.json", - "title": "Min", - "description": "Returns the minimum value in a list.", - "$ref": "schema.json#/definitions/arguments-n" -} diff --git a/packages/expressions/schemas/Multiply.schema.json b/packages/expressions/schemas/Multiply.schema.json deleted file mode 100644 index 6a8b6d517..000000000 --- a/packages/expressions/schemas/Multiply.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Multiply.schema.json", - "title": "Multiply", - "description": "Multiply two values", - "operator": "*", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/NotEqual.schema.json b/packages/expressions/schemas/NotEqual.schema.json deleted file mode 100644 index 007f84cfc..000000000 --- a/packages/expressions/schemas/NotEqual.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/NotEqual.schema.json", - "title": "NotEqual", - "description": "Compare two values for equality", - "operator": "!=", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/Now.schema.json b/packages/expressions/schemas/Now.schema.json deleted file mode 100644 index 1d40f327e..000000000 --- a/packages/expressions/schemas/Now.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Now.schema.json", - "title": "Now", - "description": "The current time in UTC", - "type": "array", - "maxItems": 0 -} diff --git a/packages/expressions/schemas/Number.schema.json b/packages/expressions/schemas/Number.schema.json deleted file mode 100644 index 5dfaf044d..000000000 --- a/packages/expressions/schemas/Number.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Number.schema.json", - "title": "Number", - "description": "Cast a value to a number.", - "$ref": "schema.json#/definitions/argument" -} diff --git a/packages/expressions/schemas/Percentage.schema.json b/packages/expressions/schemas/Percentage.schema.json deleted file mode 100644 index 588dab5cb..000000000 --- a/packages/expressions/schemas/Percentage.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Percentage.schema.json", - "title": "Percentage", - "description": "Cast a value to a percentage between 0 and 100.", - "type": "array", - "items": { "$ref": "schema.json#/definitions/number" }, - "minItems": 1, - "maxItems": 1 -} diff --git a/packages/expressions/schemas/PercentageOfActors.schema.json b/packages/expressions/schemas/PercentageOfActors.schema.json deleted file mode 100644 index e51210429..000000000 --- a/packages/expressions/schemas/PercentageOfActors.schema.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/PercentageOfActors.schema.json", - "title": "PercentageOfActors", - "description": "", - "type": "array", - "items": [ - { "$ref": "schema.json#/definitions/string" }, - { "$ref": "schema.json#/definitions/number" } - ], - "minItems": 2, - "maxItems": 2 -} diff --git a/packages/expressions/schemas/Property.schema.json b/packages/expressions/schemas/Property.schema.json deleted file mode 100644 index 0d564ad05..000000000 --- a/packages/expressions/schemas/Property.schema.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Property.schema.json", - "title": "Property", - "description": "Extract a property from context[properties].", - "type": "array", - "items": { "$ref": "schema.json#/definitions/string" }, - "minItems": 1, - "maxItems": 1 -} diff --git a/packages/expressions/schemas/Random.schema.json b/packages/expressions/schemas/Random.schema.json deleted file mode 100644 index e85f18e81..000000000 --- a/packages/expressions/schemas/Random.schema.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Random.schema.json", - "title": "Random", - "description": "Return a random number", - "type": "array", - "items": { "$ref": "schema.json#/definitions/number" }, - "maxItems": 1 -} diff --git a/packages/expressions/schemas/String.schema.json b/packages/expressions/schemas/String.schema.json deleted file mode 100644 index 9c5a4ea2b..000000000 --- a/packages/expressions/schemas/String.schema.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/String.schema.json", - "title": "String", - "description": "Cast a value to a string.", - "$ref": "schema.json#/definitions/argument" -} diff --git a/packages/expressions/schemas/Subtract.schema.json b/packages/expressions/schemas/Subtract.schema.json deleted file mode 100644 index 053bc6ec5..000000000 --- a/packages/expressions/schemas/Subtract.schema.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Subtract.schema.json", - "title": "Subtract", - "description": "Subtract two values", - "operator": "-", - "$ref": "schema.json#/definitions/operation" -} diff --git a/packages/expressions/schemas/Time.schema.json b/packages/expressions/schemas/Time.schema.json deleted file mode 100644 index 64589da3c..000000000 --- a/packages/expressions/schemas/Time.schema.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/Time.schema.json", - "title": "Time", - "description": "A time in ISO8601 format", - "type": "array", - "items": { "$ref": "#/definitions/argument" }, - "minItems": 1, - "maxItems": 1, - "definitions": { - "argument": { - "anyOf": [ - { "type": "string", "format": "date-time" }, - { "$ref": "schema.json#/definitions/function" } - ] - } - } -} diff --git a/packages/expressions/schemas/schema.json b/packages/expressions/schemas/schema.json deleted file mode 100644 index ae4d12198..000000000 --- a/packages/expressions/schemas/schema.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://www.flippercloud.io/expressions/schema.json", - "title": "Expression", - "description": "An expression can be a Constant or a Function", - "anyOf": [ - { "$ref": "#/definitions/constant" }, - { "$ref": "#/definitions/function" } - ], - "definitions": { - "constant": { - "title": "Constant", - "description": "A constant value can be a string, number or boolean", - "anyOf": [ - { - "title": "String", - "type": "string" - }, - { - "title": "Number", - "type": "number" - }, - { - "title": "Boolean", - "type": "boolean", - "enum": [true, false] - }, - { - "type": "null" - } - ] - }, - "function": { - "title": "Function", - "description": "A function is an object with a single property that is the name of the function and the value is the arguments to the function", - "type": "object", - "maxProperties": 1, - "minProperties": 1, - "properties": { - "Add": { "$ref": "Add.schema.json" }, - "All": { "$ref": "All.schema.json" }, - "Any": { "$ref": "Any.schema.json" }, - "Boolean": { "$ref": "Boolean.schema.json" }, - "Divide": { "$ref": "Divide.schema.json" }, - "Duration": { "$ref": "Duration.schema.json" }, - "Equal": { "$ref": "Equal.schema.json" }, - "GreaterThan": { "$ref": "GreaterThan.schema.json" }, - "GreaterThanOrEqualTo": { "$ref": "GreaterThanOrEqualTo.schema.json" }, - "LessThan": { "$ref": "LessThan.schema.json" }, - "LessThanOrEqualTo": { "$ref": "LessThanOrEqualTo.schema.json" }, - "Max": { "$ref": "Max.schema.json" }, - "Min": { "$ref": "Min.schema.json" }, - "Multiply": { "$ref": "Multiply.schema.json" }, - "NotEqual": { "$ref": "NotEqual.schema.json" }, - "Now": { "$ref": "Now.schema.json" }, - "Number": { "$ref": "Number.schema.json" }, - "Percentage": { "$ref": "Percentage.schema.json" }, - "PercentageOfActors": { "$ref": "PercentageOfActors.schema.json" }, - "Property": { "$ref": "Property.schema.json" }, - "Random": { "$ref": "Random.schema.json" }, - "String": { "$ref": "String.schema.json" }, - "Subtract": { "$ref": "Subtract.schema.json" }, - "Time": { "$ref": "Time.schema.json" } - }, - "additionalProperties": false - }, - "string": { - "title": "String", - "description": "A constant string value or a function that returns a string", - "anyOf": [ - { "type": "string" }, - { "$ref": "#/definitions/function" } - ] - }, - "number": { - "title": "Number", - "description": "A constant numeric value or a function that returns a number", - "anyOf": [ - { "type": "number" }, - { "$ref": "#/definitions/function" } - ] - }, - "arguments-n": { - "description": "An array of expressions", - "type": "array", - "items": { "$ref": "#" }, - "minItems": 0 - }, - "operation": { - "title": "Operation", - "description": "An array with exactly two expressions", - "type": "array", - "items": { "$ref": "#" }, - "minItems": 2, - "maxItems": 2 - }, - "argument": { - "description": "An array with exactly one expression", - "type": "array", - "items": { "$ref": "#" }, - "minItems": 1, - "maxItems": 1 - } - } -} diff --git a/packages/expressions/test/constant.test.js b/packages/expressions/test/constant.test.js deleted file mode 100644 index d538c4a3e..000000000 --- a/packages/expressions/test/constant.test.js +++ /dev/null @@ -1,52 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { Constant, Schema } from '../lib' - -describe('Constant', () => { - describe('schema', () => { - test('defaults to expression schema', () => { - expect(new Constant({ value: 'string' }).schema.title).toEqual('Expression') - }) - - test('uses provided schema', () => { - const schema = Schema.resolve('#/definitions/number') - const number = new Constant({ value: 42, schema }) - expect(number.schema).toEqual(schema) - expect(number.clone({ value: 99 }).schema).toEqual(schema) - }) - }) - - describe('validate', () => { - test('returns true for valid value', () => { - expect(new Constant({ value: true }).validate().valid).toBe(true) - expect(new Constant({ value: false }).validate().valid).toBe(true) - expect(new Constant({ value: 'string' }).validate().valid).toBe(true) - expect(new Constant({ value: 42 }).validate().valid).toBe(true) - expect(new Constant({ value: 3.14 }).validate().valid).toBe(true) - }) - - test('returns false for invalid value', () => { - expect(new Constant({ value: ['array'] }).validate().valid).toBe(false) - }) - - test('uses provided schema', () => { - const schema = Schema.resolve('#/definitions/number') - expect(new Constant({ value: 42, schema }).validate().valid).toBe(true) - expect(new Constant({ value: 42 }).validate(schema).valid).toBe(true) - - expect(new Constant({ value: 'nope', schema }).validate().valid).toBe(false) - expect(new Constant({ value: 'nope' }).validate(schema).valid).toBe(false) - }) - }) - - describe('matches', () => { - test('returns true for matching validator', () => { - const schema = Schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant({ value: 'string' }).matches(schema)).toBe(true) - }) - - test('returns false for different schema', () => { - const schema = Schema.resolve('#/definitions/constant/anyOf/0') - expect(new Constant({ value: true }).matches(schema)).toBe(false) - }) - }) -}) diff --git a/packages/expressions/test/expression.test.js b/packages/expressions/test/expression.test.js deleted file mode 100644 index c123f70c4..000000000 --- a/packages/expressions/test/expression.test.js +++ /dev/null @@ -1,82 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { Expression, Function, Constant, Schema } from '../lib' - -describe('Expression', () => { - describe('build', () => { - test('builds an expression from an object', () => { - const expression = Expression.build({ All: [true] }) - expect(expression).toBeInstanceOf(Function) - expect(expression.name).toEqual('All') - expect(expression.args[0]).toBeInstanceOf(Constant) - expect(expression.args[0].value).toBe(true) - expect(expression.args[0].parent).toBe(expression) - expect(expression.value).toEqual({ All: [true] }) - }) - - test('builds an expression from a boolean constant', () => { - const expression = Expression.build(true) - expect(expression).toBeInstanceOf(Constant) - expect(expression.value).toEqual(true) - }) - - test('builds an expression from a string constant', () => { - const expression = Expression.build('hello') - expect(expression).toBeInstanceOf(Constant) - expect(expression.value).toEqual('hello') - }) - - test('builds an expression from a null constant', () => { - const expression = Expression.build(null) - expect(expression).toBeInstanceOf(Constant) - expect(expression.value).toEqual(null) - }) - - test('throws error on invalid expression', () => { - expect(() => Expression.build([])).toThrowError(TypeError) - expect(() => Expression.build(new Date())).toThrowError(TypeError) - expect(() => Expression.build({ All: [], Any: [] })).toThrowError(TypeError) - }) - - test('sets schema for constant args', () => { - const expression = Expression.build({ Duration: [5, 'minutes'] }) - const schema = Schema.resolve('Duration.schema.json') - expect(expression.schema).toEqual(schema) - expect(expression.args[0].schema).toEqual(schema.items[0]) - expect(expression.args[1].schema).toEqual(schema.items[1]) - }) - - test('sets schema for constant', () => { - const expression = Expression.build(false) - expect(expression.schema.$id).toEqual(Schema.resolve('#').$id) - }) - - test('each subexpression uses its own schema', () => { - const expression = Expression.build({ GreaterThan: [{ Now: [] }, { Property: ['released_at'] }] }) - expect(expression.schema).toEqual(Schema.resolve('GreaterThan.schema.json')) - expect(expression.args[0].schema).toEqual(Schema.resolve('Now.schema.json')) - expect(expression.args[1].schema).toEqual(Schema.resolve('Property.schema.json')) - }) - }) - - describe('add', () => { - test('Any returns new expression with added arg', () => { - const expression = Expression.build({ Any: [] }).add(true) - expect(expression.value).toEqual({ Any: [true] }) - }) - - test('Max returns new expression with added arg', () => { - const expression = Expression.build({ Max: [1] }).add(2) - expect(expression.value).toEqual({ Max: [1, 2] }) - }) - - test('Equal returns new expression wrapped in All', () => { - const expression = Expression.build({ Equal: [1, 1] }).add(false) - expect(expression.value).toEqual({ All: [{ Equal: [1, 1] }, false] }) - }) - - test('Constant returns new expression wrapped in All', () => { - const expression = Expression.build(true).add(false) - expect(expression.value).toEqual({ All: [true, false] }) - }) - }) -}) diff --git a/packages/expressions/test/function.test.js b/packages/expressions/test/function.test.js deleted file mode 100644 index ea1a64539..000000000 --- a/packages/expressions/test/function.test.js +++ /dev/null @@ -1,37 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { Expression, Function, Constant } from '../lib' - -describe('Function', () => { - describe('clone', () => { - test('returns new expression', () => { - const expression = Expression.build({ All: [true] }) - const clone = expression.clone() - expect(clone).not.toBe(expression) - expect(clone).toBeInstanceOf(Function) - expect(clone.name).toEqual(expression.name) - expect(clone.args).toEqual(expression.args) - expect(clone.id).toEqual(expression.id) - expect(clone.args[0].parent).toBe(clone) - expect(clone.args[0].depth).toBe(1) - }) - - test('builds args', () => { - const expression = Expression.build({ All: [] }) - const clone = expression.clone({ args: [true] }) - expect(clone.args[0]).toBeInstanceOf(Constant) - expect(clone.value).toEqual({ All: [true] }) - }) - }) - - describe('validate', () => { - test('passes for valid expression', () => { - const expression = Expression.build({ All: [true] }) - expect(expression.validate().valid).toBe(true) - }) - - test('fails for invalid expression', () => { - const expression = Expression.build({ Duration: [] }) - expect(expression.validate().valid).toBe(false) - }) - }) -}) diff --git a/packages/expressions/test/schemas.test.js b/packages/expressions/test/schemas.test.js deleted file mode 100644 index 781e3bbd1..000000000 --- a/packages/expressions/test/schemas.test.js +++ /dev/null @@ -1,82 +0,0 @@ -import { describe, test, expect } from 'vitest' -import { examples, Schema, Expression } from '../lib' - -describe('schema.json', () => { - for (const [name, example] of Object.entries(examples)) { - describe(name, () => { - describe('valid', () => { - example.valid.forEach(({ expression }) => { - test(JSON.stringify(expression), () => { - const { valid, errors } = Expression.build(expression).validate() - expect(errors).toBe(null) - expect(valid).toBe(true) - }) - }) - }) - - describe('invalid', () => { - example.invalid.forEach(expression => { - test(JSON.stringify(expression), () => { - try { - const { valid, errors } = Expression.build(expression).validate() - expect(errors).not.toEqual(null) - expect(valid).toBe(false) - } catch (error) { - if (error instanceof TypeError) { - // ok - } else { - throw error - } - } - }) - }) - }) - }) - } - - describe('resolve', () => { - test('returns a schema', () => { - const ref = Schema.resolve('#/definitions/constant') - expect(ref.title).toEqual('Constant') - expect(ref.validate(true)).toEqual({ valid: true, errors: null }) - }) - - test('resolves refs', () => { - expect(Schema.resolve('#/definitions/function/properties/Any').title).toEqual('Any') - expect(Schema.resolve('#').definitions.function.properties.Any.title).toEqual('Any') - }) - - test('returns array values', () => { - const expected = ['seconds', 'minutes', 'hours', 'days', 'weeks', 'months', 'years'] - expect(Schema.resolve('Duration.schema.json#/items/1/anyOf/0').enum).toEqual(expected) - }) - }) - - describe('resolveAnyOf', () => { - test('returns nested anyOf', () => { - const ref = Schema.resolve('#') - expect(ref.resolveAnyOf()).toHaveLength(5) - }) - - test('returns array of schemas', () => { - const ref = Schema.resolve('#/definitions/constant') - expect(ref.resolveAnyOf()).toHaveLength(4) - expect(ref.resolveAnyOf()).toEqual(ref.anyOf) - }) - }) - - describe('arrayItem', () => { - test('returns schema for repeated array item', () => { - const any = Schema.resolve('Any.schema.json') - expect(any.arrayItem(0).title).toEqual('Expression') - expect(any.arrayItem(99).title).toEqual('Expression') - }) - - test('returns schema for tuple', () => { - const duration = Schema.resolve('Duration.schema.json') - expect(duration.arrayItem(0).$id).toMatch('schema.json#/definitions/number') - expect(duration.arrayItem(1).$id).toMatch('Duration.schema.json#/items/1') - expect(duration.arrayItem(2)).toBe(undefined) - }) - }) -}) diff --git a/packages/expressions/vite.config.js b/packages/expressions/vite.config.js deleted file mode 100644 index a4961e27f..000000000 --- a/packages/expressions/vite.config.js +++ /dev/null @@ -1,20 +0,0 @@ -// vite.config.js -import { resolve } from 'path' -import { defineConfig } from 'vite' - -export default defineConfig({ - build: { - sourcemap: true, - lib: { - entry: resolve(__dirname, 'lib/index.js'), - name: '@flippercloud.io/expressions' - }, - rollupOptions: { - external: [ - 'ajv', - 'ajv-formats' - ], - output: {} - } - } -}) diff --git a/packages/expressions/yarn.lock b/packages/expressions/yarn.lock deleted file mode 100644 index 72e76248b..000000000 --- a/packages/expressions/yarn.lock +++ /dev/null @@ -1,2121 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@esbuild/android-arm64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.14.tgz#4624cea3c8941c91f9e9c1228f550d23f1cef037" - integrity sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg== - -"@esbuild/android-arm@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.14.tgz#74fae60fcab34c3f0e15cb56473a6091ba2b53a6" - integrity sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g== - -"@esbuild/android-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.14.tgz#f002fbc08d5e939d8314bd23bcfb1e95d029491f" - integrity sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng== - -"@esbuild/darwin-arm64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.14.tgz#b8dcd79a1dd19564950b4ca51d62999011e2e168" - integrity sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw== - -"@esbuild/darwin-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.14.tgz#4b49f195d9473625efc3c773fc757018f2c0d979" - integrity sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g== - -"@esbuild/freebsd-arm64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.14.tgz#480923fd38f644c6342c55e916cc7c231a85eeb7" - integrity sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A== - -"@esbuild/freebsd-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.14.tgz#a6b6b01954ad8562461cb8a5e40e8a860af69cbe" - integrity sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw== - -"@esbuild/linux-arm64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.14.tgz#1fe2f39f78183b59f75a4ad9c48d079916d92418" - integrity sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g== - -"@esbuild/linux-arm@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.14.tgz#18d594a49b64e4a3a05022c005cb384a58056a2a" - integrity sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg== - -"@esbuild/linux-ia32@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.14.tgz#f7f0182a9cfc0159e0922ed66c805c9c6ef1b654" - integrity sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ== - -"@esbuild/linux-loong64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.14.tgz#5f5305fdffe2d71dd9a97aa77d0c99c99409066f" - integrity sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ== - -"@esbuild/linux-mips64el@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.14.tgz#a602e85c51b2f71d2aedfe7f4143b2f92f97f3f5" - integrity sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg== - -"@esbuild/linux-ppc64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.14.tgz#32d918d782105cbd9345dbfba14ee018b9c7afdf" - integrity sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ== - -"@esbuild/linux-riscv64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.14.tgz#38612e7b6c037dff7022c33f49ca17f85c5dec58" - integrity sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw== - -"@esbuild/linux-s390x@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.14.tgz#4397dff354f899e72fd035d72af59a700c465ccb" - integrity sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww== - -"@esbuild/linux-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.14.tgz#6c5cb99891b6c3e0c08369da3ef465e8038ad9c2" - integrity sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw== - -"@esbuild/netbsd-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.14.tgz#5fa5255a64e9bf3947c1b3bef5e458b50b211994" - integrity sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ== - -"@esbuild/openbsd-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.14.tgz#74d14c79dcb6faf446878cc64284aa4e02f5ca6f" - integrity sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g== - -"@esbuild/sunos-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.14.tgz#5c7d1c7203781d86c2a9b2ff77bd2f8036d24cfa" - integrity sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA== - -"@esbuild/win32-arm64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.14.tgz#dc36ed84f1390e73b6019ccf0566c80045e5ca3d" - integrity sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ== - -"@esbuild/win32-ia32@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.14.tgz#0802a107afa9193c13e35de15a94fe347c588767" - integrity sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w== - -"@esbuild/win32-x64@0.17.14": - version "0.17.14" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.14.tgz#e81fb49de05fed91bf74251c9ca0343f4fc77d31" - integrity sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.4.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.1.tgz#087cb8d9d757bb22e9c9946c9c0c2bf8806830f1" - integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw== - -"@eslint/eslintrc@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" - integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.5.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.36.0": - version "8.36.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" - integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== - -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@types/chai-subset@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@types/chai-subset/-/chai-subset-1.3.3.tgz#97893814e92abd2c534de422cb377e0e0bdaac94" - integrity sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.3.4": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@*": - version "18.15.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.10.tgz#4ee2171c3306a185d1208dad5f44dae3dee4cfe3" - integrity sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ== - -"@vitest/expect@0.29.8": - version "0.29.8" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-0.29.8.tgz#6ecdd031b4ea8414717d10b65ccd800908384612" - integrity sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ== - dependencies: - "@vitest/spy" "0.29.8" - "@vitest/utils" "0.29.8" - chai "^4.3.7" - -"@vitest/runner@0.29.8": - version "0.29.8" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-0.29.8.tgz#ede8a7be8a074ea1180bc1d1595bd879ed15971c" - integrity sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ== - dependencies: - "@vitest/utils" "0.29.8" - p-limit "^4.0.0" - pathe "^1.1.0" - -"@vitest/spy@0.29.8": - version "0.29.8" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-0.29.8.tgz#2e0c3b30e04d317b2197e3356234448aa432e131" - integrity sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw== - dependencies: - tinyspy "^1.0.2" - -"@vitest/utils@0.29.8": - version "0.29.8" - resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-0.29.8.tgz#423da85fd0c6633f3ab496cf7d2fc0119b850df8" - integrity sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg== - dependencies: - cli-truncate "^3.1.0" - diff "^5.1.0" - loupe "^2.3.6" - pretty-format "^27.5.1" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.8.0, acorn@^8.8.1, acorn@^8.8.2: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv@^6.10.0, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.0, ajv@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -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" - -builtins@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - -cac@^6.7.14: - version "6.7.14" - resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" - integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== - -call-bind@^1.0.0, call-bind@^1.0.2: - 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" - -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== - -chai@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-eql@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -diff@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -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.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== - dependencies: - array-buffer-byte-length "^1.0.0" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -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" - -esbuild@^0.17.5: - version "0.17.14" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.14.tgz#d61a22de751a3133f3c6c7f9c1c3e231e91a3245" - integrity sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw== - optionalDependencies: - "@esbuild/android-arm" "0.17.14" - "@esbuild/android-arm64" "0.17.14" - "@esbuild/android-x64" "0.17.14" - "@esbuild/darwin-arm64" "0.17.14" - "@esbuild/darwin-x64" "0.17.14" - "@esbuild/freebsd-arm64" "0.17.14" - "@esbuild/freebsd-x64" "0.17.14" - "@esbuild/linux-arm" "0.17.14" - "@esbuild/linux-arm64" "0.17.14" - "@esbuild/linux-ia32" "0.17.14" - "@esbuild/linux-loong64" "0.17.14" - "@esbuild/linux-mips64el" "0.17.14" - "@esbuild/linux-ppc64" "0.17.14" - "@esbuild/linux-riscv64" "0.17.14" - "@esbuild/linux-s390x" "0.17.14" - "@esbuild/linux-x64" "0.17.14" - "@esbuild/netbsd-x64" "0.17.14" - "@esbuild/openbsd-x64" "0.17.14" - "@esbuild/sunos-x64" "0.17.14" - "@esbuild/win32-arm64" "0.17.14" - "@esbuild/win32-ia32" "0.17.14" - "@esbuild/win32-x64" "0.17.14" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-standard-jsx@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" - integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== - -eslint-config-standard@17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf" - integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg== - -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" - integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.26.0: - version "2.27.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-n@^15.1.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz#f7e77f24abb92a550115cf11e29695da122c398c" - integrity sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA== - dependencies: - builtins "^5.0.1" - eslint-plugin-es "^4.1.0" - eslint-utils "^3.0.0" - ignore "^5.1.1" - is-core-module "^2.11.0" - minimatch "^3.1.2" - resolve "^1.22.1" - semver "^7.3.8" - -eslint-plugin-promise@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" - integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== - -eslint-plugin-react@^7.28.0: - version "7.32.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" - integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.0" - string.prototype.matchall "^4.0.8" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== - -eslint@^8.13.0: - version "8.36.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.36.0.tgz#1bd72202200a5492f91803b113fb8a83b11285cf" - integrity sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.1" - "@eslint/js" "8.36.0" - "@humanwhocodes/config-array" "^0.11.8" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-visitor-keys "^3.3.0" - espree "^9.5.0" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -espree@^9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" - integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -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== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - 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== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -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== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.15: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -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-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, 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-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -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" - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.3, internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.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 sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-glob@^4.0.0, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-better-errors@^1.0.1: - 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-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonc-parser@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== - dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -load-json-file@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" - -local-pkg@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" - integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== - -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@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.4.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" - -loupe@^2.3.1, loupe@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== - dependencies: - get-func-name "^2.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mlly@^1.1.0, mlly@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.2.0.tgz#f0f6c2fc8d2d12ea6907cd869066689b5031b613" - integrity sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww== - dependencies: - acorn "^8.8.2" - pathe "^1.1.0" - pkg-types "^1.0.2" - ufo "^1.1.1" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.4: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -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.assign@^4.1.3, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== - dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -p-limit@^2.0.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-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" - integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== - dependencies: - yocto-queue "^1.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@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -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== - -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-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -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 sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -pathe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.0.tgz#e2e13f6c62b31a3289af4ba19886c230f295ec03" - integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -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== - -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -pkg-types@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.2.tgz#c233efc5210a781e160e0cafd60c0d0510a4b12e" - integrity sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ== - dependencies: - jsonc-parser "^3.2.0" - mlly "^1.1.1" - pathe "^1.1.0" - -postcss@^8.4.21: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -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@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^3.18.0: - version "3.20.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" - integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== - optionalDependencies: - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -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@^7.0.0, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -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" - -siginfo@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" - integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -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== - -stackback@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" - integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== - -standard-engine@^15.0.0: - version "15.0.0" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.0.0.tgz#e37ca2e1a589ef85431043a3e87cb9ce95a4ca4e" - integrity sha512-4xwUhJNo1g/L2cleysUqUv7/btn7GEbYJvmgKrQ2vd/8pkTmN8cpqAZg+BT8Z1hNeEH787iWUdOpL8fmApLtxA== - dependencies: - get-stdin "^8.0.0" - minimist "^1.2.6" - pkg-conf "^3.1.0" - xdg-basedir "^4.0.0" - -standard@^17.0.0: - version "17.0.0" - resolved "https://registry.yarnpkg.com/standard/-/standard-17.0.0.tgz#85718ecd04dc4133908434660788708cca855aa1" - integrity sha512-GlCM9nzbLUkr+TYR5I2WQoIah4wHA2lMauqbyPLV/oI5gJxqhHzhjl9EG2N0lr/nRqI3KCbCvm/W3smxvLaChA== - dependencies: - eslint "^8.13.0" - eslint-config-standard "17.0.0" - eslint-config-standard-jsx "^11.0.0" - eslint-plugin-import "^2.26.0" - eslint-plugin-n "^15.1.0" - eslint-plugin-promise "^6.0.0" - eslint-plugin-react "^7.28.0" - standard-engine "^15.0.0" - -std-env@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.3.2.tgz#af27343b001616015534292178327b202b9ee955" - integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-literal@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.0.1.tgz#0115a332710c849b4e46497891fb8d585e404bd2" - integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== - dependencies: - acorn "^8.8.2" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tinybench@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.4.0.tgz#83f60d9e5545353610fe7993bd783120bc20c7a7" - integrity sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg== - -tinypool@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.4.0.tgz#3cf3ebd066717f9f837e8d7d31af3c127fdb5446" - integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA== - -tinyspy@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-1.1.1.tgz#0cb91d5157892af38cb2d217f5c7e8507a5bf092" - integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g== - -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@^4.0.0, type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -ufo@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.1.tgz#e70265e7152f3aba425bd013d150b2cdf4056d7c" - integrity sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -vite-node@0.29.8: - version "0.29.8" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.29.8.tgz#6a1c9d4fb31e7b4e0f825d3a37abe3404e52bd8e" - integrity sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - mlly "^1.1.0" - pathe "^1.1.0" - picocolors "^1.0.0" - vite "^3.0.0 || ^4.0.0" - -"vite@^3.0.0 || ^4.0.0", vite@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" - integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== - dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.18.0" - optionalDependencies: - fsevents "~2.3.2" - -vitest@^0.29.8: - version "0.29.8" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-0.29.8.tgz#9c13cfa007c3511e86c26e1fe9a686bb4dbaec80" - integrity sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ== - dependencies: - "@types/chai" "^4.3.4" - "@types/chai-subset" "^1.3.3" - "@types/node" "*" - "@vitest/expect" "0.29.8" - "@vitest/runner" "0.29.8" - "@vitest/spy" "0.29.8" - "@vitest/utils" "0.29.8" - acorn "^8.8.1" - acorn-walk "^8.2.0" - cac "^6.7.14" - chai "^4.3.7" - debug "^4.3.4" - local-pkg "^0.4.2" - pathe "^1.1.0" - picocolors "^1.0.0" - source-map "^0.6.1" - std-env "^3.3.1" - strip-literal "^1.0.0" - tinybench "^2.3.1" - tinypool "^0.4.0" - tinyspy "^1.0.2" - vite "^3.0.0 || ^4.0.0" - vite-node "0.29.8" - why-is-node-running "^2.2.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -why-is-node-running@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" - integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== - dependencies: - siginfo "^2.0.0" - stackback "0.0.2" - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -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== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== diff --git a/script/bootstrap b/script/bootstrap index adccebf92..a06aaa9c2 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -19,3 +19,4 @@ cd $(dirname "$0")/.. rm -rf .bundle/{binstubs,config} bundle install --binstubs --quiet "$@" +npm clean-install --silent From 6512d63a073ded11076cbb1128f3542c2fc49bd2 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 10:32:40 -0400 Subject: [PATCH 35/44] Add flipper-expressions-schema as separate gem for now --- flipper-expressions-schema.gemspec | 24 +++++++++++++++++++ flipper.gemspec | 1 - lib/flipper-expressions-schema.rb | 1 + lib/flipper/expression.rb | 1 - .../schema_spec.rb} | 3 ++- 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 flipper-expressions-schema.gemspec create mode 100644 lib/flipper-expressions-schema.rb rename spec/flipper/{expressions_schema_spec.rb => expression/schema_spec.rb} (94%) diff --git a/flipper-expressions-schema.gemspec b/flipper-expressions-schema.gemspec new file mode 100644 index 000000000..d9cb4b65f --- /dev/null +++ b/flipper-expressions-schema.gemspec @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +require File.expand_path('../lib/flipper/version', __FILE__) +require File.expand_path('../lib/flipper/metadata', __FILE__) + +Gem::Specification.new do |gem| + gem.authors = ['John Nunemaker'] + gem.email = 'support@flippercloud.io' + gem.summary = 'ActiveRecord adapter for Flipper' + gem.license = 'MIT' + gem.homepage = 'https://www.flippercloud.io/docs/expressions' + + gem.files = [ + 'lib/flipper-expressions-schema.rb', + 'lib/flipper/expression/schema.rb', + 'lib/flipper/version.rb', + ] + Dir['node_modules/@flippercloud.io/expressions/schemas/*.json'] + gem.name = 'flipper-expressions-schema' + gem.require_paths = ['lib'] + gem.version = Flipper::VERSION + gem.metadata = Flipper::METADATA + + gem.add_dependency 'flipper', "~> #{Flipper::VERSION}" + gem.add_dependency 'json_schemer', '~> 1.0' +end diff --git a/flipper.gemspec b/flipper.gemspec index 235c23833..ca48c66a8 100644 --- a/flipper.gemspec +++ b/flipper.gemspec @@ -36,5 +36,4 @@ Gem::Specification.new do |gem| gem.add_dependency 'concurrent-ruby', '< 2' gem.add_dependency 'brow', '~> 0.4.1' - gem.add_dependency 'json_schemer', '~> 1.0' end diff --git a/lib/flipper-expressions-schema.rb b/lib/flipper-expressions-schema.rb new file mode 100644 index 000000000..23dafb71e --- /dev/null +++ b/lib/flipper-expressions-schema.rb @@ -0,0 +1 @@ +require "flipper/expression/schema" diff --git a/lib/flipper/expression.rb b/lib/flipper/expression.rb index def358003..a4370569e 100644 --- a/lib/flipper/expression.rb +++ b/lib/flipper/expression.rb @@ -1,6 +1,5 @@ require "flipper/expression/builder" require "flipper/expression/constant" -require "flipper/expression/schema" module Flipper class Expression diff --git a/spec/flipper/expressions_schema_spec.rb b/spec/flipper/expression/schema_spec.rb similarity index 94% rename from spec/flipper/expressions_schema_spec.rb rename to spec/flipper/expression/schema_spec.rb index 7018e0f3d..83ac4dfe8 100644 --- a/spec/flipper/expressions_schema_spec.rb +++ b/spec/flipper/expression/schema_spec.rb @@ -1,6 +1,7 @@ require "json_schemer" +require "flipper-expressions-schema" -RSpec.describe Flipper::Expressions do +RSpec.describe Flipper::Expression::Schema do let(:schema) { Flipper::Expression::Schema.new } Flipper::Expression::Schema.examples.each do |name, examples| From 9725f56bd6774bc2f2a0765ec49ca24936abf6ac Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 12:33:31 -0400 Subject: [PATCH 36/44] Ensure schemas are downloaded --- Rakefile | 1 + flipper-expressions-schema.gemspec | 10 ++++++++++ flipper.gemspec | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Rakefile b/Rakefile index e72667b9f..2aadb6456 100644 --- a/Rakefile +++ b/Rakefile @@ -7,6 +7,7 @@ require 'flipper/version' # gem uninstall flipper flipper-ui flipper-redis desc 'Build gem into the pkg directory' task :build do + sh 'npm clean-install --silent' FileUtils.rm_rf('pkg') Dir['*.gemspec'].each do |gemspec| system "gem build #{gemspec}" diff --git a/flipper-expressions-schema.gemspec b/flipper-expressions-schema.gemspec index d9cb4b65f..a2f3a5de9 100644 --- a/flipper-expressions-schema.gemspec +++ b/flipper-expressions-schema.gemspec @@ -3,6 +3,14 @@ require File.expand_path('../lib/flipper/version', __FILE__) require File.expand_path('../lib/flipper/metadata', __FILE__) Gem::Specification.new do |gem| + SCHEMAS_DIR = File.expand_path("node_modules/@flippercloud.io/expressions/schemas", __dir__) + + # Ensure schemas are downloaded loaded as a git dependency + unless File.exist?(SCHEMAS_DIR) + warn "Getting schemas from @flippercloud.io/expressions..." + Dir.chdir(__dir__) { exec "npm install --silent" } + end + gem.authors = ['John Nunemaker'] gem.email = 'support@flippercloud.io' gem.summary = 'ActiveRecord adapter for Flipper' @@ -10,6 +18,8 @@ Gem::Specification.new do |gem| gem.homepage = 'https://www.flippercloud.io/docs/expressions' gem.files = [ + 'package.json', + 'package-lock.json', 'lib/flipper-expressions-schema.rb', 'lib/flipper/expression/schema.rb', 'lib/flipper/version.rb', diff --git a/flipper.gemspec b/flipper.gemspec index ca48c66a8..d0bb068dd 100644 --- a/flipper.gemspec +++ b/flipper.gemspec @@ -6,7 +6,7 @@ plugin_files = [] plugin_test_files = [] Dir['flipper-*.gemspec'].map do |gemspec| - spec = eval(File.read(gemspec)) + spec = Bundler.load_gemspec(gemspec) plugin_files << spec.files plugin_test_files << spec.files end From 8e1bfb1531aecbf33baa4a8ae1518ee7c964e919 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 14:39:41 -0400 Subject: [PATCH 37/44] Ensure node is setup before bundling --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51f532385..0e08a6137 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,13 +59,13 @@ jobs: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}- - name: Install libpq-dev run: sudo apt-get -yqq install libpq-dev + - name: Set up Node + uses: actions/setup-node@v3 - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # 'bundle install' and cache gems - - name: Set up Node - uses: actions/setup-node@v3 - run: npm clean-install - name: Run Rake with Rails ${{ matrix.rails }} run: bundle exec rake From 7fc02ff4b53e80bf0a44df12c5c551c387e8e808 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 14:40:39 -0400 Subject: [PATCH 38/44] Revert renaming of ci job --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e08a6137..10603a729 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ name: CI on: [push, pull_request] jobs: - ruby: + test: name: Test on ruby ${{ matrix.ruby }} and rails ${{ matrix.rails }} runs-on: ubuntu-latest services: From 15099b98b32162be6601978497d124bff2d87711 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 14:42:36 -0400 Subject: [PATCH 39/44] English properly --- flipper-expressions-schema.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flipper-expressions-schema.gemspec b/flipper-expressions-schema.gemspec index a2f3a5de9..ed4c4bdae 100644 --- a/flipper-expressions-schema.gemspec +++ b/flipper-expressions-schema.gemspec @@ -5,7 +5,8 @@ require File.expand_path('../lib/flipper/metadata', __FILE__) Gem::Specification.new do |gem| SCHEMAS_DIR = File.expand_path("node_modules/@flippercloud.io/expressions/schemas", __dir__) - # Ensure schemas are downloaded loaded as a git dependency + # Ensure schemas are downloaded when installed as a git dependency. + # This will be handled by rake when the gem is built and published. unless File.exist?(SCHEMAS_DIR) warn "Getting schemas from @flippercloud.io/expressions..." Dir.chdir(__dir__) { exec "npm install --silent" } From 6640afcb9cf865629cd45913d5d1de2c47a26fa2 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Thu, 12 Oct 2023 14:51:41 -0400 Subject: [PATCH 40/44] Don't auth to install npm/gems from github --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10603a729..c5116f93e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,6 +50,9 @@ jobs: mongodb-version: 4.0 - name: Check out repository code uses: actions/checkout@v4 + with: + # Install gems/npm packages from GitHub fails without this + persist-credentials: false - name: Do some action caching uses: actions/cache@v3 with: From ed90c5547df216dbfb4bd8f3656c6efd6c10edf6 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 13 Oct 2023 11:47:16 -0400 Subject: [PATCH 41/44] Try using the gem post_install hook to avoid issue with GitHub Actions --- flipper-expressions-schema.gemspec | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/flipper-expressions-schema.gemspec b/flipper-expressions-schema.gemspec index ed4c4bdae..c5ad9c72b 100644 --- a/flipper-expressions-schema.gemspec +++ b/flipper-expressions-schema.gemspec @@ -7,9 +7,11 @@ Gem::Specification.new do |gem| # Ensure schemas are downloaded when installed as a git dependency. # This will be handled by rake when the gem is built and published. - unless File.exist?(SCHEMAS_DIR) - warn "Getting schemas from @flippercloud.io/expressions..." - Dir.chdir(__dir__) { exec "npm install --silent" } + Gem.post_install do + unless File.exist?(SCHEMAS_DIR) + warn "Getting schemas from @flippercloud.io/expressions..." + Dir.chdir(__dir__) { exec "npm install --silent" } + end end gem.authors = ['John Nunemaker'] From 6350f0e59fd5bac9d04dd422e7a5fc986c15081d Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 13 Oct 2023 12:06:38 -0400 Subject: [PATCH 42/44] Remove actions/cache, just rely on ruby/node actions for caching --- .github/workflows/ci.yml | 9 ++------- .github/workflows/examples.yml | 11 ++++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c5116f93e..31e519300 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,17 +53,12 @@ jobs: with: # Install gems/npm packages from GitHub fails without this persist-credentials: false - - name: Do some action caching - uses: actions/cache@v3 - with: - path: vendor/bundle - key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}- - name: Install libpq-dev run: sudo apt-get -yqq install libpq-dev - name: Set up Node uses: actions/setup-node@v3 + with: + cache: 'npm' - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 69a2738a2..0497b926e 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -51,15 +51,12 @@ jobs: mongodb-version: 4.0 - name: Check out repository code uses: actions/checkout@v4 - - name: Do some action caching - uses: actions/cache@v3 - with: - path: vendor/bundle - key: ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}-${{ hashFiles('**/Gemfile.lock') }} - restore-keys: | - ${{ runner.os }}-gems-${{ matrix.ruby }}-${{ matrix.rails }}- - name: Install libpq-dev run: sudo apt-get -yqq install libpq-dev + - name: Set up Node + uses: actions/setup-node@v3 + with: + cache: 'npm' - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: From b36dd09a213bc4a586763b7d57de21cf6a42c0ab Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 13 Oct 2023 12:17:46 -0400 Subject: [PATCH 43/44] Run npm install before setting up ruby --- .github/workflows/ci.yml | 2 +- .github/workflows/examples.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31e519300..20969f1d4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,11 +59,11 @@ jobs: uses: actions/setup-node@v3 with: cache: 'npm' + - run: npm clean-install - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true # 'bundle install' and cache gems - - run: npm clean-install - name: Run Rake with Rails ${{ matrix.rails }} run: bundle exec rake diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 0497b926e..39c8800d2 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -57,6 +57,7 @@ jobs: uses: actions/setup-node@v3 with: cache: 'npm' + - run: npm clean-install - name: Set up Ruby ${{ matrix.ruby }} uses: ruby/setup-ruby@v1 with: From 5470e59a9dc9c2105dfc22c05085439ca0dceb98 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 13 Oct 2023 12:44:54 -0400 Subject: [PATCH 44/44] Rename expressions repo --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27a7f95a5..abf445e83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,12 +5,12 @@ "packages": { "": { "dependencies": { - "@flippercloud.io/expressions": "github:flippercloud/expressions.js" + "@flippercloud.io/expressions": "github:flippercloud/expressions" } }, "node_modules/@flippercloud.io/expressions": { "version": "1.0.0", - "resolved": "git+ssh://git@github.com/flippercloud/expressions.js.git#5ac389113fe4afa0b4a5f7cda0695e7f021f3804", + "resolved": "git+ssh://git@github.com/flippercloud/expressions.git#82e357d922ce6b00d343ba67900f749d0655b62c", "license": "MIT", "dependencies": { "ajv": "^8.12.0", diff --git a/package.json b/package.json index 43b535668..4d3b4f9a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "@flippercloud.io/expressions": "github:flippercloud/expressions.js" + "@flippercloud.io/expressions": "github:flippercloud/expressions" } }