From d104494f024c5c21913ecdd52c5793cb083fda86 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 27 Apr 2022 11:13:10 -0400 Subject: [PATCH 01/43] First attempt at refactoring algebraicCombination code --- .../Distributions/GenericDist/GenericDist.res | 65 +++++++++---------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index 3af431f2..b27c3c13 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -247,11 +247,11 @@ module AlgebraicCombination = { arithmeticOperation: Operation.algebraicOperation, t1: t, t2: t, - ): option => { + ): SymbolicDistTypes.analyticalSimplificationResult => { switch (t1, t2) { | (DistributionTypes.Symbolic(d1), DistributionTypes.Symbolic(d2)) => - Some(SymbolicDist.T.tryAnalyticalSimplification(d1, d2, arithmeticOperation)) - | _ => None + SymbolicDist.T.tryAnalyticalSimplification(d1, d2, arithmeticOperation) + | _ => #NoSolution } } @@ -263,20 +263,13 @@ module AlgebraicCombination = { ~t2: t, ): result => { switch tryAnalyticalSimplification(arithmeticOperation, t1, t2) { - | Some(#AnalyticalSolution(symbolicDist)) => Ok(Symbolic(symbolicDist)) - | Some(#Error(e)) => Error(OperationError(e)) - | Some(#NoSolution) - | None => - switch getInvalidOperationError(t1, t2, ~toPointSetFn, ~arithmeticOperation) { - | Some(e) => Error(e) - | None => - switch chooseConvolutionOrMonteCarloDefault(arithmeticOperation, t1, t2) { - | MonteCarloStrat => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) - | ConvolutionStrat(convOp) => - runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet( - r, - )) - } + | #AnalyticalSolution(symbolicDist) => Ok(Symbolic(symbolicDist)) + | #Error(e) => Error(OperationError(e)) + | #NoSolution => + switch chooseConvolutionOrMonteCarloDefault(arithmeticOperation, t1, t2) { + | MonteCarloStrat => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) + | ConvolutionStrat(convOp) => + runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet(r)) } } } @@ -289,27 +282,29 @@ module AlgebraicCombination = { ~arithmeticOperation: Operation.algebraicOperation, ~t2: t, ): result => { - switch strategy { - | AsDefault => runDefault(t1, ~toPointSetFn, ~toSampleSetFn, ~arithmeticOperation, ~t2) - | AsSymbolic => + let invalidOperationError = getInvalidOperationError( + t1, + t2, + ~toPointSetFn, + ~arithmeticOperation, + ) + switch (invalidOperationError, strategy, arithmeticOperation) { + | (Some(e), _, _) => Error(e) + | (None, AsDefault, _) => + runDefault(t1, ~toPointSetFn, ~toSampleSetFn, ~arithmeticOperation, ~t2) + | (None, AsMonteCarlo, _) => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) + | (None, AsSymbolic, _) => switch tryAnalyticalSimplification(arithmeticOperation, t1, t2) { - | Some(#AnalyticalSolution(symbolicDist)) => Ok(Symbolic(symbolicDist)) - | Some(#NoSolution) => Error(RequestedStrategyInvalidError(`No analytical solution`)) - | None => Error(RequestedStrategyInvalidError("Inputs were not even symbolic")) - | Some(#Error(err)) => Error(OperationError(err)) + | #AnalyticalSolution(symbolicDist) => Ok(Symbolic(symbolicDist)) + | #NoSolution => Error(RequestedStrategyInvalidError(`No analytic solution for inputs`)) + | #Error(err) => Error(OperationError(err)) } - | AsConvolution => { - let errString = opString => `Can't convolve on ${opString}` - switch arithmeticOperation { - | (#Add | #Subtract | #Multiply) as convOp => - runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet( - r, - )) - | (#Divide | #Power | #Logarithm) as op => - op->Operation.Algebraic.toString->errString->RequestedStrategyInvalidError->Error - } + | (None, AsConvolution, (#Divide | #Power | #Logarithm) as convOp) => { + let errString = `Can't convolve on ${Operation.Algebraic.toString(convOp)}` + Error(RequestedStrategyInvalidError(errString)) } - | AsMonteCarlo => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) + | (None, AsConvolution, (#Add | #Subtract | #Multiply) as convOp) => + runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet(r)) } } } From 6045fe5e6281f704e362bd70af413c7518a36cde Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 27 Apr 2022 12:48:46 -0400 Subject: [PATCH 02/43] Organized AlgebraicCombination functionality into submodules --- .../Distributions/GenericDist/GenericDist.res | 274 +++++++++--------- .../src/rescript/Utility/Operation.res | 12 + 2 files changed, 157 insertions(+), 129 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index b27c3c13..15d6333b 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -147,129 +147,136 @@ let truncate = Truncate.run TODO: It would be useful to be able to pass in a paramater to get this to run either with convolution or monte carlo. */ module AlgebraicCombination = { - let runConvolution = ( - toPointSet: toPointSetFn, - arithmeticOperation: Operation.convolutionOperation, - t1: t, - t2: t, - ) => - E.R.merge(toPointSet(t1), toPointSet(t2))->E.R2.fmap(((a, b)) => - PointSetDist.combineAlgebraically(arithmeticOperation, a, b) - ) - - let runMonteCarlo = ( - toSampleSet: toSampleSetFn, - arithmeticOperation: Operation.algebraicOperation, - t1: t, - t2: t, - ): result => { - let fn = Operation.Algebraic.toFn(arithmeticOperation) - E.R.merge(toSampleSet(t1), toSampleSet(t2)) - ->E.R.bind(((t1, t2)) => { - SampleSetDist.map2(~fn, ~t1, ~t2)->E.R2.errMap(x => DistributionTypes.OperationError(x)) - }) - ->E.R2.fmap(r => DistributionTypes.SampleSet(r)) - } - - /* + module InputValidator = { + /* It would be good to also do a check to make sure that probability mass for the second operand, at value 1.0, is 0 (or approximately 0). However, we'd ideally want to check that both the probability mass and the probability density are greater than zero. Right now we don't yet have a way of getting probability mass, so I'll leave this for later. */ - let getLogarithmInputError = (t1: t, t2: t, ~toPointSetFn: toPointSetFn): option => { - let firstOperandIsGreaterThanZero = - toFloatOperation(t1, ~toPointSetFn, ~distToFloatOperation=#Cdf(1e-10)) |> E.R.fmap(r => - r > 0. - ) - let secondOperandIsGreaterThanZero = - toFloatOperation(t2, ~toPointSetFn, ~distToFloatOperation=#Cdf(1e-10)) |> E.R.fmap(r => - r > 0. - ) - let items = E.A.R.firstErrorOrOpen([ - firstOperandIsGreaterThanZero, - secondOperandIsGreaterThanZero, - ]) - switch items { - | Error(r) => Some(r) - | Ok([true, _]) => - Some(LogarithmOfDistributionError("First input must completely greater than 0")) - | Ok([false, true]) => - Some(LogarithmOfDistributionError("Second input must completely greater than 0")) - | Ok([false, false]) => None - | Ok(_) => Some(Unreachable) + let getLogarithmInputError = (t1: t, t2: t, ~toPointSetFn: toPointSetFn): option => { + let firstOperandIsGreaterThanZero = + toFloatOperation(t1, ~toPointSetFn, ~distToFloatOperation=#Cdf(1e-10)) |> E.R.fmap(r => + r > 0. + ) + let secondOperandIsGreaterThanZero = + toFloatOperation(t2, ~toPointSetFn, ~distToFloatOperation=#Cdf(1e-10)) |> E.R.fmap(r => + r > 0. + ) + let items = E.A.R.firstErrorOrOpen([ + firstOperandIsGreaterThanZero, + secondOperandIsGreaterThanZero, + ]) + switch items { + | Error(r) => Some(r) + | Ok([true, _]) => + Some(LogarithmOfDistributionError("First input must completely greater than 0")) + | Ok([false, true]) => + Some(LogarithmOfDistributionError("Second input must completely greater than 0")) + | Ok([false, false]) => None + | Ok(_) => Some(Unreachable) + } + } + + let run = (t1: t, t2: t, ~toPointSetFn: toPointSetFn, ~arithmeticOperation): option => { + if arithmeticOperation == #Logarithm { + getLogarithmInputError(t1, t2, ~toPointSetFn) + } else { + None + } } } - let getInvalidOperationError = ( - t1: t, - t2: t, - ~toPointSetFn: toPointSetFn, + module StrategyCallOnValidatedInputs = { + let convolution = ( + toPointSet: toPointSetFn, + arithmeticOperation: Operation.convolutionOperation, + t1: t, + t2: t, + ): result => + E.R.merge(toPointSet(t1), toPointSet(t2)) + ->E.R2.fmap(((a, b)) => PointSetDist.combineAlgebraically(arithmeticOperation, a, b)) + ->E.R2.fmap(r => DistributionTypes.PointSet(r)) + + let monteCarlo = ( + toSampleSet: toSampleSetFn, + arithmeticOperation: Operation.algebraicOperation, + t1: t, + t2: t, + ): result => { + let fn = Operation.Algebraic.toFn(arithmeticOperation) + E.R.merge(toSampleSet(t1), toSampleSet(t2)) + ->E.R.bind(((t1, t2)) => { + SampleSetDist.map2(~fn, ~t1, ~t2)->E.R2.errMap(x => DistributionTypes.OperationError(x)) + }) + ->E.R2.fmap(r => DistributionTypes.SampleSet(r)) + } + + let symbolic = ( + arithmeticOperation: Operation.algebraicOperation, + t1: t, + t2: t, + ): SymbolicDistTypes.analyticalSimplificationResult => { + switch (t1, t2) { + | (DistributionTypes.Symbolic(d1), DistributionTypes.Symbolic(d2)) => + SymbolicDist.T.tryAnalyticalSimplification(d1, d2, arithmeticOperation) + | _ => #NoSolution + } + } + } + + module StrategyChooser = { + type specificStrategy = [#AsSymbolic | #AsMonteCarlo | #AsConvolution] + + //I'm (Ozzie) really just guessing here, very little idea what's best + let expectedConvolutionCost: t => int = x => + switch x { + | Symbolic(#Float(_)) => 1 + | Symbolic(_) => 1000 + | PointSet(Discrete(m)) => m.xyShape->XYShape.T.length + | PointSet(Mixed(_)) => 1000 + | PointSet(Continuous(_)) => 1000 + | _ => 1000 + } + + let run = (~t1: t, ~t2: t, ~arithmeticOperation): specificStrategy => { + switch StrategyCallOnValidatedInputs.symbolic(arithmeticOperation, t1, t2) { + | #AnalyticalSolution(_) + | #Error(_) => + #AsSymbolic + | #NoSolution => + if Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) { + expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > 10000 + ? #AsMonteCarlo + : #AsConvolution + } else { + #AsMonteCarlo + } + } + } + } + + let runStrategyOnValidatedInputs = ( + ~t1: t, + ~t2: t, ~arithmeticOperation, - ): option => { - if arithmeticOperation == #Logarithm { - getLogarithmInputError(t1, t2, ~toPointSetFn) - } else { - None - } - } - - //I'm (Ozzie) really just guessing here, very little idea what's best - let expectedConvolutionCost: t => int = x => - switch x { - | Symbolic(#Float(_)) => 1 - | Symbolic(_) => 1000 - | PointSet(Discrete(m)) => m.xyShape->XYShape.T.length - | PointSet(Mixed(_)) => 1000 - | PointSet(Continuous(_)) => 1000 - | _ => 1000 - } - - type calculationStrategy = MonteCarloStrat | ConvolutionStrat(Operation.convolutionOperation) - - let chooseConvolutionOrMonteCarloDefault = ( - op: Operation.algebraicOperation, - t2: t, - t1: t, - ): calculationStrategy => - switch op { - | #Divide - | #Power - | #Logarithm => - MonteCarloStrat - | (#Add | #Subtract | #Multiply) as convOp => - expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > 10000 - ? MonteCarloStrat - : ConvolutionStrat(convOp) - } - - let tryAnalyticalSimplification = ( - arithmeticOperation: Operation.algebraicOperation, - t1: t, - t2: t, - ): SymbolicDistTypes.analyticalSimplificationResult => { - switch (t1, t2) { - | (DistributionTypes.Symbolic(d1), DistributionTypes.Symbolic(d2)) => - SymbolicDist.T.tryAnalyticalSimplification(d1, d2, arithmeticOperation) - | _ => #NoSolution - } - } - - let runDefault = ( - t1: t, + ~strategy: StrategyChooser.specificStrategy, ~toPointSetFn: toPointSetFn, ~toSampleSetFn: toSampleSetFn, - ~arithmeticOperation, - ~t2: t, ): result => { - switch tryAnalyticalSimplification(arithmeticOperation, t1, t2) { - | #AnalyticalSolution(symbolicDist) => Ok(Symbolic(symbolicDist)) - | #Error(e) => Error(OperationError(e)) - | #NoSolution => - switch chooseConvolutionOrMonteCarloDefault(arithmeticOperation, t1, t2) { - | MonteCarloStrat => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) - | ConvolutionStrat(convOp) => - runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet(r)) + switch strategy { + | #AsMonteCarlo => + StrategyCallOnValidatedInputs.monteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) + | #AsSymbolic => + switch StrategyCallOnValidatedInputs.symbolic(arithmeticOperation, t1, t2) { + | #AnalyticalSolution(symbolicDist) => Ok(Symbolic(symbolicDist)) + | #Error(e) => Error(OperationError(e)) + | #NoSolution => Error(Unreachable) + } + | #AsConvolution => + switch Operation.Convolution.fromAlgebraicOperation(arithmeticOperation) { + | Some(convOp) => StrategyCallOnValidatedInputs.convolution(toPointSetFn, convOp, t1, t2) + | None => Error(Unreachable) } } } @@ -282,29 +289,38 @@ module AlgebraicCombination = { ~arithmeticOperation: Operation.algebraicOperation, ~t2: t, ): result => { - let invalidOperationError = getInvalidOperationError( - t1, - t2, - ~toPointSetFn, - ~arithmeticOperation, - ) - switch (invalidOperationError, strategy, arithmeticOperation) { - | (Some(e), _, _) => Error(e) - | (None, AsDefault, _) => - runDefault(t1, ~toPointSetFn, ~toSampleSetFn, ~arithmeticOperation, ~t2) - | (None, AsMonteCarlo, _) => runMonteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) - | (None, AsSymbolic, _) => - switch tryAnalyticalSimplification(arithmeticOperation, t1, t2) { + let invalidOperationError = InputValidator.run(t1, t2, ~arithmeticOperation, ~toPointSetFn) + switch (invalidOperationError, strategy) { + | (Some(e), _) => Error(e) + | (None, AsDefault) => { + let chooseStrategy = StrategyChooser.run(~arithmeticOperation, ~t1, ~t2) + runStrategyOnValidatedInputs( + ~t1, + ~t2, + ~strategy=chooseStrategy, + ~arithmeticOperation, + ~toPointSetFn, + ~toSampleSetFn, + ) + } + | (None, AsMonteCarlo) => + StrategyCallOnValidatedInputs.monteCarlo(toSampleSetFn, arithmeticOperation, t1, t2) + | (None, AsSymbolic) => + switch StrategyCallOnValidatedInputs.symbolic(arithmeticOperation, t1, t2) { | #AnalyticalSolution(symbolicDist) => Ok(Symbolic(symbolicDist)) | #NoSolution => Error(RequestedStrategyInvalidError(`No analytic solution for inputs`)) | #Error(err) => Error(OperationError(err)) } - | (None, AsConvolution, (#Divide | #Power | #Logarithm) as convOp) => { - let errString = `Can't convolve on ${Operation.Algebraic.toString(convOp)}` - Error(RequestedStrategyInvalidError(errString)) + | (None, AsConvolution) => + switch Operation.Convolution.fromAlgebraicOperation(arithmeticOperation) { + | None => { + let errString = `Convolution not supported for ${Operation.Algebraic.toString( + arithmeticOperation, + )}` + Error(RequestedStrategyInvalidError(errString)) + } + | Some(convOp) => StrategyCallOnValidatedInputs.convolution(toPointSetFn, convOp, t1, t2) } - | (None, AsConvolution, (#Add | #Subtract | #Multiply) as convOp) => - runConvolution(toPointSetFn, convOp, t1, t2)->E.R2.fmap(r => DistributionTypes.PointSet(r)) } } } diff --git a/packages/squiggle-lang/src/rescript/Utility/Operation.res b/packages/squiggle-lang/src/rescript/Utility/Operation.res index ac83ceea..4a1ef91a 100644 --- a/packages/squiggle-lang/src/rescript/Utility/Operation.res +++ b/packages/squiggle-lang/src/rescript/Utility/Operation.res @@ -29,6 +29,18 @@ type distToFloatOperation = [ module Convolution = { type t = convolutionOperation + //Only a selection of operations are supported by convolution. + let fromAlgebraicOperation = (op: algebraicOperation): option => + switch op { + | #Add => Some(#Add) + | #Subtract => Some(#Subtract) + | #Multiply => Some(#Multiply) + | #Divide | #Power | #Logarithm => None + } + + let canDoAlgebraicOperation = (op: algebraicOperation): bool => + fromAlgebraicOperation(op)->E.O.isSome + let toFn: (t, float, float) => float = x => switch x { | #Add => \"+." From ca67140361b26b2bc7261264f203c4f314c14cb3 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 14:49:15 -0400 Subject: [PATCH 03/43] `Language.mdx` changes and `examples` Value: [1e-2 to 2e-1] --- examples/decay.squiggle | 20 ++++++++ examples/givedirectly.squiggle | 38 +++++++++++++++ .../wholenumberassignmentevaluation.squiggle | 3 ++ packages/website/docs/Features/Language.mdx | 48 ++++++++++++------- 4 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 examples/decay.squiggle create mode 100644 examples/givedirectly.squiggle create mode 100644 examples/wholenumberassignmentevaluation.squiggle diff --git a/examples/decay.squiggle b/examples/decay.squiggle new file mode 100644 index 00000000..60f4c95e --- /dev/null +++ b/examples/decay.squiggle @@ -0,0 +1,20 @@ +# The following code was provided by Nuño Sempere, it comes directly from the post https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3/p/j8o6sgRerE3tqNWdj +## Initial setup +yearly_probability_max = 0.95 +yearly_probability_min = 0.66 +period_probability_function(epsilon, yearly_probability) = 1 - (1 - yearly_probability) ^ (1 / epsilon) +probability_decayed(t, time_periods, period_probability) = 1 - (1 - period_probability) ^ (time_periods - t) + +## Monthly decomposition +months_in_a_year=12 + +monthly_probability_min = period_probability_function(months_in_a_year, yearly_probability_min) +monthly_probability_max = period_probability_function(months_in_a_year, yearly_probability_max) + +probability_decayed_monthly_min(t) = probability_decayed(t, months_in_a_year, monthly_probability_min) +probability_decayed_monthly_max(t) = probability_decayed(t, months_in_a_year, monthly_probability_max) +probability_decayed_monthly(t) = probability_decayed_monthly_min(t) to probability_decayed_monthly_max(t) + +probability_decayed_monthly +## probability_decayed_monthly(6) +## mean(probability_decayed_monthly(6)) diff --git a/examples/givedirectly.squiggle b/examples/givedirectly.squiggle new file mode 100644 index 00000000..16dda3a7 --- /dev/null +++ b/examples/givedirectly.squiggle @@ -0,0 +1,38 @@ +# This is a cost effectiveness analysis of givedirectly, originally done by givewell, and translated into Squiggle by Sam Nolan +donation_size = 10000 +proportion_of_funding_available = beta(10, 2) +total_funding_available = donation_size * proportion_of_funding_available +household_size = 3.7 to 5.7 +size_of_transfer = 800 to 1200 +size_of_transfer_per_person = size_of_transfer / household_size + +portion_invested = 0.3 to 0.5 +amount_invested = portion_invested * size_of_transfer_per_person +amount_consumed = (1 - portion_invested) * size_of_transfer_per_person +return_on_investment = 0.08 to 0.12 +increase_in_consumption_from_investments = return_on_investment * amount_invested +baseline_consumption = 200 to 350 +log_increase_in_consumption = log(amount_consumed + baseline_consumption) + log(baseline_consumption) +log_increase_in_consumption_from_investment = log(increase_in_consumption_from_investments + baseline_consumption) + log(baseline_consumption) +investment_duration = 8 to 12 +discount_rate = beta(1.004, 20) + +present_value_excluding_last_year = log_increase_in_consumption_from_investment * (1 - (1 + discount_rate) ^ (-investment_duration)) / (log(1 + discount_rate)) + +percent_of_investment_returned = 0.15 to 0.25 + +pv_consumption_last_year = (log(baseline_consumption + amount_invested * (return_on_investment + percent_of_investment_returned)) - log(baseline_consumption)) / (1 + discount_rate)^investment_duration + +total_pv_of_cash_transfer = pv_consumption_last_year + present_value_excluding_last_year + log_increase_in_consumption + +discount_negative_spoiler = 0.03 to 0.07 + +value_discounting_spoiler = discount_negative_spoiler * total_pv_of_cash_transfer + +consumption_increase_per_household = value_discounting_spoiler * household_size + +amount_of_transfers_made = total_funding_available / size_of_transfer + +total_increase_in_ln_consumption = amount_of_transfers_made * consumption_increase_per_household + +total_increase_in_ln_consumption diff --git a/examples/wholenumberassignmentevaluation.squiggle b/examples/wholenumberassignmentevaluation.squiggle new file mode 100644 index 00000000..f441c67e --- /dev/null +++ b/examples/wholenumberassignmentevaluation.squiggle @@ -0,0 +1,3 @@ +xY1 = 99 +aBa3 = xY1 * 2 + 1 +aBa3 * xY1 + aBa3 diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index e559fb60..57dcaa0a 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -1,39 +1,51 @@ --- sidebar_position: 2 +title: Squiggle Language --- import { SquiggleEditor } from "../../src/components/SquiggleEditor"; -# Squiggle Language - The squiggle language has a very simple syntax. The best way to get to understand it is by simply looking at examples. -## Basic Language +## Expressions and statements -As an example: +A squiggle **expression** is a value like a float or a distribution or a data structure like an array or a record. + + + +The bottom line of your squiggle buffer should be an expression, which we evaluate (i.e., render). Sometimes we call the last expression of a squiggle file an _export_. + +A squiggle **assignment** is a statement, when you want to bind an expression to a name. -Squiggle can declare variables (`value_of_work = 10 to 70`) and declare exports -(the lone `value_of_work` line). Variables can be used later in a squiggle program -and even in other notebooks! +### Functions -An export is rendered to the output view so you can see your result. - -the exports can be expressions, such as: - - - -## Functions - -Squiggle supports functions, including the rendering of functions: +Some assignments are functions + +## Data structures + +A squiggle **array** is a list of expressions, which is interpretable as an export. + + + +A squiggle **record** is a key-value store with dot accessors. + + From b2189777d59cf4ebc68cc90a6d6a68dd9e0e7044 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 27 Apr 2022 15:21:27 -0400 Subject: [PATCH 04/43] Linted --- .../Distributions/GenericDist/GenericDist.res | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index fcbaff3b..aaa7bf40 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -163,13 +163,17 @@ module AlgebraicCombination = { */ let getLogarithmInputError = (t1: t, t2: t, ~toPointSetFn: toPointSetFn): option => { let firstOperandIsGreaterThanZero = - toFloatOperation(t1, ~toPointSetFn, ~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten)) |> E.R.fmap(r => - r > 0. - ) + toFloatOperation( + t1, + ~toPointSetFn, + ~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten), + ) |> E.R.fmap(r => r > 0.) let secondOperandIsGreaterThanZero = - toFloatOperation(t2, ~toPointSetFn, ~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten)) |> E.R.fmap(r => - r > 0. - ) + toFloatOperation( + t2, + ~toPointSetFn, + ~distToFloatOperation=#Cdf(MagicNumbers.Epsilon.ten), + ) |> E.R.fmap(r => r > 0.) let items = E.A.R.firstErrorOrOpen([ firstOperandIsGreaterThanZero, secondOperandIsGreaterThanZero, @@ -238,8 +242,8 @@ module AlgebraicCombination = { //I'm (Ozzie) really just guessing here, very little idea what's best let expectedConvolutionCost: t => int = x => switch x { - | Symbolic(#Float(_)) =>MagicNumbers.OpCost.floatCost - | Symbolic(_) =>MagicNumbers.OpCost.symbolicCost + | Symbolic(#Float(_)) => MagicNumbers.OpCost.floatCost + | Symbolic(_) => MagicNumbers.OpCost.symbolicCost | PointSet(Discrete(m)) => m.xyShape->XYShape.T.length | PointSet(Mixed(_)) => MagicNumbers.OpCost.mixedCost | PointSet(Continuous(_)) => MagicNumbers.OpCost.continuousCost @@ -253,7 +257,8 @@ module AlgebraicCombination = { #AsSymbolic | #NoSolution => if Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) { - expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > MagicNumbers.OpCost.monteCarloCost + expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > + MagicNumbers.OpCost.monteCarloCost ? #AsMonteCarlo : #AsConvolution } else { From 98bc2ddd5818eb452562d95f871e2ea1966da4bd Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:28:10 -0400 Subject: [PATCH 05/43] Made docs better Value: [1e-3 to 2e-1] --- packages/website/docs/Discussions/Gallery.md | 7 +++++++ ...butions.md => Three-Formats-Of-Distributions.md} | 8 +++----- packages/website/docs/Features/Language.mdx | 10 +++++----- .../{Javascript-Libraries.md => Node-Packages.md} | 9 ++++----- ...ervals.md => Processing-Confidence-Intervals.md} | 8 ++++++-- packages/website/docs/Introduction.md | 13 +++++++++---- 6 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 packages/website/docs/Discussions/Gallery.md rename packages/website/docs/Discussions/{Three-Types-Of-Distributions.md => Three-Formats-Of-Distributions.md} (99%) rename packages/website/docs/Features/{Javascript-Libraries.md => Node-Packages.md} (83%) rename packages/website/docs/Internal/{ProcessingConfidenceIntervals.md => Processing-Confidence-Intervals.md} (90%) diff --git a/packages/website/docs/Discussions/Gallery.md b/packages/website/docs/Discussions/Gallery.md new file mode 100644 index 00000000..fee8f344 --- /dev/null +++ b/packages/website/docs/Discussions/Gallery.md @@ -0,0 +1,7 @@ +--- +sidebar_position: 6 +title: Gallery +--- + +- [Adjusting probabilities for the passage of time](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3/p/j8o6sgRerE3tqNWdj) by Nuño Sempere +- [GiveWell's GiveDirectly cost effectiveness analysis](https://observablehq.com/@hazelfire/givewells-givedirectly-cost-effectiveness-analysis) by Sam Nolan diff --git a/packages/website/docs/Discussions/Three-Types-Of-Distributions.md b/packages/website/docs/Discussions/Three-Formats-Of-Distributions.md similarity index 99% rename from packages/website/docs/Discussions/Three-Types-Of-Distributions.md rename to packages/website/docs/Discussions/Three-Formats-Of-Distributions.md index ffd99fc1..8ec5b88d 100644 --- a/packages/website/docs/Discussions/Three-Types-Of-Distributions.md +++ b/packages/website/docs/Discussions/Three-Formats-Of-Distributions.md @@ -1,12 +1,10 @@ --- sidebar_position: 5 +title: Three Formats of Distributions +author: Ozzie Gooen +date: 02-19-2022 --- -# Three Formats of Distributions - -_Author: Ozzie Gooen_ -_Written on: Feb 19, 2022_ - Probability distributions have several subtle possible formats. Three important ones that we deal with in Squiggle are symbolic, sample set, and graph formats. _Symbolic_ formats are just the math equations. `normal(5,3)` is the symbolic representation of a normal distribution. diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 57dcaa0a..4862bd5d 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -1,6 +1,6 @@ --- sidebar_position: 2 -title: Squiggle Language +title: Language Basics --- import { SquiggleEditor } from "../../src/components/SquiggleEditor"; @@ -29,8 +29,8 @@ Some assignments are functions @@ -46,6 +46,6 @@ A squiggle **record** is a key-value store with dot accessors. diff --git a/packages/website/docs/Features/Javascript-Libraries.md b/packages/website/docs/Features/Node-Packages.md similarity index 83% rename from packages/website/docs/Features/Javascript-Libraries.md rename to packages/website/docs/Features/Node-Packages.md index c782be6f..6a55c6dd 100644 --- a/packages/website/docs/Features/Javascript-Libraries.md +++ b/packages/website/docs/Features/Node-Packages.md @@ -1,13 +1,12 @@ --- sidebar_position: 3 +title: Node Packages --- -# Javascript Libraries - There are two JavaScript packages currently available for Squiggle: -- [`@quri/squiggle-lang`](https://www.npmjs.com/package/@quri/squiggle-lang) -- [`@quri/squiggle-components`](https://www.npmjs.com/package/@quri/squiggle-components) +- [`@quri/squiggle-lang`](https://www.npmjs.com/package/@quri/squiggle-lang) ![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg) +- [`@quri/squiggle-components`](https://www.npmjs.com/package/@quri/squiggle-components) ![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg) Types are available for both packages. @@ -24,7 +23,7 @@ call. Passing this environment will mean that all previously declared variables in the previous environment will be made available. The return type of `run` is a bit complicated, and comes from auto generated js -code that comes from rescript. I highly recommend using typescript when using +code that comes from rescript. We highly recommend using typescript when using this library to help navigate the return type. ## Squiggle Components diff --git a/packages/website/docs/Internal/ProcessingConfidenceIntervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md similarity index 90% rename from packages/website/docs/Internal/ProcessingConfidenceIntervals.md rename to packages/website/docs/Internal/Processing-Confidence-Intervals.md index 99e72e5a..cc193e8f 100644 --- a/packages/website/docs/Internal/ProcessingConfidenceIntervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -1,6 +1,8 @@ -# Processing confidence intervals +--- +title: Processing Confidence Intervals +--- -This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it +This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it. ## For normals @@ -30,3 +32,5 @@ We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% poin So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. ## For lognormals + +TODO diff --git a/packages/website/docs/Introduction.md b/packages/website/docs/Introduction.md index ecfe7f02..021bd845 100644 --- a/packages/website/docs/Introduction.md +++ b/packages/website/docs/Introduction.md @@ -1,10 +1,15 @@ --- sidebar_position: 1 +title: Introduction --- -# Squiggle +Squiggle is an _estimation language_, and a syntax for _calculating and expressing beliefs_ involving uncertainty. It has use cases in forecasting and writing evaluations. -Squiggle is a language for writing calculations under uncertainty. It has use -cases in forecasting and writing better evaluations. +## Get started -The best way to get started with Squiggle is to [try it out yourself](https://playground.squiggle-language.com/). +- [Gallery](https://www.squiggle-language.com/docs/Discussions/Gallery) +- [Squiggle playground](https://squiggle-language.com/playground) +- [Language basics](https://www.squiggle-language.com/docs/Features/Language) +- [Squiggle functions source of truth](https://www.squiggle-language.com/docs/Features/Functions) +- [Known bugs](https://www.squiggle-language.com/docs/Discussions/Bugs) +- [Original lesswrong sequence](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3) From 6bd8aecb31c4e3e0ed583cc2fabd091b08e3ada0 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:51:23 -0400 Subject: [PATCH 06/43] Fixed 95->90 Value: [1e-4 to 3e-3] --- packages/website/docs/Features/Node-Packages.md | 2 +- .../docs/Internal/Processing-Confidence-Intervals.md | 10 ++++------ packages/website/docs/Introduction.md | 1 + 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/website/docs/Features/Node-Packages.md b/packages/website/docs/Features/Node-Packages.md index 6a55c6dd..ab590c32 100644 --- a/packages/website/docs/Features/Node-Packages.md +++ b/packages/website/docs/Features/Node-Packages.md @@ -22,7 +22,7 @@ argument allows you to pass an environment previously created by another `run` call. Passing this environment will mean that all previously declared variables in the previous environment will be made available. -The return type of `run` is a bit complicated, and comes from auto generated js +The return type of `run` is a bit complicated, and comes from auto generated `js` code that comes from rescript. We highly recommend using typescript when using this library to help navigate the return type. diff --git a/packages/website/docs/Internal/Processing-Confidence-Intervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md index cc193e8f..004e3bb7 100644 --- a/packages/website/docs/Internal/Processing-Confidence-Intervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -1,8 +1,9 @@ --- title: Processing Confidence Intervals +author: Nuño Sempere --- -This page explains what we are doing when we take a 95% confidence interval, and we get a mean and a standard deviation from it. +This page explains what we are doing when we take a 90% confidence interval, and we get a mean and a standard deviation from it. ## For normals @@ -21,13 +22,10 @@ module Normal = { We know that for a normal with mean $\mu$ and standard deviation $\sigma$, $$ - -a \cdot Normal(\mu, \sigma) = Normal(a\cdot \mu, |a|\cdot \sigma) - - +a \cdot Normal(\mu, \sigma) = Normal(a \cdot \mu, |a| \cdot \sigma) $$ -We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. +We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 90% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. diff --git a/packages/website/docs/Introduction.md b/packages/website/docs/Introduction.md index 021bd845..91cfd919 100644 --- a/packages/website/docs/Introduction.md +++ b/packages/website/docs/Introduction.md @@ -13,3 +13,4 @@ Squiggle is an _estimation language_, and a syntax for _calculating and expressi - [Squiggle functions source of truth](https://www.squiggle-language.com/docs/Features/Functions) - [Known bugs](https://www.squiggle-language.com/docs/Discussions/Bugs) - [Original lesswrong sequence](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3) +- [Author your squiggle models as Observable notebooks](https://observablehq.com/@hazelfire/squiggle) From 8866b9d09353a52b98479ad333554fa6d0f115e4 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 16:56:30 -0400 Subject: [PATCH 07/43] the _correct_ 90 vs. 95 thing Value: [1e-6 to 1e-4] --- .../website/docs/Internal/Processing-Confidence-Intervals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/website/docs/Internal/Processing-Confidence-Intervals.md b/packages/website/docs/Internal/Processing-Confidence-Intervals.md index 004e3bb7..01afeb79 100644 --- a/packages/website/docs/Internal/Processing-Confidence-Intervals.md +++ b/packages/website/docs/Internal/Processing-Confidence-Intervals.md @@ -25,7 +25,7 @@ $$ a \cdot Normal(\mu, \sigma) = Normal(a \cdot \mu, |a| \cdot \sigma) $$ -We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 90% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. +We can now look at the inverse cdf of a $Normal(0,1)$. We find that the 95% point is reached at $1.6448536269514722$. ([source](https://stackoverflow.com/questions/20626994/how-to-calculate-the-inverse-of-the-normal-cumulative-distribution-function-in-p)) This means that the 90% confidence interval is $[-1.6448536269514722, 1.6448536269514722]$, which has a width of $2 \cdot 1.6448536269514722$. So then, if we take a $Normal(0,1)$ and we multiply it by $\frac{(high -. low)}{(2. *. 1.6448536269514722)}$, it's 90% confidence interval will be multiplied by the same amount. Then we just have to shift it by the mean to get our target normal. From b83d3a73925e26984665597ee1dd787cf259127c Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Wed, 27 Apr 2022 18:18:49 -0400 Subject: [PATCH 08/43] New logo and favicon: stripped `QURI` text from beneath Value: [1e-2 to 1e-1] --- packages/website/static/img/docusaurus.png | Bin 5142 -> 0 bytes packages/website/static/img/favicon.ico | Bin 6611 -> 12704 bytes packages/website/static/img/logo.svg | 1 - ...quri-logo-with-QURI-written-underneath.png | Bin 0 -> 20214 bytes packages/website/static/img/quri-logo.png | Bin 20214 -> 12704 bytes .../static/img/undraw_docusaurus_mountain.svg | 170 ------------------ .../static/img/undraw_docusaurus_react.svg | 169 ----------------- .../static/img/undraw_docusaurus_tree.svg | 1 - 8 files changed, 341 deletions(-) delete mode 100644 packages/website/static/img/docusaurus.png delete mode 100644 packages/website/static/img/logo.svg create mode 100644 packages/website/static/img/quri-logo-with-QURI-written-underneath.png delete mode 100644 packages/website/static/img/undraw_docusaurus_mountain.svg delete mode 100644 packages/website/static/img/undraw_docusaurus_react.svg delete mode 100644 packages/website/static/img/undraw_docusaurus_tree.svg diff --git a/packages/website/static/img/docusaurus.png b/packages/website/static/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 zcma)=cTf{R(}xj7f`AaDml%oxrAm_`5IRVc-jPtHML-0kDIiip57LWD@4bW~(nB|) z34|^sbOZqj<;8ct`Tl-)=Jw`pZtiw=e$UR_Mn2b8rM$y@hlq%XQe90+?|Mf68-Ux_ zzTBiDn~3P%oVt>{f$z+YC7A)8ak`PktoIXDkpXod+*gQW4fxTWh!EyR9`L|fi4YlH z{IyM;2-~t3s~J-KF~r-Z)FWquQCfG*TQy6w*9#k2zUWV-+tCNvjrtl9(o}V>-)N!) ziZgEgV>EG+b(j@ex!dx5@@nGZim*UfFe<+e;(xL|j-Pxg(PCsTL~f^br)4{n5?OU@ z*pjt{4tG{qBcDSa3;yKlopENd6Yth=+h9)*lkjQ0NwgOOP+5Xf?SEh$x6@l@ZoHoYGc5~d2>pO43s3R|*yZw9yX^kEyUV2Zw1%J4o`X!BX>CwJ zI8rh1-NLH^x1LnaPGki_t#4PEz$ad+hO^$MZ2 ziwt&AR}7_yq-9Pfn}k3`k~dKCbOsHjvWjnLsP1{)rzE8ERxayy?~{Qz zHneZ2gWT3P|H)fmp>vA78a{0&2kk3H1j|n59y{z@$?jmk9yptqCO%* zD2!3GHNEgPX=&Ibw?oU1>RSxw3;hhbOV77-BiL%qQb1(4J|k=Y{dani#g>=Mr?Uyd z)1v~ZXO_LT-*RcG%;i|Wy)MvnBrshlQoPxoO*82pKnFSGNKWrb?$S$4x+24tUdpb= zr$c3K25wQNUku5VG@A=`$K7%?N*K+NUJ(%%)m0Vhwis*iokN#atyu(BbK?+J+=H z!kaHkFGk+qz`uVgAc600d#i}WSs|mtlkuwPvFp) z1{Z%nt|NwDEKj1(dhQ}GRvIj4W?ipD76jZI!PGjd&~AXwLK*98QMwN&+dQN1ML(6< z@+{1`=aIc z9Buqm97vy3RML|NsM@A>Nw2=sY_3Ckk|s;tdn>rf-@Ke1m!%F(9(3>V%L?w#O&>yn z(*VIm;%bgezYB;xRq4?rY})aTRm>+RL&*%2-B%m; zLtxLTBS=G!bC$q;FQ|K3{nrj1fUp`43Qs&V!b%rTVfxlDGsIt3}n4p;1%Llj5ePpI^R} zl$Jhx@E}aetLO!;q+JH@hmelqg-f}8U=XnQ+~$9RHGUDOoR*fR{io*)KtYig%OR|08ygwX%UqtW81b@z0*`csGluzh_lBP=ls#1bwW4^BTl)hd|IIfa zhg|*M%$yt@AP{JD8y!7kCtTmu{`YWw7T1}Xlr;YJTU1mOdaAMD172T8Mw#UaJa1>V zQ6CD0wy9NEwUsor-+y)yc|Vv|H^WENyoa^fWWX zwJz@xTHtfdhF5>*T70(VFGX#8DU<^Z4Gez7vn&4E<1=rdNb_pj@0?Qz?}k;I6qz@| zYdWfcA4tmI@bL5JcXuoOWp?ROVe*&o-T!><4Ie9@ypDc!^X&41u(dFc$K$;Tv$c*o zT1#8mGWI8xj|Hq+)#h5JToW#jXJ73cpG-UE^tsRf4gKw>&%Z9A>q8eFGC zG@Iv(?40^HFuC_-%@u`HLx@*ReU5KC9NZ)bkS|ZWVy|_{BOnlK)(Gc+eYiFpMX>!# zG08xle)tntYZ9b!J8|4H&jaV3oO(-iFqB=d}hGKk0 z%j)johTZhTBE|B-xdinS&8MD=XE2ktMUX8z#eaqyU?jL~PXEKv!^) zeJ~h#R{@O93#A4KC`8@k8N$T3H8EV^E2 z+FWxb6opZnX-av5ojt@`l3TvSZtYLQqjps{v;ig5fDo^}{VP=L0|uiRB@4ww$Eh!CC;75L%7|4}xN+E)3K&^qwJizphcnn=#f<&Np$`Ny%S)1*YJ`#@b_n4q zi%3iZw8(I)Dzp0yY}&?<-`CzYM5Rp+@AZg?cn00DGhf=4|dBF8BO~2`M_My>pGtJwNt4OuQm+dkEVP4 z_f*)ZaG6@t4-!}fViGNd%E|2%ylnzr#x@C!CrZSitkHQ}?_;BKAIk|uW4Zv?_npjk z*f)ztC$Cj6O<_{K=dPwO)Z{I=o9z*lp?~wmeTTP^DMP*=<-CS z2FjPA5KC!wh2A)UzD-^v95}^^tT<4DG17#wa^C^Q`@f@=jLL_c3y8@>vXDJd6~KP( zurtqU1^(rnc=f5s($#IxlkpnU=ATr0jW`)TBlF5$sEwHLR_5VPTGiO?rSW9*ND`bYN*OX&?=>!@61{Z4)@E;VI9 zvz%NmR*tl>p-`xSPx$}4YcdRc{_9k)>4Jh&*TSISYu+Y!so!0JaFENVY3l1n*Fe3_ zRyPJ(CaQ-cNP^!3u-X6j&W5|vC1KU!-*8qCcT_rQN^&yqJ{C(T*`(!A=))=n%*-zp_ewRvYQoJBS7b~ zQlpFPqZXKCXUY3RT{%UFB`I-nJcW0M>1^*+v)AxD13~5#kfSkpWys^#*hu)tcd|VW zEbVTi`dbaM&U485c)8QG#2I#E#h)4Dz8zy8CLaq^W#kXdo0LH=ALhK{m_8N@Bj=Um zTmQOO*ID(;Xm}0kk`5nCInvbW9rs0pEw>zlO`ZzIGkB7e1Afs9<0Z(uS2g*BUMhp> z?XdMh^k}k<72>}p`Gxal3y7-QX&L{&Gf6-TKsE35Pv%1 z;bJcxPO+A9rPGsUs=rX(9^vydg2q`rU~otOJ37zb{Z{|)bAS!v3PQ5?l$+LkpGNJq zzXDLcS$vMy|9sIidXq$NE6A-^v@)Gs_x_3wYxF%y*_e{B6FvN-enGst&nq0z8Hl0< z*p6ZXC*su`M{y|Fv(Vih_F|83=)A6ay-v_&ph1Fqqcro{oeu99Y0*FVvRFmbFa@gs zJ*g%Gik{Sb+_zNNf?Qy7PTf@S*dTGt#O%a9WN1KVNj`q$1Qoiwd|y&_v?}bR#>fdP zSlMy2#KzRq4%?ywXh1w;U&=gKH%L~*m-l%D4Cl?*riF2~r*}ic9_{JYMAwcczTE`!Z z^KfriRf|_YcQ4b8NKi?9N7<4;PvvQQ}*4YxemKK3U-7i}ap8{T7=7`e>PN7BG-Ej;Uti2$o=4T#VPb zm1kISgGzj*b?Q^MSiLxj26ypcLY#RmTPp+1>9zDth7O?w9)onA%xqpXoKA-`Jh8cZ zGE(7763S3qHTKNOtXAUA$H;uhGv75UuBkyyD;eZxzIn6;Ye7JpRQ{-6>)ioiXj4Mr zUzfB1KxvI{ZsNj&UA`+|)~n}96q%_xKV~rs?k=#*r*7%Xs^Hm*0~x>VhuOJh<2tcb zKbO9e-w3zbekha5!N@JhQm7;_X+J!|P?WhssrMv5fnQh$v*986uWGGtS}^szWaJ*W z6fLVt?OpPMD+-_(3x8Ra^sX~PT1t5S6bfk@Jb~f-V)jHRul#Hqu;0(+ER7Z(Z4MTR z+iG>bu+BW2SNh|RAGR2-mN5D1sTcb-rLTha*@1@>P~u;|#2N{^AC1hxMQ|(sp3gTa zDO-E8Yn@S7u=a?iZ!&&Qf2KKKk7IT`HjO`U*j1~Df9Uxz$~@otSCK;)lbLSmBuIj% zPl&YEoRwsk$8~Az>>djrdtp`PX z`Pu#IITS7lw07vx>YE<4pQ!&Z^7L?{Uox`CJnGjYLh1XN^tt#zY*0}tA*a=V)rf=&-kLgD|;t1D|ORVY}8 F{0H{b<4^zq diff --git a/packages/website/static/img/favicon.ico b/packages/website/static/img/favicon.ico index d318e2344334b98493b932a60f95c1d389357b68..d88e28c49f892a935b93c51112215cfa7a8322dc 100644 GIT binary patch literal 12704 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 KneS4jAO8==>R7G- literal 6611 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
Jvzps}Nnrwa6}}3DUefLf zQuM1hZe0kEV>gY{Q9aAPqXoyS`}{GmMf24VKL2nt6C@7(X7AblFNu@Bs80^GQ(xhT zLL~g_n7hoN0UGn;-h1J{4ZR}0->p)Ay%ZHmrNHkt_^K4p`4k&E \ No newline at end of file diff --git a/packages/website/static/img/quri-logo-with-QURI-written-underneath.png b/packages/website/static/img/quri-logo-with-QURI-written-underneath.png new file mode 100644 index 0000000000000000000000000000000000000000..14932c801d39b038ed1a523d7dafd89939e79c6b GIT binary patch literal 20214 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 literal 0 HcmV?d00001 diff --git a/packages/website/static/img/quri-logo.png b/packages/website/static/img/quri-logo.png index 14932c801d39b038ed1a523d7dafd89939e79c6b..d88e28c49f892a935b93c51112215cfa7a8322dc 100644 GIT binary patch literal 12704 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 KneS4jAO8==>R7G- literal 20214 zcmeIZc{r5q8$Ud@>{POZOrD++$`Z1hP$6qEBs(F5?CT(Fkwz)|mVIBc8%qdf-}jjb z*_Xi#V;kQ4_Wa)WzxS{Ac>nu$JRMKReb2R=+vhy5&voAKb+l9%={V^i5D251>ceLc z2*nEcm*xWSL^EsjFYv#s?vI|k>pI)Gds(+TUuXNbF{Fver9d)(#PeuwHySZ zm7w-eQO|pN18wx?rB?uSUrf-|fQ^;Kce%JvCP9SPvA8dj4oNpx_q#?DWn@$+^YZ2?;;Z)-_3u& zqFL28tlbNu=?~9_0^f*mKu9oj9%^9q)W7iK16MBUyfcK>y8i$!kRKH2e}Dd`f&XdX ze;WAzMFX6hNw*-7{^NzSrLMR(q}HS=ywEuZ`%s5 zAp$Fc)+F<0L+$zhdrpbx_(g21k@=fb5geebN(~{q21(G6g3-)8St|P((_D;_h3G9) zBtamd_|J24ku7cp>tsPeOb|WWvX@e@F|CC$vLL#Zc_s+`9jc8~QO`@LI{%_M zgch>!RFOKUgK=5#Mi_oUr6#9*^OffLxJKfrK?=wFDo8W(D#E6HIW_9vM(9%?=^ChR#gTUjnO$Q4I zM>HMqK54HcaNUF+lMx~KFgto zP`X1h>ZC%QKVE92MoID1q<*k4ctjm^DWT&UgzX3Pv?+G&5Cd=Z%Qgz{33NW>+YcC> z*oDMsQvt6Z(ELe`hc_aj$*uB^$lhJkFC~pe?AO3K{}jW#7k_Kf%$7WBm93mPW<{e7 zpzdkL!$*+o859s)-in*mKo>m*`P$&!Tw~VG`Obr3&;9O|s$&GWn$<(kitfjDoLeVb zB)~6wTYmVv!$e!4?@I^LcFT$ROdbS64(O?hI+f3$4Y{v6cWk`feBGb9W}$K>?6`h0 z76J;+X0%}$V13ZfjOohK{&(VV4ok}TJr4o&6x2azH-Z||DWb$$|D>WBPbXixfP4GV zCL=Vi!h}hjJ8nDk9}0E56-9AA(`3n~5Tc9cc0U3#c+`p&HRJ}(Ty7q4;02qcwWyb{ zA44^CA6Hi<|KAH-R@yJ2E5y{d9uJjBq2zZRim+!!(0l)9AV6Xwy= z1}=YwW!U(1Z749wy{UqcK z822xq-@7AcXebf!46-f7>JCX@!Jf@P*FqtU;!``zkLs-_`p@dE(6gY9gM8RgG1?AI z_^5Vb%x1P=lf)3&pUVw(6hF8RPO(Qif+uxns@wg&%L^?lFQ%}lQ$paGN`!(0#QO{2 zmAxTS(#BJTURoW;74QEJ@Bez~_Gqdb^?&5`>05qe8@jc0g9>+fp-*^5MnM#e5A!X5 zT+4yZ^2^knqC!lUl|hrb9wy2HJsc3Nyvu>OoOg}wn=@~d-4)p%3OBqB4$o=ZOR2r(V zkT}MQiTW zwoUu!Fo!1nMfBK1^$PT^9XW_8n&SmN+dQt^6I!+VvXX(Biwl(CAWr_!S)=+n*}%N7 z7jRuQMAQsSf$F2v7U+5p@Que)uuBw<4#RL9U9i`dD7XQ@%f$!nGD@0JK8JryKDaP2 z*M7wY8cKSB%FR&3kdj?o>nuHj(S1EsxP@LbRQ@_C>v#~5j?9Dw^1v`>?F}DE9q|wGvx5pn9y%NmP~uGb4XtPD{YVxGRS}{K7DBX!m*$i z$8CGob%_x@QGEiF&d-D%Ws`w0+z>@plU_42IP=6PHN>k_iV4x)#qcAuA(s}CaTsv6 znEomPx_M>ZXdxW8p&`Gf{I(|$ccc=y_f|j#lu3lof>bxD@s?C^R%_-m=9i5{&0C|O z$79rmD_~&#I62tDdJA}7#nR6VPqxb9y#(_ciLm{p5bJcF^9js&NoBC=FG@#ibp^he zUx_OFE}KVPr+Lt|C8i&36}_C0-U{R?lKEqsrx@k(W>1_{&kHuhhw2fi$K4CtT{SA> zZo-i>3epfZ(8hP(;ZCaaWI8gEPV=AG1h#mtHb23g)=3>5zz*ib09R%^$K`iO(prcU zO^X9dfiIM~aKrG?-W>cO$NB7Qy7At7G7#MGT*Fuf-X*uTNoPgXV}D(XJv}?^I_o#38B6WPXgm^YiLmlr$~&t7!lV}lM0&oq z6fE_kQ$eOl+DD54#x|}Fa|S=tgHrP*Ji)7MQcHk%&6fJyM>PE&P5qt@cZm4Y5{qvW zzdF-b*hbtI+Mdv&@OH6|KU$cN(>;gxgvg7T3%-A2lP)^SZ@?U|yxCn&J2SD&7+eG{ zC4x-wY#@-pXViZgOm61Gb8`B9Ubjwc_g(p-k9E&_m}`^<6&f>pd_IYNn$7=updNhY zXiIm#13N$611|N&)Bft}3IP75T4lYKyn0H`JtY=D%8s2CD1>?iBzhkCDU%4W(*R>% zN59@eufv-YLV-Z0X>mUJT_bj$#SzksuzAGp@5mrj!05P$J5!t#Dx~$O%m-=zf(uM z_4GI!Is1Fu6qAAi@ON%b*7mR_XPeV%=seK7+kA@2alHp3-R>S(nwg>Jt*A_=?S}u% z3y*Y2tF?c_ZD@i%BeW8cN-LPOm)i;~KO$JyXU>*j{tb&)$icFt^K;>{hvA5s%uXktQ?i;zLt5Ntyw53zk-++w!{)UD;c-0JsCo zif_vb$Mreoj$wBl=D%MFm6h=0np&7U>ovlzhxyN5t5{3rY94q!!Sm5A(A|NwZe|E( zTL5inmeP%AjksG#rlJW|#qozlei8`vB0K%VxeIVY)}=xWk`gD_Moir7CN*woP?}@F zWE*p>SC&7fcHm^Wx-4*!9&ORWMgHa_HH5RJDPXb`=DnGdWg&bb*|JN}KdA7Ta(uMa z=yE9BNFb&kR-O@7ekIcWX!KTMf&BRTP0o|dOuMzwLt%6&6#uev$+`L~W_i4v{SiZ<2{zar^{H(c*K#52)nyb2StVW2zpqxq_^!ovT&ERH7oGNIQ^Ju zmfs3>S-6Ap^dIuv+tU2c_-@?22JN0P!9IC){+)aG#_*}(jie3Qh0~3*fGRWN`}+YW ze-PF&u*wqu_4s)Glxj#Xy~!-u#cpc!_<15MkCEBzykXoCj6W73oqOhxF_9EqsNIM6-0g{viMq34lrVUW% zR$mWnY@~3#YEr_k%3kZ6M9X7>FdasE=FLPKec7x`e*h#&iwf8z z?NZ5=?joknrgBGrKtQQphUJQ6Vv{u8%1|^Q;MUnG(VGBb~W1RC#zT6_Y@_zljYK7iPF6P#0#eJvdBc=LvMm-*F@10&uTq+Xcj z7+z}M-;ODnuoN<3$~i4W3|wum=wmMR?b{hV6A53iJY;Fval*2m8+(swvjndwAG%`- zKV~LF6#Xi`FR25gBrK+|pB9-Ny_NzuMjiaaIf#vQO13F94LCTmE{F{JX zo{^Auf{6JE?S=#|toE34%|c^*>M?Wt2Rq@?>HwUu0&0y8gr%SzrNd{FG8R!|6CoFW zT8bcz7*_qTM~k*EJmj`6zF2T65&of4^@XH>jM`jSpaTv7N$y*u&F<8sJ4`{3hdZtX zaRR5#Mx--4-+G)Gs$3~~y!&Hi5teqwX+6EkOD`*^*+37qzX$A(A^2`}AV5eP{ z_f8qoy~jmvUp)@Cmy9Erm_Wqe167FF$Qd!+F2Yeb6nEU!H8I{^<39B4MHh4Ia|T>8 zZz3AkvfZmcX@kj;3&rn~hv7#C%=v_0n$0k^o~(R&lQy!5$nHM2GU{Tz@L(iAgF+ZbnCal0wOuVs5f-^Iq}xc5Cq zK)O%C19uHLeu1X2vRe&{-C4+M_21|w?kw<@rnem#!~>y$`O@a&5A&lx`sAtnz>I4@ z)A_Wm64~zrYqg#bn%wKthBjB?)+j(ND~gz@eQOkZe89uoXcEOMuRqoj*X9>^n4aD% zbeeDs7w~qJWatBOIkE z|3sHtQ(_$qgeyJ1oAC7WB=c=#{$3JFaol)VOj)+rSXNa$ovU5##ZtY$H@1mHQ z$Dim82y=O1WGk=T{neGcmoYyQfpc%SorQ8XA}e8)QMQ4w7RGP`$b%akAxuB?&}TW! zwa@a`xy{%b3qRMEab!FD&r4$ZlBg8mADmf3DmHh#n95$T$VJ1E3)>4g`SbvxzNs$X z8&!(VlTpn(Cn_=>FP()w)%27GHb(J8-AJ^TUjLfp;CjxM(i#*9$53 z2EZ3lfpa%@+!XR}dz&2^rq7V}mQM$8JPn`0YUGuxh;tsK-naFPyZ!L7mIxQ;XyDGj z`B<6$0s$!U;H>*X%LIMP_e*Vu7Jbvw{d6sc;uv+ws&zuJ(hW z6#rZ5{MlvqHwG6dl1e@VVVLHQGupOO_aMBK1Zx91uoUuOcq6+ixk+~}rQ z^TbeWSu^IzCI{3t>X)FhO&qMnX}Zzp<0woVdqHLk}SJUZ)DG2#uvmWco-4-6q- z->cc`w**+q+3@sR#jo~%IQ557)jG9P_%O_GT9$wGk;P9~K0mXcY~U>?s+?@hW946| zst%N9p7o@kt&A=IeJ8fhT+k?dHrsNdg_R@+w^qrpBC6xWW*t|Tq@h#xx|7HswyRI~ z2~Ln%33K%O((T)>j0SJSSg{u5Y& zSBo4YOj0#Ut|nr|LJq5@Z(jKMToZfuuwLS3c2|V3vfx+?z7iU>nPTt=D*6)&JB8K+ zo_e)ZE*hN^Rf;56mqyPrj$#W;vW*8Kvh}3#Am|_c5#$qpn~K7~TC%(e*M8-AAR#Kf zGA;Ypf0^nq;Qx`~v&hw=Jkjh9mm%lSHxnhd^R->4s-F@@_Vtg5rbj+kg0U9uA%}($ z{MpdBlg54ffWjsCQ2Oz6xpXU5gkA5S)IgM*aWUycvKhVS2(lMH@-4o9RdUbsu8MMF zDCM#y$FR1RnP@m|c(BgAFBaKI*;qd z*zE))*D$mFk*St7d`S6$Hk{y~ZjiI~;ZJJnpp{YJQZjbyFdRI)T<6p9jNC={t0eiq zR;BsSb!p->?Gc=Gn+m^`;CMB}taxy|Y2H{MJ7VBgbD7^G`K60>y?ZIVv@N7nq%&*0 z-jMnQobfSl29}^n0g7v_c<(~Vh`EB+VuKk&Lz6+xk~dvQkuKf3XntqTq-R&^9iggK zU%CKwMrp?GaKhIs!|MWC2a;8?ht7zj1!Oc}Qt$W*ZY5u=Bs1udw#t8>?3AnfP5Yh*6Q_s@lpF`;oo|@nv+YJ@xIZZOfOSN*kjGq}gAIl7DIy z_IB)AkbsXmP=QoPw$ny!@|>0>Y6*OcPD39|yec?nyWU1xYRoDXflQt5ebkZHsdTZSiIh1^*R z3-=wTrSSLeyYi8W4!sEt`a{~`ETJ(0dSK009>d#YGHP{gD`2vwy~eC#_qEuou7eD# zyjM%W7^lDczBIguqTAKE2YTpULji48klzS0r0mtA)2(Dm5KZxlQiL~QgFGGB_q>0I z_6_9qX1jQpK%1cCN3Q+!%Bty0emak+!SMA|l#h&!?MNJTFo0{b{OE{0Tq94r)wJ#N z(&LhL?0!e-mdD0!OI&3sf@VcD1*(CsQ+j}71KBq58Mkzj@%p;ip;BOfug(Nq7O-WIp&d+S+U zZ~SV*aTcd2V!ySW~nCxoqVZCTSb^pZCp~tbgbi2r#>m8^$60L6U-FDj}9`B-~v$3 z9f5;aRE}!O@nARGyf+`|*{oK3ilS*JTz^t)Oh6m=hX*65dBuUchWFM;jL9P;Gj_O| zy==Wy_cGu)=HJN>mt*zd_ZN;6%XyGH`rnR^GpA^H0(bwzo*)MaNB?Y3x02 zI***wNhXS*n`ZcskzVVxusE$S7tO9Fdi=D4qc>LYMXM(09=)Nw!yt_hYY>BjH2MZTU!YUBYw(HnMZ^Sr z*^ze{)4=Z#aiNX|I-rwt2xoLfqPxGGZTuT@^o(v*m`z|EpA9VN$D3ihM-C8;r&o}O zbL-;Xd&?2U6mFbv)%-&ck6^T{*b$y&*=A*^YfTa_uJxaf*3T{SJ88s?ZydN4t!!HQ zq6xsxtzxjfvw0a{i6Nr&piH^iML?2Z7hLa2x8eA<=@Y>Hr2nL&T3Cq)N|O*ZqFG($ zvq{cIUmTRY*CN>6D<0@;;#HJ#``jEDW#5hY0G-h+S?}6}AEB6Ufjih*XYel-Y`iCET!51-ga$$--03FRIKji>#U z$5v8U;aolV0K<-YM;7zF{%~U6z=`v+nTki!>=*)wAs`%hl($LzJQKiC)9)(w(x&B! z=x(qKpo9lDs>s%Rp4I@671?uB9C3AI6k_tZj@`bUiVwmNt${bRV^Iz18og{vM}uj+ z0AF~$MLK6;Ei5SD23|I^FoNg5X_hp-1;awL7@38EL(dD1dis+q!6$Y)Fw&v_(Uj+7 z1)kgL?jFeHZPVzF2!J{G#!?v;q_7!5@4%bwCDy{V1@|^?vQ$zRCI^(#Yovp;aLMcB zbrEVmqM9R#*L7{$_MhPYF~Ib=d%*Iiq`3j0`Tzn3{f>93LE}c!xiUrGW?-}woB9_D zt)2%Ky)u_P5DoTQ*LWW2(yHW_Sh`h_x;2*XxUc-6B@y3takwinp`>{8;$ZE)7M5Ec z#{ah*K6xB^{Vyb7qo;{KFv-hnM^xWP?o)Lm64+(wavb0ntnSLHP>;lNwfakdPA+ni z`<^f`gMQ5{e=pu7nczaZ1}4X=l1m<`s#^jPtKor{DEt_n3A2a1Z+hW&z~&qt)0}>F zcztxNiJjbcT$^k}(h~rZ%7h10{xH7)5>{0Y;i6RaUQl0|2wf=@$D~)OOzzl_BNN$6rP?sHx z0W^PY;(zM>`?x7JSldq#;|gcmMElqZFG&8uzPB)k45SXy^q*el6Agijf+ zurdqo=8>Jgc`4} z`!sdob96)2AO1IZzO(6Tu&;`P-qyxt*9iE)V`%V^{?qg)ZXXX$%OuN-{1UAva<7K= z6h}9InXZI~>|Z&L-tgHUwNV{Os!q9YfdmVqN2*b`~wzow-x0-8ld?#{*{b=b6NSwpo?+c?zM06Z0Y^KO_CKwehe|- z=;Kx;VDyMWjWOC%1dlp5;G5Ry6W@kUlAmVX+k6>rdv(&@W?b71xa`R_IVSHgRefdH zinU3i1J74fuTAD3op`$3>oK@H1`&}KSb;EF z|5Km%4vmp~T=1{L;o5qtWrKq&vhckLdR@lCxQdkM9N;I2PjX`4<3t7|I(^Foq4Ld~ zCW1lL#oyP+K||P`^+vBJIwpok*?w} zyp9Y~ao(8WKdG+j91Y%hG4*CRCdSl8pV&az9ZOB0$kM5KoNx>r8mvuwJf1^M0Ex-0 z2FaElHcB%Yai{ZiO}*&y-hE*qt19-!mcF&tXf#mc=mcesplBVL9H=*OAR+r>K!fZT0;MQ#mgYjgmkJ ztKWq3j9SR~t``V5*MG&gUG?xlZY}k1q?JxoXY$Bj34fnXs(Hht^AR9Lku(w`BoAL6Ne8sFBGiT z^DY67fh}-J#+?HE$pEJrcbf}CI??`3uXRHM^h)Jb8<8hB5jU^ls{D+9N(M-d8yN6IO_GT70qXckT0_53U=AJudog$2NEBW*T*V+S#@e_ zYsb5cJ=Vlc&J@2hH_SN4ZGI1kTMk1`-D~YO>JDFO;yN!fvnsuLy$o0uIHVy~@sh5l zfK`fZ)L_B@W?oTp-H^eg4Y_=LrUpyBVO~AIFnO^XEY*@Ojam^GC-)F)4liXB8Rg*$ zZc4rkCaFoy@%Plr`s^DCH{Mo0G$4AX5N*91bCi7>ZWT$H0p}G#zllXUk!!$Jx=76% z3TXS(>Id9k=>qrMNLzgxp<6QuA8uLg<|CkpIMl1hB<$>TmTnogGdvS%mhQ2-djV)i zdSV*ua=SZUknE>9kDvD)`en!na3*<>qw%l7v=fb@;aiEYKZXYBWpo}BfrOj^Tez?C zgHmN=5ErwlUqL)jC&knb`^XFO$qNln9^9L-LUAx4pLd^d&8)uV0$t4Q%BVJYr&FA{HG(5#A%ZjBKT8$hXK;>g5{7#ADude8u{2IIp{J4g6h`22;P6KHI3uq?njNy`aFjs;?|>E&UAS1QpB?i zufJ&=a-vz~x?voV$LuwKjAr|9v}87L=VR;NayQ?MyJ6|2+>zSE&gF$6EAteOS`uKL zu{rN7V4OpiaYV2*kboh1WZ&T6V)%PJ@_q=ym0?@7V@tY{?-sxhFo<#3UA+%hCv~^; zyD~<`IdQTD3d{OZ4hlR7$xy9fbZp+jhz)BX;qfr zj%+sm$azXrBWYmx!3O5^fTL~GL4_~atd{E_?VGyb?3Qccj+hatOTi7M2Lm$J%W46 z`N~pt$jC5|k$ktJ97HOQfB$v3c`G`3Y^T$_*~HVt9kK?%E5x2Ze7NfGr0XPGwZLzkUd;%`zeY<FY;^4cI?gdD<6mHghl(uh5cwJkNQjrG^9~${JTQxv(d`#Vc6aZ~i^CAe{%PWLitL z6y^JDM9sRx66m?!;e;itV(9I*0L^h)_Sj-U-m$s&=&Br4$f;Z!!C=0G~4ZWGhM; zvc(qSGUP$;x$~{N6(|Qxm*$@MLo1ElPOkR}rRQXduDU>7J{-oqVJhbUfaF!<#TP~( z17S;s*;3o9e|fX1RJ}a4_lv3JVRa5cLEmO_f2ybK(GC4!D-onvCD8;8Zd6<%AE*-( zRD~|ouGjaJjmc-n8wWU!^EQp{I`C(A;dh)K&(JS{zw9;9L0WxXxNKM=9gxhYSn*Od z-J`BaJRv+L4SlWg8!zH!7$K_vw<+C{yn!&NEo*%8wP zR&Bo#E*q9SHFdeZUg2Gh^M&N*dO%GYlYJFyRleE#+bB}eBdhn`>!*xeIq`+rD%yyh zKD&WuQ0VIo&WQ6^7z2c*%iomtmd%-Xq79H|ipIiCLacL7m5#)13Xok@*MfbpUqQwd z5=+0fd1X5Z<0u{8^>qA6nGrJhsS-dr_Ht7MOP?F_GBbhbliq&CWC;Gp@M($P2#Zz^k)t!Ce#EUwTdIgVjwQph@W{$ z-(6Nk6S^XOCZ-rcVfz@?QZwsWes2QjThVUe@C+Wop~|hT!0%sX0hTHpe-QKSZo>J! z_X!nnbW3FU-4VkTZ@G@VI6T9@(!VPY&51E>=n0@%b2OO($s}_Hf8h@9M%ettQG=0V z?z|+7@CB2p62J3hH16bkMJi4Z8>shO#x2P3ET(=a}(4KLaChVPV9;!P~oV^}nWNsy$E9 z{QO!6&sR;B9}F?)4PHr{0Hq**>ocIn{tXPi;Jh6pihFcIS0{b{p)2W1FG_(5q_l(P zN$>w^g*2F-cbkeVWMH1~Hi^AOcfJ2}pVIC87bh7Qp~7SUZ1J)dGu2->&-L|6QC{db zTfB_}?Gm^PNF`u{?FD_&=gNr5m#$6aO_ypAK(qj^XzpqOqU?U+nLkI(4fPzd|6e{J z`2RTRo|h&IumLqfU~V0IB~JZap*-iUYc$|K^#3qaGQEVha!$Uis*^{ z6F-=vN;8EJNegq;O>*bhL)n4cV>|Q~q;7Yqj5VM*e6!<9Z+z~-^319&-!=6{7p(SM z1Z-A^=P;CKM1W_rL?p77ExUy6TWX;c)W%}(GcK$0E$MHo30*vis(C4%^XMwbDBV={ zDQ+woT^Wpf_8d85D%H<1-Xc)ku4Ko$%p(_y3+5Q~3ybgqQ1J&h6@Emgc{)bfRC7j) zZoQ(%Wq^;C{_3>sfA1f(D<9gyk31WGJ7y9E*XKxtNUE#KjK*sx?I=eUZF2E;YH_mi z{8qWwMsrXcdkAg#3%A|z>5hzGPnc#5)t%Cj2(O*vKi6M7YJx20=-m{rXCl};xw5M> z;?>V|T9$LUZ(m@>F+J09wqpXY)qK3Q@fw8#Ln+YFHejSCx#)%dLcyPp)s}w;`eH6m zua(#SWHc!wf1-F}QCJWmY80v!VoJe!dA9 z@Mi^O6>mG#7tK$i&qCVgCGWyD$*zPP3hax6NlD~A(9BlVW!_vMA;em=>J_a_^;s*a z$Wl!g^mcd{K2~igQt@lT+`QDNyyW5o(S)M;A4KpQ1s!WC$WQ=u|(jDZRmbGLB#w<)5J`N zd1GA+6aC-M)ZRO-=pL3+t#{ax3a??0bn+kW3I8&^vX^q!e)w87 ziuRO7f6;!Ha@)S^Ds?r}+A=^!UmBGx*#)7-_*QtQnotg#vuoLek88G@60P93P`l1PwGOJQ6V{a357$0Oxr(^uD4kg2Q5NF&#kEmi9ZmH4tO??-KH{()ac zmNjt33exrKc-fg+mXkb{i;W?+BcE&Hw9JW)fRGE#ES`d=3UwuL@OS@&wR?7;qD|Ty zhQh|#Zj8)b+-+3YhbF<<>p}YiV ztp)FTQH%GaM(&S{e*r?K-29ornt(H9?XsOx-DgYHvfb97xnfs1^9pe->=HM@HPQs) z39Dgmnyd2}6FW0HcUItfBe*idx;6Z| ze^AaDUXHA>p}aWww&R)go}8y6&S99y7r6$nLe)ro`sN~Vb?tLp%eh`2<`pInU3ud3 zDyt2F9#0wMo;xl#7%G)Zp#Vld+TNfq`&qgPhuhw-TCtK`sR$k~dF3_!Fnnp%fgI4+ zbpyCnvLCB{)RHFLYAAk~f)x-S_-{##bK*Jt&&+rxySmjbigk0#`Ys*43cDAmW5{OY zewMF-F`QXMZ_r`~aB)y)58z{ylH!YF&sdubI--v%g&T**GrI9BZ_;HzKNs)u{Y|ZHF;<%arM_E2yT?-6r}eb&;YU(o zvoL@$Zx8qHYKpj#%Zv)AbX6?NvTiz=MUm62{5Uzj3OtwBgt*z2<=cGyu)^3!3u>n< zhZa(}2N<}ReN2;y9aU@84K4%$zC^%X8S`*NZoPs7JA?$e0-)cUfpME#_~f?$p>IGyRAf=HMh0*l%x#g zLG3?runVqm+V5g>`b*`W&?~_ikx|vYZ+Rpg%_Cf4-<-P#V1fA#p{<5LW8gzgNEAtf zrfU-bagJuI>t~7Xj%laIRgT^(7XX=Q5=RUkL00V^FX`|(M&)v~`Al>%i3`+=qz?xl$GuoM#w%3<#0>&uMA7*HU_g=n}F;I%e41b8`&2URZ%y9#%dRLgA z2`jtWqc%1wKyDPMmGsxnmWp0Lzu(y&{J0>aFsQlks=C7jaFtE5-ddSIXS@gw^ESI_ zlAVs2W94m1i7%Q|tE(?legNBbv9SZfHq9o5o=?4i79s_Hp=JHB09IMUAnRY9JhsqalYzw%RdjiWd2U&PF1<6n&AkE(6`P>!ysu^aDQrQZ_5hzioL2< zvWAtTv>u^m%I1uU|B>r_e_`1p#S;~bSeeIgyGXU0^Z{R8X}==R$ZfDNDl>-(^1dpG z7;Gt0!x}6qN6AX~2g1VuE}CjcPtBy@DVL;TSpxcAunMb5*^b|vo?g)YKcrfnn=%oO z;mIS21rcrXY5k{Y227Jo={Ig9f8&6FC#wN@LM^o{yx1?W%6wwjsFI;(&N!eVb6}I; zr-P#o;vDI?mY;J4(!jc@#Xis)9l)>z*GeHij>bBb1tW@k=O)oc5_U$rC9Gqb-CmM? z^UMJJ>%91i&a;|)F}bs{n%meNamB@E#VH!=3TI)&q-D8XSI8*HB>ps_(q$>F%(^mM zG$_#916FAtysbD z`#Riw;Y9#OK(Z$DW%B!XHfGuBaFXG80q0-qrt&aE-AI|afoMwEK&$kiKw)A%Hfg$2 zHm^2v?bhin7o-42ak&J4Rb1~=5i>fYjRu+b#47ZUAbsl&ud=s2rEqEKj5Qy` z?43ejOrA7YSv=K~INin$0wdnxGn1b)Se!Ca5 zw|M2l@LFLgJ^3I1jEWwFTmBT_5?5BpOYnz zik3H2h79l zvJ&BD-ZP9i@ANfl%qK~l1u$F!Mss!Oijwb@5CevvMBNEu;vKasg4O&9SnXE- zVP*zP=CEpMS+iSv<-Gbszy*#&lA?UyBoxZi;b!TkwEXjhB1=CG=*=~KB+F=A0x@@z z`$l_kHic@>s`(_s@FO|#IIuT6=mFK+z{7}wKN;ln;xRg8I*O`PE&?KBlB+05UU@SMjAPv4%>#C~I2U}1#DZB7D;$c_8DYZnr zk9%C-#hi&|_7#>|G37!>?N~6h9GO<#P(D#2Y`piCdXXnS_!RSGmExu2XdQ*;y0M=3 zQiM5{YDy~0eo_P_?7ZP}r6)uyZn2l)o0C_TV_y>dN1EyR;AZa&wr)Pj?U;|XHFbu( z!q96%+*_3xw`+=(xD~y4I!kdUGuYJ$RGU#j+VHEk!v)0RF(nrh1uU-aXwVz{%gHVN$e)UwaVMOLkN&kG9H@ zH(t76l#ZI-Y&GGX2%86|sM}SjTA$V@AlBQWQ?!ci>WeE3akh9E<(A^29?-6~`9yRC zyTmFT9~Bcg0k|x;KZv}P-4rZYU?N&tbM0o;Df_Un?<^&-NxowbxlmbwDwKCRsZyT` zh!XuKwbYjQfNv5`Dt+3P)s|5T=yg8PnM@?FN5VkrR=`;*`!xE`VzL*sN&uXDO><2= zB8FydA?<$q?Y_r-^7#h{*wviV-nw^gvz6D4g^%_OTX9XudJSGMUvx_rO4g5WitO1= z`^_dm2_C$4%Y;v(q^s=g1vfnU53P1m4c3S-j0$!*8~FW$f{SeQmYeQ!`CUHO7FRc{ z3=jpUqUkP|nB5w#ST0v@Y0DL_nxuckg*+>}_mk$R;9LgEy}W2Qnwj4@aoz!E90oI{ z)JH1Ze!Ur!`0`vV)~mqy@HewCwvp?+gv;p9XfD_ru@V<|YWDh&Ffk3ge>Z<1Xm?A#x{+e^yy5UHF zdt_F)*;}Wb0^$8)4|}`G6K?K>A9hfA!3KnT{@$(oeUGzM=q(T}H{af2J7{p~A?y_* zYKo9Vguqz!_VwlLn+PkO?y`lE<3+i#z@la@>f0$Q*GZh4Iwa}6lC*sagcVT>n_t8|rilso8A4uE0ki+CFD!b0)g1NE zk#Ha+xTC|*qf;W5p-pdW)uQ~sp%JK99|f;DHP4~@14%Lw)iRIaH!{kqU%yaTE|TSS zf7L*0@|^BNn8%#0jVVD7W6cl5&ZNnI>2ZKxr3WoXR2C&E9W}ljch_9rlSV^%)0V6* z|3e0D*EEbk^HW7r=t3O3>haO9!=Iv?-prg3bD!>FveDbfThMIRoM<+*mROk*-cWf? zE}&nRnQN&l`{Xj@$L9|~%Pfo2I=340&h_R>=K>iX%TgHF)-UBS{I< z%PiKyH%!6s%a-QQzXK$Hxf~T@$p#bnzDgmxOZCWtS&NuSx58H{1F{^0OBp=8B*zGC z(cDRB{V)Wgt!u+*9=-cy*~Db?B)5I}0z@a}l6w%_t5;#f-1fuPd-S7Z5JD>W=vP$! zX7<$Dda~1<6bi_l0UDVHJ&peOE#@GRCqB1T9CY5(bd6fRSpsE zQ|>*jPBobGpYMi%=Q;$_8qQ6}*>%nDLxLH=1p~^15Zi%fkHEss@=hoVE-o0W241HHQgJ|1HEq7o&h7GoKT><7^{`aQJox_t6`@M( diff --git a/packages/website/static/img/undraw_docusaurus_mountain.svg b/packages/website/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index 431cef2f..00000000 --- a/packages/website/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/undraw_docusaurus_react.svg b/packages/website/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index e4170504..00000000 --- a/packages/website/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/website/static/img/undraw_docusaurus_tree.svg b/packages/website/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index a05cc03d..00000000 --- a/packages/website/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1 +0,0 @@ -docu_tree \ No newline at end of file From 5025f2d55f66358542763f285c8995bad43824bd Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Wed, 27 Apr 2022 18:34:37 -0400 Subject: [PATCH 09/43] Refactor of splitContinuousAndDiscrete to allow for more customization --- .../Distributions/SampleSetDist_test.res | 42 ++++++++++++----- .../SampleSetDist_ToPointSet.res | 25 +--------- .../squiggle-lang/src/rescript/Utility/E.res | 47 ++++++++++++++----- 3 files changed, 66 insertions(+), 48 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res index 1c430f3d..edfcb6ef 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res @@ -4,20 +4,34 @@ open TestHelpers describe("Continuous and discrete splits", () => { makeTest( "splits (1)", - SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete([1.432, 1.33455, 2.0]), - ([1.432, 1.33455, 2.0], E.FloatFloatMap.empty()), + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight([1.432, 1.33455, 2.0], 2), + ([1.33455, 1.432, 2.0], E.FloatFloatMap.empty()), ) makeTest( "splits (2)", - SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete([ - 1.432, - 1.33455, - 2.0, - 2.0, - 2.0, - 2.0, - ]) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), - ([1.432, 1.33455], [(2.0, 4.0)]), + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 2.0, 2.0], + 2, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432], [(2.0, 4.0)]), + ) + + makeTest( + "splits (3)", + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], + 3, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432, 2.0, 2.0], [(3.5, 3.0)]), + ) + + makeTest( + "splits (3)", + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], + 5, + ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + ([1.33455, 1.432, 2.0, 2.0, 3.5, 3.5, 3.5], []), ) let makeDuplicatedArray = count => { @@ -26,14 +40,16 @@ describe("Continuous and discrete splits", () => { E.A.concatMany([sorted, sorted, sorted, sorted]) |> Belt.SortArray.stableSortBy(_, compare) } - let (_, discrete1) = SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete( + let (_, discrete1) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(10), + 2, ) let toArr1 = discrete1 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=10", toArr1 |> Belt.Array.length, 10) - let (_c, discrete2) = SampleSetDist_ToPointSet.Internals.T.splitContinuousAndDiscrete( + let (_c, discrete2) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(500), + 2, ) let toArr2 = discrete2 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=500", toArr2 |> Belt.Array.length, 500) diff --git a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res index 90537a12..10874f96 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res +++ b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res @@ -39,28 +39,6 @@ module Internals = { module T = { type t = array - let splitContinuousAndDiscrete = (sortedArray: t) => { - let continuous = [] - let discrete = E.FloatFloatMap.empty() - Belt.Array.forEachWithIndex(sortedArray, (index, element) => { - let maxIndex = (sortedArray |> Array.length) - 1 - let possiblySimilarElements = switch index { - | 0 => [index + 1] - | n if n == maxIndex => [index - 1] - | _ => [index - 1, index + 1] - } |> Belt.Array.map(_, r => sortedArray[r]) - let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) - hasSimilarElement - ? E.FloatFloatMap.increment(element, discrete) - : { - let _ = Js.Array.push(element, continuous) - } - - () - }) - (continuous, discrete) - } - let xWidthToUnitWidth = (samples, outputXYPoints, xWidth) => { let xyPointRange = E.A.Sorted.range(samples) |> E.O.default(0.0) let xyPointWidth = xyPointRange /. float_of_int(outputXYPoints) @@ -85,7 +63,8 @@ let toPointSetDist = ( (), ): Internals.Types.outputs => { Array.fast_sort(compare, samples) - let (continuousPart, discretePart) = E.A.Sorted.Floats.split(samples) + let minDiscreteToKeep = max(2, E.A.length(samples) / 10); + let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(samples, minDiscreteToKeep) let length = samples |> E.A.length |> float_of_int let discrete: PointSetTypes.discreteShape = discretePart diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 030c2961..69ded69b 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -8,7 +8,7 @@ module FloatFloatMap = { type t = Belt.MutableMap.t let fromArray = (ar: array<(float, float)>) => Belt.MutableMap.fromArray(ar, ~id=module(Id)) - let toArray = (t: t) => Belt.MutableMap.toArray(t) + let toArray = (t: t): array<(float, float)> => Belt.MutableMap.toArray(t) let empty = () => Belt.MutableMap.make(~id=module(Id)) let increment = (el, t: t) => Belt.MutableMap.update(t, el, x => @@ -20,6 +20,10 @@ module FloatFloatMap = { let get = (el, t: t) => Belt.MutableMap.get(t, el) let fmap = (fn, t: t) => Belt.MutableMap.map(t, fn) + let partition = (fn, t: t) => { + let (match, noMatch) = Belt.Array.partition(toArray(t), fn) + (fromArray(match), fromArray(noMatch)) + } } module Int = { @@ -518,18 +522,17 @@ module A = { let makeIncrementalDown = (a, b) => Array.make(a - b + 1, a) |> Array.mapi((i, c) => c - i) |> Belt.Array.map(_, float_of_int) - let split = (sortedArray: array) => { - let continuous = [] + let splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { + let continuous: array = [] let discrete = FloatFloatMap.empty() - Belt.Array.forEachWithIndex(sortedArray, (_, element) => { - // let maxIndex = (sortedArray |> Array.length) - 1 - // let possiblySimilarElements = switch index { - // | 0 => [index + 1] - // | n if n == maxIndex => [index - 1] - // | _ => [index - 1, index + 1] - // } |> Belt.Array.map(_, r => sortedArray[r]) - // let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) - let hasSimilarElement = false + Belt.Array.forEachWithIndex(sortedArray, (index, element) => { + let maxIndex = (sortedArray |> Array.length) - 1 + let possiblySimilarElements = switch index { + | 0 => [index + 1] + | n if n == maxIndex => [index - 1] + | _ => [index - 1, index + 1] + } |> Belt.Array.map(_, r => sortedArray[r]) + let hasSimilarElement = Belt.Array.some(possiblySimilarElements, r => r == element) hasSimilarElement ? FloatFloatMap.increment(element, discrete) : { @@ -541,6 +544,26 @@ module A = { (continuous, discrete) } + + let splitContinuousAndDiscreteForMinWeight = ( + sortedArray: array, + minDiscreteWeight: int, + ) => { + let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) + let keepFn = v => Belt.Float.toInt(v) > minDiscreteWeight + let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( + ((_, v)) => keepFn(v), + discrete, + ) + let newContinousSamples = + discreteToIntegrate->FloatFloatMap.toArray + |> fmap(((k, v)) => Belt.Array.makeBy(Belt.Float.toInt(v), _ => k)) + |> Belt.Array.concatMany + + let newContinuous = concat(continuous, newContinousSamples) + newContinuous |> Array.fast_sort(floatCompare) + (newContinuous, discreteToKeep) + } } } From 335d0b5d0430cb556e4dc222e5dd3c573fe649cf Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 07:36:53 -0400 Subject: [PATCH 10/43] Cleaned tests --- .../Distributions/SampleSetDist_test.res | 33 +++++++------------ .../squiggle-lang/src/rescript/Utility/E.res | 2 +- 2 files changed, 13 insertions(+), 22 deletions(-) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res index edfcb6ef..825c0095 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res @@ -1,36 +1,27 @@ open Jest open TestHelpers +let prepareInputs = (ar, minWeight) => + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, minWeight) |> ( + ((c, disc)) => (c, disc |> E.FloatFloatMap.toArray) + ) + describe("Continuous and discrete splits", () => { makeTest( - "splits (1)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight([1.432, 1.33455, 2.0], 2), - ([1.33455, 1.432, 2.0], E.FloatFloatMap.empty()), - ) - makeTest( - "splits (2)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 2.0, 2.0], - 2, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), - ([1.33455, 1.432], [(2.0, 4.0)]), + "is empty, with no common elements", + prepareInputs([1.432, 1.33455, 2.0], 2), + ([1.33455, 1.432, 2.0], []), ) makeTest( - "splits (3)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], - 3, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + "only stores 3.5 as discrete when minWeight is 3", + prepareInputs([1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], 3), ([1.33455, 1.432, 2.0, 2.0], [(3.5, 3.0)]), ) makeTest( - "splits (3)", - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( - [1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], - 5, - ) |> (((c, disc)) => (c, disc |> E.FloatFloatMap.toArray)), + "doesn't store 3.5 as discrete when minWeight is 5", + prepareInputs([1.432, 1.33455, 2.0, 2.0, 3.5, 3.5, 3.5], 5), ([1.33455, 1.432, 2.0, 2.0, 3.5, 3.5, 3.5], []), ) diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 69ded69b..b0d9ef19 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -550,7 +550,7 @@ module A = { minDiscreteWeight: int, ) => { let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) - let keepFn = v => Belt.Float.toInt(v) > minDiscreteWeight + let keepFn = v => Belt.Float.toInt(v) >= minDiscreteWeight let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( ((_, v)) => keepFn(v), discrete, From 2eec389b55368722afb85bac22351b6c4d906df1 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 07:56:23 -0400 Subject: [PATCH 11/43] Added docstrings and cleanup --- .../splitContinuousAndDiscrete_test.res} | 6 +++--- .../SampleSetDist_ToPointSet.res | 7 +++++-- .../src/rescript/MagicNumbers.res | 13 +++++++++++++ .../squiggle-lang/src/rescript/Utility/E.res | 19 +++++++++++++++---- 4 files changed, 36 insertions(+), 9 deletions(-) rename packages/squiggle-lang/__tests__/{Distributions/SampleSetDist_test.res => E/splitContinuousAndDiscrete_test.res} (90%) diff --git a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res b/packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res similarity index 90% rename from packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res rename to packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res index 825c0095..449787dd 100644 --- a/packages/squiggle-lang/__tests__/Distributions/SampleSetDist_test.res +++ b/packages/squiggle-lang/__tests__/E/splitContinuousAndDiscrete_test.res @@ -2,7 +2,7 @@ open Jest open TestHelpers let prepareInputs = (ar, minWeight) => - E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, minWeight) |> ( + E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(ar, ~minDiscreteWeight=minWeight) |> ( ((c, disc)) => (c, disc |> E.FloatFloatMap.toArray) ) @@ -33,14 +33,14 @@ describe("Continuous and discrete splits", () => { let (_, discrete1) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(10), - 2, + ~minDiscreteWeight=2, ) let toArr1 = discrete1 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=10", toArr1 |> Belt.Array.length, 10) let (_c, discrete2) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( makeDuplicatedArray(500), - 2, + ~minDiscreteWeight=2, ) let toArr2 = discrete2 |> E.FloatFloatMap.toArray makeTest("splitMedium at count=500", toArr2 |> Belt.Array.length, 500) diff --git a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res index 10874f96..142f10b2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res +++ b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res @@ -63,8 +63,11 @@ let toPointSetDist = ( (), ): Internals.Types.outputs => { Array.fast_sort(compare, samples) - let minDiscreteToKeep = max(2, E.A.length(samples) / 10); - let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight(samples, minDiscreteToKeep) + let minDiscreteToKeep = MagicNumbers.ToPointSet.minDiscreteToKeep(samples) + let (continuousPart, discretePart) = E.A.Sorted.Floats.splitContinuousAndDiscreteForMinWeight( + samples, + ~minDiscreteWeight=minDiscreteToKeep, + ) let length = samples |> E.A.length |> float_of_int let discrete: PointSetTypes.discreteShape = discretePart diff --git a/packages/squiggle-lang/src/rescript/MagicNumbers.res b/packages/squiggle-lang/src/rescript/MagicNumbers.res index 291f05d6..124a44f4 100644 --- a/packages/squiggle-lang/src/rescript/MagicNumbers.res +++ b/packages/squiggle-lang/src/rescript/MagicNumbers.res @@ -22,3 +22,16 @@ module OpCost = { let wildcardCost = 1000 let monteCarloCost = Environment.defaultSampleCount } + +module ToPointSet = { + /* + This function chooses the minimum amount of duplicate samples that need + to exist in order for this to be considered discrete. The tricky thing + is that there are some operations that create duplicate continuous samples, + so we can't guarantee that these only will occur because the fundamental + structure is meant to be discrete. I chose this heuristic because I think + it would strike a reasonable trade-off, but I’m really unsure what’s + best right now. + */ + let minDiscreteToKeep = samples => max(20, E.A.length(samples) / 50) +} diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index b0d9ef19..1f218194 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -522,7 +522,12 @@ module A = { let makeIncrementalDown = (a, b) => Array.make(a - b + 1, a) |> Array.mapi((i, c) => c - i) |> Belt.Array.map(_, float_of_int) - let splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { + /* + This function goes through a sorted array and divides it into two different clusters: + continuous samples and discrete samples. The discrete samples are stored in a mutable map. + Samples are thought to be discrete if they have any duplicates. + */ + let _splitContinuousAndDiscreteForDuplicates = (sortedArray: array) => { let continuous: array = [] let discrete = FloatFloatMap.empty() Belt.Array.forEachWithIndex(sortedArray, (index, element) => { @@ -545,11 +550,18 @@ module A = { (continuous, discrete) } + /* + This function works very similarly to splitContinuousAndDiscreteForDuplicates. The one major difference + is that you can specify a minDiscreteWeight. If the min discreet weight is 4, that would mean that + at least four elements needed from a specific value for that to be kept as discrete. This is important + because in some cases, we can expect that some common elements will be generated by regular operations. + The final continous array will be sorted. + */ let splitContinuousAndDiscreteForMinWeight = ( sortedArray: array, - minDiscreteWeight: int, + ~minDiscreteWeight: int, ) => { - let (continuous, discrete) = splitContinuousAndDiscreteForDuplicates(sortedArray) + let (continuous, discrete) = _splitContinuousAndDiscreteForDuplicates(sortedArray) let keepFn = v => Belt.Float.toInt(v) >= minDiscreteWeight let (discreteToKeep, discreteToIntegrate) = FloatFloatMap.partition( ((_, v)) => keepFn(v), @@ -559,7 +571,6 @@ module A = { discreteToIntegrate->FloatFloatMap.toArray |> fmap(((k, v)) => Belt.Array.makeBy(Belt.Float.toInt(v), _ => k)) |> Belt.Array.concatMany - let newContinuous = concat(continuous, newContinousSamples) newContinuous |> Array.fast_sort(floatCompare) (newContinuous, discreteToKeep) From ab4dcc233cb19bcfcb8614ffd8e4f2bfa00985f9 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 08:09:31 -0400 Subject: [PATCH 12/43] Minor revisions from CR --- .../src/rescript/Distributions/GenericDist/GenericDist.res | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index aaa7bf40..d5dbe1cf 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -150,8 +150,6 @@ let truncate = Truncate.run of a new variable that is the result of the operation on A and B. For instance, normal(0, 1) + normal(1, 1) -> normal(1, 2). In general, this is implemented via convolution. - - TODO: It would be useful to be able to pass in a paramater to get this to run either with convolution or monte carlo. */ module AlgebraicCombination = { module InputValidator = { @@ -181,9 +179,9 @@ module AlgebraicCombination = { switch items { | Error(r) => Some(r) | Ok([true, _]) => - Some(LogarithmOfDistributionError("First input must completely greater than 0")) + Some(LogarithmOfDistributionError("First input must be completely greater than 0")) | Ok([false, true]) => - Some(LogarithmOfDistributionError("Second input must completely greater than 0")) + Some(LogarithmOfDistributionError("Second input must be completely greater than 0")) | Ok([false, false]) => None | Ok(_) => Some(Unreachable) } From b0bfe0f74837a6075480fb11a64ca82a8cd76a0f Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 08:14:07 -0400 Subject: [PATCH 13/43] Fixed tests --- .../ReducerInterface/ReducerInterface_Distribution_test.res | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/squiggle-lang/__tests__/ReducerInterface/ReducerInterface_Distribution_test.res b/packages/squiggle-lang/__tests__/ReducerInterface/ReducerInterface_Distribution_test.res index 33afd311..4df843bb 100644 --- a/packages/squiggle-lang/__tests__/ReducerInterface/ReducerInterface_Distribution_test.res +++ b/packages/squiggle-lang/__tests__/ReducerInterface/ReducerInterface_Distribution_test.res @@ -92,11 +92,11 @@ describe("eval on distribution functions", () => { testEval("log(2, uniform(5,8))", "Ok(Sample Set Distribution)") testEval( "log(normal(5,2), 3)", - "Error(Distribution Math Error: Logarithm of input error: First input must completely greater than 0)", + "Error(Distribution Math Error: Logarithm of input error: First input must be completely greater than 0)", ) testEval( "log(normal(5,2), normal(10,1))", - "Error(Distribution Math Error: Logarithm of input error: First input must completely greater than 0)", + "Error(Distribution Math Error: Logarithm of input error: First input must be completely greater than 0)", ) testEval("log(uniform(5,8))", "Ok(Sample Set Distribution)") testEval("log10(uniform(5,8))", "Ok(Sample Set Distribution)") From 934ce783994fe5d68136c2cfdd74e491729ddf7f Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 09:08:53 -0400 Subject: [PATCH 14/43] Algebraic Strategy should use MC when inputs include sample set dists --- .../Distributions/GenericDist/GenericDist.res | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res index d5dbe1cf..c19bdf7f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.res @@ -6,6 +6,24 @@ type toSampleSetFn = t => result type scaleMultiplyFn = (t, float) => result type pointwiseAddFn = (t, t) => result +let isPointSet = (t: t) => + switch t { + | PointSet(_) => true + | _ => false + } + +let isSampleSetSet = (t: t) => + switch t { + | SampleSet(_) => true + | _ => false + } + +let isSymbolic = (t: t) => + switch t { + | Symbolic(_) => true + | _ => false + } + let sampleN = (t: t, n) => switch t { | PointSet(r) => PointSetDist.sampleNRendered(n, r) @@ -248,20 +266,24 @@ module AlgebraicCombination = { | _ => MagicNumbers.OpCost.wildcardCost } + let hasSampleSetDist = (t1: t, t2: t): bool => isSampleSetSet(t1) || isSampleSetSet(t2) + + let convolutionIsFasterThanMonteCarlo = (t1: t, t2: t): bool => + expectedConvolutionCost(t1) * expectedConvolutionCost(t2) < MagicNumbers.OpCost.monteCarloCost + + let preferConvolutionToMonteCarlo = (t1, t2, arithmeticOperation) => { + !hasSampleSetDist(t1, t2) && + Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) && + convolutionIsFasterThanMonteCarlo(t1, t2) + } + let run = (~t1: t, ~t2: t, ~arithmeticOperation): specificStrategy => { switch StrategyCallOnValidatedInputs.symbolic(arithmeticOperation, t1, t2) { | #AnalyticalSolution(_) | #Error(_) => #AsSymbolic | #NoSolution => - if Operation.Convolution.canDoAlgebraicOperation(arithmeticOperation) { - expectedConvolutionCost(t1) * expectedConvolutionCost(t2) > - MagicNumbers.OpCost.monteCarloCost - ? #AsMonteCarlo - : #AsConvolution - } else { - #AsMonteCarlo - } + preferConvolutionToMonteCarlo(t1, t2, arithmeticOperation) ? #AsConvolution : #AsMonteCarlo } } } From dde28e54f084c751bdbc24a75cf625efabbe1e7b Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 10:17:29 -0400 Subject: [PATCH 15/43] Restructuring of E Sorted --- .../AlgebraicShapeCombination.res | 2 +- .../SampleSetDist_ToPointSet.res | 2 +- .../squiggle-lang/src/rescript/Utility/E.res | 126 +++++++++--------- 3 files changed, 63 insertions(+), 67 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/AlgebraicShapeCombination.res b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/AlgebraicShapeCombination.res index 63600e43..a51de00d 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/AlgebraicShapeCombination.res +++ b/packages/squiggle-lang/src/rescript/Distributions/PointSetDist/AlgebraicShapeCombination.res @@ -263,4 +263,4 @@ let combineShapesContinuousDiscrete = ( ) } -let isOrdered = (a: XYShape.T.t): bool => E.A.Sorted.Floats.isSorted(a.xs) +let isOrdered = (a: XYShape.T.t): bool => E.A.Floats.isSorted(a.xs) diff --git a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res index 90537a12..da9f941f 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res +++ b/packages/squiggle-lang/src/rescript/Distributions/SampleSetDist/SampleSetDist_ToPointSet.res @@ -85,7 +85,7 @@ let toPointSetDist = ( (), ): Internals.Types.outputs => { Array.fast_sort(compare, samples) - let (continuousPart, discretePart) = E.A.Sorted.Floats.split(samples) + let (continuousPart, discretePart) = E.A.Sorted.split(samples) let length = samples |> E.A.length |> float_of_int let discrete: PointSetTypes.discreteShape = discretePart diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 030c2961..9c11426a 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -475,42 +475,73 @@ module A = { } } - module Sorted = { - let min = first - let max = last - let range = (~min=min, ~max=max, a) => - switch (min(a), max(a)) { - | (Some(min), Some(max)) => Some(max -. min) - | _ => None - } + module Floats = { + let mean = Jstat.mean + let geomean = Jstat.geomean + let mode = Jstat.mode + let variance = Jstat.variance + let stdev = Jstat.stdev + let sum = Jstat.sum + let random = Js.Math.random_int let floatCompare: (float, float) => int = compare + let sort = t => { + let r = t + r |> Array.fast_sort(floatCompare) + r + } - let binarySearchFirstElementGreaterIndex = (ar: array<'a>, el: 'a) => { - let el = Belt.SortArray.binarySearchBy(ar, el, floatCompare) - let el = el < 0 ? el * -1 - 1 : el - switch el { - | e if e >= length(ar) => #overMax - | e if e == 0 => #underMin - | e => #firstHigher(e) + let isSorted = (ar: array): bool => + reduce(zip(ar, tail(ar)), true, (acc, (first, second)) => acc && first < second) + + //Passing true for the exclusive parameter excludes both endpoints of the range. + //https://jstat.github.io/all.html + let percentile = (a, b) => Jstat.percentile(a, b, false) + + // Gives an array with all the differences between values + // diff([1,5,3,7]) = [4,-2,4] + let diff = (arr: array): array => + Belt.Array.zipBy(arr, Belt.Array.sliceToEnd(arr, 1), (left, right) => right -. left) + + exception RangeError(string) + let range = (min: float, max: float, n: int): array => + switch n { + | 0 => [] + | 1 => [min] + | 2 => [min, max] + | _ if min == max => Belt.Array.make(n, min) + | _ if n < 0 => raise(RangeError("n must be greater than 0")) + | _ if min > max => raise(RangeError("Min value is less then max value")) + | _ => + let diff = (max -. min) /. Belt.Float.fromInt(n - 1) + Belt.Array.makeBy(n, i => min +. Belt.Float.fromInt(i) *. diff) } - } - let concat = (t1: array<'a>, t2: array<'a>) => { - let ts = Belt.Array.concat(t1, t2) - ts |> Array.fast_sort(floatCompare) - ts - } + let min = Js.Math.minMany_float + let max = Js.Math.maxMany_float - let concatMany = (t1: array>) => { - let ts = Belt.Array.concatMany(t1) - ts |> Array.fast_sort(floatCompare) - ts - } + module Sorted = { + let min = first + let max = last + let range = (~min=min, ~max=max, a) => + switch (min(a), max(a)) { + | (Some(min), Some(max)) => Some(max -. min) + | _ => None + } - module Floats = { - let isSorted = (ar: array): bool => - reduce(zip(ar, tail(ar)), true, (acc, (first, second)) => acc && first < second) + let binarySearchFirstElementGreaterIndex = (ar: array<'a>, el: 'a) => { + let el = Belt.SortArray.binarySearchBy(ar, el, floatCompare) + let el = el < 0 ? el * -1 - 1 : el + switch el { + | e if e >= length(ar) => #overMax + | e if e == 0 => #underMin + | e => #firstHigher(e) + } + } + + let concat = (t1: array<'a>, t2: array<'a>) => Belt.Array.concat(t1, t2)->sort + + let concatMany = (t1: array>) => Belt.Array.concatMany(t1)->sort let makeIncrementalUp = (a, b) => Array.make(b - a + 1, a) |> Array.mapi((i, c) => c + i) |> Belt.Array.map(_, float_of_int) @@ -543,42 +574,7 @@ module A = { } } } - - module Floats = { - let mean = Jstat.mean - let geomean = Jstat.geomean - let mode = Jstat.mode - let variance = Jstat.variance - let stdev = Jstat.stdev - let sum = Jstat.sum - let random = Js.Math.random_int - - //Passing true for the exclusive parameter excludes both endpoints of the range. - //https://jstat.github.io/all.html - let percentile = (a, b) => Jstat.percentile(a, b, false) - - // Gives an array with all the differences between values - // diff([1,5,3,7]) = [4,-2,4] - let diff = (arr: array): array => - Belt.Array.zipBy(arr, Belt.Array.sliceToEnd(arr, 1), (left, right) => right -. left) - - exception RangeError(string) - let range = (min: float, max: float, n: int): array => - switch n { - | 0 => [] - | 1 => [min] - | 2 => [min, max] - | _ if min == max => Belt.Array.make(n, min) - | _ if n < 0 => raise(RangeError("n must be greater than 0")) - | _ if min > max => raise(RangeError("Min value is less then max value")) - | _ => - let diff = (max -. min) /. Belt.Float.fromInt(n - 1) - Belt.Array.makeBy(n, i => min +. Belt.Float.fromInt(i) *. diff) - } - - let min = Js.Math.minMany_float - let max = Js.Math.maxMany_float - } + module Sorted = Floats.Sorted; } module A2 = { From a8cc554354965047aa8d4713cbfd5c5659260bb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:36:16 +0000 Subject: [PATCH 16/43] :arrow_up: Bump chalk from 4.1.2 to 5.0.1 Bumps [chalk](https://github.com/chalk/chalk) from 4.1.2 to 5.0.1. - [Release notes](https://github.com/chalk/chalk/releases) - [Commits](https://github.com/chalk/chalk/compare/v4.1.2...v5.0.1) --- updated-dependencies: - dependency-name: chalk dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- packages/squiggle-lang/package.json | 2 +- yarn.lock | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index f9157ada..0dca9ea6 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -45,7 +45,7 @@ "@types/jest": "^27.4.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", "bisect_ppx": "^2.7.1", - "chalk": "^4.1.2", + "chalk": "^5.0.1", "codecov": "3.8.3", "fast-check": "2.25.0", "gentype": "^4.3.0", diff --git a/yarn.lock b/yarn.lock index f9feaabc..cb1e6b3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6155,6 +6155,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" + integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" From 7c14fd55c08df79fa235f5fe44a8ec2131123191 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 10:58:39 -0400 Subject: [PATCH 17/43] Made less programmery based on feedback Value: [5e-4 to 8e-3] --- packages/website/docs/Features/Language.mdx | 52 ++++++++++----------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 4862bd5d..117f5993 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -8,44 +8,42 @@ import { SquiggleEditor } from "../../src/components/SquiggleEditor"; The squiggle language has a very simple syntax. The best way to get to understand it is by simply looking at examples. -## Expressions and statements +## Expressions -A squiggle **expression** is a value like a float or a distribution or a data structure like an array or a record. +A distribution -The bottom line of your squiggle buffer should be an expression, which we evaluate (i.e., render). Sometimes we call the last expression of a squiggle file an _export_. +A number -A squiggle **assignment** is a statement, when you want to bind an expression to a name. + - - -### Functions - -Some assignments are functions - - - -## Data structures - -A squiggle **array** is a list of expressions, which is interpretable as an export. +Arrays -A squiggle **record** is a key-value store with dot accessors. +Records + + + +## Statements + +A statement assigns expressions to names. It looks like ` = ` + +### Functions + +We can define functions + + From 114d537c0770347c84b3ebced6246481791c188e Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 11:21:10 -0400 Subject: [PATCH 18/43] rm top line; fixed some examples; added `See more` section Value: [5e-4 to 2e-3] --- packages/website/docs/Features/Language.mdx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/website/docs/Features/Language.mdx b/packages/website/docs/Features/Language.mdx index 117f5993..5b66d2e2 100644 --- a/packages/website/docs/Features/Language.mdx +++ b/packages/website/docs/Features/Language.mdx @@ -5,9 +5,6 @@ title: Language Basics import { SquiggleEditor } from "../../src/components/SquiggleEditor"; -The squiggle language has a very simple syntax. The best way to get to understand -it is by simply looking at examples. - ## Expressions A distribution @@ -21,12 +18,15 @@ A number Arrays Records - + ## Statements @@ -44,6 +44,10 @@ We can define functions + +## See more + +- [Functions reference](https://squiggle-language.com/docs/Features/Functions) +- [Gallery](https://squiggle-language.com/docs/Discussions/Gallery) From d1ffac492cb0c4147ace407c3f36418081459887 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 11:39:29 -0400 Subject: [PATCH 19/43] Draft of Validates for XYShape --- packages/squiggle-lang/src/rescript/Utility/E.res | 14 +++++++++----- .../squiggle-lang/src/rescript/Utility/XYShape.res | 10 ++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 9c11426a..45051578 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -476,6 +476,7 @@ module A = { } module Floats = { + type t = array let mean = Jstat.mean let geomean = Jstat.geomean let mode = Jstat.mode @@ -491,8 +492,11 @@ module A = { r } - let isSorted = (ar: array): bool => - reduce(zip(ar, tail(ar)), true, (acc, (first, second)) => acc && first < second) + let getNonFinite = (t: t) => Belt.Array.getBy(t, r => !Js.Float.isFinite(r)) + let getBelowZero = (t: t) => Belt.Array.getBy(t, r => r < 0.0) + + let isSorted = (t: t): bool => + reduce(zip(t, tail(t)), true, (acc, (first, second)) => acc && first < second) //Passing true for the exclusive parameter excludes both endpoints of the range. //https://jstat.github.io/all.html @@ -500,8 +504,8 @@ module A = { // Gives an array with all the differences between values // diff([1,5,3,7]) = [4,-2,4] - let diff = (arr: array): array => - Belt.Array.zipBy(arr, Belt.Array.sliceToEnd(arr, 1), (left, right) => right -. left) + let diff = (t: t): array => + Belt.Array.zipBy(t, Belt.Array.sliceToEnd(t, 1), (left, right) => right -. left) exception RangeError(string) let range = (min: float, max: float, n: int): array => @@ -574,7 +578,7 @@ module A = { } } } - module Sorted = Floats.Sorted; + module Sorted = Floats.Sorted } module A2 = { diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index 97974884..e22dc5fd 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -62,6 +62,16 @@ module T = { let toJs = (t: t) => {"xs": t.xs, "ys": t.ys} } +module Validates = { + type t = T.t + let areXsSorted = (t:t) => E.A.Floats.isSorted(T.xs(t)) + let validate = (t:t) => { + let xsNotSorted = E.A.Floats.isSorted(T.xs(t)) ? None : Some("Xs are not sorted") + let xsNotFinite = E.A.Floats.getNonFinite(T.xs(t)) |> E.O.fmap(r => `Xs contain non-finite values: ${E.Float.toString(r)}`) + let ysNotFinite = E.A.Floats.getNonFinite(T.ys(t)) |> E.O.fmap(r => `Ys contain non-finite values: ${E.Float.toString(r)}`) + } +} + module Ts = { type t = T.ts let minX = (t: t) => t |> E.A.fmap(T.minX) |> E.A.Floats.min From c9301085b91441c9332c47bee20e73ee63da7783 Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Thu, 28 Apr 2022 15:50:12 +0000 Subject: [PATCH 20/43] Add functions to implementation file to fix warnings --- .../src/rescript/Distributions/GenericDist/GenericDist.resi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi index ed2c5c03..e91803e2 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi +++ b/packages/squiggle-lang/src/rescript/Distributions/GenericDist/GenericDist.resi @@ -69,3 +69,6 @@ let mixture: ( ~scaleMultiplyFn: scaleMultiplyFn, ~pointwiseAddFn: pointwiseAddFn, ) => result + +let isSymbolic: t => bool +let isPointSet: t => bool From 03cd887084db7354751312bd9c3e43872c36354b Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 12:47:04 -0400 Subject: [PATCH 21/43] Adding better error messages to XYShape validator --- .../squiggle-lang/src/rescript/Utility/E.res | 1 + .../src/rescript/Utility/Errors.res | 29 ++++++++++++++ .../src/rescript/Utility/XYShape.res | 38 ++++++++++++++++--- 3 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 packages/squiggle-lang/src/rescript/Utility/Errors.res diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 45051578..88024c3b 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -584,6 +584,7 @@ module A = { module A2 = { let fmap = (a, b) => A.fmap(b, a) let joinWith = (a, b) => A.joinWith(b, a) + let filter = (a,b) => A.filter(b, a) } module JsArray = { diff --git a/packages/squiggle-lang/src/rescript/Utility/Errors.res b/packages/squiggle-lang/src/rescript/Utility/Errors.res new file mode 100644 index 00000000..6f52b21c --- /dev/null +++ b/packages/squiggle-lang/src/rescript/Utility/Errors.res @@ -0,0 +1,29 @@ +type property = {fnName: string, propertyName: string} + +type rec error = + | NotSorted(property) + | IsEmpty(property) + | NotFinite(property, float) + | DifferentLengths({fnName: string, p1Name: string, p2Name: string, p1Length: int, p2Length: int}) + | Multiple(array) + +let mapErrorArrayToError = (errors: array): option => { + switch errors { + | [] => None + | [error] => Some(error) + | _ => Some(Multiple(errors)) + } +} + +let rec toString = (t: error) => + switch t { + | NotSorted({fnName, propertyName}) => `${fnName} ${propertyName} is not sorted` + | IsEmpty({fnName, propertyName}) => `${fnName} ${propertyName} is empty` + | NotFinite({fnName, propertyName}, exampleValue) => + `${fnName} ${propertyName} is not finite. Example value: ${E.Float.toString(exampleValue)}` + | DifferentLengths({fnName, p1Name, p2Name, p1Length, p2Length}) => + `${fnName} ${p1Name} and ${p2Name} have different lengths. ${p1Name} has length ${E.I.toString( + p1Length, + )} and ${p2Name} has length ${E.I.toString(p2Length)}` + | Multiple(errors) => `Multiple Errors: ${E.A2.fmap(errors, toString) |> E.A.joinWith(", ")}` + } diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index e22dc5fd..9368c1ee 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -62,13 +62,39 @@ module T = { let toJs = (t: t) => {"xs": t.xs, "ys": t.ys} } -module Validates = { +module Validator = { type t = T.t - let areXsSorted = (t:t) => E.A.Floats.isSorted(T.xs(t)) - let validate = (t:t) => { - let xsNotSorted = E.A.Floats.isSorted(T.xs(t)) ? None : Some("Xs are not sorted") - let xsNotFinite = E.A.Floats.getNonFinite(T.xs(t)) |> E.O.fmap(r => `Xs contain non-finite values: ${E.Float.toString(r)}`) - let ysNotFinite = E.A.Floats.getNonFinite(T.ys(t)) |> E.O.fmap(r => `Ys contain non-finite values: ${E.Float.toString(r)}`) + let fnName = "XYShape validate" + let property = (propertyName: string): Errors.property => { + fnName: fnName, + propertyName: propertyName, + } + let notSortedError = (p: string): Errors.error => NotSorted(property(p)) + let notFiniteError = (p, exampleValue): Errors.error => NotFinite(property(p), exampleValue) + let isEmptyError = (propertyName): Errors.error => IsEmpty(property(propertyName)) + let differentLengthsError = (t): Errors.error => DifferentLengths({ + fnName: fnName, + p1Name: "Xs", + p2Name: "Ys", + p1Length: E.A.length(T.xs(t)), + p2Length: E.A.length(T.ys(t)), + }) + + let areXsSorted = (t: t) => E.A.Floats.isSorted(T.xs(t)) + let areXsEmpty = (t: t) => E.A.length(t.xs) == 0 + let getNonFiniteXs = (t: t) => t->T.xs->E.A.Floats.getNonFinite + let getNonFiniteYs = (t: t) => t->T.ys->E.A.Floats.getNonFinite + + let validate = (t: t) => { + let xsNotSorted = areXsSorted(t) ? None : Some(notSortedError("Xs")) + let xsEmpty = areXsEmpty(t) ? None : Some(isEmptyError("Xs")) + let differentLengths = + E.A.length(T.xs(t)) !== E.A.length(T.ys(t)) ? Some(differentLengthsError(t)) : None + let xsNotFinite = getNonFiniteXs(t)->E.O2.fmap(notFiniteError("Xs")) + let ysNotFinite = getNonFiniteYs(t)->E.O2.fmap(notFiniteError("Ys")) + [xsNotSorted, xsEmpty, differentLengths, xsNotFinite, ysNotFinite] + ->E.A.O.concatSomes + ->Errors.mapErrorArrayToError } } From 5b1ee7f0a6c73d3032d0689feb220010441a5947 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 13:19:15 -0400 Subject: [PATCH 22/43] Removed rationale (#410) Value: [2e-1 to 6.5e-1] --- packages/squiggle-lang/bsconfig.json | 2 +- packages/squiggle-lang/package.json | 8 - .../squiggle-lang/src/rescript/Utility/E.res | 241 +++++++++++++++--- yarn.lock | 5 - 4 files changed, 205 insertions(+), 51 deletions(-) diff --git a/packages/squiggle-lang/bsconfig.json b/packages/squiggle-lang/bsconfig.json index 4c27a48a..e98b3822 100644 --- a/packages/squiggle-lang/bsconfig.json +++ b/packages/squiggle-lang/bsconfig.json @@ -20,7 +20,7 @@ ], "suffix": ".bs.js", "namespace": true, - "bs-dependencies": ["@glennsl/rescript-jest", "rationale", "bisect_ppx"], + "bs-dependencies": ["@glennsl/rescript-jest", "bisect_ppx"], "gentypeconfig": { "language": "typescript", "module": "commonjs", diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index 0dca9ea6..75583bfc 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -35,30 +35,22 @@ "bisect_ppx": "^2.7.1", "jstat": "^1.9.5", "lodash": "4.17.21", - "mathjs": "10.5.0", - "pdfast": "^0.2.0", - "rationale": "0.2.0", "rescript": "^9.1.4", "rescript-fast-check": "^1.1.1", "@glennsl/rescript-jest": "^0.9.0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/jest": "^27.4.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", - "bisect_ppx": "^2.7.1", "chalk": "^5.0.1", "codecov": "3.8.3", "fast-check": "2.25.0", "gentype": "^4.3.0", "jest": "^27.5.1", - "jstat": "^1.9.5", - "lodash": "4.17.21", "mathjs": "10.5.0", "moduleserve": "0.9.1", "nyc": "^15.1.0", "pdfast": "^0.2.0", - "rationale": "0.2.0", "reanalyze": "^2.19.0", - "rescript": "^9.1.4", "ts-jest": "^27.1.4", "ts-loader": "^9.2.8", "ts-node": "^10.7.0", diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 030c2961..420ffd0b 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -1,4 +1,3 @@ -open Rationale.Function.Infix module FloatFloatMap = { module Id = Belt.Id.MakeComparable({ type t = float @@ -51,17 +50,59 @@ module O = { | None => rFn() } () - let fmap = Rationale.Option.fmap - let bind = Rationale.Option.bind - let default = Rationale.Option.default - let isSome = Rationale.Option.isSome - let isNone = Rationale.Option.isNone - let toExn = Rationale.Option.toExn - let some = Rationale.Option.some - let firstSome = Rationale.Option.firstSome - let toExt = Rationale.Option.toExn // wanna flag this-- looks like a typo but `Rationale.OptiontoExt` doesn't exist. - let flatApply = (fn, b) => Rationale.Option.apply(fn, Some(b)) |> Rationale.Option.flatten - let flatten = Rationale.Option.flatten + let fmap = (f: 'a => 'b, x: option<'a>): option<'b> => { + switch x { + | None => None + | Some(x') => Some(f(x')) + } + } + let bind = (o, f) => + switch o { + | None => None + | Some(a) => f(a) + } + let default = (d, o) => + switch o { + | None => d + | Some(a) => a + } + let isSome = o => + switch o { + | Some(_) => true + | _ => false + } + let isNone = o => + switch o { + | None => true + | _ => false + } + let toExn = (err, o) => + switch o { + | None => raise(Failure(err)) + | Some(a) => a + } + + let some = a => Some(a) + let firstSome = (a, b) => + switch a { + | None => b + | _ => a + } + + let toExt = toExn + + let flatten = o => + switch o { + | None => None + | Some(x) => x + } + + let apply = (o, a) => + switch o { + | Some(f) => bind(a, b => some(f(b))) + | _ => None + } + let flatApply = (fn, b) => apply(fn, Some(b)) |> flatten let toBool = opt => switch opt { @@ -109,6 +150,11 @@ module O2 = { /* Functions */ module F = { + let pipe = (f, g, x) => g(f(x)) + let compose = (f, g, x) => f(g(x)) + let flip = (f, a, b) => f(b, a) + let always = (x, _y) => x + let apply = (a, e) => a |> e let flatten2Callbacks = (fn1, fn2, fnlast) => @@ -156,10 +202,25 @@ exception Assertion(string) /* R for Result */ module R = { - let result = Rationale.Result.result + open Belt.Result + let result = (okF, errF, r) => + switch r { + | Ok(a) => okF(a) + | Error(err) => errF(err) + } let id = e => e |> result(U.id, U.id) - let fmap = Rationale.Result.fmap - let bind = Rationale.Result.bind + let fmap = (f: 'a => 'b, r: result<'a, 'c>): result<'b, 'c> => { + switch r { + | Ok(r') => Ok(f(r')) + | Error(err) => Error(err) + } + } + let bind = (r, f) => + switch r { + | Ok(a) => f(a) + | Error(err) => Error(err) + } + let toExn = (msg: string, x: result<'a, 'b>): 'a => switch x { | Ok(r) => r @@ -186,14 +247,17 @@ module R = { let errorIfCondition = (errorCondition, errorMessage, r) => errorCondition(r) ? Error(errorMessage) : Ok(r) - let ap = Rationale.Result.ap + let ap = (r, a) => + switch r { + | Ok(f) => Ok(f(a)) + | Error(err) => Error(err) + } let ap' = (r, a) => switch r { | Ok(f) => fmap(f, a) | Error(err) => Error(err) } - // (a1 -> a2 -> r) -> m a1 -> m a2 -> m r // not in Rationale let liftM2: (('a, 'b) => 'c, result<'a, 'd>, result<'b, 'd>) => result<'c, 'd> = (op, xR, yR) => { ap'(fmap(op, xR), yR) } @@ -243,7 +307,7 @@ module S = { } module J = { - let toString = \"||>"(Js.Json.decodeString, O.default("")) + let toString = F.pipe(Js.Json.decodeString, O.default("")) let fromString = Js.Json.string let fromNumber = Js.Json.number @@ -256,7 +320,7 @@ module J = { let toString = (str: option<'a>) => switch str { - | Some(str) => Some(str |> \"||>"(Js.Json.decodeString, O.default(""))) + | Some(str) => Some(str |> F.pipe(Js.Json.decodeString, O.default(""))) | _ => None } } @@ -276,29 +340,132 @@ module L = { let toArray = Array.of_list let fmapi = List.mapi let concat = List.concat - let drop = Rationale.RList.drop - let remove = Rationale.RList.remove + let concat' = (xs, ys) => List.append(ys, xs) + + let rec drop = (i, xs) => + switch (i, xs) { + | (_, list{}) => list{} + | (i, _) if i <= 0 => xs + | (i, list{_, ...b}) => drop(i - 1, b) + } + + let append = (a, xs) => List.append(xs, list{a}) + let take = { + let rec loop = (i, xs, acc) => + switch (i, xs) { + | (i, _) if i <= 0 => acc + | (_, list{}) => acc + | (i, list{a, ...b}) => loop(i - 1, b, append(a, acc)) + } + (i, xs) => loop(i, xs, list{}) + } + let takeLast = (i, xs) => List.rev(xs) |> take(i) |> List.rev + + let splitAt = (i, xs) => (take(i, xs), takeLast(List.length(xs) - i, xs)) + let remove = (i, n, xs) => { + let (a, b) = splitAt(i, xs) + \"@"(a, drop(n, b)) + } + let find = List.find let filter = List.filter let for_all = List.for_all let exists = List.exists let sort = List.sort let length = List.length - let filter_opt = Rationale.RList.filter_opt - let uniqBy = Rationale.RList.uniqBy - let join = Rationale.RList.join - let head = Rationale.RList.head - let uniq = Rationale.RList.uniq + + let filter_opt = xs => { + let rec loop = (l, acc) => + switch l { + | list{} => acc + | list{hd, ...tl} => + switch hd { + | None => loop(tl, acc) + | Some(x) => loop(tl, list{x, ...acc}) + } + } + List.rev(loop(xs, list{})) + } + + let containsWith = f => List.exists(f) + + let uniqWithBy = (eq, f, xs) => + List.fold_left( + ((acc, tacc), v) => + containsWith(eq(f(v)), tacc) ? (acc, tacc) : (append(v, acc), append(f(v), tacc)), + (list{}, list{}), + xs, + ) |> fst + + module Util = { + let eq = (a, b) => a == b + } + let uniqBy = (f, xs) => uniqWithBy(Util.eq, f, xs) + let join = j => List.fold_left((acc, v) => String.length(acc) == 0 ? v : acc ++ (j ++ v), "") + let head = xs => + switch List.hd(xs) { + | exception _ => None + | a => Some(a) + } + + let uniq = xs => uniqBy(x => x, xs) + let flatten = List.flatten - let last = Rationale.RList.last + let last = xs => xs |> List.rev |> head + let append = List.append let getBy = Belt.List.getBy - let dropLast = Rationale.RList.dropLast - let contains = Rationale.RList.contains - let without = Rationale.RList.without - let update = Rationale.RList.update + + let dropLast = (i, xs) => take(List.length(xs) - i, xs) + + let containsWith = f => List.exists(f) + + let contains = x => containsWith(Util.eq(x)) + + let reject = pred => List.filter(x => !pred(x)) + let tail = xs => + switch List.tl(xs) { + | exception _ => None + | a => Some(a) + } + + let init = xs => { + O.fmap(List.rev, xs |> List.rev |> tail) + } + + let singleton = (x: 'a): list<'a> => list{x} + + let adjust = (f, i, xs) => { + let (a, b) = splitAt(i + 1, xs) + switch a { + | _ if i < 0 => xs + | _ if i >= List.length(xs) => xs + | list{} => b + | list{a} => list{f(a), ...b} + | a => + O.fmap( + concat'(b), + O.bind(init(a), x => + O.fmap(F.flip(append, x), O.fmap(fmap(f), O.fmap(singleton, last(a)))) + ), + ) |> O.default(xs) + } + } + + let without = (exclude, xs) => reject(x => contains(x, exclude), xs) + + let update = (x, i, xs) => adjust(F.always(x), i, xs) + let iter = List.iter - let findIndex = Rationale.RList.findIndex + let findIndex = { + let rec loop = (pred, xs, i) => + switch xs { + | list{} => None + | list{a, ...b} => pred(a) ? Some(i) : loop(pred, b, i + 1) + } + (pred, xs) => loop(pred, xs, 0) + } + let headSafe = Belt.List.head let tailSafe = Belt.List.tail let headExn = Belt.List.headExn @@ -360,7 +527,7 @@ module A = { Belt.Array.getUnsafe(a, index), Belt.Array.getUnsafe(a, index + 1), )) - |> Rationale.Result.return + |> (x => Ok(x)) } let tail = Belt.Array.sliceToEnd(_, 1) @@ -424,8 +591,8 @@ module A = { module O = { let concatSomes = (optionals: array>): array<'a> => optionals - |> Js.Array.filter(Rationale.Option.isSome) - |> Js.Array.map(Rationale.Option.toExn("Warning: This should not have happened")) + |> Js.Array.filter(O.isSome) + |> Js.Array.map(O.toExn("Warning: This should not have happened")) let defaultEmpty = (o: option>): array<'a> => switch o { | Some(o) => o @@ -589,7 +756,7 @@ module A2 = { module JsArray = { let concatSomes = (optionals: Js.Array.t>): Js.Array.t<'a> => optionals - |> Js.Array.filter(Rationale.Option.isSome) - |> Js.Array.map(Rationale.Option.toExn("Warning: This should not have happened")) + |> Js.Array.filter(O.isSome) + |> Js.Array.map(O.toExn("Warning: This should not have happened")) let filter = Js.Array.filter } diff --git a/yarn.lock b/yarn.lock index cb1e6b3a..283b1121 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13889,11 +13889,6 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rationale@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rationale/-/rationale-0.2.0.tgz#555ed4f3cc7cd0245faeac041d3769f1857e4f3d" - integrity sha512-Pd8w5Inv1JhTfRyx03zs486CEAn6UKXvvOtxVRLsewngsBSffo3MQwUKYS75L/8vPt98wmf7iaZROx362/f7Bw== - raw-body@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" From 4ff14db6f3b111791d074b18a739e8b3ef01a72d Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 13:34:57 -0400 Subject: [PATCH 23/43] response to CR Value: [1e-3 to 4e-3] --- .../squiggle-lang/src/rescript/Utility/E.res | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index 420ffd0b..f03ed07d 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -1,3 +1,7 @@ +/* +Some functions from modules `L`, `O`, and `R` below were copied directly from +running `rescript convert -all` on Rationale https://github.com/jonlaing/rationale +*/ module FloatFloatMap = { module Id = Belt.Id.MakeComparable({ type t = float @@ -335,6 +339,9 @@ module JsDate = { /* List */ module L = { + module Util = { + let eq = (a, b) => a == b + } let fmap = List.map let get = Belt.List.get let toArray = Array.of_list @@ -397,11 +404,9 @@ module L = { xs, ) |> fst - module Util = { - let eq = (a, b) => a == b - } let uniqBy = (f, xs) => uniqWithBy(Util.eq, f, xs) let join = j => List.fold_left((acc, v) => String.length(acc) == 0 ? v : acc ++ (j ++ v), "") + let head = xs => switch List.hd(xs) { | exception _ => None @@ -409,17 +414,12 @@ module L = { } let uniq = xs => uniqBy(x => x, xs) - let flatten = List.flatten let last = xs => xs |> List.rev |> head - let append = List.append let getBy = Belt.List.getBy - let dropLast = (i, xs) => take(List.length(xs) - i, xs) - let containsWith = f => List.exists(f) - let contains = x => containsWith(Util.eq(x)) let reject = pred => List.filter(x => !pred(x)) @@ -453,10 +453,9 @@ module L = { } let without = (exclude, xs) => reject(x => contains(x, exclude), xs) - let update = (x, i, xs) => adjust(F.always(x), i, xs) - let iter = List.iter + let findIndex = { let rec loop = (pred, xs, i) => switch xs { From 5dd0292b52fb9cbabe22bd5e886b6c7dd40c321e Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 14:52:44 -0400 Subject: [PATCH 24/43] Added tests for XYShape validator --- .../squiggle-lang/__tests__/XYShape_test.res | 28 ++++++--- .../squiggle-lang/src/rescript/Utility/E.res | 8 ++- .../src/rescript/Utility/Errors.res | 6 +- .../src/rescript/Utility/XYShape.res | 63 +++++++++---------- 4 files changed, 59 insertions(+), 46 deletions(-) diff --git a/packages/squiggle-lang/__tests__/XYShape_test.res b/packages/squiggle-lang/__tests__/XYShape_test.res index 701d82e1..9f5be4fd 100644 --- a/packages/squiggle-lang/__tests__/XYShape_test.res +++ b/packages/squiggle-lang/__tests__/XYShape_test.res @@ -19,6 +19,24 @@ let pointSetDist3: PointSetTypes.xyShape = { } describe("XYShapes", () => { + describe("Validator", () => { + makeTest("with no errors", XYShape.T.Validator.validate(pointSetDist1), None) + makeTest( + "when empty", + XYShape.T.Validator.validate({xs: [], ys: []})->E.O2.fmap(Errors.toString), + Some("XYShape validate Xs is empty"), + ) + makeTest( + "when not sorted, different lengths, and not finite", + XYShape.T.Validator.validate({xs: [2.0, 1.0, infinity, 0.0], ys: [3.0, infinity]})->E.O2.fmap( + Errors.toString, + ), + Some( + "Multiple Errors: [XYShape validate Xs is not sorted], [XYShape validate Xs and Ys have different lengths. Xs has length 4 and Ys has length 2], [XYShape validate Xs is not finite. Example value: Infinity], [XYShape validate Ys is not finite. Example value: Infinity]", + ), + ) + }) + describe("logScorePoint", () => { makeTest("When identical", XYShape.logScorePoint(30, pointSetDist1, pointSetDist1), Some(0.0)) makeTest( @@ -32,16 +50,6 @@ describe("XYShapes", () => { Some(210.3721280423322), ) }) - // describe("transverse", () => { - // makeTest( - // "When very different", - // XYShape.Transversal._transverse( - // (aCurrent, aLast) => aCurrent +. aLast, - // [|1.0, 2.0, 3.0, 4.0|], - // ), - // [|1.0, 3.0, 6.0, 10.0|], - // ) - // }); describe("integrateWithTriangles", () => makeTest( "integrates correctly", diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index af3d9f7f..aab3d160 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -500,7 +500,11 @@ module A = { let getBelowZero = (t: t) => Belt.Array.getBy(t, r => r < 0.0) let isSorted = (t: t): bool => - reduce(zip(t, tail(t)), true, (acc, (first, second)) => acc && first < second) + if Array.length(t) < 1 { + true + } else { + reduce(zip(t, tail(t)), true, (acc, (first, second)) => acc && first < second) + } //Passing true for the exclusive parameter excludes both endpoints of the range. //https://jstat.github.io/all.html @@ -618,7 +622,7 @@ module A = { module A2 = { let fmap = (a, b) => A.fmap(b, a) let joinWith = (a, b) => A.joinWith(b, a) - let filter = (a,b) => A.filter(b, a) + let filter = (a, b) => A.filter(b, a) } module JsArray = { diff --git a/packages/squiggle-lang/src/rescript/Utility/Errors.res b/packages/squiggle-lang/src/rescript/Utility/Errors.res index 6f52b21c..bdd41869 100644 --- a/packages/squiggle-lang/src/rescript/Utility/Errors.res +++ b/packages/squiggle-lang/src/rescript/Utility/Errors.res @@ -20,10 +20,12 @@ let rec toString = (t: error) => | NotSorted({fnName, propertyName}) => `${fnName} ${propertyName} is not sorted` | IsEmpty({fnName, propertyName}) => `${fnName} ${propertyName} is empty` | NotFinite({fnName, propertyName}, exampleValue) => - `${fnName} ${propertyName} is not finite. Example value: ${E.Float.toString(exampleValue)}` + `${fnName} ${propertyName} is not finite. Example value: ${E.Float.toString(exampleValue)}` | DifferentLengths({fnName, p1Name, p2Name, p1Length, p2Length}) => `${fnName} ${p1Name} and ${p2Name} have different lengths. ${p1Name} has length ${E.I.toString( p1Length, )} and ${p2Name} has length ${E.I.toString(p2Length)}` - | Multiple(errors) => `Multiple Errors: ${E.A2.fmap(errors, toString) |> E.A.joinWith(", ")}` + | Multiple(errors) => + `Multiple Errors: ${E.A2.fmap(errors, toString)->E.A2.fmap(r => `[${r}]`) + |> E.A.joinWith(", ")}` } diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index 9368c1ee..1d96a3ee 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -60,41 +60,40 @@ module T = { let fromZippedArray = (pairs: array<(float, float)>): t => pairs |> Belt.Array.unzip |> fromArray let equallyDividedXs = (t: t, newLength) => E.A.Floats.range(minX(t), maxX(t), newLength) let toJs = (t: t) => {"xs": t.xs, "ys": t.ys} -} -module Validator = { - type t = T.t - let fnName = "XYShape validate" - let property = (propertyName: string): Errors.property => { - fnName: fnName, - propertyName: propertyName, - } - let notSortedError = (p: string): Errors.error => NotSorted(property(p)) - let notFiniteError = (p, exampleValue): Errors.error => NotFinite(property(p), exampleValue) - let isEmptyError = (propertyName): Errors.error => IsEmpty(property(propertyName)) - let differentLengthsError = (t): Errors.error => DifferentLengths({ - fnName: fnName, - p1Name: "Xs", - p2Name: "Ys", - p1Length: E.A.length(T.xs(t)), - p2Length: E.A.length(T.ys(t)), - }) + module Validator = { + let fnName = "XYShape validate" + let property = (propertyName: string): Errors.property => { + fnName: fnName, + propertyName: propertyName, + } + let notSortedError = (p: string): Errors.error => NotSorted(property(p)) + let notFiniteError = (p, exampleValue): Errors.error => NotFinite(property(p), exampleValue) + let isEmptyError = (propertyName): Errors.error => IsEmpty(property(propertyName)) + let differentLengthsError = (t): Errors.error => DifferentLengths({ + fnName: fnName, + p1Name: "Xs", + p2Name: "Ys", + p1Length: E.A.length(xs(t)), + p2Length: E.A.length(ys(t)), + }) - let areXsSorted = (t: t) => E.A.Floats.isSorted(T.xs(t)) - let areXsEmpty = (t: t) => E.A.length(t.xs) == 0 - let getNonFiniteXs = (t: t) => t->T.xs->E.A.Floats.getNonFinite - let getNonFiniteYs = (t: t) => t->T.ys->E.A.Floats.getNonFinite + let areXsSorted = (t: t) => E.A.Floats.isSorted(xs(t)) + let areXsEmpty = (t: t) => E.A.length(xs(t)) == 0 + let getNonFiniteXs = (t: t) => t->xs->E.A.Floats.getNonFinite + let getNonFiniteYs = (t: t) => t->ys->E.A.Floats.getNonFinite - let validate = (t: t) => { - let xsNotSorted = areXsSorted(t) ? None : Some(notSortedError("Xs")) - let xsEmpty = areXsEmpty(t) ? None : Some(isEmptyError("Xs")) - let differentLengths = - E.A.length(T.xs(t)) !== E.A.length(T.ys(t)) ? Some(differentLengthsError(t)) : None - let xsNotFinite = getNonFiniteXs(t)->E.O2.fmap(notFiniteError("Xs")) - let ysNotFinite = getNonFiniteYs(t)->E.O2.fmap(notFiniteError("Ys")) - [xsNotSorted, xsEmpty, differentLengths, xsNotFinite, ysNotFinite] - ->E.A.O.concatSomes - ->Errors.mapErrorArrayToError + let validate = (t: t) => { + let xsNotSorted = areXsSorted(t) ? None : Some(notSortedError("Xs")) + let xsEmpty = areXsEmpty(t) ? Some(isEmptyError("Xs")) : None + let differentLengths = + E.A.length(xs(t)) !== E.A.length(ys(t)) ? Some(differentLengthsError(t)) : None + let xsNotFinite = getNonFiniteXs(t)->E.O2.fmap(notFiniteError("Xs")) + let ysNotFinite = getNonFiniteYs(t)->E.O2.fmap(notFiniteError("Ys")) + [xsNotSorted, xsEmpty, differentLengths, xsNotFinite, ysNotFinite] + ->E.A.O.concatSomes + ->Errors.mapErrorArrayToError + } } } From 00f862725cdac0083a6130620ba8605eabf92b8f Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Thu, 28 Apr 2022 18:59:15 +0000 Subject: [PATCH 25/43] Add Dictionary Viewer and Recursive Array viewer --- .../src/components/SquiggleChart.tsx | 13 ++ packages/squiggle-lang/src/js/index.ts | 148 +++++++++++++++++- 2 files changed, 158 insertions(+), 3 deletions(-) diff --git a/packages/components/src/components/SquiggleChart.tsx b/packages/components/src/components/SquiggleChart.tsx index 534d164d..7dda92e4 100644 --- a/packages/components/src/components/SquiggleChart.tsx +++ b/packages/components/src/components/SquiggleChart.tsx @@ -44,6 +44,8 @@ export const VariableBox: React.FC<{ ); }; +let RecordKeyHeader = styled.h3``; + export interface SquiggleItemProps { /** The input string for squiggle */ expression: squiggleExpression; @@ -104,6 +106,17 @@ const SquiggleItem: React.FC = ({ ))} ); + case "record": + return ( + + {Object.entries(expression.value).map(([key, r]) => ( + <> + {key} + + + ))} + + ); default: return ( diff --git a/packages/squiggle-lang/src/js/index.ts b/packages/squiggle-lang/src/js/index.ts index 6ff022e0..57c09e1a 100644 --- a/packages/squiggle-lang/src/js/index.ts +++ b/packages/squiggle-lang/src/js/index.ts @@ -50,6 +50,67 @@ export let defaultSamplingInputs: samplingParams = { xyPointLength: 10000, }; +import type { t as SampleSetDist_t } from "../rescript/Distributions/SampleSetDist/SampleSetDist.gen"; +import type { mixedShape } from "../rescript/Distributions/PointSetDist/PointSetTypes.gen"; + +import type { symbolicDist as SymbolicDistTypes_symbolicDist } from "../rescript/Distributions/SymbolicDist/SymbolicDistTypes.gen"; + +type rescriptPointSetDist = + | { + TAG: 0; // Mixed + _0: mixedShape; + } + | { + TAG: 1; // Discrete + _0: discreteShape; + } + | { + TAG: 2; // ContinuousShape + _0: continuousShape; + }; + +type rescriptDist = + | { TAG: 0; _0: rescriptPointSetDist } + | { TAG: 1; _0: SampleSetDist_t } + | { TAG: 2; _0: SymbolicDistTypes_symbolicDist }; + +// This is a raw rescript export. genType for some reason only converts half +// the data structure into the format it claims it is. This here is so that +// we can be guided in converting the other half +type rescriptExport = + | { + TAG: 0; // EvArray + _0: rescriptExport[]; + } + | { + TAG: 1; // EvBool + _0: boolean; + } + | { + TAG: 2; // EvCall + _0: string; + } + | { + TAG: 3; // EvDistribution + _0: rescriptDist; + } + | { + TAG: 4; // EvNumber + _0: number; + } + | { + TAG: 5; // EvRecord + _0: { [key: string]: rescriptExport }; + } + | { + TAG: 6; // EvString + _0: string; + } + | { + TAG: 7; // EvSymbol + _0: string; + }; + export type result = | { tag: "Ok"; @@ -90,6 +151,7 @@ export type squiggleExpression = | tagged<"distribution", Distribution> | tagged<"number", number> | tagged<"record", { [key: string]: squiggleExpression }>; + export function run( squiggleString: string, samplingInputs?: samplingParams @@ -101,6 +163,63 @@ export function run( return resultMap(result, (x) => createTsExport(x, si)); } +// Recript half converts recursive data structures +function convertRawToTypescript( + result: rescriptExport, + sampEnv: samplingParams +): squiggleExpression { + switch (result.TAG) { + case 0: // EvArray + return tag( + "array", + result._0.map((x) => convertRawToTypescript(x, sampEnv)) + ); + case 1: // EvBool + return tag("boolean", result._0); + case 2: // EvCall + return tag("call", result._0); + case 3: // EvDistribution + return tag( + "distribution", + new Distribution( + convertRawDistributionToGenericDist(result._0), + sampEnv + ) + ); + case 4: // EvNumber + return tag("number", result._0); + case 5: // EvRecord + return tag( + "record", + _.mapValues(result._0, (x) => convertRawToTypescript(x, sampEnv)) + ); + case 6: // EvString + return tag("string", result._0); + case 7: // EvSymbol + return tag("symbol", result._0); + } +} + +function convertRawDistributionToGenericDist( + result: rescriptDist +): genericDist { + switch (result.TAG) { + case 0: // Point Set Dist + switch (result._0.TAG) { + case 0: // Mixed + return tag("PointSet", tag("Mixed", result._0._0)); + case 1: // Discrete + return tag("PointSet", tag("Discrete", result._0._0)); + case 2: // Continuous + return tag("PointSet", tag("Continuous", result._0._0)); + } + case 1: // Sample Set Dist + return tag("SampleSet", result._0); + case 2: // Symbolic Dist + return tag("Symbolic", result._0); + } +} + function createTsExport( x: expressionValue, sampEnv: samplingParams @@ -109,7 +228,27 @@ function createTsExport( case "EvArray": return tag( "array", - x.value.map((x) => createTsExport(x, sampEnv)) + x.value.map((arrayItem): squiggleExpression => { + switch (arrayItem.tag) { + case "EvRecord": + return tag( + "record", + _.mapValues(arrayItem.value, (recordValue: unknown) => + convertRawToTypescript(recordValue as rescriptExport, sampEnv) + ) + ); + case "EvArray": + let y = arrayItem.value as unknown as rescriptExport[]; + return tag( + "array", + y.map((childArrayItem) => + convertRawToTypescript(childArrayItem, sampEnv) + ) + ); + default: + return createTsExport(arrayItem, sampEnv); + } + }) ); case "EvBool": return tag("boolean", x.value); @@ -120,10 +259,13 @@ function createTsExport( case "EvNumber": return tag("number", x.value); case "EvRecord": - return tag( + let result: tagged<"record", { [key: string]: squiggleExpression }> = tag( "record", - _.mapValues(x.value, (x) => createTsExport(x, sampEnv)) + _.mapValues(x.value, (x: unknown) => + convertRawToTypescript(x as rescriptExport, sampEnv) + ) ); + return result; case "EvString": return tag("string", x.value); case "EvSymbol": From 95a4bac49bf19801b9e3bed690e9b88c847ab427 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 15:01:57 -0400 Subject: [PATCH 26/43] Added NaN to test to make sure its caught --- packages/squiggle-lang/__tests__/XYShape_test.res | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/squiggle-lang/__tests__/XYShape_test.res b/packages/squiggle-lang/__tests__/XYShape_test.res index 9f5be4fd..c63e1ce2 100644 --- a/packages/squiggle-lang/__tests__/XYShape_test.res +++ b/packages/squiggle-lang/__tests__/XYShape_test.res @@ -28,11 +28,11 @@ describe("XYShapes", () => { ) makeTest( "when not sorted, different lengths, and not finite", - XYShape.T.Validator.validate({xs: [2.0, 1.0, infinity, 0.0], ys: [3.0, infinity]})->E.O2.fmap( + XYShape.T.Validator.validate({xs: [2.0, 1.0, infinity, 0.0], ys: [3.0, Js.Float._NaN]})->E.O2.fmap( Errors.toString, ), Some( - "Multiple Errors: [XYShape validate Xs is not sorted], [XYShape validate Xs and Ys have different lengths. Xs has length 4 and Ys has length 2], [XYShape validate Xs is not finite. Example value: Infinity], [XYShape validate Ys is not finite. Example value: Infinity]", + "Multiple Errors: [XYShape validate Xs is not sorted], [XYShape validate Xs and Ys have different lengths. Xs has length 4 and Ys has length 2], [XYShape validate Xs is not finite. Example value: Infinity], [XYShape validate Ys is not finite. Example value: NaN]", ), ) }) From 44215f540f4e3512392859394d671275d36d712a Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 15:20:58 -0400 Subject: [PATCH 27/43] v0.2.6: packaging fixed Value: [1e-1 to 8e-1] --- packages/squiggle-lang/.npmignore | 1 - packages/squiggle-lang/package.json | 16 +++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/squiggle-lang/.npmignore b/packages/squiggle-lang/.npmignore index bfbe051d..2d3f13c3 100644 --- a/packages/squiggle-lang/.npmignore +++ b/packages/squiggle-lang/.npmignore @@ -2,7 +2,6 @@ node_modules shell.nix .cache .direnv -src __tests__ lib examples diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index 75583bfc..a2a79a4f 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -1,10 +1,10 @@ { "name": "@quri/squiggle-lang", - "version": "0.2.5", + "version": "0.2.6", "homepage": "https://squiggle-language.com", "licence": "MIT", "scripts": { - "build": "rescript build -with-deps", + "build": "rescript build -with-deps && tsc", "bundle": "webpack", "start": "rescript build -w -with-deps", "clean": "rescript clean", @@ -31,11 +31,15 @@ ], "author": "Quantified Uncertainty Research Institute", "license": "MIT", + "dependencies": { + "rescript": "^9.1.4", + "jstat": "^1.9.5", + "pdfast": "^0.2.0", + "mathjs": "10.5.0" + }, "devDependencies": { "bisect_ppx": "^2.7.1", - "jstat": "^1.9.5", "lodash": "4.17.21", - "rescript": "^9.1.4", "rescript-fast-check": "^1.1.1", "@glennsl/rescript-jest": "^0.9.0", "@istanbuljs/nyc-config-typescript": "^1.0.2", @@ -46,10 +50,8 @@ "fast-check": "2.25.0", "gentype": "^4.3.0", "jest": "^27.5.1", - "mathjs": "10.5.0", "moduleserve": "0.9.1", "nyc": "^15.1.0", - "pdfast": "^0.2.0", "reanalyze": "^2.19.0", "ts-jest": "^27.1.4", "ts-loader": "^9.2.8", @@ -59,6 +61,6 @@ "webpack-cli": "^4.9.2" }, "source": "./src/js/index.ts", - "main": "./dist/bundle.js", + "main": "./dist/src/js/index.js", "types": "./dist/js/index.d.ts" } From e499c1a887299a0e7ba94fefb9af1820642b3cc2 Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Thu, 28 Apr 2022 20:16:31 +0000 Subject: [PATCH 28/43] Add tests for deeply nested and records --- .../squiggle-lang/__tests__/TS/JS_test.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/squiggle-lang/__tests__/TS/JS_test.ts b/packages/squiggle-lang/__tests__/TS/JS_test.ts index 1974dee6..43f981eb 100644 --- a/packages/squiggle-lang/__tests__/TS/JS_test.ts +++ b/packages/squiggle-lang/__tests__/TS/JS_test.ts @@ -42,6 +42,39 @@ describe("Log function", () => { }); }); +describe("Array", () => { + test("nested Array", () => { + expect(testRun("[[1]]")).toEqual({ + tag: "array", + value: [ + { + tag: "array", + value: [ + { + tag: "number", + value: 1, + }, + ], + }, + ], + }); + }); +}); + +describe("Record", () => { + test("Return record", () => { + expect(testRun("{a: 1}")).toEqual({ + tag: "record", + value: { + a: { + tag: "number", + value: 1, + }, + }, + }); + }); +}); + describe("Distribution", () => { //It's important that sampleCount is less than 9. If it's more, than that will create randomness //Also, note, the value should be created using makeSampleSetDist() later on. From de8eb76f4e84c5a84443fd984f884f43f9cfe839 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 16:19:40 -0400 Subject: [PATCH 29/43] v0.2.13: packaging works Value: [2e-1 to 8e-1] --- packages/components/package.json | 23 +- packages/squiggle-lang/package.json | 2 +- yarn.lock | 909 ++++++++++++++++------------ 3 files changed, 551 insertions(+), 383 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index d895d545..5d21b9cc 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,12 +1,19 @@ { "name": "@quri/squiggle-components", - "version": "0.2.9", - "licence": "MIT", + "version": "0.2.13", + "license": "MIT", "dependencies": { "antd": "^4.20.1", "react-ace": "10.1.0", + "@quri/squiggle-lang": "0.2.6", "react-dom": "^18.1.0", + "vega": "^5.22.1", + "vega-embed": "^6.20.6", + "vega-lite": "^5.2.0", + "react-vega": "^7.5.0", + "react": "^18.1.0", "@react-hook/size": "^2.1.2", + "lodash": "^4.17.21", "styled-components": "^5.3.5" }, "devDependencies": { @@ -26,31 +33,25 @@ "webpack": "^5.72.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.8.1", - "@quri/squiggle-lang": "0.2.5", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.1.1", "@testing-library/user-event": "^14.1.1", "@types/jest": "^27.4.0", + "web-vitals": "^2.1.4", "@types/lodash": "^4.14.182", "@types/node": "^17.0.29", "@types/react": "^18.0.3", "@types/react-dom": "^18.0.2", "cross-env": "^7.0.3", - "lodash": "^4.17.21", - "react": "^18.1.0", "react-scripts": "5.0.1", - "react-vega": "^7.5.0", "tsconfig-paths-webpack-plugin": "^3.5.2", "typescript": "^4.6.3", - "vega": "^5.22.1", - "vega-embed": "^6.20.6", - "vega-lite": "^5.2.0", - "web-vitals": "^2.1.4", "webpack-cli": "^4.9.2" }, "scripts": { "start": "cross-env REACT_APP_FAST_REFRESH=false && start-storybook -p 6006 -s public", "build": "tsc -b && build-storybook -s public", + "build:package": "tsc -b", "bundle": "webpack", "all": "yarn bundle && yarn build", "lint": "prettier --check .", @@ -88,6 +89,6 @@ "@types/react": "17.0.43" }, "source": "./src/index.ts", - "main": "dist/bundle.js", + "main": "dist/src/index.js", "types": "dist/src/index.d.ts" } diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index a2a79a4f..f5002481 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -7,7 +7,7 @@ "build": "rescript build -with-deps && tsc", "bundle": "webpack", "start": "rescript build -w -with-deps", - "clean": "rescript clean", + "clean": "rescript clean && rm -r dist", "test:reducer": "jest __tests__/Reducer*/", "benchmark": "ts-node benchmark/conversion_tests.ts", "test": "jest", diff --git a/yarn.lock b/yarn.lock index 283b1121..4ce8009f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -131,11 +131,12 @@ "@algolia/requester-common" "4.13.0" "@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== dependencies: - "@jridgewell/trace-mapping" "^0.3.0" + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" "@ant-design/colors@^6.0.0": version "6.0.0" @@ -1351,7 +1352,7 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== -"@csstools/postcss-color-function@^1.0.3": +"@csstools/postcss-color-function@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" integrity sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA== @@ -1381,7 +1382,7 @@ "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-is-pseudo-class@^2.0.1": +"@csstools/postcss-is-pseudo-class@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz#a834ca11a43d6ed9bc9e3ff53c80d490a4b1aaad" integrity sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA== @@ -1395,7 +1396,7 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^1.0.2": +"@csstools/postcss-oklab-function@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" integrity sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww== @@ -1920,10 +1921,10 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@eslint/eslintrc@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" - integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== +"@eslint/eslintrc@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.2.tgz#4989b9e8c0216747ee7cca314ae73791bb281aae" + integrity sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1992,7 +1993,7 @@ dependencies: "@istanbuljs/schema" "^0.1.2" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -2009,6 +2010,18 @@ jest-util "^27.5.1" slash "^3.0.0" +"@jest/console@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.0.2.tgz#d11e8b43ae431ae9b3112656848417ae4008fcad" + integrity sha512-tiRpnMeeyQuuzgL5UNSeiqMwF8UOWPbAE5rzcu/1zyq4oPG2Ox6xm4YCOruwbp10F8odWc+XwVxTyGzMSLMqxA== + dependencies: + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.0.2" + jest-util "^28.0.2" + slash "^3.0.0" + "@jest/core@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" @@ -2105,6 +2118,13 @@ terminal-link "^2.0.0" v8-to-istanbul "^8.1.0" +"@jest/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + "@jest/source-map@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" @@ -2124,6 +2144,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-result@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.0.2.tgz#bc8e15a95347e3c2149572ae06a5a6fed939c522" + integrity sha512-4EUqgjq9VzyUiVTvZfI9IRJD6t3NYBNP4f+Eq8Zr93+hkJ0RrGU4OBTw8tfNzidKX+bmuYzn8FxqpxOPIGGCMA== + dependencies: + "@jest/console" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + "@jest/test-sequencer@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" @@ -2198,20 +2228,45 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" +"@jest/types@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.0.2.tgz#70b9538c1863fb060b2f438ca008b5563d00c5b4" + integrity sha512-hi3jUdm9iht7I2yrV5C4s3ucCJHUP8Eh3W6rQ1s4n/Qw9rQgsda4eqCt+r3BKRi7klVmZfQlMx1nGlzNMP2d8A== + dependencies: + "@jest/schemas" "^28.0.2" + "@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/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz#4ac237f4dabc8dd93330386907b97591801f7352" + integrity sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw== + +"@jridgewell/set-array@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.0.tgz#1179863356ac8fbea64a5a4bcde93a4871012c01" + integrity sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg== "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== +"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -2345,6 +2400,19 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== +"@quri/squiggle-lang@0.2.5": + version "0.2.5" + resolved "https://registry.yarnpkg.com/@quri/squiggle-lang/-/squiggle-lang-0.2.5.tgz#368f0644290a0265696db7547ea31b0a0b55a69e" + integrity sha512-yBCqjieirDE4oDZVICGQh2r1A6vS6GM5y8Pc0IhHGnNBbs230iA/b+eytQTGbEE7yVEvHbDNBUoiB+B7sCPzaQ== + dependencies: + bisect_ppx "^2.7.1" + jstat "^1.9.5" + lodash "4.17.21" + mathjs "10.5.0" + pdfast "^0.2.0" + rationale "0.2.0" + rescript "^9.1.4" + "@react-hook/latest@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@react-hook/latest/-/latest-1.0.3.tgz#c2d1d0b0af8b69ec6e2b3a2412ba0768ac82db80" @@ -2412,9 +2480,9 @@ picomatch "^2.2.2" "@rushstack/eslint-patch@^1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.2.tgz#7a26e63b1bdaf654bcce2176a38b83f7f576327e" - integrity sha512-oe5WJEDaVsW8fBlGT7udrSCgOwWfoYHQOmSpnh8X+0GXpqqcRCP8k4y+Dxb0taWJDPpB+rdDUtumIiBwkY9qGA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz#6801033be7ff87a6b7cadaf5b337c9f366a3c4b0" + integrity sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw== "@ryyppy/rescript-promise@^2.1.0": version "2.1.0" @@ -2438,6 +2506,11 @@ resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== +"@sinclair/typebox@^0.23.3": + version "0.23.4" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.4.tgz#6ff93fd2585ce44f7481c9ff6af610fbb5de98a4" + integrity sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg== + "@sindresorhus/is@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" @@ -3758,9 +3831,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.0.tgz#7a9b80f712fe2052bc20da153ff1e552404d8e4b" - integrity sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA== + version "7.17.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314" + integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA== dependencies: "@babel/types" "^7.3.0" @@ -4004,9 +4077,9 @@ integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA== "@types/node@^14.0.10": - version "14.18.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.13.tgz#6ad4d9db59e6b3faf98dcfe4ca9d2aec84443277" - integrity sha512-Z6/KzgyWOga3pJNS42A+zayjhPbf2zM3hegRQaOPnLOzEi86VV++6FLDWgR1LGrVCRufP/ph2daa3tEa5br1zA== + version "14.18.16" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.16.tgz#878f670ba3f00482bf859b6550b6010610fc54b5" + integrity sha512-X3bUMdK/VmvrWdoTkz+VCn6nwKwrKCFTHtqwBIaQJNx4RUIBBUFXM00bqPz/DsDd+Icjmzm6/tyYZzeGVqb6/Q== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -4131,10 +4204,10 @@ dependencies: "@types/node" "*" -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== "@types/sax@^1.2.1": version "1.2.4" @@ -4219,9 +4292,9 @@ integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== "@types/webpack-env@^1.16.0": - version "1.16.3" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.3.tgz#b776327a73e561b71e7881d0cd6d34a1424db86a" - integrity sha512-9gtOPPkfyNoEqCQgx4qJKkuNm/x0R2hKR7fdl7zvTJyHnIisuE/LfvXOsYWL0o3qq6uiBnKZNNNzi3l0y/X+xw== + version "1.16.4" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.16.4.tgz#1f4969042bf76d7ef7b5914f59b3b60073f4e1f4" + integrity sha512-llS8qveOUX3wxHnSykP5hlYFFuMfJ9p5JvIyCiBgp7WTfl6K5ZcyHj8r8JsN/J6QODkAsRRCLIcTuOCu8etkUw== "@types/webpack-sources@*": version "3.2.0" @@ -4279,14 +4352,21 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.5.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.19.0.tgz#9608a4b6d0427104bccf132f058cba629a6553c0" - integrity sha512-w59GpFqDYGnWFim9p6TGJz7a3qWeENJuAKCqjGSx+Hq/bwq3RZwXYqy98KIfN85yDqz9mq6QXiY5h0FjGQLyEg== +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== dependencies: - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/type-utils" "5.19.0" - "@typescript-eslint/utils" "5.19.0" + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz#bfc22e0191e6404ab1192973b3b4ea0461c1e878" + integrity sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg== + dependencies: + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/type-utils" "5.21.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -4295,75 +4375,75 @@ tsutils "^3.21.0" "@typescript-eslint/experimental-utils@^5.0.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.19.0.tgz#b7c8f1e22624d4f3d1b3683438530f5636086cb7" - integrity sha512-F+X/TTzmb2UXbghY1LrNLNDjMcGZMhKzXuzvu0xD+YEB77EamLM7zMOLuz2kP5807IJRDLBoAFFPYa7HT62sYg== + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.21.0.tgz#489275ca792f5de7e0d1f4be1f15576ea56b6ca2" + integrity sha512-mzF6ert/6iQoESV0z9v5/mEaJRKL4fv68rHoZ6exM38xjxkw4MNx54B7ferrnMTM/GIRKLDaJ3JPRi+Dxa5Hlg== dependencies: - "@typescript-eslint/utils" "5.19.0" + "@typescript-eslint/utils" "5.21.0" "@typescript-eslint/parser@^5.5.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.19.0.tgz#05e587c1492868929b931afa0cb5579b0f728e75" - integrity sha512-yhktJjMCJX8BSBczh1F/uY8wGRYrBeyn84kH6oyqdIJwTGKmzX5Qiq49LRQ0Jh0LXnWijEziSo6BRqny8nqLVQ== + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.21.0.tgz#6cb72673dbf3e1905b9c432175a3c86cdaf2071f" + integrity sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg== dependencies: - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/typescript-estree" "5.19.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/typescript-estree" "5.21.0" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.19.0.tgz#97e59b0bcbcb54dbcdfba96fc103b9020bbe9cb4" - integrity sha512-Fz+VrjLmwq5fbQn5W7cIJZ066HxLMKvDEmf4eu1tZ8O956aoX45jAuBB76miAECMTODyUxH61AQM7q4/GOMQ5g== +"@typescript-eslint/scope-manager@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz#a4b7ed1618f09f95e3d17d1c0ff7a341dac7862e" + integrity sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ== dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" -"@typescript-eslint/type-utils@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.19.0.tgz#80f2125b0dfe82494bbae1ea99f1c0186d420282" - integrity sha512-O6XQ4RI4rQcBGshTQAYBUIGsKqrKeuIOz9v8bckXZnSeXjn/1+BDZndHLe10UplQeJLXDNbaZYrAytKNQO2T4Q== +"@typescript-eslint/type-utils@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz#ff89668786ad596d904c21b215e5285da1b6262e" + integrity sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw== dependencies: - "@typescript-eslint/utils" "5.19.0" + "@typescript-eslint/utils" "5.21.0" debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/types@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.19.0.tgz#12d3d600d754259da771806ee8b2c842d3be8d12" - integrity sha512-zR1ithF4Iyq1wLwkDcT+qFnhs8L5VUtjgac212ftiOP/ZZUOCuuF2DeGiZZGQXGoHA50OreZqLH5NjDcDqn34w== +"@typescript-eslint/types@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.21.0.tgz#8cdb9253c0dfce3f2ab655b9d36c03f72e684017" + integrity sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA== -"@typescript-eslint/typescript-estree@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.19.0.tgz#fc987b8f62883f9ea6a5b488bdbcd20d33c0025f" - integrity sha512-dRPuD4ocXdaE1BM/dNR21elSEUPKaWgowCA0bqJ6YbYkvtrPVEvZ+zqcX5a8ECYn3q5iBSSUcBBD42ubaOp0Hw== +"@typescript-eslint/typescript-estree@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz#9f0c233e28be2540eaed3df050f0d54fb5aa52de" + integrity sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg== dependencies: - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/visitor-keys" "5.19.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/visitor-keys" "5.21.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.19.0", "@typescript-eslint/utils@^5.13.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.19.0.tgz#fe87f1e3003d9973ec361ed10d36b4342f1ded1e" - integrity sha512-ZuEckdupXpXamKvFz/Ql8YnePh2ZWcwz7APICzJL985Rp5C2AYcHO62oJzIqNhAMtMK6XvrlBTZeNG8n7gS3lQ== +"@typescript-eslint/utils@5.21.0", "@typescript-eslint/utils@^5.13.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.21.0.tgz#51d7886a6f0575e23706e5548c7e87bce42d7c18" + integrity sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.19.0" - "@typescript-eslint/types" "5.19.0" - "@typescript-eslint/typescript-estree" "5.19.0" + "@typescript-eslint/scope-manager" "5.21.0" + "@typescript-eslint/types" "5.21.0" + "@typescript-eslint/typescript-estree" "5.21.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.19.0": - version "5.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.19.0.tgz#c84ebc7f6c744707a361ca5ec7f7f64cd85b8af6" - integrity sha512-Ym7zZoMDZcAKWsULi2s7UMLREdVQdScPQ/fKWMYefarCztWlHPFVJo8racf8R0Gc8FAEJ2eD4of8As1oFtnQlQ== +"@typescript-eslint/visitor-keys@5.21.0": + version "5.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz#453fb3662409abaf2f8b1f65d515699c888dd8ae" + integrity sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA== dependencies: - "@typescript-eslint/types" "5.19.0" + "@typescript-eslint/types" "5.21.0" eslint-visitor-keys "^3.0.0" "@webassemblyjs/ast@1.11.1": @@ -4660,9 +4740,9 @@ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + version "2.0.6" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" @@ -4725,9 +4805,9 @@ acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== address@^1.0.1, address@^1.1.2: version "1.1.2" @@ -5221,10 +5301,10 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== -async-validator@^4.0.2: - version "4.0.7" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" - integrity sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ== +async-validator@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.1.1.tgz#3cd1437faa2de64743f7d56649dd904c946a18fe" + integrity sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA== async@^2.6.2: version "2.6.4" @@ -5253,13 +5333,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.3.7, autoprefixer@^10.4.4: - version "10.4.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.4.tgz#3e85a245b32da876a893d3ac2ea19f01e7ea5a1e" - integrity sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA== +autoprefixer@^10.3.7, autoprefixer@^10.4.4, autoprefixer@^10.4.5: + version "10.4.5" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.5.tgz#662193c744094b53d3637f39be477e07bd904998" + integrity sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw== dependencies: browserslist "^4.20.2" - caniuse-lite "^1.0.30001317" + caniuse-lite "^1.0.30001332" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -5319,9 +5399,9 @@ babel-jest@^27.4.2, babel-jest@^27.5.1: slash "^3.0.0" babel-loader@^8.0.0, babel-loader@^8.2.3, babel-loader@^8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.4.tgz#95f5023c791b2e9e2ca6f67b0984f39c82ff384b" - integrity sha512-8dytA3gcvPPPv4Grjhnt8b5IIiTcq/zeXOPk4iTYI0SVXcsmuGg7JtBRDp8S9X+gJfhQ8ektjXZlDu1Bb33U8A== + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: find-cache-dir "^3.3.1" loader-utils "^2.0.0" @@ -5708,26 +5788,28 @@ bn.js@^5.0.0, bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" bonjour-service@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.11.tgz#5418e5c1ac91c89a406f853a942e7892829c0d89" - integrity sha512-drMprzr2rDTCtgEE3VgdA9uUFaUHF+jXduwYSThHJnKMYM+FhI9Z3ph+TX3xy0LtgYHae6CHYPJ/2UnK8nQHcA== + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== dependencies: array-flatten "^2.1.2" dns-equal "^1.0.0" @@ -5876,15 +5958,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: - version "4.20.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" - integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.20.2, browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== dependencies: - caniuse-lite "^1.0.30001317" - electron-to-chromium "^1.4.84" + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" escalade "^3.1.1" - node-releases "^2.0.2" + node-releases "^2.0.3" picocolors "^1.0.0" bs-logger@0.x: @@ -5941,22 +6023,22 @@ bytes@3.1.2: integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== c8@^7.6.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/c8/-/c8-7.11.0.tgz#b3ab4e9e03295a102c47ce11d4ef6d735d9a9ac9" - integrity sha512-XqPyj1uvlHMr+Y1IeRndC2X5P7iJzJlEJwBpCdBbq2JocXOgJfr+JVfJkyNMGROke5LfKrhSFXGFXnwnRJAUJw== + version "7.11.2" + resolved "https://registry.yarnpkg.com/c8/-/c8-7.11.2.tgz#2f2103e39079899041e612999a16b31d7ea6d463" + integrity sha512-6ahJSrhS6TqSghHm+HnWt/8Y2+z0hM/FQyB1ybKhAR30+NYL9CTQ1uwHxuWw6U7BHlHv6wvhgOrH81I+lfCkxg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@istanbuljs/schema" "^0.1.2" + "@istanbuljs/schema" "^0.1.3" find-up "^5.0.0" foreground-child "^2.0.0" - istanbul-lib-coverage "^3.0.1" + istanbul-lib-coverage "^3.2.0" istanbul-lib-report "^3.0.0" - istanbul-reports "^3.0.2" - rimraf "^3.0.0" + istanbul-reports "^3.1.4" + rimraf "^3.0.2" test-exclude "^6.0.0" - v8-to-istanbul "^8.0.0" + v8-to-istanbul "^9.0.0" yargs "^16.2.0" - yargs-parser "^20.2.7" + yargs-parser "^20.2.9" cacache@^12.0.2: version "12.0.4" @@ -6097,10 +6179,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001317: - version "1.0.30001332" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz#39476d3aa8d83ea76359c70302eafdd4a1d727dd" - integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001332: + version "1.0.30001334" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz#892e9965b35285033fc2b8a8eff499fe02f13d8b" + integrity sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw== capture-exit@^2.0.0: version "2.0.0" @@ -6680,10 +6762,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== copy-concurrently@^1.0.0: version "1.0.5" @@ -6727,17 +6809,17 @@ copy-webpack-plugin@^10.2.4: serialize-javascript "^6.0.0" core-js-compat@^3.20.2, core-js-compat@^3.21.0, core-js-compat@^3.8.1: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82" - integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g== + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.3.tgz#9b10d786052d042bc97ee8df9c0d1fb6a49c2005" + integrity sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw== dependencies: - browserslist "^4.19.1" + browserslist "^4.20.3" semver "7.0.0" core-js-pure@^3.20.2, core-js-pure@^3.8.1, core-js-pure@^3.8.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.3.tgz#181d1b6321fb29fe99c16a1f28beb840ab84ad36" + integrity sha512-oN88zz7nmKROMy8GOjs+LN+0LedIvbMdnB5XsTlhcOg1WGARt9l0LFg0zohdoFmCsEZ1h2ZbSQ6azj3M+vhzwQ== core-js@^2.4.0: version "2.6.12" @@ -6745,9 +6827,9 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.0.4, core-js@^3.19.2, core-js@^3.21.1, core-js@^3.6.5, core-js@^3.8.2: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== + version "3.22.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.3.tgz#498c41d997654cb00e81c7a54b44f0ab21ab01d5" + integrity sha512-1t+2a/d2lppW1gkLXx3pKPVGbBdxXAkqztvWb1EJ8oF8O2gIGiytzflNiFEehYwVK/t2ryUsGBoOFFvNx95mbg== core-util-is@~1.0.0: version "1.0.3" @@ -7332,9 +7414,9 @@ date-fns@2.x: integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== dayjs@1.x: - version "1.11.0" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805" - integrity sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug== + version "1.11.1" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.1.tgz#90b33a3dda3417258d48ad2771b415def6545eb0" + integrity sha512-ER7EjqVAMkRRsxNCC5YqJ9d9VQYuWdGt7aiH2qA5R5wt8ZmWaP2dLUSIK6y/kVzLMlmh1Tvu5xUf4M/wdGJ5KA== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -7429,11 +7511,12 @@ define-lazy-prop@^2.0.0: integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" @@ -7638,14 +7721,14 @@ doctrine@^3.0.0: esutils "^2.0.2" dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: - version "0.5.13" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.13.tgz#102ee5f25eacce09bdf1cfa5a298f86da473be4b" - integrity sha512-R305kwb5CcMDIpSHUnLyIAp7SrSPBx6F0VfQFB3M75xVMHhXJJIdePYgbPPh1o57vCHNu5QztokWUPsLjWzFqw== + version "0.5.14" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== dom-align@^1.7.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b" - integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg== + version "1.12.3" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.3.tgz#a36d02531dae0eefa2abb0c4db6595250526f103" + integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA== dom-converter@^0.2.0: version "0.2.0" @@ -7823,10 +7906,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.84: - version "1.4.107" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz#564257014ab14033b4403a309c813123c58a3fb9" - integrity sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg== +electron-to-chromium@^1.4.118: + version "1.4.124" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.124.tgz#e9015e234d8632920dcdf5480351da9e845ed220" + integrity sha512-VhaE9VUYU6d2eIb+4xf83CATD+T+3bTzvxvlADkQE+c2hisiw3sZmvEDtsW704+Zky9WZGhBuQXijDVqSriQLA== element-resize-detector@^1.2.2: version "1.2.4" @@ -7848,6 +7931,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -8028,9 +8116,9 @@ es-to-primitive@^1.2.1: is-symbol "^1.0.2" es5-shim@^4.5.13: - version "4.6.5" - resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.5.tgz#2124bb073b7cede2ed23b122a1fd87bb7b0bb724" - integrity sha512-vfQ4UAai8szn0sAubCy97xnZ4sJVDD1gt/Grn736hg8D7540wemIb1YPrYZSTqlM2H69EQX1or4HU/tSwRTI3w== + version "4.6.6" + resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.6.tgz#1e0e95bedfdcd933a2d4931a3ac6c79164f18de6" + integrity sha512-Ay5QQE78I2WKUoZVZjL0AIuiIjsmXwZGkyCTH9+n6J1anPbb0ymDA27ASa2Lt0rhOpAlEKy2W0d17gJ1XOQ5eQ== es6-error@^4.0.1: version "4.1.1" @@ -8178,9 +8266,9 @@ eslint-plugin-jsx-a11y@^6.5.1: minimatch "^3.0.4" eslint-plugin-react-hooks@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== eslint-plugin-react@^7.27.1: version "7.29.4" @@ -8262,11 +8350,11 @@ eslint-webpack-plugin@^3.1.1: schema-utils "^3.1.1" eslint@^8.3.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.13.0.tgz#6fcea43b6811e655410f5626cfcf328016badcd7" - integrity sha512-D+Xei61eInqauAyTJ6C0q6x9mx7kTUC1KZ0m0LSEexR0V+e94K12LmWX076ZIsldwfQ2RONdaJe0re0TRGQbRQ== + version "8.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.14.0.tgz#62741f159d9eb4a79695b28ec4989fcdec623239" + integrity sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw== dependencies: - "@eslint/eslintrc" "^1.2.1" + "@eslint/eslintrc" "^1.2.2" "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" @@ -8457,37 +8545,38 @@ expect@^27.5.1: jest-message-util "^27.5.1" express@^4.17.1, express@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== + version "4.18.0" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.0.tgz#7a426773325d0dd5406395220614c0db10b6e8e2" + integrity sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -8716,17 +8805,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: @@ -8843,9 +8932,9 @@ fork-ts-checker-webpack-plugin@^4.1.6: worker-rpc "^0.1.0" fork-ts-checker-webpack-plugin@^6.0.4, fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.1.tgz#fd689e2d9de6ac76abb620909eea56438cd0f232" - integrity sha512-x1wumpHOEf4gDROmKTaB6i4/Q6H3LwmjVO7fIX47vBwlZbtPjU33hgoMuD/Q/y6SU8bnuYSoN6ZQOLshGp0T/g== + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== dependencies: "@babel/code-frame" "^7.8.3" "@types/json-schema" "^7.0.5" @@ -8922,9 +9011,9 @@ fs-extra@^0.30.0: rimraf "^2.2.8" fs-extra@^10.0.0, fs-extra@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -9001,9 +9090,9 @@ functional-red-black-tree@^1.0.1: integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= functions-have-names@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.2.tgz#98d93991c39da9361f8e50b337c4f6e41f120e21" - integrity sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA== + 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== fuse.js@^3.6.1: version "3.6.1" @@ -9308,10 +9397,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +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" @@ -9330,6 +9419,13 @@ has-glob@^1.0.0: dependencies: is-glob "^3.0.0" +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-symbols@^1.0.1, 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" @@ -9756,9 +9852,9 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: debug "4" http-proxy-middleware@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -10092,9 +10188,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" @@ -10445,7 +10541,7 @@ isobject@^4.0.0: resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, istanbul-lib-coverage@^3.0.1, istanbul-lib-coverage@^3.2.0: +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1, 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== @@ -10468,9 +10564,9 @@ istanbul-lib-instrument@^4.0.0: semver "^6.3.0" istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" @@ -10509,7 +10605,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: +istanbul-reports@^3.0.2, istanbul-reports@^3.1.3, istanbul-reports@^3.1.4: version "3.1.4" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== @@ -10782,6 +10878,21 @@ jest-message-util@^27.5.1: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.0.2.tgz#f3cf36be72be4c4c4058cb34bd6673996d26dee3" + integrity sha512-knK7XyojvwYh1XiF2wmVdskgM/uN11KsjcEWWHfnMZNEdwXCrqB4sCBO94F4cfiAwCS8WFV6CDixDwPlMh/wdA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.0.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.0.2" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" @@ -10800,11 +10911,16 @@ jest-regex-util@^26.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== -jest-regex-util@^27.0.0, jest-regex-util@^27.5.1: +jest-regex-util@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-resolve-dependencies@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" @@ -10953,6 +11069,18 @@ jest-util@^27.0.0, jest-util@^27.5.1: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.0.2.tgz#8e22cdd6e0549e0a393055f0e2da7eacc334b143" + integrity sha512-EVdpIRCC8lzqhp9A0u0aAKlsFIzufK6xKxNK7awsnebTdOP4hpyQW5o6Ox2qPl8gbeUKYF+POLyItaND53kpGA== + dependencies: + "@jest/types" "^28.0.2" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" @@ -10966,19 +11094,19 @@ jest-validate@^27.5.1: pretty-format "^27.5.1" jest-watch-typeahead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz#4de2ca1eb596acb1889752afbab84b74fcd99173" - integrity sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== dependencies: ansi-escapes "^4.3.1" chalk "^4.0.0" - jest-regex-util "^27.0.0" - jest-watcher "^27.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" slash "^4.0.0" string-length "^5.0.1" strip-ansi "^7.0.1" -jest-watcher@^27.0.0, jest-watcher@^27.5.1: +jest-watcher@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== @@ -10991,6 +11119,20 @@ jest-watcher@^27.0.0, jest-watcher@^27.5.1: jest-util "^27.5.1" string-length "^4.0.1" +jest-watcher@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.0.2.tgz#649fa24df531d4071be5784b6274d494d788c88b" + integrity sha512-uIVJLpQ/5VTGQWBiBatHsi7jrCqHjHl0e0dFHMWzwuIfUbdW/muk0DtSr0fteY2T7QTFylv+7a5Rm8sBKrE12Q== + dependencies: + "@jest/test-result" "^28.0.2" + "@jest/types" "^28.0.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.0.2" + string-length "^4.0.1" + jest-worker@^26.2.1, jest-worker@^26.5.0, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -12050,9 +12192,9 @@ nan@^2.12.1: integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanoid@^3.1.23, nanoid@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" - integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== nanomatch@^1.2.9: version "1.2.13" @@ -12171,10 +12313,10 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" - integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== normalize-package-data@^2.5.0: version "2.5.0" @@ -12323,7 +12465,7 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-keys@^1.0.12, object-keys@^1.1.1: +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== @@ -12600,11 +12742,11 @@ p-map@^4.0.0: aggregate-error "^3.0.0" p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "^0.12.0" + "@types/retry" "0.12.0" retry "^0.13.1" p-timeout@^3.1.0: @@ -13009,7 +13151,7 @@ postcss-custom-media@^8.0.0: resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== -postcss-custom-properties@^12.1.5: +postcss-custom-properties@^12.1.7: version "12.1.7" resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz#ca470fd4bbac5a87fd868636dafc084bc2a78b41" integrity sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg== @@ -13127,7 +13269,7 @@ postcss-js@^4.0.0: dependencies: camelcase-css "^2.0.1" -postcss-lab-function@^4.1.2: +postcss-lab-function@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" integrity sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w== @@ -13299,7 +13441,7 @@ postcss-nested@5.0.6: dependencies: postcss-selector-parser "^6.0.6" -postcss-nesting@^10.1.3: +postcss-nesting@^10.1.4: version "10.1.4" resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.4.tgz#80de9d1c2717bc44df918dd7f118929300192a7a" integrity sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA== @@ -13409,20 +13551,20 @@ postcss-place@^7.0.4: postcss-value-parser "^4.2.0" postcss-preset-env@^7.0.1: - version "7.4.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz#fb1c8b4cb405da042da0ddb8c5eda7842c08a449" - integrity sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg== + version "7.4.4" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.4.4.tgz#069e34e31e2a7345154da7936b9fc1fcbdbd6d43" + integrity sha512-MqzSEx/QsvOk562iV9mLTgIvLFEOq1os9QBQfkgnq8TW6yKhVFPGh0gdXSK5ZlmjuNQEga6/x833e86XZF/lug== dependencies: - "@csstools/postcss-color-function" "^1.0.3" + "@csstools/postcss-color-function" "^1.1.0" "@csstools/postcss-font-format-keywords" "^1.0.0" "@csstools/postcss-hwb-function" "^1.0.0" "@csstools/postcss-ic-unit" "^1.0.0" - "@csstools/postcss-is-pseudo-class" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.2" "@csstools/postcss-normalize-display-values" "^1.0.0" - "@csstools/postcss-oklab-function" "^1.0.2" + "@csstools/postcss-oklab-function" "^1.1.0" "@csstools/postcss-progressive-custom-properties" "^1.3.0" - autoprefixer "^10.4.4" - browserslist "^4.20.2" + autoprefixer "^10.4.5" + browserslist "^4.20.3" css-blank-pseudo "^3.0.3" css-has-pseudo "^3.0.4" css-prefers-color-scheme "^6.0.3" @@ -13433,7 +13575,7 @@ postcss-preset-env@^7.0.1: postcss-color-hex-alpha "^8.0.3" postcss-color-rebeccapurple "^7.0.2" postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.1.5" + postcss-custom-properties "^12.1.7" postcss-custom-selectors "^6.0.0" postcss-dir-pseudo-class "^6.0.4" postcss-double-position-gradients "^3.1.1" @@ -13444,20 +13586,20 @@ postcss-preset-env@^7.0.1: postcss-gap-properties "^3.0.3" postcss-image-set-function "^4.0.6" postcss-initial "^4.0.1" - postcss-lab-function "^4.1.2" + postcss-lab-function "^4.2.0" postcss-logical "^5.0.4" postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.3" + postcss-nesting "^10.1.4" postcss-opacity-percentage "^1.1.2" postcss-overflow-shorthand "^3.0.3" postcss-page-break "^3.0.4" postcss-place "^7.0.4" - postcss-pseudo-class-any-link "^7.1.1" + postcss-pseudo-class-any-link "^7.1.2" postcss-replace-overflow-wrap "^4.0.0" postcss-selector-not "^5.0.0" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.1.1: +postcss-pseudo-class-any-link@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz#81ec491aa43f97f9015e998b7a14263b4630bdf0" integrity sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w== @@ -13610,6 +13752,16 @@ pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" +pretty-format@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.0.2.tgz#6a24d71cbb61a5e5794ba7513fe22101675481bc" + integrity sha512-UmGZ1IERwS3yY35LDMTaBUYI1w4udZDdJGGT/DqQeKG9ZLDn7/K2Jf/JtYSRiHCCKMHvUA+zsEGSmHdpaVp1yw== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -13625,7 +13777,12 @@ prism-react-renderer@^1.2.1, prism-react-renderer@^1.3.1: resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.3.1.tgz#88fc9d0df6bed06ca2b9097421349f8c2f24e30d" integrity sha512-xUeDMEz074d0zc5y6rxiMp/dlC7C+5IDDlaEUlcBOFE2wddz7hz5PNupb087mPwTt7T9BrFmewObfCBuf/LKwQ== -prismjs@^1.21.0, prismjs@^1.27.0, prismjs@~1.27.0: +prismjs@^1.21.0, prismjs@^1.27.0: + version "1.28.0" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" + integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== + +prismjs@~1.27.0: version "1.27.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== @@ -13695,7 +13852,7 @@ prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.7.2, 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== @@ -13803,12 +13960,7 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -qs@^6.10.0: +qs@6.10.3, qs@^6.10.0: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== @@ -13889,13 +14041,18 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +rationale@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rationale/-/rationale-0.2.0.tgz#555ed4f3cc7cd0245faeac041d3769f1857e4f3d" + integrity sha512-Pd8w5Inv1JhTfRyx03zs486CEAn6UKXvvOtxVRLsewngsBSffo3MQwUKYS75L/8vPt98wmf7iaZROx362/f7Bw== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -13908,9 +14065,9 @@ raw-loader@^4.0.2: schema-utils "^3.0.0" rc-align@^4.0.0: - version "4.0.11" - resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.11.tgz#8198c62db266bc1b8ef05e56c13275bf72628a5e" - integrity sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A== + version "4.0.12" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-4.0.12.tgz#065b5c68a1cc92a00800c9239320d9fdf5f16207" + integrity sha512-3DuwSJp8iC/dgHzwreOQl52soj40LchlfUHtgACOUtwGuoFIOVh6n/sCpfqCU8kO5+iz6qR0YKvjgB8iPdE3aQ== dependencies: "@babel/runtime" "^7.10.1" classnames "2.x" @@ -13970,9 +14127,9 @@ rc-drawer@~4.4.2: rc-util "^5.7.0" rc-dropdown@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.5.0.tgz#6ff2e6aaacd3641aa4040cfa941ab9634ad5f1ed" - integrity sha512-HHMpzO6AJt3I2jBG8fFK9LqFMQhHn/V09AzQnqCCV8Fp22tNCS98Obelcc4C8T6ZlZR+/w01im0BQVP3o1Y+Cw== + version "3.5.2" + resolved "https://registry.yarnpkg.com/rc-dropdown/-/rc-dropdown-3.5.2.tgz#2f1f4eeb36c07fb67cd599c0cb8e861da3de5527" + integrity sha512-Ty4LsXjkspZuFJSRx3blCLLCDicXM5qds6F1odgEa+jcjC+OJKHQGnvE4FqtoljPaqWm4wG78pbgXH6Ddh2DkA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.6" @@ -13980,18 +14137,18 @@ rc-dropdown@~3.5.0: rc-util "^5.17.0" rc-field-form@~1.26.1: - version "1.26.2" - resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.26.2.tgz#69d92811eed09f9e1f74704695b13253bb2ae534" - integrity sha512-Q1QdpLAt/kxd119kJwGfFvn/ZIzjzTBJsCscy5k0z3g+eRMHkI0Exij6SE2D42N7FAzVkvuXTvzqWSiFGeer7g== + version "1.26.3" + resolved "https://registry.yarnpkg.com/rc-field-form/-/rc-field-form-1.26.3.tgz#4050000eae0d879fde85672a965c9558ed6ff04b" + integrity sha512-wzQToAwdr8fiq/Nb1KFq+9WYFeALJXKwNGk5/MaCu1AUS7PpVQaN2anzVfWdVBFiiM2N+3DOh64JSOH8s1w3FQ== dependencies: "@babel/runtime" "^7.8.4" - async-validator "^4.0.2" + async-validator "^4.1.0" rc-util "^5.8.0" rc-image@~5.6.0: - version "5.6.1" - resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.6.1.tgz#60662a8fc0fe91d7ebd7fd5ee972d5b6226850e2" - integrity sha512-nmcobNCfmeevsep6eL7KNHVwFdLz4As4Vx0o90nnUFNzZ9Pqost1s10gOf4Wl6XW2iMR9LU6ztm5EazM7yA4Gg== + version "5.6.2" + resolved "https://registry.yarnpkg.com/rc-image/-/rc-image-5.6.2.tgz#31892b0b22aa5122fd9b1a067e9a4ba627004214" + integrity sha512-qhKOVvivCZkd6CrzS/4ST2+Auu16mtPSFVqVzwE7sELWfuvzcLGTzGv8UsVvm6qRNIz6SeaueUetqi4Ii16XQA== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" @@ -14061,9 +14218,9 @@ rc-notification@~4.6.0: rc-util "^5.20.1" rc-overflow@^1.0.0, rc-overflow@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.4.tgz#e25cd3c4a98b4f8233a8dab7172ab2dbcc83b45e" - integrity sha512-nIeelyYfdS+mQBK1++FisLZEvZ8xVAzC+duG+TC4TmqNN+kTHraiGntV9/zxDGA1ruyQ91YRJ549JjFodCBnsw== + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc-overflow/-/rc-overflow-1.2.5.tgz#d0fe3f9fa99edec70f4fe20e38119e8c1c5ae3ca" + integrity sha512-5HJKZ4nPe9e7AFdCkflgpRydvH6lJ4i2iFF06q/T1G9lL/XBeuoPLRrTBU8ao/Vo/yARW6WfEHnC2951lVgX5Q== dependencies: "@babel/runtime" "^7.11.1" classnames "^2.2.1" @@ -14071,17 +14228,17 @@ rc-overflow@^1.0.0, rc-overflow@^1.2.0: rc-util "^5.19.2" rc-pagination@~3.1.9: - version "3.1.15" - resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.15.tgz#e05eddf4c15717a5858290bed0857e27e2f957ff" - integrity sha512-4L3fot8g4E+PjWEgoVGX0noFCg+8ZFZmeLH4vsnZpB3O2T2zThtakjNxG+YvSaYtyMVT4B+GLayjKrKbXQpdAg== + version "3.1.16" + resolved "https://registry.yarnpkg.com/rc-pagination/-/rc-pagination-3.1.16.tgz#b0082108cf027eded18ed61d818d31897c343e81" + integrity sha512-GFcHXJ7XxeJDf9B+ndP4PRDt46maSSgYhiwofBMiIGKIlBhJ0wfu8DMCEvaWJJLpI2u4Gb6zF1dHpiqPFrosPg== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" rc-picker@~2.6.4: - version "2.6.7" - resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.6.7.tgz#bdde4156e219ef36b0006b7d4d72020373f21229" - integrity sha512-+P2Grt0r2kmCkw2XTp9ew3zTCwBCFEOQLd5BYs+hFaGDSSZwEWJtlbGXAGqWnAUMFx6JrCsKYkDKXDxAWlRz3A== + version "2.6.8" + resolved "https://registry.yarnpkg.com/rc-picker/-/rc-picker-2.6.8.tgz#eff71e13d836953a4c7439c958228b5108f92c22" + integrity sha512-j14N2nxcx4PAw7LviwLKIJG4cEAlCFhcHI/7pz+Ps43Df7UrSIWt/QGJgPAWz38Z6jrjsgMcyVHVccpL09gDDA== dependencies: "@babel/runtime" "^7.10.1" classnames "^2.2.1" @@ -14237,9 +14394,9 @@ rc-tree@~5.5.0: rc-virtual-list "^3.4.2" rc-trigger@^5.0.0, rc-trigger@^5.0.4, rc-trigger@^5.1.2, rc-trigger@^5.2.10: - version "5.2.15" - resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.15.tgz#f6bfed418e602513cc3e07853ddaf37e5c5339f4" - integrity sha512-VxZWqCObtUOzs9V9Be0dDA2JGchriDpvQaJpsCI2EQ4+KWHIvjFz6Ziina4uxK5drRsn0RnBi7nngmTl9j/F7Q== + version "5.2.18" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-5.2.18.tgz#adab51918e4569b174d4fc5044186200d97a542c" + integrity sha512-hi2yZ7umtbAGLxgSph1az9BR9i4Pb4fiQa4pdvFQuKN7U//3nwwygHQKHfexnM+0APBnzZwVlEHA5I8BpWrygw== dependencies: "@babel/runtime" "^7.11.2" classnames "^2.2.6" @@ -14266,9 +14423,9 @@ rc-util@^5.0.1, rc-util@^5.0.6, rc-util@^5.12.0, rc-util@^5.14.0, rc-util@^5.15. shallowequal "^1.1.0" rc-virtual-list@^3.2.0, rc-virtual-list@^3.4.2: - version "3.4.6" - resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.6.tgz#af34235915221173dd42d9f25b32e95d4c0f5698" - integrity sha512-wMJ7Bl+AxgIDojp0VxuQxjpNulKodwxGXSsTyxA9Mwzwemj5vKAgTbkPT64ZW5ORf8FOQAaPRlMiTADrPEo3sQ== + version "3.4.7" + resolved "https://registry.yarnpkg.com/rc-virtual-list/-/rc-virtual-list-3.4.7.tgz#ca0ba5ecddff686cd3833562d07c2678d1c9cb2e" + integrity sha512-PhV8a8g/L9sCmWcmXizzwW7QdqsxK4ebHU6fA9OsUIR7isFdx2bTGU2iAUdRV4teiIF1ZHF3gSQh8NtAxrXh6A== dependencies: classnames "^2.2.6" rc-resize-observer "^1.0.0" @@ -14382,12 +14539,12 @@ react-dom@^18.1.0: scheduler "^0.22.0" react-draggable@^4.4.3: - version "4.4.4" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.4.tgz#5b26d9996be63d32d285a426f41055de87e59b2f" - integrity sha512-6e0WdcNLwpBx/YIDpoyd2Xb04PB0elrDrulKUgdrIlwuYvxh5Ok9M+F8cljm8kPXXs43PmMzek9RrB1b7mLMqA== + version "4.4.5" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.5.tgz#9e37fe7ce1a4cf843030f521a0a4cc41886d7e7c" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== dependencies: clsx "^1.1.1" - prop-types "^15.6.0" + prop-types "^15.8.1" react-element-to-jsx-string@^14.3.4: version "14.3.4" @@ -14438,6 +14595,11 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: 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.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + react-json-view@^1.21.3: version "1.21.3" resolved "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" @@ -14470,9 +14632,9 @@ react-popper-tooltip@^3.1.1: react-popper "^2.2.4" react-popper@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" - integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== dependencies: react-fast-compare "^3.0.1" warning "^4.0.2" @@ -14490,15 +14652,15 @@ react-router-config@^5.1.1: "@babel/runtime" "^7.1.2" react-router-dom@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" - integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.1.tgz#0151baf2365c5fcd8493f6ec9b9b31f34d0f8ae1" + integrity sha512-f0pj/gMAbv9e8gahTmCEY20oFhxhrmHwYeIwH5EO5xu0qme+wXtsdB8YfUOAZzUz4VaXmb58m3ceiLtjMhqYmQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.2.1" + react-router "5.3.1" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" @@ -14510,10 +14672,10 @@ react-router-dom@^6.0.0: history "^5.2.0" react-router "6.3.0" -react-router@5.2.1, react-router@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" - integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== +react-router@5.3.1, react-router@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.1.tgz#b13e84a016c79b9e80dde123ca4112c4f117e3cf" + integrity sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" @@ -14782,12 +14944,13 @@ regex-parser@^2.2.11: integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== regexp.prototype.flags@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.2.tgz#bf635117a2f4b755595ebb0c0ee2d2a49b2084db" - integrity sha512-Ynz8fTQW5/1elh+jWU2EDDzeoNbD0OQ0R+D1VJU5ATOkUaro4A9YEkdN2ODQl/8UQFPPpZNw91fOcLFamM7Pww== + 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.2.0: version "3.2.0" @@ -15163,9 +15326,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.70.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.1.tgz#824b1f1f879ea396db30b0fc3ae8d2fead93523e" - integrity sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA== + version "2.70.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d" + integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg== optionalDependencies: fsevents "~2.3.2" @@ -15396,25 +15559,6 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -send@0.17.2, send@^0.17.1: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "1.8.1" - mime "1.6.0" - ms "2.1.3" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -15434,6 +15578,25 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +send@^0.17.1: + version "0.17.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" + integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "1.8.1" + mime "1.6.0" + ms "2.1.3" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -15493,17 +15656,7 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.2" - -serve-static@^1.14.1: +serve-static@1.15.0, serve-static@^1.14.1: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== @@ -15759,12 +15912,12 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.7.3, source-map@~0.7.2: +source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.8.0-beta.0: +source-map@^0.8.0-beta.0, source-map@~0.8.0-beta.0: version "0.8.0-beta.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== @@ -15909,9 +16062,9 @@ statuses@2.0.1: integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= std-env@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.0.1.tgz#bc4cbc0e438610197e34c2d79c3df30b491f5182" - integrity sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.1.1.tgz#1f19c4d3f6278c52efd08a94574a2a8d32b7d092" + integrity sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw== store2@^2.12.0: version "2.13.2" @@ -16441,13 +16594,13 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.0.0, terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== + version "5.13.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.0.tgz#d43fd71861df1b4df743980caa257c6fa03acc44" + integrity sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng== dependencies: acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" + source-map "~0.8.0-beta.0" source-map-support "~0.5.20" test-exclude@^6.0.0: @@ -16713,7 +16866,12 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1, tslib@~2.3.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@~2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -16820,13 +16978,13 @@ uglify-js@^3.1.4: integrity sha512-vMOPGDuvXecPs34V74qDKk4iJ/SN4vL3Ow/23ixafENYvtrNvtbcgUeugTcUGRGsOF/5fU8/NYSL5Hyb3l1OJA== unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" unfetch@^4.2.0: @@ -17093,21 +17251,21 @@ urlgrey@1.0.0: fast-url-parser "^1.1.3" use-composed-ref@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.2.1.tgz#9bdcb5ccd894289105da2325e1210079f56bf849" - integrity sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== -use-isomorphic-layout-effect@^1.0.0: +use-isomorphic-layout-effect@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-latest@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz#a44f6572b8288e0972ec411bdd0840ada366f232" - integrity sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: - use-isomorphic-layout-effect "^1.0.0" + use-isomorphic-layout-effect "^1.1.1" use@^3.1.0: version "3.1.1" @@ -17191,7 +17349,7 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^8.0.0, v8-to-istanbul@^8.1.0: +v8-to-istanbul@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== @@ -17200,6 +17358,15 @@ v8-to-istanbul@^8.0.0, v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +v8-to-istanbul@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" + integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.7" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -18368,7 +18535,7 @@ yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.7: +yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== From b9c1f8d7272213a9243e39767dfe6c86ed455ded Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Thu, 28 Apr 2022 20:26:40 +0000 Subject: [PATCH 30/43] Move around declarations to be a bit more readable --- packages/squiggle-lang/src/js/index.ts | 233 +++++++++--------- .../src/rescript/TypescriptInterface.res | 6 + 2 files changed, 125 insertions(+), 114 deletions(-) diff --git a/packages/squiggle-lang/src/js/index.ts b/packages/squiggle-lang/src/js/index.ts index 57c09e1a..bc66ab99 100644 --- a/packages/squiggle-lang/src/js/index.ts +++ b/packages/squiggle-lang/src/js/index.ts @@ -10,6 +10,9 @@ import { continuousShape, discreteShape, distributionErrorToString, + mixedShape, + sampleSetDist, + symbolicDist, } from "../rescript/TypescriptInterface.gen"; export { makeSampleSetDist, @@ -50,67 +53,6 @@ export let defaultSamplingInputs: samplingParams = { xyPointLength: 10000, }; -import type { t as SampleSetDist_t } from "../rescript/Distributions/SampleSetDist/SampleSetDist.gen"; -import type { mixedShape } from "../rescript/Distributions/PointSetDist/PointSetTypes.gen"; - -import type { symbolicDist as SymbolicDistTypes_symbolicDist } from "../rescript/Distributions/SymbolicDist/SymbolicDistTypes.gen"; - -type rescriptPointSetDist = - | { - TAG: 0; // Mixed - _0: mixedShape; - } - | { - TAG: 1; // Discrete - _0: discreteShape; - } - | { - TAG: 2; // ContinuousShape - _0: continuousShape; - }; - -type rescriptDist = - | { TAG: 0; _0: rescriptPointSetDist } - | { TAG: 1; _0: SampleSetDist_t } - | { TAG: 2; _0: SymbolicDistTypes_symbolicDist }; - -// This is a raw rescript export. genType for some reason only converts half -// the data structure into the format it claims it is. This here is so that -// we can be guided in converting the other half -type rescriptExport = - | { - TAG: 0; // EvArray - _0: rescriptExport[]; - } - | { - TAG: 1; // EvBool - _0: boolean; - } - | { - TAG: 2; // EvCall - _0: string; - } - | { - TAG: 3; // EvDistribution - _0: rescriptDist; - } - | { - TAG: 4; // EvNumber - _0: number; - } - | { - TAG: 5; // EvRecord - _0: { [key: string]: rescriptExport }; - } - | { - TAG: 6; // EvString - _0: string; - } - | { - TAG: 7; // EvSymbol - _0: string; - }; - export type result = | { tag: "Ok"; @@ -163,7 +105,69 @@ export function run( return resultMap(result, (x) => createTsExport(x, si)); } -// Recript half converts recursive data structures +function createTsExport( + x: expressionValue, + sampEnv: samplingParams +): squiggleExpression { + switch (x.tag) { + case "EvArray": + // genType doesn't convert anything more than 2 layers down into {tag: x, value: x} + // format, leaving it as the raw values. This converts the raw values + // directly into typescript values. + // + // The casting here is because genType is about the types of the returned + // values, claiming they are fully recursive when that's not actually the + // case + return tag( + "array", + x.value.map((arrayItem): squiggleExpression => { + switch (arrayItem.tag) { + case "EvRecord": + return tag( + "record", + _.mapValues(arrayItem.value, (recordValue: unknown) => + convertRawToTypescript(recordValue as rescriptExport, sampEnv) + ) + ); + case "EvArray": + let y = arrayItem.value as unknown as rescriptExport[]; + return tag( + "array", + y.map((childArrayItem) => + convertRawToTypescript(childArrayItem, sampEnv) + ) + ); + default: + return createTsExport(arrayItem, sampEnv); + } + }) + ); + case "EvBool": + return tag("boolean", x.value); + case "EvCall": + return tag("call", x.value); + case "EvDistribution": + return tag("distribution", new Distribution(x.value, sampEnv)); + case "EvNumber": + return tag("number", x.value); + case "EvRecord": + // genType doesn't support records, so we have to do the raw conversion ourself + let result: tagged<"record", { [key: string]: squiggleExpression }> = tag( + "record", + _.mapValues(x.value, (x: unknown) => + convertRawToTypescript(x as rescriptExport, sampEnv) + ) + ); + return result; + case "EvString": + return tag("string", x.value); + case "EvSymbol": + return tag("symbol", x.value); + } +} + +// Helper functions to convert the recsript representations that genType doesn't +// cover function convertRawToTypescript( result: rescriptExport, sampEnv: samplingParams @@ -220,58 +224,59 @@ function convertRawDistributionToGenericDist( } } -function createTsExport( - x: expressionValue, - sampEnv: samplingParams -): squiggleExpression { - switch (x.tag) { - case "EvArray": - return tag( - "array", - x.value.map((arrayItem): squiggleExpression => { - switch (arrayItem.tag) { - case "EvRecord": - return tag( - "record", - _.mapValues(arrayItem.value, (recordValue: unknown) => - convertRawToTypescript(recordValue as rescriptExport, sampEnv) - ) - ); - case "EvArray": - let y = arrayItem.value as unknown as rescriptExport[]; - return tag( - "array", - y.map((childArrayItem) => - convertRawToTypescript(childArrayItem, sampEnv) - ) - ); - default: - return createTsExport(arrayItem, sampEnv); - } - }) - ); - case "EvBool": - return tag("boolean", x.value); - case "EvCall": - return tag("call", x.value); - case "EvDistribution": - return tag("distribution", new Distribution(x.value, sampEnv)); - case "EvNumber": - return tag("number", x.value); - case "EvRecord": - let result: tagged<"record", { [key: string]: squiggleExpression }> = tag( - "record", - _.mapValues(x.value, (x: unknown) => - convertRawToTypescript(x as rescriptExport, sampEnv) - ) - ); - return result; - case "EvString": - return tag("string", x.value); - case "EvSymbol": - return tag("symbol", x.value); - } -} +// Raw rescript types. +type rescriptExport = + | { + TAG: 0; // EvArray + _0: rescriptExport[]; + } + | { + TAG: 1; // EvBool + _0: boolean; + } + | { + TAG: 2; // EvCall + _0: string; + } + | { + TAG: 3; // EvDistribution + _0: rescriptDist; + } + | { + TAG: 4; // EvNumber + _0: number; + } + | { + TAG: 5; // EvRecord + _0: { [key: string]: rescriptExport }; + } + | { + TAG: 6; // EvString + _0: string; + } + | { + TAG: 7; // EvSymbol + _0: string; + }; + +type rescriptDist = + | { TAG: 0; _0: rescriptPointSetDist } + | { TAG: 1; _0: sampleSetDist } + | { TAG: 2; _0: symbolicDist }; + +type rescriptPointSetDist = + | { + TAG: 0; // Mixed + _0: mixedShape; + } + | { + TAG: 1; // Discrete + _0: discreteShape; + } + | { + TAG: 2; // ContinuousShape + _0: continuousShape; + }; export function resultExn(r: result): a | c { return r.value; diff --git a/packages/squiggle-lang/src/rescript/TypescriptInterface.res b/packages/squiggle-lang/src/rescript/TypescriptInterface.res index fc381729..c4265178 100644 --- a/packages/squiggle-lang/src/rescript/TypescriptInterface.res +++ b/packages/squiggle-lang/src/rescript/TypescriptInterface.res @@ -13,6 +13,12 @@ type samplingParams = DistributionOperation.env @genType type genericDist = DistributionTypes.genericDist +@genType +type sampleSetDist = SampleSetDist.t + +@genType +type symbolicDist = SymbolicDistTypes.symbolicDist + @genType type distributionError = DistributionTypes.error From 911fb5bcc677963ab86f91af8654abbc249a6775 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 16:40:19 -0400 Subject: [PATCH 31/43] Should fix lint Value: [1e-6 to 1e-5] --- yarn.lock | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4ce8009f..cbd03955 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2400,18 +2400,17 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== -"@quri/squiggle-lang@0.2.5": - version "0.2.5" - resolved "https://registry.yarnpkg.com/@quri/squiggle-lang/-/squiggle-lang-0.2.5.tgz#368f0644290a0265696db7547ea31b0a0b55a69e" - integrity sha512-yBCqjieirDE4oDZVICGQh2r1A6vS6GM5y8Pc0IhHGnNBbs230iA/b+eytQTGbEE7yVEvHbDNBUoiB+B7sCPzaQ== +"@quri/squiggle-components@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@quri/squiggle-components/-/squiggle-components-0.2.9.tgz#9a2c7ce824ad59f980dc73e465676bd2563d409c" + integrity sha512-RpMTCzf7vBY+fatdjD+iFWkleMYOkJQN7kknZlLBriSo8Fy5KjhKghR+DotU+HE/2Yq1jUIveaIDF0XRBg+SVA== dependencies: - bisect_ppx "^2.7.1" - jstat "^1.9.5" - lodash "4.17.21" - mathjs "10.5.0" - pdfast "^0.2.0" - rationale "0.2.0" - rescript "^9.1.4" + "@react-hook/size" "^2.1.2" + antd "^4.20.0" + react "^18.0.0" + react-ace "10.0.0" + react-dom "^18.0.0" + styled-components "^5.3.5" "@react-hook/latest@^1.0.2": version "1.0.3" @@ -5006,7 +5005,7 @@ ansi-to-html@^0.6.11: dependencies: entities "^2.0.0" -antd@^4.20.1: +antd@^4.20.0, antd@^4.20.1: version "4.20.1" resolved "https://registry.yarnpkg.com/antd/-/antd-4.20.1.tgz#6cd5a406c7172d61a5d0693ea52ee908650cf674" integrity sha512-asKxOV0a6AijqonbcXkO08/q+XvqS/HmGfaRIS6ZH1ALR3FS2q+kTW52rJZO9rfoOb/ldPhEBVSWiNrbiB+uCQ== @@ -14041,11 +14040,6 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rationale@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rationale/-/rationale-0.2.0.tgz#555ed4f3cc7cd0245faeac041d3769f1857e4f3d" - integrity sha512-Pd8w5Inv1JhTfRyx03zs486CEAn6UKXvvOtxVRLsewngsBSffo3MQwUKYS75L/8vPt98wmf7iaZROx362/f7Bw== - raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" @@ -14441,6 +14435,17 @@ rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-ace@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-10.0.0.tgz#1760e302604cff35ba40963db43eb027513b6572" + integrity sha512-AUoA2OsKOCv8fXLqcFM232dF/Z8w14bwPUZ9z5I2zjBfqfZOZLqxnhXN+qKL6VrQXs1DLUvalGOuM5TABAFOCA== + dependencies: + ace-builds "^1.4.14" + diff-match-patch "^1.0.5" + lodash.get "^4.4.2" + lodash.isequal "^4.5.0" + prop-types "^15.7.2" + react-ace@10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-10.1.0.tgz#d348eac2b16475231779070b6cd16768deed565f" @@ -14530,7 +14535,7 @@ react-docgen@^5.0.0: node-dir "^0.1.10" strip-indent "^3.0.0" -react-dom@^18.1.0: +react-dom@^18.0.0, react-dom@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== From 94d4a38540fa0425f1412da4f02c62ee804be671 Mon Sep 17 00:00:00 2001 From: Ozzie Gooen Date: Thu, 28 Apr 2022 16:49:51 -0400 Subject: [PATCH 32/43] Refactored errors for XYShape --- .../squiggle-lang/__tests__/XYShape_test.res | 17 +++--- .../Distributions/DistributionTypes.res | 2 + .../squiggle-lang/src/rescript/Utility/E.res | 6 ++ .../src/rescript/Utility/Errors.res | 31 ---------- .../src/rescript/Utility/XYShape.res | 59 +++++++++++++++---- 5 files changed, 66 insertions(+), 49 deletions(-) delete mode 100644 packages/squiggle-lang/src/rescript/Utility/Errors.res diff --git a/packages/squiggle-lang/__tests__/XYShape_test.res b/packages/squiggle-lang/__tests__/XYShape_test.res index c63e1ce2..38535020 100644 --- a/packages/squiggle-lang/__tests__/XYShape_test.res +++ b/packages/squiggle-lang/__tests__/XYShape_test.res @@ -18,21 +18,22 @@ let pointSetDist3: PointSetTypes.xyShape = { ys: [0.2, 0.5, 0.8], } +let makeAndGetErrorString = (~xs, ~ys) => + XYShape.T.make(~xs, ~ys)->E.R.getError->E.O2.fmap(XYShape.Error.toString) + describe("XYShapes", () => { describe("Validator", () => { - makeTest("with no errors", XYShape.T.Validator.validate(pointSetDist1), None) makeTest( - "when empty", - XYShape.T.Validator.validate({xs: [], ys: []})->E.O2.fmap(Errors.toString), - Some("XYShape validate Xs is empty"), + "with no errors", + makeAndGetErrorString(~xs=[1.0, 4.0, 8.0], ~ys=[0.2, 0.4, 0.8]), + None, ) + makeTest("when empty", makeAndGetErrorString(~xs=[], ~ys=[]), Some("Xs is empty")) makeTest( "when not sorted, different lengths, and not finite", - XYShape.T.Validator.validate({xs: [2.0, 1.0, infinity, 0.0], ys: [3.0, Js.Float._NaN]})->E.O2.fmap( - Errors.toString, - ), + makeAndGetErrorString(~xs=[2.0, 1.0, infinity, 0.0], ~ys=[3.0, Js.Float._NaN]), Some( - "Multiple Errors: [XYShape validate Xs is not sorted], [XYShape validate Xs and Ys have different lengths. Xs has length 4 and Ys has length 2], [XYShape validate Xs is not finite. Example value: Infinity], [XYShape validate Ys is not finite. Example value: NaN]", + "Multiple Errors: [Xs is not sorted], [Xs and Ys have different lengths. Xs has length 4 and Ys has length 2], [Xs is not finite. Example value: Infinity], [Ys is not finite. Example value: NaN]", ), ) }) diff --git a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res index e27a138d..93f86798 100644 --- a/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res +++ b/packages/squiggle-lang/src/rescript/Distributions/DistributionTypes.res @@ -19,6 +19,7 @@ type error = | RequestedStrategyInvalidError(string) | LogarithmOfDistributionError(string) | OtherError(string) + | XYShapeError(XYShape.error) @genType module Error = { @@ -39,6 +40,7 @@ module Error = { | PointSetConversionError(err) => SampleSetDist.pointsetConversionErrorToString(err) | SparklineError(err) => PointSetTypes.sparklineErrorToString(err) | RequestedStrategyInvalidError(err) => `Requested strategy invalid: ${err}` + | XYShapeError(err) => `XY Shape Error: ${XYShape.Error.toString(err)}` | OtherError(s) => s } diff --git a/packages/squiggle-lang/src/rescript/Utility/E.res b/packages/squiggle-lang/src/rescript/Utility/E.res index aab3d160..35699c5c 100644 --- a/packages/squiggle-lang/src/rescript/Utility/E.res +++ b/packages/squiggle-lang/src/rescript/Utility/E.res @@ -162,6 +162,12 @@ exception Assertion(string) module R = { let result = Rationale.Result.result let id = e => e |> result(U.id, U.id) + let isOk = Belt.Result.isOk + let getError = (r: result<'a, 'b>) => + switch r { + | Ok(_) => None + | Error(e) => Some(e) + } let fmap = Rationale.Result.fmap let bind = Rationale.Result.bind let toExn = (msg: string, x: result<'a, 'b>): 'a => diff --git a/packages/squiggle-lang/src/rescript/Utility/Errors.res b/packages/squiggle-lang/src/rescript/Utility/Errors.res deleted file mode 100644 index bdd41869..00000000 --- a/packages/squiggle-lang/src/rescript/Utility/Errors.res +++ /dev/null @@ -1,31 +0,0 @@ -type property = {fnName: string, propertyName: string} - -type rec error = - | NotSorted(property) - | IsEmpty(property) - | NotFinite(property, float) - | DifferentLengths({fnName: string, p1Name: string, p2Name: string, p1Length: int, p2Length: int}) - | Multiple(array) - -let mapErrorArrayToError = (errors: array): option => { - switch errors { - | [] => None - | [error] => Some(error) - | _ => Some(Multiple(errors)) - } -} - -let rec toString = (t: error) => - switch t { - | NotSorted({fnName, propertyName}) => `${fnName} ${propertyName} is not sorted` - | IsEmpty({fnName, propertyName}) => `${fnName} ${propertyName} is empty` - | NotFinite({fnName, propertyName}, exampleValue) => - `${fnName} ${propertyName} is not finite. Example value: ${E.Float.toString(exampleValue)}` - | DifferentLengths({fnName, p1Name, p2Name, p1Length, p2Length}) => - `${fnName} ${p1Name} and ${p2Name} have different lengths. ${p1Name} has length ${E.I.toString( - p1Length, - )} and ${p2Name} has length ${E.I.toString(p2Length)}` - | Multiple(errors) => - `Multiple Errors: ${E.A2.fmap(errors, toString)->E.A2.fmap(r => `[${r}]`) - |> E.A.joinWith(", ")}` - } diff --git a/packages/squiggle-lang/src/rescript/Utility/XYShape.res b/packages/squiggle-lang/src/rescript/Utility/XYShape.res index 1d96a3ee..1f1e87ca 100644 --- a/packages/squiggle-lang/src/rescript/Utility/XYShape.res +++ b/packages/squiggle-lang/src/rescript/Utility/XYShape.res @@ -4,6 +4,42 @@ type xyShape = { ys: array, } +type propertyName = string + +@genType +type rec error = + | NotSorted(propertyName) + | IsEmpty(propertyName) + | NotFinite(propertyName, float) + | DifferentLengths({p1Name: string, p2Name: string, p1Length: int, p2Length: int}) + | MultipleErrors(array) + +@genType +module Error = { + let mapErrorArrayToError = (errors: array): option => { + switch errors { + | [] => None + | [error] => Some(error) + | _ => Some(MultipleErrors(errors)) + } + } + + let rec toString = (t: error) => + switch t { + | NotSorted(propertyName) => `${propertyName} is not sorted` + | IsEmpty(propertyName) => `${propertyName} is empty` + | NotFinite(propertyName, exampleValue) => + `${propertyName} is not finite. Example value: ${E.Float.toString(exampleValue)}` + | DifferentLengths({p1Name, p2Name, p1Length, p2Length}) => + `${p1Name} and ${p2Name} have different lengths. ${p1Name} has length ${E.I.toString( + p1Length, + )} and ${p2Name} has length ${E.I.toString(p2Length)}` + | MultipleErrors(errors) => + `Multiple Errors: ${E.A2.fmap(errors, toString)->E.A2.fmap(r => `[${r}]`) + |> E.A.joinWith(", ")}` + } +} + @genType type interpolationStrategy = [ | #Stepwise @@ -63,15 +99,10 @@ module T = { module Validator = { let fnName = "XYShape validate" - let property = (propertyName: string): Errors.property => { - fnName: fnName, - propertyName: propertyName, - } - let notSortedError = (p: string): Errors.error => NotSorted(property(p)) - let notFiniteError = (p, exampleValue): Errors.error => NotFinite(property(p), exampleValue) - let isEmptyError = (propertyName): Errors.error => IsEmpty(property(propertyName)) - let differentLengthsError = (t): Errors.error => DifferentLengths({ - fnName: fnName, + let notSortedError = (p: string): error => NotSorted(p) + let notFiniteError = (p, exampleValue): error => NotFinite(p, exampleValue) + let isEmptyError = (propertyName): error => IsEmpty(propertyName) + let differentLengthsError = (t): error => DifferentLengths({ p1Name: "Xs", p2Name: "Ys", p1Length: E.A.length(xs(t)), @@ -92,7 +123,15 @@ module T = { let ysNotFinite = getNonFiniteYs(t)->E.O2.fmap(notFiniteError("Ys")) [xsNotSorted, xsEmpty, differentLengths, xsNotFinite, ysNotFinite] ->E.A.O.concatSomes - ->Errors.mapErrorArrayToError + ->Error.mapErrorArrayToError + } + } + + let make = (~xs: array, ~ys: array) => { + let attempt: t = {xs: xs, ys: ys} + switch Validator.validate(attempt) { + | Some(error) => Error(error) + | None => Ok(attempt) } } } From b894f78466b8d0e1edb3fc81876a2af08a6a50b5 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 16:57:27 -0400 Subject: [PATCH 33/43] Changed `0.2.6` to `^0.2.6` for squiggle-lang dep Value: [1e-3 to 1e-1] --- packages/components/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/package.json b/packages/components/package.json index 5d21b9cc..218747b9 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -5,7 +5,7 @@ "dependencies": { "antd": "^4.20.1", "react-ace": "10.1.0", - "@quri/squiggle-lang": "0.2.6", + "@quri/squiggle-lang": "^0.2.6", "react-dom": "^18.1.0", "vega": "^5.22.1", "vega-embed": "^6.20.6", From 6e9315170f68361c1888a931e780a2904458f7b6 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 17:25:47 -0400 Subject: [PATCH 34/43] Spelling license correctly Value: [1e-7 to 1e-5] --- packages/squiggle-lang/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index f5002481..b9941b0f 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -2,7 +2,7 @@ "name": "@quri/squiggle-lang", "version": "0.2.6", "homepage": "https://squiggle-language.com", - "licence": "MIT", + "license": "MIT", "scripts": { "build": "rescript build -with-deps && tsc", "bundle": "webpack", From c4ee0959ec5b61893af74d7e248b7e558350946c Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 17:28:37 -0400 Subject: [PATCH 35/43] `dist/js/index.d.ts` => `dist/src/js/index.d.ts` Value: [1e-4 to 5e-3] --- packages/squiggle-lang/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/squiggle-lang/package.json b/packages/squiggle-lang/package.json index b9941b0f..4d146ef8 100644 --- a/packages/squiggle-lang/package.json +++ b/packages/squiggle-lang/package.json @@ -1,6 +1,6 @@ { "name": "@quri/squiggle-lang", - "version": "0.2.6", + "version": "0.2.7", "homepage": "https://squiggle-language.com", "license": "MIT", "scripts": { @@ -62,5 +62,5 @@ }, "source": "./src/js/index.ts", "main": "./dist/src/js/index.js", - "types": "./dist/js/index.d.ts" + "types": "./dist/src/js/index.d.ts" } From fde75d4bc3e52b1fa720fe4f75239b41044016a7 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 17:54:43 -0400 Subject: [PATCH 36/43] No antd and everything compiles Value: [1e-3 to 3e-2] --- packages/components/package.json | 3 +-- .../src/components/SquigglePlayground.tsx | 26 ++++++++++++++----- yarn.lock | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index 218747b9..4a71a150 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -3,9 +3,8 @@ "version": "0.2.13", "license": "MIT", "dependencies": { - "antd": "^4.20.1", "react-ace": "10.1.0", - "@quri/squiggle-lang": "^0.2.6", + "@quri/squiggle-lang": "^0.2.7", "react-dom": "^18.1.0", "vega": "^5.22.1", "vega-embed": "^6.20.6", diff --git a/packages/components/src/components/SquigglePlayground.tsx b/packages/components/src/components/SquigglePlayground.tsx index 93e8e9c6..30833ae7 100644 --- a/packages/components/src/components/SquigglePlayground.tsx +++ b/packages/components/src/components/SquigglePlayground.tsx @@ -1,11 +1,11 @@ import _ from "lodash"; -import React, { FC, useState } from "react"; +import React, { FC, ReactElement, useState } from "react"; import ReactDOM from "react-dom"; import { SquiggleChart } from "./SquiggleChart"; import CodeEditor from "./CodeEditor"; -import { Form, Input, Row, Col } from "antd"; +// import { Form, Input, Row, Col } from "antd"; import styled from "styled-components"; -import "antd/dist/antd.css"; +// import "antd/dist/antd.css"; interface FieldFloatProps { label: string; @@ -14,10 +14,19 @@ interface FieldFloatProps { onChange: (value: number) => void; } +const Input = styled.input`` + +const FormItem = (props: {label:string, children:ReactElement}) => ( +
+ + {props.children} +
+) + function FieldFloat(Props: FieldFloatProps) { let [contents, setContents] = useState(Props.value + ""); return ( - + - + ); } @@ -65,6 +74,9 @@ const Display = styled.div` max-height: ${(props) => props.maxHeight}px; `; +const Row = styled.div`` +const Col = styled.div`` + let SquigglePlayground: FC = ({ initialSquiggleString = "", height = 300, @@ -79,7 +91,7 @@ let SquigglePlayground: FC = ({ return ( - + = ({ height={height - 3} /> - + Date: Thu, 28 Apr 2022 18:25:01 -0400 Subject: [PATCH 37/43] fixed width stuff, playground, and fonts after antd factor-out Value: [1e-3 to 2e-2] --- .../src/components/DistributionChart.tsx | 9 ++++++--- .../components/src/components/SquiggleChart.tsx | 16 ++++++++-------- .../src/components/SquigglePlayground.tsx | 17 +++++++++-------- .../src/vega-specs/spec-distributions.json | 1 + 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/packages/components/src/components/DistributionChart.tsx b/packages/components/src/components/DistributionChart.tsx index a27f325a..6bef36c7 100644 --- a/packages/components/src/components/DistributionChart.tsx +++ b/packages/components/src/components/DistributionChart.tsx @@ -6,6 +6,7 @@ import { distributionErrorToString } from "@quri/squiggle-lang"; import { createClassFromSpec } from "react-vega"; import * as chartSpecification from "../vega-specs/spec-distributions.json"; import { ErrorBox } from "./ErrorBox"; +import styled from "styled-components"; let SquiggleVegaChart = createClassFromSpec({ spec: chartSpecification as Spec, @@ -24,19 +25,21 @@ export const DistributionChart: React.FC = ({ }: DistributionChartProps) => { let shape = distribution.pointSet(); if (shape.tag === "Ok") { - return ( + let widthProp = width ? width - 20 : undefined; + var result = ( ); } else { - return ( + var result = ( {distributionErrorToString(shape.value)} ); } + return result; }; diff --git a/packages/components/src/components/SquiggleChart.tsx b/packages/components/src/components/SquiggleChart.tsx index 7dda92e4..137f23c0 100644 --- a/packages/components/src/components/SquiggleChart.tsx +++ b/packages/components/src/components/SquiggleChart.tsx @@ -150,6 +150,12 @@ export interface SquiggleChartProps { height?: number; } +const ChartWrapper = styled.div` + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; +`; + export const SquiggleChart: React.FC = ({ squiggleString = "", sampleCount = 1000, @@ -158,11 +164,6 @@ export const SquiggleChart: React.FC = ({ height = 60, width = NaN, }: SquiggleChartProps) => { - const target = React.useRef(null); - const [componentWidth] = useSize(target); - // I would have wanted to just use componentWidth, but this created infinite loops with SquiggleChart.stories. - //So you can manually add a width, as an escape hatch. - let _width = width || componentWidth; let samplingInputs: samplingParams = { sampleCount: sampleCount, xyPointLength: outputXYPoints, @@ -173,15 +174,14 @@ export const SquiggleChart: React.FC = ({ let expression = expressionResult.value; onChange(expression); internal = ( - + ); } else { - // At this point, we came across an error. What was our error? internal = ( {errorValueToString(expressionResult.value)} ); } - return
{internal}
; + return {internal}; }; diff --git a/packages/components/src/components/SquigglePlayground.tsx b/packages/components/src/components/SquigglePlayground.tsx index 30833ae7..a8ad84d5 100644 --- a/packages/components/src/components/SquigglePlayground.tsx +++ b/packages/components/src/components/SquigglePlayground.tsx @@ -3,9 +3,7 @@ import React, { FC, ReactElement, useState } from "react"; import ReactDOM from "react-dom"; import { SquiggleChart } from "./SquiggleChart"; import CodeEditor from "./CodeEditor"; -// import { Form, Input, Row, Col } from "antd"; import styled from "styled-components"; -// import "antd/dist/antd.css"; interface FieldFloatProps { label: string; @@ -14,14 +12,14 @@ interface FieldFloatProps { onChange: (value: number) => void; } -const Input = styled.input`` +const Input = styled.input``; -const FormItem = (props: {label:string, children:ReactElement}) => ( +const FormItem = (props: { label: string; children: ReactElement }) => (
{props.children} -
-) + +); function FieldFloat(Props: FieldFloatProps) { let [contents, setContents] = useState(Props.value + ""); @@ -74,8 +72,11 @@ const Display = styled.div` max-height: ${(props) => props.maxHeight}px; `; -const Row = styled.div`` -const Col = styled.div`` +const Row = styled.div` + display: grid; + grid-template-columns: 1fr 1fr; +`; +const Col = styled.div``; let SquigglePlayground: FC = ({ initialSquiggleString = "", diff --git a/packages/components/src/vega-specs/spec-distributions.json b/packages/components/src/vega-specs/spec-distributions.json index ef30bdf2..129183a5 100644 --- a/packages/components/src/vega-specs/spec-distributions.json +++ b/packages/components/src/vega-specs/spec-distributions.json @@ -3,6 +3,7 @@ "description": "A basic area chart example", "width": 500, "height": 100, + "autosize": "fit", "padding": 5, "data": [ { From 1d5a0a30d4e766d052827b3dbd54b413980e7e82 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 19:06:39 -0400 Subject: [PATCH 38/43] version increment; piggyback README.md improvements Value: [1e-5 to 6e-4] --- README.md | 18 ++++++++++++++---- packages/components/README.md | 21 +++++++++++++++++++-- packages/components/package.json | 2 +- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2f1de7f7..137fb1cb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,22 @@ # Squiggle [![Packages check](https://github.com/quantified-uncertainty/squiggle/actions/workflows/ci.yml/badge.svg)](https://github.com/quantified-uncertainty/squiggle/actions/workflows/ci.yml) -[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg)](https://www.npmjs.com/package/@quri/squiggle-lang) -[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg)](https://www.npmjs.com/package/@quri/squiggle-components) +[![npm version - lang](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg)](https://www.npmjs.com/package/@quri/squiggle-lang) +[![npm version - components](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg)](https://www.npmjs.com/package/@quri/squiggle-components) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/quantified-uncertainty/squiggle/blob/develop/LICENSE) [![codecov](https://codecov.io/gh/quantified-uncertainty/squiggle/branch/develop/graph/badge.svg?token=QRLBL5CQ7C)](https://codecov.io/gh/quantified-uncertainty/squiggle) -This is an experimental DSL/language for making probabilistic estimates. The full story can be found [here](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3). +_An estimation language_. + +## Get started + +- [Gallery](https://www.squiggle-language.com/docs/Discussions/Gallery) +- [Squiggle playground](https://squiggle-language.com/playground) +- [Language basics](https://www.squiggle-language.com/docs/Features/Language) +- [Squiggle functions source of truth](https://www.squiggle-language.com/docs/Features/Functions) +- [Known bugs](https://www.squiggle-language.com/docs/Discussions/Bugs) +- [Original lesswrong sequence](https://www.lesswrong.com/s/rDe8QE5NvXcZYzgZ3) +- [Author your squiggle models as Observable notebooks](https://observablehq.com/@hazelfire/squiggle) ## Our deployments @@ -27,7 +37,7 @@ the packages can be found in `packages`. - `@quri/squiggle-components` in `packages/components` contains React components that can be passed squiggle strings as props, and return a presentation of the result of the calculation. -- `@quri/squiggle-website` in `packages/website` The main descriptive website for squiggle, +- `packages/website` is the main descriptive website for squiggle, it is hosted at `squiggle-language.com`. The playground depends on the components library which then depends on the language. This means that if you wish to work on the components library, you will need to build (no need to bundle) the language, and as of this writing playground doesn't really work. diff --git a/packages/components/README.md b/packages/components/README.md index 282230d9..87c39ebe 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -1,8 +1,26 @@ +[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-components.svg)](https://www.npmjs.com/package/@quri/squiggle-components) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/quantified-uncertainty/squiggle/blob/develop/LICENSE) + # Squiggle Components This package contains all the components for squiggle. These can be used either as a library or hosted as a [storybook](https://storybook.js.org/). -# Build for development +# Usage in a `react` project + +For example, in a fresh `create-react-app` project + +```sh +yarn add @quri/squiggle-components +``` + +Add to `App.js`: + +```sh +import {SquiggleEditor} from '@quri/squiggle-components'; + +``` + +# Build storybook for development We assume that you had run `yarn` at monorepo level, installing dependencies. @@ -24,6 +42,5 @@ yarn start And build artefacts for production, ```sh -yarn bundle # builds components library yarn build # builds storybook app ``` diff --git a/packages/components/package.json b/packages/components/package.json index 4a71a150..ac70581b 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@quri/squiggle-components", - "version": "0.2.13", + "version": "0.2.14", "license": "MIT", "dependencies": { "react-ace": "10.1.0", From 8bc8fd92283e6b115be2b91b4a731a81f2b1cd2c Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 19:08:04 -0400 Subject: [PATCH 39/43] wrong syntax highlighting in markdown Value: [1e-8 to 1e-6] --- packages/components/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/components/README.md b/packages/components/README.md index 87c39ebe..26d73c6b 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -15,7 +15,7 @@ yarn add @quri/squiggle-components Add to `App.js`: -```sh +```jsx import {SquiggleEditor} from '@quri/squiggle-components'; ``` From b15ba6563c77b32c7f0fb6bb1d8847ec44fb9cea Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Thu, 28 Apr 2022 19:15:15 -0400 Subject: [PATCH 40/43] Incremental README.md improvements Value: [1e-7 to 1e-6] --- packages/components/README.md | 4 ++-- packages/squiggle-lang/README.md | 20 +++++++++----------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/components/README.md b/packages/components/README.md index 26d73c6b..ad35c67f 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -16,8 +16,8 @@ yarn add @quri/squiggle-components Add to `App.js`: ```jsx -import {SquiggleEditor} from '@quri/squiggle-components'; - +import { SquiggleEditor } from "@quri/squiggle-components"; +; ``` # Build storybook for development diff --git a/packages/squiggle-lang/README.md b/packages/squiggle-lang/README.md index fcd0c7a2..05bb969c 100644 --- a/packages/squiggle-lang/README.md +++ b/packages/squiggle-lang/README.md @@ -1,3 +1,6 @@ +[![npm version](https://badge.fury.io/js/@quri%2Fsquiggle-lang.svg)](https://www.npmjs.com/package/@quri/squiggle-lang) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/quantified-uncertainty/squiggle/blob/develop/LICENSE) + # Squiggle language ## Build for development @@ -15,13 +18,16 @@ Other: ```sh yarn start # listens to files and recompiles at every mutation yarn test -yarn test:watch # keeps an active session and runs all tests at every mutation # where o := open in osx and o := xdg-open in linux, -yarn coverage; o _coverage/index.html # produces coverage report and opens it in browser +yarn coverage:rescript; o _coverage/index.html # produces coverage report and opens it in browser ``` -## Information +## Distributing this package or using this package from other monorepo packages + +As it says in the other `packages/*/README.md`s, building this package is an essential step of building other packages. + +# Information Squiggle is a language for representing probability distributions, as well as functions that return probability distributions. Its original intended use is for improving epistemics around EA decisions. @@ -34,11 +40,3 @@ This package is mainly written in [ReScript](https://rescript-lang.org/), but ha ReScript has an interesting philosophy of not providing much in the way of effective build tools. Every ReScript file is compiled into `.bs.js` and `.gen.ts` files with the same name and same location, and then you can use these files in other `.js` files to create your program. To generate these files to build the package, you run `yarn build`. `.gen.ts` files are created by the [`@genType`](https://rescript-lang.org/docs/gentype/latest/getting-started) decorator, which creates typescript typings for needed parts of the codebase so that they can be easily used in typescript. These .gen.ts files reference the .bs.js files generated by rescript. - -### Errors regarding the `rationale` package - -You may notice sometimes, that there are errors about the `rationale` package. If you ever get these errors, `yarn build` should fix this issue. These errors occur because `yarn build` also needs to create build files that are in `node_modules`. So if you replace `node_modules` you may need to rebuild to get those files back. - -## Distributing this package or using this package from other monorepo packages - -As it says in the other `packages/*/README.md`s, building this package is an essential step of building other packages. From 454ac0c252e6bb8d8a6cc133e9b1917eaa4944cf Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Fri, 29 Apr 2022 13:50:57 +0000 Subject: [PATCH 41/43] Add bindings to Squiggle Editor --- packages/components/package.json | 1 + .../src/components/SquiggleChart.tsx | 9 ++- .../src/components/SquiggleEditor.tsx | 81 ++++++++++++++++++- packages/components/src/index.ts | 2 + .../squiggle-lang/__tests__/TS/JS_test.ts | 22 +---- .../squiggle-lang/__tests__/TS/TestHelpers.ts | 2 +- packages/squiggle-lang/src/js/index.ts | 23 +++++- .../src/rescript/TypescriptInterface.res | 6 ++ 8 files changed, 118 insertions(+), 28 deletions(-) diff --git a/packages/components/package.json b/packages/components/package.json index 218747b9..e9549700 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -89,6 +89,7 @@ "@types/react": "17.0.43" }, "source": "./src/index.ts", + "browser": "dist/bundle.js", "main": "dist/src/index.js", "types": "dist/src/index.d.ts" } diff --git a/packages/components/src/components/SquiggleChart.tsx b/packages/components/src/components/SquiggleChart.tsx index 7dda92e4..a6bf12af 100644 --- a/packages/components/src/components/SquiggleChart.tsx +++ b/packages/components/src/components/SquiggleChart.tsx @@ -3,10 +3,12 @@ import _ from "lodash"; import styled from "styled-components"; import { run, + runPartial, errorValueToString, squiggleExpression, + bindings, + samplingParams, } from "@quri/squiggle-lang"; -import type { samplingParams } from "@quri/squiggle-lang"; import { NumberShower } from "./NumberShower"; import { DistributionChart } from "./DistributionChart"; import { ErrorBox } from "./ErrorBox"; @@ -148,6 +150,8 @@ export interface SquiggleChartProps { /** CSS width of the element */ width?: number; height?: number; + /** Bindings of previous variables declared */ + bindings?: bindings; } export const SquiggleChart: React.FC = ({ @@ -156,6 +160,7 @@ export const SquiggleChart: React.FC = ({ outputXYPoints = 1000, onChange = () => {}, height = 60, + bindings = {}, width = NaN, }: SquiggleChartProps) => { const target = React.useRef(null); @@ -167,7 +172,7 @@ export const SquiggleChart: React.FC = ({ sampleCount: sampleCount, xyPointLength: outputXYPoints, }; - let expressionResult = run(squiggleString, samplingInputs); + let expressionResult = run(squiggleString, bindings, samplingInputs); let internal: JSX.Element; if (expressionResult.tag === "Ok") { let expression = expressionResult.value; diff --git a/packages/components/src/components/SquiggleEditor.tsx b/packages/components/src/components/SquiggleEditor.tsx index 580db580..f85cf1e8 100644 --- a/packages/components/src/components/SquiggleEditor.tsx +++ b/packages/components/src/components/SquiggleEditor.tsx @@ -3,7 +3,9 @@ import * as ReactDOM from "react-dom"; import { SquiggleChart } from "./SquiggleChart"; import { CodeEditor } from "./CodeEditor"; import styled from "styled-components"; -import type { squiggleExpression } from "@quri/squiggle-lang"; +import type { squiggleExpression, bindings } from "@quri/squiggle-lang"; +import { runPartial, errorValueToString } from "@quri/squiggle-lang"; +import { ErrorBox } from "./ErrorBox"; export interface SquiggleEditorProps { /** The input string for squiggle */ @@ -26,6 +28,8 @@ export interface SquiggleEditorProps { onChange?(expr: squiggleExpression): void; /** The width of the element */ width: number; + /** Previous variable declarations */ + bindings: bindings; } const Input = styled.div` @@ -46,6 +50,7 @@ export let SquiggleEditor: React.FC = ({ diagramCount, onChange, environment, + bindings = {}, }: SquiggleEditorProps) => { let [expression, setExpression] = React.useState(initialSquiggleString); return ( @@ -71,6 +76,7 @@ export let SquiggleEditor: React.FC = ({ diagramCount={diagramCount} environment={environment} onChange={onChange} + bindings={bindings} /> ); @@ -107,3 +113,76 @@ export function renderSquiggleEditorToDom(props: SquiggleEditorProps) { ); return parent; } + +export interface SquigglePartialProps { + /** The input string for squiggle */ + initialSquiggleString?: string; + /** If the output requires monte carlo sampling, the amount of samples */ + sampleCount?: number; + /** The amount of points returned to draw the distribution */ + outputXYPoints?: number; + kernelWidth?: number; + pointDistLength?: number; + /** If the result is a function, where the function starts */ + diagramStart?: number; + /** If the result is a function, where the function ends */ + diagramStop?: number; + /** If the result is a function, how many points along the function it samples */ + diagramCount?: number; + /** when the environment changes. Used again for notebook magic*/ + onChange?(expr: bindings): void; + /** The width of the element */ + width: number; + /** Previously declared variables */ + bindings: bindings; +} + +export let SquigglePartial: React.FC = ({ + initialSquiggleString = "", + onChange, + bindings, +}: SquigglePartialProps) => { + let [expression, setExpression] = React.useState(initialSquiggleString); + let squiggleResult = runPartial(expression, bindings); + if (squiggleResult.tag == "Ok") { + if (onChange) onChange(squiggleResult.value); + } + return ( +
+ + + + {squiggleResult.tag == "Error" ? ( + + {errorValueToString(squiggleResult.value)} + + ) : ( + <> + )} +
+ ); +}; + +export function renderSquigglePartialToDom(props: SquigglePartialProps) { + let parent = document.createElement("div"); + ReactDOM.render( + { + // @ts-ignore + parent.value = bindings; + + parent.dispatchEvent(new CustomEvent("input")); + if (props.onChange) props.onChange(bindings); + }} + />, + parent + ); + return parent; +} diff --git a/packages/components/src/index.ts b/packages/components/src/index.ts index 364e6dcb..ffd9c8e0 100644 --- a/packages/components/src/index.ts +++ b/packages/components/src/index.ts @@ -1,7 +1,9 @@ export { SquiggleChart } from "./components/SquiggleChart"; export { SquiggleEditor, + SquigglePartial, renderSquiggleEditorToDom, + renderSquigglePartialToDom, } from "./components/SquiggleEditor"; import SquigglePlayground, { renderSquigglePlaygroundToDom, diff --git a/packages/squiggle-lang/__tests__/TS/JS_test.ts b/packages/squiggle-lang/__tests__/TS/JS_test.ts index 43f981eb..33aae7db 100644 --- a/packages/squiggle-lang/__tests__/TS/JS_test.ts +++ b/packages/squiggle-lang/__tests__/TS/JS_test.ts @@ -1,23 +1,5 @@ -import { - run, - Distribution, - resultMap, - squiggleExpression, - errorValueToString, -} from "../../src/js/index"; - -let testRun = (x: string): squiggleExpression => { - let result = run(x, { sampleCount: 100, xyPointLength: 100 }); - expect(result.tag).toEqual("Ok"); - if (result.tag === "Ok") { - return result.value; - } else { - throw Error( - "Expected squiggle expression to evaluate but got error: " + - errorValueToString(result.value) - ); - } -}; +import { Distribution, resultMap } from "../../src/js/index"; +import { testRun } from "./TestHelpers"; function Ok(x: b) { return { tag: "Ok", value: x }; diff --git a/packages/squiggle-lang/__tests__/TS/TestHelpers.ts b/packages/squiggle-lang/__tests__/TS/TestHelpers.ts index 3d4153ef..8ec0c3e1 100644 --- a/packages/squiggle-lang/__tests__/TS/TestHelpers.ts +++ b/packages/squiggle-lang/__tests__/TS/TestHelpers.ts @@ -8,7 +8,7 @@ import { } from "../../src/js/index"; export function testRun(x: string): squiggleExpression { - let squiggleResult = run(x, { sampleCount: 1000, xyPointLength: 100 }); + let squiggleResult = run(x, {}, { sampleCount: 1000, xyPointLength: 100 }); // return squiggleResult.value if (squiggleResult.tag === "Ok") { return squiggleResult.value; diff --git a/packages/squiggle-lang/src/js/index.ts b/packages/squiggle-lang/src/js/index.ts index bc66ab99..fb67e47a 100644 --- a/packages/squiggle-lang/src/js/index.ts +++ b/packages/squiggle-lang/src/js/index.ts @@ -2,7 +2,9 @@ import * as _ from "lodash"; import { genericDist, samplingParams, - evaluate, + evaluateUsingExternalBindings, + evaluatePartialUsingExternalBindings, + externalBindings, expressionValue, errorValue, distributionError, @@ -46,7 +48,7 @@ import { Constructors_pointwiseLogarithm, Constructors_pointwisePower, } from "../rescript/Distributions/DistributionOperation/DistributionOperation.gen"; -export type { samplingParams, errorValue }; +export type { samplingParams, errorValue, externalBindings as bindings }; export let defaultSamplingInputs: samplingParams = { sampleCount: 10000, @@ -96,15 +98,28 @@ export type squiggleExpression = export function run( squiggleString: string, + bindings?: externalBindings, samplingInputs?: samplingParams ): result { + let b = bindings ? bindings : {}; let si: samplingParams = samplingInputs ? samplingInputs : defaultSamplingInputs; - let result: result = evaluate(squiggleString); + + let result: result = + evaluateUsingExternalBindings(squiggleString, b); return resultMap(result, (x) => createTsExport(x, si)); } +// Run Partial. A partial is a block of code that doesn't return a value +export function runPartial( + squiggleString: string, + bindings: externalBindings, + _samplingInputs?: samplingParams +): result { + return evaluatePartialUsingExternalBindings(squiggleString, bindings); +} + function createTsExport( x: expressionValue, sampEnv: samplingParams @@ -166,7 +181,7 @@ function createTsExport( } } -// Helper functions to convert the recsript representations that genType doesn't +// Helper functions to convert the rescript representations that genType doesn't // cover function convertRawToTypescript( result: rescriptExport, diff --git a/packages/squiggle-lang/src/rescript/TypescriptInterface.res b/packages/squiggle-lang/src/rescript/TypescriptInterface.res index c4265178..f2758ba3 100644 --- a/packages/squiggle-lang/src/rescript/TypescriptInterface.res +++ b/packages/squiggle-lang/src/rescript/TypescriptInterface.res @@ -40,6 +40,12 @@ let evaluate = Reducer.evaluate @genType let evaluateUsingExternalBindings = Reducer.evaluateUsingExternalBindings +@genType +let evaluatePartialUsingExternalBindings = Reducer.evaluatePartialUsingExternalBindings + +@genType +type externalBindings = Reducer.externalBindings + @genType type expressionValue = ReducerInterface_ExpressionValue.expressionValue From 58a357cce5d5a9c9d5430e5975a3c4e634e0ef3c Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Fri, 29 Apr 2022 14:10:41 +0000 Subject: [PATCH 42/43] Add basic partial test --- .../squiggle-lang/__tests__/TS/JS_test.ts | 13 ++++++++- .../squiggle-lang/__tests__/TS/TestHelpers.ts | 28 +++++++++++++++---- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/squiggle-lang/__tests__/TS/JS_test.ts b/packages/squiggle-lang/__tests__/TS/JS_test.ts index 33aae7db..e522eb95 100644 --- a/packages/squiggle-lang/__tests__/TS/JS_test.ts +++ b/packages/squiggle-lang/__tests__/TS/JS_test.ts @@ -1,5 +1,5 @@ import { Distribution, resultMap } from "../../src/js/index"; -import { testRun } from "./TestHelpers"; +import { testRun, testRunPartial } from "./TestHelpers"; function Ok(x: b) { return { tag: "Ok", value: x }; @@ -57,6 +57,17 @@ describe("Record", () => { }); }); +describe("Partials", () => { + test("Can pass variables between partials and cells", () => { + let bindings = testRunPartial(`x = 5`); + let bindings2 = testRunPartial(`y = x + 2`, bindings); + expect(testRun(`y + 3`, bindings2)).toEqual({ + tag: "number", + value: 10, + }); + }); +}); + describe("Distribution", () => { //It's important that sampleCount is less than 9. If it's more, than that will create randomness //Also, note, the value should be created using makeSampleSetDist() later on. diff --git a/packages/squiggle-lang/__tests__/TS/TestHelpers.ts b/packages/squiggle-lang/__tests__/TS/TestHelpers.ts index 8ec0c3e1..7d51c98e 100644 --- a/packages/squiggle-lang/__tests__/TS/TestHelpers.ts +++ b/packages/squiggle-lang/__tests__/TS/TestHelpers.ts @@ -1,14 +1,16 @@ import { run, - // Distribution, + runPartial, + bindings, squiggleExpression, errorValueToString, - // errorValue, - // result, } from "../../src/js/index"; -export function testRun(x: string): squiggleExpression { - let squiggleResult = run(x, {}, { sampleCount: 1000, xyPointLength: 100 }); +export function testRun(x: string, bindings = {}): squiggleExpression { + let squiggleResult = run(x, bindings, { + sampleCount: 1000, + xyPointLength: 100, + }); // return squiggleResult.value if (squiggleResult.tag === "Ok") { return squiggleResult.value; @@ -21,6 +23,22 @@ export function testRun(x: string): squiggleExpression { } } +export function testRunPartial(x: string, bindings: bindings = {}): bindings { + let squiggleResult = runPartial(x, bindings, { + sampleCount: 1000, + xyPointLength: 100, + }); + if (squiggleResult.tag === "Ok") { + return squiggleResult.value; + } else { + throw new Error( + `Expected squiggle expression to evaluate but got error: ${errorValueToString( + squiggleResult.value + )}` + ); + } +} + export function failDefault() { expect("be reached").toBe("codepath should never"); } From a866270af8f18b6f759c52350e29e0a646c346fd Mon Sep 17 00:00:00 2001 From: Sam Nolan Date: Fri, 29 Apr 2022 14:19:26 +0000 Subject: [PATCH 43/43] Update dependencies --- yarn.lock | 51 ++++++++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/yarn.lock b/yarn.lock index bf2d7be9..3597fea6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2506,9 +2506,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.23.3": - version "0.23.4" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.4.tgz#6ff93fd2585ce44f7481c9ff6af610fbb5de98a4" - integrity sha512-0/WqSvpVbCBAV1yPeko7eAczKbs78dNVAaX14quVlwOb2wxfKuXCx91h4NrEfkYK9zEnyVSW4JVI/trP3iS+Qg== + version "0.23.5" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -4071,9 +4071,9 @@ form-data "^3.0.0" "@types/node@*", "@types/node@^17.0.29", "@types/node@^17.0.5": - version "17.0.29" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d" - integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA== + version "17.0.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.30.tgz#2c6e8512acac70815e8176aa30c38025067880ef" + integrity sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw== "@types/node@^14.0.10": version "14.18.16" @@ -4140,17 +4140,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^18.0.0": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141" - integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg== - dependencies: - "@types/react" "*" - -"@types/react-dom@^18.0.2": - version "18.0.2" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.2.tgz#2d6b46557aa30257e87e67a6d952146d15979d79" - integrity sha512-UxeS+Wtj5bvLRREz9tIgsK4ntCuLDo0EcAcACgw3E+9wE8ePDr9uQpq53MfcyxyIS55xJ+0B6mDS8c4qkkHLBg== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.0.2": + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.3.tgz#a022ea08c75a476fe5e96b675c3e673363853831" + integrity sha512-1RRW9kst+67gveJRYPxGmVy8eVJ05O43hg77G2j5m76/RFJtMbcfAs2viQ2UNsvvDg8F7OfQZx8qQcl6ymygaQ== dependencies: "@types/react" "*" @@ -4809,9 +4802,9 @@ acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0: integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== address@^1.0.1, address@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" - integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== adjust-sourcemap-loader@^4.0.0: version "4.0.0" @@ -7906,9 +7899,9 @@ ejs@^3.1.6: jake "^10.8.5" electron-to-chromium@^1.4.118: - version "1.4.124" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.124.tgz#e9015e234d8632920dcdf5480351da9e845ed220" - integrity sha512-VhaE9VUYU6d2eIb+4xf83CATD+T+3bTzvxvlADkQE+c2hisiw3sZmvEDtsW704+Zky9WZGhBuQXijDVqSriQLA== + version "1.4.127" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.127.tgz#4ef19d5d920abe2676d938f4170729b44f7f423a" + integrity sha512-nhD6S8nKI0O2MueC6blNOEZio+/PWppE/pevnf3LOlQA/fKPCrDp2Ao4wx4LFwmIkJpVdFdn2763YWLy9ENIZg== element-resize-detector@^1.2.2: version "1.2.4" @@ -16599,9 +16592,9 @@ terser@^4.1.2, terser@^4.6.3: source-map-support "~0.5.12" terser@^5.0.0, terser@^5.10.0, terser@^5.3.4, terser@^5.7.2: - version "5.13.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.0.tgz#d43fd71861df1b4df743980caa257c6fa03acc44" - integrity sha512-sgQ99P+fRBM1jAYzN9RTnD/xEWx/7LZgYTCRgmYriSq1wxxqiQPJgXkkLBBuwySDWJ2PP0PnVQyuf4xLUuH4Ng== + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== dependencies: acorn "^8.5.0" commander "^2.20.0" @@ -16968,9 +16961,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== ua-parser-js@^0.7.30: version "0.7.31"