Merge branch 'develop' into collapsible
This commit is contained in:
commit
a11030814c
|
@ -358,7 +358,7 @@ export const SquigglePlayground: FC<PlaygroundProps> = ({
|
|||
<SquiggleContainer>
|
||||
<StyledTab.Group>
|
||||
<div className="pb-4">
|
||||
<div className="flex justify-between items-center mt-2">
|
||||
<div className="flex justify-between items-center">
|
||||
<StyledTab.List>
|
||||
<StyledTab
|
||||
name={vars.showEditor ? "Code" : "Display"}
|
||||
|
|
|
@ -43,7 +43,7 @@ could be continuous, discrete or mixed.
|
|||
<Story
|
||||
name="Continuous Pointset"
|
||||
args={{
|
||||
code: "toPointSet(normal(5,2))",
|
||||
code: "PointSet.fromDist(normal(5,2))",
|
||||
width,
|
||||
}}
|
||||
>
|
||||
|
@ -57,7 +57,7 @@ could be continuous, discrete or mixed.
|
|||
<Story
|
||||
name="Continuous SampleSet"
|
||||
args={{
|
||||
code: "toSampleSet(normal(5,2), 1000)",
|
||||
code: "SampleSet.fromDist(normal(5,2))",
|
||||
width,
|
||||
}}
|
||||
>
|
||||
|
|
|
@ -339,7 +339,7 @@ A log loss score. Often that often acts as a [scoring rule](https://en.wikipedia
|
|||
Note that it is fairly slow.
|
||||
|
||||
```
|
||||
logScore: ({estimate: distribution, ?prior: distribution, answer: distribution|number}) => number
|
||||
Dist.logScore: ({estimate: distribution, ?prior: distribution, answer: distribution|number}) => number
|
||||
```
|
||||
|
||||
**Examples**
|
||||
|
|
|
@ -38,7 +38,7 @@ Gets the internal samples of a sampleSet distribution. This is separate from the
|
|||
**Examples**
|
||||
|
||||
```
|
||||
toList(toSampleSet(normal(5,2)))
|
||||
toList(SampleSet.fromDist(normal(5,2)))
|
||||
```
|
||||
|
||||
### map
|
||||
|
|
|
@ -31,6 +31,6 @@ The means of sample set distributions can vary dramatically, especially as the n
|
|||
|
||||
<SquiggleEditor
|
||||
defaultCode={`symbolicDist = 5 to 50333333
|
||||
sampleSetDist = toSampleSet(symbolicDist)
|
||||
sampleSetDist = SampleSet.fromDist(symbolicDist)
|
||||
[mean(symbolicDist), mean(sampleSetDist), symbolicDist, sampleSetDist]`}
|
||||
/>
|
||||
|
|
|
@ -23,12 +23,6 @@ Squiggle is still very early. The main first goal is to become stable. This mean
|
|||
|
||||
## Distribution Features
|
||||
|
||||
`Distribution.fromSamples([])`
|
||||
Converts a list of samples, for example, from Guesstimate, into a distribution shape. Maybe takes a list of optional parameters.
|
||||
|
||||
`Distribution.fromCoordinates({xs, ys})`
|
||||
Convert XY coordinates into a distribution. Figure out a good way to do this for continuous, discrete, and mixed distributions.
|
||||
|
||||
[Metalog Distribution](https://en.wikipedia.org/wiki/Metalog_distribution)
|
||||
Add the Metalog distribution, and some convenient methods for generating these distributions. This might be a bit tricky because we might need or build a library to fit data. There's no Metalog javascript library yet, this would be pretty useful. There's already a Metalog library in Python, so that one could be used for inspiration.
|
||||
|
||||
|
|
|
@ -343,13 +343,13 @@ Creates a [triangular distribution](https://en.wikipedia.org/wiki/Triangular_dis
|
|||
|
||||
<SquiggleEditor defaultCode="triangular(1, 2, 4)" />
|
||||
|
||||
## FromSamples
|
||||
## FromList
|
||||
|
||||
`fromSamples(samples:number[])`
|
||||
`SampleSet.fromList(samples:number[])`
|
||||
|
||||
Creates a sample set distribution using an array of samples.
|
||||
|
||||
<SquiggleEditor defaultCode="fromSamples([1,2,3,4,6,5,5,5])" />
|
||||
<SquiggleEditor defaultCode="SampleSet.fromList([1,2,3,4,6,5,5,5])" />
|
||||
|
||||
### Arguments
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ dist1 * dist2`}
|
|||
|
||||
We also provide concatenation of two distributions as a syntax sugar for `*`
|
||||
|
||||
<SquiggleEditor defaultCode="(0.1 to 1) triangular(1,2,3)" />
|
||||
<SquiggleEditor defaultCode="(0.1 to 1) * triangular(1,2,3)" />
|
||||
|
||||
### Division
|
||||
|
||||
|
@ -87,18 +87,11 @@ A projection over a stretched x-axis.
|
|||
log(dist)`}
|
||||
/>
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist = beta(1,2)
|
||||
log10(dist)`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`log10(5 to 10)`} />
|
||||
|
||||
Base `x`
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`x = 2
|
||||
dist = beta(2,3)
|
||||
log(dist, x)`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`log(5 to 10, 2)`} />
|
||||
|
||||
#### Validity
|
||||
|
||||
|
@ -113,45 +106,25 @@ For every point on the x-axis, operate the corresponding points in the y axis of
|
|||
|
||||
TODO: this isn't in the new interpreter/parser yet.
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist1 = 1 to 10
|
||||
dist2 = triangular(1,2,3)
|
||||
dist1 .+ dist2`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`(1 to 10) .+ triangular(1,2,3)`} />
|
||||
|
||||
### Pointwise subtraction
|
||||
|
||||
TODO: this isn't in the new interpreter/parser yet.
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist1 = 1 to 10
|
||||
dist2 = triangular(1,2,3)
|
||||
dist1 .- dist2`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`(1 to 10) .- triangular(1,2,3)`} />
|
||||
|
||||
### Pointwise multiplication
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist1 = 1 to 10
|
||||
dist2 = triangular(1,2,3)
|
||||
dist1 .* dist2`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`(1 to 10) .* triangular(1,2,3)`} />
|
||||
|
||||
### Pointwise division
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist1 = uniform(0,20)
|
||||
dist2 = normal(10,8)
|
||||
dist1 ./ dist2`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`(uniform(0,10)) ./ normal(10,4)`} />
|
||||
|
||||
### Pointwise exponentiation
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`dist1 = 1 to 10
|
||||
dist2 = triangular(1,2,3)
|
||||
dist1 .^ dist2`}
|
||||
/>
|
||||
<SquiggleEditor defaultCode={`(1 to 10) .^ triangular(1,2,3)`} />
|
||||
|
||||
## Standard functions on distributions
|
||||
|
||||
|
@ -208,21 +181,15 @@ The `sample(distribution)` samples a given distribution.
|
|||
|
||||
Recall the [three formats of distributions](https://develop--squiggle-documentation.netlify.app/docs/Discussions/Three-Types-Of-Distributions). We can force any distribution into `SampleSet` format
|
||||
|
||||
<SquiggleEditor defaultCode="toSampleSet(normal(5, 10))" />
|
||||
<SquiggleEditor defaultCode="PointSet.fromDist(normal(5, 10))" />
|
||||
|
||||
Or `PointSet` format
|
||||
|
||||
<SquiggleEditor defaultCode="toPointSet(normal(5, 10))" />
|
||||
|
||||
### `toSampleSet` has two signatures
|
||||
|
||||
Above, we saw the unary `toSampleSet`, which uses an internal hardcoded number of samples. If you'd like to provide the number of samples, it has a binary signature as well (floored)
|
||||
|
||||
<SquiggleEditor defaultCode="[toSampleSet(0.1 to 1, 100.1), toSampleSet(0.1 to 1, 5000), toSampleSet(0.1 to 1, 20000)]" />
|
||||
<SquiggleEditor defaultCode="PointSet.fromDist(normal(5, 10))" />
|
||||
|
||||
#### Validity
|
||||
|
||||
- Second argument to `toSampleSet` must be a number.
|
||||
- Second argument to `SampleSet.fromDist` must be a number.
|
||||
|
||||
## Normalization
|
||||
|
||||
|
@ -246,7 +213,7 @@ We provide a predicate `isNormalized`, for when we have simple control flow
|
|||
|
||||
You may like to debug by right clicking your browser and using the _inspect_ functionality on the webpage, and viewing the _console_ tab. Then, wrap your squiggle output with `inspect` to log an internal representation.
|
||||
|
||||
<SquiggleEditor defaultCode="inspect(toSampleSet(0.1 to 1, 100))" />
|
||||
<SquiggleEditor defaultCode="inspect(SampleSet.fromDist(0.1 to 1))" />
|
||||
|
||||
Save for a logging side effect, `inspect` does nothing to input and returns it.
|
||||
|
||||
|
|
|
@ -7,46 +7,46 @@ import { SquiggleEditor } from "../../src/components/SquiggleEditor";
|
|||
|
||||
## Expressions
|
||||
|
||||
### Distributions
|
||||
|
||||
<SquiggleEditor defaultCode={`mixture(1 to 2, 3, [0.3, 0.7])`} />
|
||||
|
||||
### Numbers
|
||||
|
||||
<SquiggleEditor defaultCode="4.32" />
|
||||
|
||||
### Arrays
|
||||
### Distributions
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`[beta(1,10), 4, isNormalized(toSampleSet(1 to 2))]`}
|
||||
defaultCode={`a = normal(4,2)
|
||||
b = 30 to 50
|
||||
c = lognormal({mean:90, stdev: 7})
|
||||
d = mixture(a,b,c, [0.3, 0.3, .4])
|
||||
{a:a, b:b, c:c, d:d}`}
|
||||
/>
|
||||
|
||||
### Records
|
||||
### Lists
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`[beta(1,10), 4, isNormalized(SampleSet.fromDist(1 to 2))]`}
|
||||
/>
|
||||
|
||||
<SquiggleEditor defaultCode={`List.make(5,1)`} />
|
||||
|
||||
### Dictionaries
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`d = {dist: triangular(0, 1, 2), weight: 0.25}
|
||||
d.dist`}
|
||||
/>
|
||||
|
||||
## Statements
|
||||
|
||||
A statement assigns expressions to names. It looks like `<symbol> = <expression>`
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`value_of_work = 10 to 70
|
||||
5 + value_of_work / 75`}
|
||||
/>
|
||||
|
||||
### Functions
|
||||
|
||||
We can define functions
|
||||
|
||||
<SquiggleEditor
|
||||
defaultCode={`ozzie_estimate(t) = lognormal(t^(1.1), 0.5)
|
||||
nuno_estimate(t, m) = mixture(normal(-5, 1), lognormal(m, t / 1.25))
|
||||
ozzie_estimate(1) * nuno_estimate(1, 1)`}
|
||||
defaultCode={`f(t) = normal(t^2, t^1.2+.01)
|
||||
f`}
|
||||
/>
|
||||
|
||||
### Anonymous Functions
|
||||
|
||||
<SquiggleEditor defaultCode={`{|t| normal(t^2, t^1.2+.01)}`} />
|
||||
|
||||
## See more
|
||||
|
||||
- [Distribution creation](./DistributionCreation)
|
||||
|
|
|
@ -3,7 +3,21 @@ sidebar_position: 1
|
|||
title: Introduction
|
||||
---
|
||||
|
||||
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 simple programming language for intuitive probabilistic estimation. It's meant for quantitative forecasting and evaluations.
|
||||
|
||||
The basics of Squiggle can be pretty simple and intuitive. The more advanced functionality can take some time to learn.
|
||||
|
||||
## What Squiggle Is
|
||||
|
||||
- A simple programming language for doing math with probability distributions
|
||||
- An embeddable language that can be used in Javascript applications
|
||||
- A tool to embed functions as forecasts that can be embedded in other applications
|
||||
|
||||
## What Squiggle Is Not
|
||||
|
||||
- A complete replacement for enterprise Risk Analysis tools (See Crystal Ball, @Risk, Lumina Analytica)
|
||||
- A Probabilistic Programming Language with backwards inference and sophisticated sampling algorithms. (See [PPLs](https://en.wikipedia.org/wiki/Probabilistic_programming))
|
||||
- A visual tool aimed at casual users (see Guesstimate, Causal)
|
||||
|
||||
## Get started
|
||||
|
||||
|
|
|
@ -10,7 +10,8 @@ const path = require("path");
|
|||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: "Squiggle",
|
||||
tagline: "An estimation language for forecasters",
|
||||
tagline:
|
||||
"A simple programming language for intuitive probabilistic estimation",
|
||||
url: "https://squiggle-language.com",
|
||||
baseUrl: "/",
|
||||
onBrokenLinks: "throw",
|
||||
|
@ -72,6 +73,11 @@ const config = {
|
|||
},
|
||||
{ to: "/blog", label: "Blog", position: "left" },
|
||||
{ to: "/playground", label: "Playground", position: "left" },
|
||||
{
|
||||
href: "https://github.com/quantified-uncertainty/squiggle/discussions",
|
||||
label: "Issues & Discussion",
|
||||
position: "right",
|
||||
},
|
||||
{
|
||||
href: "https://github.com/quantified-uncertainty/squiggle",
|
||||
label: "GitHub",
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
"dependencies": {
|
||||
"@docusaurus/core": "2.0.0-rc.1",
|
||||
"@docusaurus/preset-classic": "2.0.0-rc.1",
|
||||
"@heroicons/react": "^1.0.6",
|
||||
"@quri/squiggle-components": "^0.2.20",
|
||||
"base64-js": "^1.5.1",
|
||||
"clsx": "^1.2.1",
|
||||
|
|
17
packages/website/src/components/FallbackSpinner.jsx
Normal file
17
packages/website/src/components/FallbackSpinner.jsx
Normal file
|
@ -0,0 +1,17 @@
|
|||
import { useEffect, useState } from "react";
|
||||
import { RefreshIcon } from "@heroicons/react/solid";
|
||||
import styles from "./FallbackSpinner.module.css";
|
||||
|
||||
export const FallbackSpinner = ({ height }) => {
|
||||
const [show, setShow] = useState(/* false */ true);
|
||||
useEffect(() => {
|
||||
setTimeout(() => {
|
||||
setShow(true);
|
||||
}, 500);
|
||||
}, []);
|
||||
return (
|
||||
<div className={styles.container} style={{ height }}>
|
||||
{show ? <RefreshIcon className={styles.icon} /> : null}
|
||||
</div>
|
||||
);
|
||||
};
|
24
packages/website/src/components/FallbackSpinner.module.css
Normal file
24
packages/website/src/components/FallbackSpinner.module.css
Normal file
|
@ -0,0 +1,24 @@
|
|||
.container {
|
||||
/* height must be set explicitly */
|
||||
width: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
color: #aaa;
|
||||
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
|
@ -5,6 +5,11 @@
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
.features h3 {
|
||||
font-family: "Lora", serif;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.featureSvg {
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import BrowserOnly from "@docusaurus/BrowserOnly";
|
||||
import { FallbackSpinner } from "./FallbackSpinner";
|
||||
|
||||
export function SquiggleEditor(props) {
|
||||
return (
|
||||
<BrowserOnly fallback={<div>Loading...</div>}>
|
||||
<BrowserOnly fallback={<FallbackSpinner height={292} />}>
|
||||
{() => {
|
||||
const LibComponent =
|
||||
require("@quri/squiggle-components").SquiggleEditor;
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import BrowserOnly from "@docusaurus/BrowserOnly";
|
||||
import { FallbackSpinner } from "./FallbackSpinner";
|
||||
|
||||
export function SquigglePlayground(props) {
|
||||
return (
|
||||
<BrowserOnly fallback={<div>Loading...</div>}>
|
||||
<BrowserOnly fallback={<FallbackSpinner height="100vh" />}>
|
||||
{() => {
|
||||
const LibComponent =
|
||||
require("@quri/squiggle-components").SquigglePlayground;
|
||||
|
|
|
@ -4,27 +4,29 @@
|
|||
* work well for content-centric websites.
|
||||
*/
|
||||
|
||||
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600&family=Lato:wght@100;400;700;900&family=Lora:wght@400;500;600&display=swap");
|
||||
|
||||
/* You can override the default Infima variables here. */
|
||||
:root {
|
||||
--ifm-color-primary: #2488df;
|
||||
--ifm-color-primary-dark: #176fcd;
|
||||
--ifm-color-primary-darker: #1f58cb;
|
||||
--ifm-color-primary-darkest: #1e2672;
|
||||
--ifm-color-primary-light: #49acd3;
|
||||
--ifm-color-primary-lighter: #4fb1c7;
|
||||
--ifm-color-primary-lightest: #3dbfd3;
|
||||
--ifm-color-primary: #e74c0f;
|
||||
--ifm-color-primary-dark: #bb4b05;
|
||||
--ifm-color-primary-darker: #9d0c02;
|
||||
--ifm-color-primary-darkest: #5d2200;
|
||||
--ifm-color-primary-light: #e6a036;
|
||||
--ifm-color-primary-lighter: #e79d1d;
|
||||
--ifm-color-primary-lightest: #f5e191;
|
||||
--ifm-code-font-size: 95%;
|
||||
}
|
||||
|
||||
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||
html[data-theme="dark"] {
|
||||
--ifm-color-primary: #25c2a0;
|
||||
--ifm-color-primary-dark: #21af90;
|
||||
--ifm-color-primary-darker: #1fa588;
|
||||
--ifm-color-primary-darkest: #1a8870;
|
||||
--ifm-color-primary-light: #29d5b0;
|
||||
--ifm-color-primary-lighter: #32d8b4;
|
||||
--ifm-color-primary-lightest: #4fddbf;
|
||||
--ifm-color-primary: #df774d;
|
||||
--ifm-color-primary-dark: #db8651;
|
||||
--ifm-color-primary-darker: #d7584f;
|
||||
--ifm-color-primary-darkest: #b3693e;
|
||||
--ifm-color-primary-light: #edb25a;
|
||||
--ifm-color-primary-lighter: #ebd489;
|
||||
--ifm-color-primary-lightest: #faf2d4;
|
||||
}
|
||||
|
||||
.docusaurus-highlight-code-line {
|
||||
|
@ -37,3 +39,55 @@ html[data-theme="dark"] {
|
|||
html[data-theme="dark"] .docusaurus-highlight-code-line {
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.hero h1 {
|
||||
font-size: 4em;
|
||||
font-weight: 900;
|
||||
margin-bottom: 0.5rem;
|
||||
color: rgb(230, 72, 79);
|
||||
font-family: "Lato", sans-serif;
|
||||
}
|
||||
|
||||
.navbar__title {
|
||||
font-family: "Lato", sans-serif;
|
||||
font-weight: 900;
|
||||
color: rgb(205, 88, 53);
|
||||
}
|
||||
|
||||
.hero__subtitle {
|
||||
color: #888;
|
||||
font-size: 1.25em;
|
||||
}
|
||||
|
||||
.hero__subtitle2 {
|
||||
color: #ba3e3e;
|
||||
font-size: 1.5em;
|
||||
font-family: "Lora";
|
||||
font-weight: 500;
|
||||
margin-top: 1em;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
max-width: 500px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: "Lora", serif;
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.menu__link,
|
||||
.navbar__item {
|
||||
font-family: "Lora", serif;
|
||||
}
|
||||
|
||||
.navbar__item {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
:root {
|
||||
/* --ifm-font-family-base: 'Lora'; */
|
||||
}
|
||||
|
|
|
@ -12,11 +12,8 @@ function HomepageHeader() {
|
|||
<header className={clsx("hero hero--primary", styles.heroBanner)}>
|
||||
<div className="container">
|
||||
<h1 className="hero__title">{siteConfig.title}</h1>
|
||||
<p className="hero__subtitle">
|
||||
<i>Early access</i>
|
||||
</p>
|
||||
<p className="hero__subtitle">{siteConfig.tagline}</p>
|
||||
<div className={styles.buttons}></div>
|
||||
<p className="hero__subtitle">Early Access</p>
|
||||
<p className="hero__subtitle2">{siteConfig.tagline}</p>
|
||||
</div>
|
||||
</header>
|
||||
);
|
||||
|
|
|
@ -4,10 +4,11 @@
|
|||
*/
|
||||
|
||||
.heroBanner {
|
||||
padding: 4rem 0;
|
||||
padding: 2rem 0;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
background: rgb(255, 246, 237);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 966px) {
|
||||
|
|
|
@ -56,6 +56,7 @@ export default function PlaygroundPage() {
|
|||
<div
|
||||
style={{
|
||||
maxWidth: 2000,
|
||||
padding: 8,
|
||||
}}
|
||||
>
|
||||
<SquigglePlayground {...playgroundProps} />
|
||||
|
|
|
@ -4825,7 +4825,7 @@
|
|||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@^18.0.1", "@types/react@^18.0.9":
|
||||
"@types/react@*", "@types/react@^18.0.9":
|
||||
version "18.0.15"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe"
|
||||
integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==
|
||||
|
@ -15261,7 +15261,7 @@ react-vega@^7.6.0:
|
|||
prop-types "^15.8.1"
|
||||
vega-embed "^6.5.1"
|
||||
|
||||
react@^18.0.0, react@^18.1.0:
|
||||
react@^18.1.0:
|
||||
version "18.2.0"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
|
||||
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
|
||||
|
|
Loading…
Reference in New Issue
Block a user