+ }
+}
+
+suite "Locale" {
+ test "BadUrl" {
+
+ |> Test.Html.start()
+ |> Test.Html.assertTextOf("div", "Hello World!")
+ |> Test.Html.triggerClick("div")
+ |> Test.Html.assertTextOf("div", "Szia Világ!")
+ }
+}
diff --git a/core/tests/tests/Provider/AnimationFrame.mint b/core/tests/tests/Provider/AnimationFrame.mint
index e657cc915..4bc9b0936 100644
--- a/core/tests/tests/Provider/AnimationFrame.mint
+++ b/core/tests/tests/Provider/AnimationFrame.mint
@@ -23,8 +23,10 @@ suite "Provider.AnimationFrame.frames" {
test "called on an animation frame" {
|> Test.Html.start()
- |> Test.Html.assertTextOf("div", "1")
- |> Test.Html.assertTextOf("div", "2")
- |> Test.Html.assertTextOf("div", "3")
+ |> Test.Context.timeout(10)
+ |> Test.Context.assert(
+ (element : Dom.Element) {
+ Dom.getTextContent(element) != "0"
+ })
}
}
diff --git a/core/tests/tests/Window.mint b/core/tests/tests/Window.mint
index 797536f66..212dc6863 100644
--- a/core/tests/tests/Window.mint
+++ b/core/tests/tests/Window.mint
@@ -1,31 +1,55 @@
component ScrollTest {
- use Provider.Scroll { scrolls: (event : Html.Event) : Promise(Void) { `this.forceUpdate()` } }
+ state scrollWidth = 0
+ state scrollLeft = 0
+ state scrollTop = 0
+
+ use Provider.Scroll {
+ scrolls:
+ (event : Html.Event) : Promise(Void) {
+ update()
+ }
+ }
style base {
height: 3000px;
width: 3000px;
}
- fun componentDidMount : Void {
- `this.forceUpdate()`
+ fun componentDidMount : Promise(Void) {
+ update()
+ }
+
+ fun update {
+ next
+ {
+ scrollWidth: Window.scrollWidth(),
+ scrollLeft: Window.scrollLeft(),
+ scrollTop: Window.scrollTop()
+ }
}
fun render : Html {
- <{ Number.toString(Window.scrollWidth()) }>
+ <{ Number.toString(scrollWidth) }>
+ "|"
+
<{ Number.toString(Window.scrollHeight()) }>
+ "|"
+
- <{ Number.toString(Window.scrollLeft()) }>
+ <{ Number.toString(scrollLeft) }>
+ "|"
+
- <{ Number.toString(Window.scrollTop()) }>
+ <{ Number.toString(scrollTop) }>
}
@@ -37,7 +61,6 @@ suite "Window.navigate" {
Window.url()
Window.navigate("/blah")
-
Window.href() == "http://127.0.0.1:#{url.port}/blah"
}
}
@@ -87,11 +110,6 @@ suite "Window.scrollWidth" {
test "returns the scrollable width when overflown" {
|> Test.Html.start()
- |> Test.Context.then(
- (subject : Dom.Element) : Promise(Dom.Element) {
- await Timer.nextFrame()
- subject
- })
|> Test.Html.assertTextOf("scroll-width", "3008")
}
}
diff --git a/runtime/Makefile b/runtime/Makefile
new file mode 100644
index 000000000..f85f6cbf7
--- /dev/null
+++ b/runtime/Makefile
@@ -0,0 +1,25 @@
+.PHONY: index
+index:
+ yarn esbuild index.js \
+ --outfile=../src/assets/runtime.js \
+ --log-override:equals-nan=silent \
+ --format=esm \
+ --minify \
+ --bundle
+
+.PHONY: index_testing
+index_testing:
+ yarn esbuild index_testing.js \
+ --outfile=../src/assets/runtime_test.js \
+ --log-override:equals-nan=silent \
+ --format=esm \
+ --minify \
+ --bundle
+
+.PHONY: format
+format:
+ yarn prettier --write *.js **/*.js
+
+.PHONY: test
+test:
+ yarn vitest --coverage
diff --git a/runtime/index.js b/runtime/index.js
new file mode 100644
index 000000000..fe5a3ef09
--- /dev/null
+++ b/runtime/index.js
@@ -0,0 +1,16 @@
+export { useComputed, computed, signal, effect, batch } from "@preact/signals";
+export { createElement, Fragment as fragment } from "preact";
+export { useEffect, useMemo, useRef } from "preact/hooks";
+
+export * from "./src/pattern_matching";
+export * from "./src/normalize_event";
+export * from "./src/utilities";
+export * from "./src/translate";
+export * from "./src/equality";
+export * from "./src/provider";
+export * from "./src/decoders";
+export * from "./src/encoders";
+export * from "./src/program";
+export * from "./src/portals";
+export * from "./src/variant";
+export * from "./src/styles";
diff --git a/runtime/index_testing.js b/runtime/index_testing.js
new file mode 100644
index 000000000..a0f50ab46
--- /dev/null
+++ b/runtime/index_testing.js
@@ -0,0 +1,3 @@
+export { render as testRender } from "preact";
+export * from "./src/testing";
+export * from "./index";
diff --git a/runtime/package.json b/runtime/package.json
new file mode 100644
index 000000000..e85cd0685
--- /dev/null
+++ b/runtime/package.json
@@ -0,0 +1,19 @@
+{
+ "private": true,
+ "dependencies": {
+ "route-parser": "mint-lang/mint-route-parser",
+ "@preact/signals": "^1.2.2",
+ "indent-string": "^5.0.0",
+ "fast-equals": "^5.0.1",
+ "uuid-random": "^1.3.2",
+ "preact": "^10.19.3"
+ },
+ "devDependencies": {
+ "@testing-library/preact": "^3.2.3",
+ "@vitest/coverage-v8": "^1.2.1",
+ "esbuild": "^0.19.11",
+ "prettier": "^3.1.0",
+ "vitest": "^1.2.1",
+ "jsdom": "^23.2.0"
+ }
+}
diff --git a/runtime/src/decoders.js b/runtime/src/decoders.js
new file mode 100644
index 000000000..9e2e67cdb
--- /dev/null
+++ b/runtime/src/decoders.js
@@ -0,0 +1,344 @@
+import indentString from "indent-string";
+
+// Formats the given value as JSON with extra indentation.
+const format = (value) => {
+ let string = JSON.stringify(value, "", 2);
+
+ if (typeof string === "undefined") {
+ string = "undefined";
+ }
+
+ return indentString(string);
+};
+
+// A class to keep the errors when decoding. It keeps track of the path
+// to the nested objects for reporting purpuses.
+export class Error {
+ constructor(message, path = []) {
+ this.message = message;
+ this.object = null;
+ this.path = path;
+ }
+
+ push(input) {
+ this.path.unshift(input);
+ }
+
+ toString() {
+ const message = this.message.trim();
+
+ const path = this.path.reduce((memo, item) => {
+ if (memo.length) {
+ switch (item.type) {
+ case "FIELD":
+ return `${memo}.${item.value}`;
+ case "ARRAY":
+ return `${memo}[${item.value}]`;
+ }
+ } else {
+ switch (item.type) {
+ case "FIELD":
+ return item.value;
+ case "ARRAY":
+ return `[$(item.value)]`;
+ }
+ }
+ }, "");
+
+ if (path.length && this.object) {
+ return (
+ message +
+ "\n\n" +
+ IN_OBJECT.trim()
+ .replace("{value}", format(this.object))
+ .replace("{path}", path)
+ );
+ } else {
+ return message;
+ }
+ }
+}
+
+const IN_OBJECT = `
+The input is in this object:
+
+{value}
+
+at: {path}
+`;
+
+const NOT_A_STRING = `
+I was trying to decode the value:
+
+{value}
+
+as a String, but could not.
+`;
+
+const NOT_A_TIME = `
+I was trying to decode the value:
+
+{value}
+
+as a Time, but could not.
+`;
+
+const NOT_A_NUMBER = `
+I was trying to decode the value:
+
+{value}
+
+as a Number, but could not.
+`;
+
+const NOT_A_BOOLEAN = `
+I was trying to decode the value:
+
+{value}
+
+as a Bool, but could not.
+`;
+
+const NOT_AN_OBJECT = `
+I was trying to decode the field "{field}" from the object:
+
+{value}
+
+but I could not because it's not an object.
+`;
+
+const NOT_AN_ARRAY = `
+I was trying to decode the value:
+
+{value}
+
+as an Array, but could not.
+`;
+
+const NOT_A_TUPLE = `
+I was trying to decode the value:
+
+{value}
+
+as an Tuple, but could not.
+`;
+
+const TUPLE_ITEM_MISSING = `
+I was trying to decode one of the values of a tuple:
+
+{value}
+
+but could not.
+`;
+
+const NOT_A_MAP = `
+I was trying to decode the value:
+
+{value}
+
+as a Map, but could not.
+`;
+
+// Decodes `String` (by checking for the type equality).
+export const decodeString = (ok, err) => (input) => {
+ if (typeof input != "string") {
+ return new err(new Error(NOT_A_STRING.replace("{value}", format(input))));
+ } else {
+ return new ok(input);
+ }
+};
+
+// Decodes `Time` either a UNIX timestamp or any values that the
+// environment can parse with the `Date` construtor.
+export const decodeTime = (ok, err) => (input) => {
+ let parsed = NaN;
+
+ if (typeof input === "number") {
+ parsed = new Date(input);
+ } else {
+ parsed = Date.parse(input);
+ }
+
+ if (Number.isNaN(parsed)) {
+ return new err(new Error(NOT_A_TIME.replace("{value}", format(input))));
+ } else {
+ return new ok(new Date(parsed));
+ }
+};
+
+// Decodes `Number` using `parseFloat`.
+export const decodeNumber = (ok, err) => (input) => {
+ let value = parseFloat(input);
+
+ if (isNaN(value)) {
+ return new err(new Error(NOT_A_NUMBER.replace("{value}", format(input))));
+ } else {
+ return new ok(value);
+ }
+};
+
+// Decodes `Bool` (by checking for type)
+export const decodeBoolean = (ok, err) => (input) => {
+ if (typeof input != "boolean") {
+ return new err(new Error(NOT_A_BOOLEAN.replace("{value}", format(input))));
+ } else {
+ return new ok(input);
+ }
+};
+
+// Decodes an object field using the decoder (only works on "object" types
+// except arrays)
+export const decodeField = (key, decoder, err) => (input) => {
+ if (
+ typeof input !== "object" ||
+ Array.isArray(input) ||
+ input == undefined ||
+ input == null
+ ) {
+ const message = NOT_AN_OBJECT.replace("{field}", key).replace(
+ "{value}",
+ format(input),
+ );
+
+ return new err(new Error(message));
+ } else {
+ const decoded = decoder(input[key]);
+
+ if (decoded instanceof err) {
+ decoded._0.push({ type: "FIELD", value: key });
+ decoded._0.object = input;
+ }
+
+ return decoded;
+ }
+};
+
+// Decodes `Array` with the decoder.
+export const decodeArray = (decoder, ok, err) => (input) => {
+ if (!Array.isArray(input)) {
+ return new err(new Error(NOT_AN_ARRAY.replace("{value}", format(input))));
+ }
+
+ let results = [];
+ let index = 0;
+
+ for (let item of input) {
+ let result = decoder(item);
+
+ if (result instanceof err) {
+ result._0.push({ type: "ARRAY", value: index });
+ result._0.object = input;
+ return result;
+ } else {
+ results.push(result._0);
+ }
+
+ index++;
+ }
+
+ return new ok(results);
+};
+
+// Decodes `Maybe`. `null` and `undefined` becomes `Nothing` otherwise
+// the decoded value is returned as a `Just`.
+export const decodeMaybe = (decoder, ok, err, just, nothing) => (input) => {
+ if (input === null || input === undefined) {
+ return new ok(new nothing());
+ } else {
+ const result = decoder(input);
+
+ if (result instanceof err) {
+ return result;
+ } else {
+ return new ok(new just(result._0));
+ }
+ }
+};
+
+// Decodes `Tuple(...)` with the decoders.
+export const decodeTuple = (decoders, ok, err) => (input) => {
+ if (!Array.isArray(input)) {
+ return new err(new Error(NOT_A_TUPLE.replace("{value}", format(input))));
+ }
+
+ let results = [];
+ let index = 0;
+
+ for (let decoder of decoders) {
+ if (input[index] === undefined || input[index] === null) {
+ return new err(
+ new Error(TUPLE_ITEM_MISSING.replace("{value}", format(input[index]))),
+ );
+ } else {
+ let result = decoder(input[index]);
+
+ if (result instanceof err) {
+ result._0.push({ type: "ARRAY", value: index });
+ result._0.object = input;
+ return result;
+ } else {
+ results.push(result._0);
+ }
+ }
+
+ index++;
+ }
+
+ return new ok(results);
+};
+
+// Decodes an object as a `Map(key, value)` (it only works on objects with
+// string keys so normal objects).
+export const decodeMap = (decoder, ok, err) => (input) => {
+ if (
+ typeof input !== "object" ||
+ Array.isArray(input) ||
+ input == undefined ||
+ input == null
+ ) {
+ const message = NOT_A_MAP.replace("{value}", format(input));
+
+ return new err(new Error(message));
+ } else {
+ const map = [];
+
+ for (let key in input) {
+ const result = decoder(input[key]);
+
+ if (result instanceof err) {
+ return result;
+ } else {
+ map.push([key, result._0]);
+ }
+ }
+
+ return new ok(map);
+ }
+};
+
+// Decodes a record, using the mappings.
+export const decoder = (mappings, ok, err) => (input) => {
+ const object = {};
+
+ for (let key in mappings) {
+ let decoder = mappings[key];
+
+ if (Array.isArray(decoder)) {
+ decoder = mappings[key][0];
+ key = mappings[key][1];
+ }
+
+ const result = decodeField(key, decoder, err)(input);
+
+ if (result instanceof err) {
+ return result;
+ }
+
+ object[key] = result._0;
+ }
+
+ return new ok(object);
+};
+
+// Decodes an `object` by wrapping in an `Ok`.
+export const decodeObject = (ok) => (value) => new ok(value);
diff --git a/runtime/src/encoders.js b/runtime/src/encoders.js
new file mode 100644
index 000000000..d97a1ac30
--- /dev/null
+++ b/runtime/src/encoders.js
@@ -0,0 +1,61 @@
+import { identity } from "./utilities";
+
+// Encodes `Time`
+export const encodeTime = (value) => value.toISOString();
+
+// Encodes `Array(item)`
+export const encodeArray = (encoder) => (value) => {
+ return value.map((item) => {
+ return encoder ? encoder(item) : item;
+ });
+};
+
+// Encodes `Map(String, value)` as a JS object. `Map` internally is just
+// an array of key, value pairs which is an array as well.
+export const encodeMap = (encoder) => (value) => {
+ const result = {};
+
+ for (let item of value) {
+ result[item[0]] = encoder ? encoder(item[1]) : item[1];
+ }
+
+ return result;
+};
+
+// Encodes `Maybe`. `Nothing` becomes `null`, `Just` is unwrapped.
+export const encodeMaybe = (encoder, just) => (value) => {
+ if (value instanceof just) {
+ return encoder(value._0);
+ } else {
+ return null;
+ }
+};
+
+// Encodes `Tuple(...)`
+export const encodeTuple = (encoders) => (value) => {
+ return value.map((item, index) => {
+ const encoder = encoders[index];
+ return encoder ? encoder(item) : item;
+ });
+};
+
+// Encode a record with the encoders. An encoder can be a function or
+// an array where the first item is the function the second is the key
+// to use.
+export const encoder = (encoders) => (value) => {
+ const result = {};
+
+ for (let key in encoders) {
+ let encoder = encoders[key];
+ let field = key;
+
+ if (Array.isArray(encoder)) {
+ encoder = encoders[key][0];
+ field = encoders[key][1];
+ }
+
+ result[field] = (encoder || identity)(value[key]);
+ }
+
+ return result;
+};
diff --git a/runtime/src/equality.js b/runtime/src/equality.js
new file mode 100644
index 000000000..cbdb5b054
--- /dev/null
+++ b/runtime/src/equality.js
@@ -0,0 +1,169 @@
+// This file contains code to have value equality instead of reference equality.
+// We use a `Symbol` to have a custom equality functions and then use these
+// functions when comparing two values.
+export const Equals = Symbol("Equals");
+
+// We use regular functions instead of arrow functions because they have
+// binding (this, arguments, etc...).
+Boolean.prototype[Equals] =
+ Symbol.prototype[Equals] =
+ Number.prototype[Equals] =
+ String.prototype[Equals] =
+ function (other) {
+ return this.valueOf() === other;
+ };
+
+Date.prototype[Equals] = function (other) {
+ return +this === +other;
+};
+
+Function.prototype[Equals] = Node.prototype[Equals] = function (other) {
+ return this === other;
+};
+
+// Search parameters need to be the same string to be equal.
+URLSearchParams.prototype[Equals] = function (other) {
+ if (other === null || other === undefined) {
+ return false;
+ }
+
+ return this.toString() === other.toString();
+};
+
+// Sets need to have the same elements to be equal.
+Set.prototype[Equals] = function (other) {
+ if (other === null || other === undefined) {
+ return false;
+ }
+
+ return compare(Array.from(this).sort(), Array.from(other).sort());
+};
+
+// Arrays need to have the same elements to be equal.
+Array.prototype[Equals] = function (other) {
+ if (other === null || other === undefined) {
+ return false;
+ }
+
+ if (this.length !== other.length) {
+ return false;
+ }
+
+ if (this.length == 0) {
+ return true;
+ }
+
+ for (let index in this) {
+ if (!compare(this[index], other[index])) {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+// Form data need to have the same elements to be equal.
+FormData.prototype[Equals] = function (other) {
+ if (other === null || other === undefined) {
+ return false;
+ }
+
+ const bKeys = Array.from(other.keys()).sort();
+ const aKeys = Array.from(this.keys()).sort();
+
+ if (compare(aKeys, bKeys)) {
+ if (aKeys.length == 0) {
+ return true;
+ }
+
+ for (let key of aKeys) {
+ const bValue = Array.from(other.getAll(key).sort());
+ const aValue = Array.from(this.getAll(key).sort());
+
+ if (!compare(aValue, bValue)) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+};
+
+// Maps need to have the same keys and values to be equal.
+Map.prototype[Equals] = function (other) {
+ if (other === null || other === undefined) {
+ return false;
+ }
+
+ const aKeys = Array.from(this.keys()).sort();
+ const bKeys = Array.from(other.keys()).sort();
+
+ if (compare(aKeys, bKeys)) {
+ if (aKeys.length == 0) {
+ return true;
+ }
+
+ for (let key of aKeys) {
+ if (!compare(this.get(key), other.get(key))) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ return false;
+ }
+};
+
+// If the object has a specific set of keys it's a Preact virtual DOM node.
+const isVnode = (object) =>
+ typeof object == "object" &&
+ "constructor" in object &&
+ "props" in object &&
+ "type" in object &&
+ "ref" in object &&
+ "key" in object &&
+ "__" in object
+
+// This is the custom comparison function.
+export const compare = (a, b) => {
+ if ((a === undefined && b === undefined) || (a === null && b === null)) {
+ return true;
+ } else if (a != null && a != undefined && a[Equals]) {
+ return a[Equals](b);
+ } else if (b != null && b != undefined && b[Equals]) {
+ return b[Equals](a);
+ } else if (isVnode(a) || isVnode(b)) {
+ return a === b
+ } else {
+ return compareObjects(a, b);
+ }
+};
+
+// This is the custom comparison function for plain objects.
+export const compareObjects = (a, b) => {
+ if (a instanceof Object && b instanceof Object) {
+ const aKeys = Object.keys(a);
+ const bKeys = Object.keys(b);
+
+ if (aKeys.length !== bKeys.length) {
+ return false;
+ }
+
+ const keys = new Set(aKeys.concat(bKeys));
+
+ for (let key of keys) {
+ if (!compare(a[key], b[key])) {
+ return false;
+ }
+ }
+
+ return true;
+ } else {
+ // We fall back to strict equality if there is something we don't know
+ // how to compare.
+ return a === b;
+ }
+};
diff --git a/runtime/src/normalize_event.js b/runtime/src/normalize_event.js
new file mode 100644
index 000000000..3f37003c1
--- /dev/null
+++ b/runtime/src/normalize_event.js
@@ -0,0 +1,141 @@
+import { options } from "preact";
+
+// Polyfill DataTransfer
+if (!("DataTransfer" in window)) {
+ window.DataTransfer = class {
+ constructor() {
+ this.effectAllowed = "none";
+ this.dropEffect = "none";
+ this.files = [];
+ this.types = [];
+ this.cache = {};
+ }
+
+ getData(format) {
+ return this.cache[format] || "";
+ }
+
+ setData(format, data) {
+ this.cache[format] = data;
+ return null;
+ }
+
+ clearData() {
+ this.cache = {};
+ return null;
+ }
+ };
+}
+
+// Set the event option hook to normalize the event so we can use one type
+// for events (`Html.Event``) instead of multiple event types like in
+// JavaScript (`MouseEvent`, `KeyboardEvent`, etc...). Basically we make sure
+// that there are values for all fields using a proxy (which makes it lazy).
+export const normalizeEvent = (event) => {
+ return new Proxy(event, {
+ get: function (obj, prop) {
+ if (prop === "event") {
+ return event;
+ } else if (prop in obj) {
+ const value = obj[prop];
+
+ if (value instanceof Function) {
+ return () => obj[prop]();
+ } else {
+ return value;
+ }
+ } else {
+ switch (prop) {
+ // onCopy onCut onPaste
+ case "clipboardData":
+ return (obj.clipboardData = new DataTransfer());
+
+ // drag events
+ case "dataTransfer":
+ return (obj.dataTransfer = new DataTransfer());
+
+ // onCompositionEnd onCompositionStart onCompositionUpdate
+ case "data":
+ return "";
+
+ // onKeyDown onKeyPress onKeyUp
+ case "altKey":
+ return false;
+ case "charCode":
+ return -1;
+ case "ctrlKey":
+ return false;
+ case "key":
+ return "";
+ case "keyCode":
+ return -1;
+ case "locale":
+ return "";
+ case "location":
+ return -1;
+ case "metaKey":
+ return false;
+ case "repeat":
+ return false;
+ case "shiftKey":
+ return false;
+ case "which":
+ return -1;
+
+ // onClick onContextMenu onDoubleClick onDrag onDragStart onDragEnd
+ // onDragEnter onDragExit onDragLeave onDragOver onDrop onMouseDown
+ // onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver
+ // onMouseUp
+ case "button":
+ return -1;
+ case "buttons":
+ return -1;
+ case "clientX":
+ return -1;
+ case "clientY":
+ return -1;
+ case "pageX":
+ return -1;
+ case "pageY":
+ return -1;
+ case "screenX":
+ return -1;
+ case "screenY":
+ return -1;
+
+ // onScroll
+ case "detail":
+ return -1;
+
+ // onWheel
+ case "deltaMode":
+ return -1;
+ case "deltaX":
+ return -1;
+ case "deltaY":
+ return -1;
+ case "deltaZ":
+ return -1;
+
+ // onAnimationStart onAnimationEnd onAnimationIteration
+ case "animationName":
+ return "";
+ case "pseudoElement":
+ return "";
+ case "elapsedTime":
+ return -1;
+
+ // onTransitionEnd
+ case "propertyName":
+ return "";
+
+ default:
+ return undefined;
+ }
+ }
+ },
+ });
+};
+
+// Set the event preact hook.
+options.event = normalizeEvent;
diff --git a/runtime/src/pattern_matching.js b/runtime/src/pattern_matching.js
new file mode 100644
index 000000000..ab430faf7
--- /dev/null
+++ b/runtime/src/pattern_matching.js
@@ -0,0 +1,152 @@
+import { compare } from "./equality";
+
+// This is a pattern for destructuring records.
+class PatternRecord {
+ constructor(patterns) {
+ this.patterns = patterns;
+ }
+}
+
+// This is a pattern for destructuring types.
+class Pattern {
+ constructor(variant, pattern) {
+ this.pattern = pattern;
+ this.variant = variant;
+ }
+}
+
+// Export functions for creating various patterns.
+export const pattern = (variant, pattern) => new Pattern(variant, pattern);
+export const patternRecord = (patterns) => new PatternRecord(patterns);
+
+// Symbols to use during pattern matching.
+export const patternVariable = Symbol("Variable");
+export const patternSpread = Symbol("Spread");
+
+// Destructures the value using the pattern and returns the matched values of
+// the pattern as an array. If the value cannot be destructured it returns
+// `false`. This is a recursive function.
+export const destructure = (value, pattern, values = []) => {
+ // If the pattern is null it means that we skip this value.
+ if (pattern === null) {
+ // This branch matches a variable in the pattern
+ } else if (pattern === patternVariable) {
+ values.push(value);
+ // This branch covers tuples and arrays (they are the same)
+ } else if (Array.isArray(pattern)) {
+ const hasSpread = pattern.some((item) => item === patternSpread);
+
+ // If we have spreads and the arrays length is bigger then the patterns
+ // length that means that there will be values in the spread.
+ if (hasSpread && value.length >= pattern.length - 1) {
+ let startIndex = 0;
+ let endValues = [];
+ let endIndex = 1;
+
+ // This destructures the head patterns until a spread (if any).
+ while (
+ pattern[startIndex] !== patternSpread &&
+ startIndex < pattern.length
+ ) {
+ if (!destructure(value[startIndex], pattern[startIndex], values)) {
+ return false;
+ }
+ startIndex++;
+ }
+
+ // This destructures the tail patterns backwards until a spread (if any).
+ while (
+ pattern[pattern.length - endIndex] !== patternSpread &&
+ endIndex < pattern.length
+ ) {
+ if (
+ !destructure(
+ value[value.length - endIndex],
+ pattern[pattern.length - endIndex],
+ endValues,
+ )
+ ) {
+ return false;
+ }
+ endIndex++;
+ }
+
+ // Add in the spread
+ values.push(value.slice(startIndex, value.length - (endIndex - 1)));
+
+ // Add in the end values
+ for (let item of endValues) {
+ values.push(item);
+ }
+ // This branch is for without spreads. We can only destructure patterns
+ // which have the same length.
+ } else {
+ if (pattern.length !== value.length) {
+ return false;
+ } else {
+ for (let index in pattern) {
+ if (!destructure(value[index], pattern[index], values)) {
+ return false;
+ }
+ }
+ }
+ }
+ // This branch covers type variants.
+ } else if (pattern instanceof Pattern) {
+ if (value instanceof pattern.variant) {
+ if (pattern.pattern instanceof PatternRecord) {
+ if (!destructure(value, pattern.pattern, values)) {
+ return false;
+ }
+ } else {
+ for (let index in pattern.pattern) {
+ if (
+ !destructure(value[`_${index}`], pattern.pattern[index], values)
+ ) {
+ return false;
+ }
+ }
+ }
+ } else {
+ return false;
+ }
+ // This branch covers type variants as records.
+ } else if (pattern instanceof PatternRecord) {
+ for (let index in pattern.patterns) {
+ const item = pattern.patterns[index];
+
+ if (!destructure(value[item[0]], item[1], values)) {
+ return false;
+ }
+ }
+ // We compare anything else.
+ } else {
+ if (!compare(value, pattern)) {
+ return false;
+ }
+ }
+
+ return values;
+};
+
+// Matches a value with different patterns and calls the function of the first
+// matching pattern.
+//
+// match("Hello", [
+// ["World", () => "It's world"],
+// [patternVariable, (value) => value] // This is matched
+// ])
+//
+export const match = (value, branches) => {
+ for (let branch of branches) {
+ if (branch[0] === null) {
+ return branch[1]();
+ } else {
+ const values = destructure(value, branch[0]);
+
+ if (values) {
+ return branch[1].apply(null, values);
+ }
+ }
+ }
+};
diff --git a/runtime/src/portals.js b/runtime/src/portals.js
new file mode 100644
index 000000000..a828c428b
--- /dev/null
+++ b/runtime/src/portals.js
@@ -0,0 +1,87 @@
+/*
+================================================================================
+
+DO NOT EDIT THIS FILE! IT IS COPIED FROM:
+
+https://github.com/preactjs/preact/blob/main/compat/src/portals.js
+(commit e16b520eadac9f91a32c645a2447036b73ac98f4)
+
+THIS IS BECAUSE `preact/compat` IS NOT TREE SHAKEABLE AND THIS WAY THE BUNDLE
+SIZE IS 5KB SMALLER.
+
+================================================================================
+*/
+
+import { createElement, render } from "preact";
+
+/**
+ * @param {import('../../src/index').RenderableProps<{ context: any }>} props
+ */
+function ContextProvider(props) {
+ this.getChildContext = () => props.context;
+ return props.children;
+}
+
+/**
+ * Portal component
+ * @this {import('./internal').Component}
+ * @param {object | null | undefined} props
+ *
+ * TODO: use createRoot() instead of fake root
+ */
+function Portal(props) {
+ const _this = this;
+ let container = props._container;
+
+ _this.componentWillUnmount = function () {
+ render(null, _this._temp);
+ _this._temp = null;
+ _this._container = null;
+ };
+
+ // When we change container we should clear our old container and
+ // indicate a new mount.
+ if (_this._container && _this._container !== container) {
+ _this.componentWillUnmount();
+ }
+
+ if (!_this._temp) {
+ _this._container = container;
+
+ // Create a fake DOM parent node that manages a subset of `container`'s children:
+ _this._temp = {
+ nodeType: 1,
+ parentNode: container,
+ childNodes: [],
+ appendChild(child) {
+ this.childNodes.push(child);
+ _this._container.appendChild(child);
+ },
+ insertBefore(child, before) {
+ this.childNodes.push(child);
+ _this._container.appendChild(child);
+ },
+ removeChild(child) {
+ this.childNodes.splice(this.childNodes.indexOf(child) >>> 1, 1);
+ _this._container.removeChild(child);
+ },
+ };
+ }
+
+ // Render our wrapping element into temp.
+ render(
+ createElement(ContextProvider, { context: _this.context }, props._vnode),
+ _this._temp,
+ );
+}
+
+/**
+ * Create a `Portal` to continue rendering the vnode tree at a different DOM node
+ * @param {import('./internal').VNode} vnode The vnode to render
+ * @param {import('./internal').PreactElement} container The DOM node to continue rendering in to.
+ */
+export function createPortal(vnode, container) {
+ const el = createElement(Portal, { _vnode: vnode, _container: container });
+ el.containerInfo = container;
+ return el;
+}
diff --git a/runtime/src/program.js b/runtime/src/program.js
new file mode 100644
index 000000000..c9bfcbd76
--- /dev/null
+++ b/runtime/src/program.js
@@ -0,0 +1,237 @@
+import { deepEqual } from "fast-equals";
+import RouteParser from "route-parser";
+import { h, render } from "preact";
+
+// An internally used error when we can't decode route parameters.
+class DecodingError extends Error {}
+
+// Comparison function for route variables later on.
+const equals = (a, b) => {
+ if (a instanceof Object) {
+ return b instanceof Object && deepEqual(a, b);
+ } else {
+ return !(b instanceof Object) && a === b;
+ }
+};
+
+// `queueMicrotask` polyfill.
+const queueTask = (callback) => {
+ if (typeof window.queueMicrotask !== "function") {
+ Promise.resolve()
+ .then(callback)
+ .catch((e) =>
+ setTimeout(() => {
+ throw e;
+ }),
+ );
+ } else {
+ window.queueMicrotask(callback);
+ }
+};
+
+// Returns the route information by parsing the route.
+const getRouteInfo = (url, routes) => {
+ for (let route of routes) {
+ if (route.path === "*") {
+ return { route: route, vars: false, url: url };
+ } else {
+ let vars = new RouteParser(route.path).match(url);
+
+ if (vars) {
+ return { route: route, vars: vars, url: url };
+ }
+ }
+ }
+
+ return null;
+};
+
+class Program {
+ constructor(ok, routes) {
+ this.root = document.createElement("div");
+ this.routeInfo = null;
+ this.routes = routes;
+ this.ok = ok;
+
+ document.body.appendChild(this.root);
+
+ window.addEventListener("popstate", this.handlePopState.bind(this));
+ window.addEventListener("click", this.handleClick.bind(this), true);
+ }
+
+ handleClick(event) {
+ // If someone prevented default we honor that.
+ if (event.defaultPrevented) {
+ return;
+ }
+
+ // If the control is pressed it means that the user wants
+ // to open it a new tab so we honor that.
+ if (event.ctrlKey) {
+ return;
+ }
+
+ for (let element of event.composedPath()) {
+ if (element.tagName === "A") {
+ // If the target is not empty then it's probably `_blank` or
+ // an other window or frame so we skip.
+ if (element.target.trim() !== "") {
+ return;
+ }
+
+ // We only handle same origin URLs.
+ if (element.origin === window.location.origin) {
+ const fullPath = element.pathname + element.search + element.hash;
+ const routeInfo = getRouteInfo(fullPath, this.routes);
+
+ // If we found a matchin route, we prevent default and navigate to
+ // that route.
+ if (routeInfo) {
+ event.preventDefault();
+
+ navigate(
+ fullPath,
+ /* dispatch */ true,
+ /* triggerJump */ true,
+ routeInfo,
+ );
+ return;
+ }
+ }
+ }
+ }
+ }
+
+ // Handles resolving the page position after a navigation event.
+ resolvePagePosition(triggerJump) {
+ // Queue a microTask, this will run after Preact does a render.
+ queueTask(() => {
+ // On the next frame, the DOM should be updated already.
+ requestAnimationFrame(() => {
+ const hash = window.location.hash;
+
+ if (hash) {
+ let elem = null;
+
+ try {
+ elem =
+ this.root.querySelector(hash) || // ID
+ this.root.querySelector(`a[name="${hash.slice(1)}"]`); // Anchor
+ } catch {}
+
+ if (elem) {
+ if (triggerJump) {
+ elem.scrollIntoView();
+ }
+ } else {
+ console.warn(
+ `MINT: ${hash} matches no element with an id and no link with a name`,
+ );
+ }
+ } else if (triggerJump) {
+ window.scrollTo(0, 0);
+ }
+ });
+ });
+ }
+
+ // Handles navigation events.
+ handlePopState(event) {
+ const url =
+ window.location.pathname + window.location.search + window.location.hash;
+
+ const routeInfo = event?.routeInfo || getRouteInfo(url, this.routes);
+
+ if (routeInfo) {
+ if (
+ this.routeInfo === null ||
+ routeInfo.url !== this.routeInfo.url ||
+ !equals(routeInfo.vars, this.routeInfo.vars)
+ ) {
+ this.runRouteHandler(routeInfo);
+ }
+
+ this.resolvePagePosition(!!event?.triggerJump);
+ }
+
+ this.routeInfo = routeInfo;
+ }
+
+ // Helper function for above.
+ runRouteHandler(routeInfo) {
+ const { route } = routeInfo;
+
+ if (route.path === "*") {
+ route.handler();
+ } else {
+ const { vars } = routeInfo;
+ try {
+ let args = route.mapping.map((name, index) => {
+ const value = vars[name];
+ const result = route.decoders[index](value);
+
+ if (result instanceof this.ok) {
+ return result._0;
+ } else {
+ throw new DecodingError();
+ }
+ });
+
+ route.handler.apply(null, args);
+ } catch (error) {
+ if (error.constructor !== DecodingError) {
+ throw error;
+ }
+ }
+ }
+ }
+
+ // Renders the program and runs current route handlers.
+ render(main, globals) {
+ if (typeof main !== "undefined") {
+ const components = [];
+
+ for (let key in globals) {
+ components.push(h(globals[key], { key: key }));
+ }
+
+ render([...components, h(main, { key: "MINT_MAIN" })], this.root);
+
+ this.handlePopState();
+ }
+ }
+}
+
+// Function to navigate to a different url.
+export const navigate = (
+ url,
+ dispatch = true,
+ triggerJump = true,
+ routeInfo = null,
+) => {
+ let pathname = window.location.pathname;
+ let search = window.location.search;
+ let hash = window.location.hash;
+
+ let fullPath = pathname + search + hash;
+
+ if (fullPath !== url) {
+ if (dispatch) {
+ window.history.pushState({}, "", url);
+ } else {
+ window.history.replaceState({}, "", url);
+ }
+ }
+
+ if (dispatch) {
+ let event = new PopStateEvent("popstate");
+ event.triggerJump = triggerJump;
+ event.routeInfo = routeInfo;
+ dispatchEvent(event);
+ }
+};
+
+// Creates a program.
+export const program = (main, globals, ok, routes = []) => {
+ new Program(ok, routes).render(main, globals);
+};
diff --git a/runtime/src/provider.js b/runtime/src/provider.js
new file mode 100644
index 000000000..b1218db4a
--- /dev/null
+++ b/runtime/src/provider.js
@@ -0,0 +1,47 @@
+import { useEffect, useMemo } from "preact/hooks";
+import { untracked } from "@preact/signals";
+import { compare } from "./equality";
+import uuid from "uuid-random";
+
+// This creates a function which is used for subscribing to a provider. We use
+// `untracked` to not to subscribe to any outside signals.
+export const createProvider = (subscriptions, update) => {
+ // This is the subscription function.
+ return (owner, object) => {
+ const unsubscribe = () => {
+ if (subscriptions.has(owner)) {
+ subscriptions.delete(owner);
+ untracked(update);
+ }
+ };
+
+ // This will only run when the component unmounts.
+ useEffect(() => {
+ return unsubscribe;
+ }, []);
+
+ // This runs on every update so we don't return a cleanup function.
+ useEffect(() => {
+ const data = object();
+
+ // If the object is null that means we need to unsubscribe.
+ if (data === null) {
+ unsubscribe();
+ } else {
+ const current = subscriptions.get(owner);
+
+ if (!compare(current, data)) {
+ subscriptions.set(owner, data);
+ untracked(update);
+ }
+ }
+ });
+ };
+};
+
+// Returns the subscriptions as an array.
+export const subscriptions = (items) => Array.from(items.values());
+
+// Returns a unique ID for a component which doesn't change.
+export const useId = () => useMemo(uuid, []);
+export { uuid };
diff --git a/runtime/src/styles.js b/runtime/src/styles.js
new file mode 100644
index 000000000..68a983896
--- /dev/null
+++ b/runtime/src/styles.js
@@ -0,0 +1,42 @@
+// Inserts styles into the document (used in tests).
+export const insertStyles = (styles) => {
+ let style = document.createElement("style");
+ document.head.appendChild(style);
+ style.innerHTML = styles;
+};
+
+// Parses style data for an HTML element which can come in multiple forms:
+//
+// style="color: red" - A CSS string (we need to parse this)
+// style={Map.set(Map.empty(), "color", "red")} - A Mint `Map`
+// style=[{"color", "red"}] - A Mint Array of tuples
+// style={`{color: "red"}`} - A JavaScript object
+export const style = (items) => {
+ const result = {};
+
+ const setKeyValue = (key, value) => {
+ result[key.toString().trim()] = value.toString().trim();
+ };
+
+ for (let item of items) {
+ if (typeof item === "string") {
+ item.split(";").forEach((prop) => {
+ const [key, value] = prop.split(":");
+
+ if (key && value) {
+ setKeyValue(key, value);
+ }
+ });
+ } else if (item instanceof Map || item instanceof Array) {
+ for (let [key, value] of item) {
+ setKeyValue(key, value);
+ }
+ } else {
+ for (let key in item) {
+ setKeyValue(key, item[key]);
+ }
+ }
+ }
+
+ return result;
+};
diff --git a/runtime/src/testing.js b/runtime/src/testing.js
new file mode 100644
index 000000000..ae08c2d8a
--- /dev/null
+++ b/runtime/src/testing.js
@@ -0,0 +1,211 @@
+import { compare } from "./equality";
+
+// This is a class for tests. It allows to have multiple steps which are
+// evaluated asynchronously.
+class TestContext {
+ constructor(subject, teardown) {
+ this.teardown = teardown;
+ this.subject = subject;
+ this.steps = [];
+ }
+
+ async run() {
+ let result;
+
+ try {
+ result = await new Promise(this.next.bind(this));
+ } finally {
+ this.teardown && this.teardown();
+ }
+
+ return result;
+ }
+
+ async next(resolve, reject) {
+ requestAnimationFrame(async () => {
+ let step = this.steps.shift();
+
+ if (step) {
+ try {
+ this.subject = await step(this.subject);
+ } catch (error) {
+ return reject(error);
+ }
+ }
+
+ if (this.steps.length) {
+ this.next(resolve, reject);
+ } else {
+ resolve(this.subject);
+ }
+ });
+ }
+
+ step(proc) {
+ this.steps.push(proc);
+ return this;
+ }
+}
+
+// This is the test runner which runs the tests and sends reports to
+// the CLI using websockets.
+class TestRunner {
+ constructor(suites, url, id) {
+ this.socket = new WebSocket(url);
+ this.suites = suites;
+ this.url = url;
+ this.id = id;
+
+ // Catch debug messages.
+ window.DEBUG = {
+ log: (value) => {
+ let result = "";
+
+ if (value === undefined) {
+ result = "undefined";
+ } else if (value === null) {
+ result = "null";
+ } else {
+ result = value.toString();
+ }
+
+ this.log(result);
+ },
+ };
+
+ let error = null;
+
+ window.onerror = (message) => {
+ if (this.socket.readyState === 1) {
+ this.crash(message);
+ } else {
+ error = error || message;
+ }
+ };
+
+ this.socket.onopen = () => {
+ if (error != null) {
+ this.crash(error);
+ }
+ };
+
+ this.start();
+ }
+
+ start() {
+ if (this.socket.readyState === 1) {
+ this.run();
+ } else {
+ this.socket.addEventListener("open", () => this.run());
+ }
+ }
+
+ run() {
+ return new Promise((resolve, reject) => {
+ this.next(resolve, reject);
+ })
+ .catch((e) => this.log(e.reason))
+ .finally(() => this.socket.send("DONE"));
+ }
+
+ report(type, suite, name, message, location) {
+ if (message && message.toString) {
+ message = message.toString();
+ }
+ this.socket.send(
+ JSON.stringify({
+ location: location,
+ result: message,
+ suite: suite,
+ id: this.id,
+ type: type,
+ name: name,
+ }),
+ );
+ }
+
+ reportTested(test, type, message) {
+ this.report(type, this.suite.name, test.name, message, test.location);
+ }
+
+ crash(message) {
+ this.report("CRASHED", null, null, message);
+ }
+
+ log(message) {
+ this.report("LOG", null, null, message);
+ }
+
+ next(resolve, reject) {
+ requestAnimationFrame(async () => {
+ if (!this.suite || this.suite.tests.length === 0) {
+ this.suite = this.suites.shift();
+
+ if (this.suite) {
+ this.report("SUITE", this.suite.name);
+ } else {
+ return resolve();
+ }
+ }
+
+ const currentHistory = window.history.length;
+
+ const test = this.suite.tests.shift();
+
+ try {
+ const result = await test.proc.call(this.suite.context);
+
+ // Go back to the beginning
+ if (window.history.length - currentHistory) {
+ window.history.go(-(window.history.length - currentHistory));
+ }
+
+ // Clear storages
+ sessionStorage.clear();
+ localStorage.clear();
+
+ // TODO: Reset Stores
+
+ if (result instanceof TestContext) {
+ try {
+ await result.run();
+ this.reportTested(test, "SUCCEEDED", result.subject);
+ } catch (error) {
+ this.reportTested(test, "FAILED", error);
+ }
+ } else {
+ if (result) {
+ this.reportTested(test, "SUCCEEDED");
+ } else {
+ this.reportTested(test, "FAILED");
+ }
+ }
+ } catch (error) {
+ // An error occurred while trying to run a test; this is different from the test itself failing.
+ this.reportTested(test, "ERRORED", error);
+ }
+
+ this.next(resolve, reject);
+ });
+ }
+}
+
+// This function creates a test for an equality operation (either == or !=).
+export const testOperation = (left, right, operator) => {
+ return new TestContext(left).step((subject) => {
+ let result = compare(subject, right);
+
+ if (operator === "==") {
+ result = !result;
+ }
+
+ if (result) {
+ throw `Assertion failed: ${right} ${operator} ${subject}`;
+ }
+
+ return true;
+ });
+};
+
+export const testContext = TestContext;
+export const testRunner = TestRunner;
diff --git a/runtime/src/translate.js b/runtime/src/translate.js
new file mode 100644
index 000000000..1e2dca85a
--- /dev/null
+++ b/runtime/src/translate.js
@@ -0,0 +1,11 @@
+import { signal } from "@preact/signals";
+
+// We have global signals for translations.
+export const translations = signal({});
+export const locale = signal({});
+
+// Global functions to set the locale and translate a key
+// with the current locale.
+export const setLocale = (value) => (locale.value = value);
+export const translate = (key) =>
+ (translations.value[locale.value] || {})[key] || "";
diff --git a/runtime/src/utilities.js b/runtime/src/utilities.js
new file mode 100644
index 000000000..3325b547d
--- /dev/null
+++ b/runtime/src/utilities.js
@@ -0,0 +1,97 @@
+import { createRef as createRefOriginal, Component, createElement } from "preact";
+import { useEffect, useRef, useMemo } from "preact/hooks";
+import { signal } from "@preact/signals";
+
+// We need to have a different function for accessing array items because there
+// is no concept of `null` in Mint so we return `Just(a)` or `Nothing`.
+export const arrayAccess = (array, index, just, nothing) => {
+ if (array.length >= index + 1 && index >= 0) {
+ return new just(array[index]);
+ } else {
+ return new nothing();
+ }
+};
+
+// This sets the references to an element or component. The current
+// value is always a `Maybe`
+export const setRef = (value, just) => (element) => {
+ if (value.current._0 !== element) {
+ value.current = new just(element);
+ }
+};
+
+// A version of `useSignal`` which subscribes to the signal by default (like a
+// state) since we want to re-render every time the signal changes.
+export const useSignal = (value) => {
+ const item = useMemo(() => signal(value), []);
+ item.value;
+ return item;
+};
+
+// A version of `createRef` with a default value.
+export const createRef = (value) => {
+ const ref = createRefOriginal();
+ ref.current = value;
+ return ref;
+};
+
+// A hook to replace the `componentDidUpdate` function.
+export const useDidUpdate = (callback) => {
+ const hasMount = useRef(false);
+
+ useEffect(() => {
+ if (hasMount.current) {
+ callback();
+ } else {
+ hasMount.current = true;
+ }
+ });
+};
+
+// Function for the `or` operator.
+export const or = (item, value) => {
+ if (item !== undefined && item !== null) {
+ return item;
+ } else {
+ return value;
+ }
+};
+
+// Converts the arguments into an array.
+export const toArray = (...args) => {
+ let items = Array.from(args);
+
+ if (Array.isArray(items[0]) && items.length === 1) {
+ return items[0];
+ } else {
+ return items;
+ }
+};
+
+// Function for member access.
+export const access = (field) => (value) => value[field];
+
+// Identity function, used in encoders.
+export const identity = (a) => a;
+
+export class lazyComponent extends Component {
+ async componentDidMount() {
+ let x = await this.props.x();
+ this.setState({ x: x })
+ }
+
+ render() {
+ if (this.state.x) {
+ return createElement(this.state.x, this.props.p, this.props.c)
+ } else {
+ return null
+ }
+ }
+}
+
+export const lazy = (path) => async () => load(path)
+
+export const load = async (path) => {
+ const x = await import(path)
+ return x.default
+}
diff --git a/runtime/src/variant.js b/runtime/src/variant.js
new file mode 100644
index 000000000..b90f9282c
--- /dev/null
+++ b/runtime/src/variant.js
@@ -0,0 +1,56 @@
+import { Equals, compareObjects, compare } from "./equality";
+
+// The base class for variants.
+class Variant {
+ [Equals](other) {
+ if (!(other instanceof this.constructor)) {
+ return false;
+ }
+
+ if (other.length !== this.length) {
+ return false;
+ }
+
+ if (this.record) {
+ return compareObjects(this, other);
+ }
+
+ for (let index = 0; index < this.length; index++) {
+ if (!compare(this["_" + index], other["_" + index])) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
+
+// Creates an type variant class, this is needed so we can do proper
+// comparisons and pattern matching / destructuring.
+export const variant = (input) => {
+ return class extends Variant {
+ constructor(...args) {
+ super();
+ if (Array.isArray(input)) {
+ this.length = input.length;
+ this.record = true;
+
+ for (let index = 0; index < input.length; index++) {
+ this[input[index]] = args[index];
+ }
+ } else {
+ this.length = input;
+
+ for (let index = 0; index < input; index++) {
+ this[`_${index}`] = args[index];
+ }
+ }
+ }
+ };
+};
+
+// Creates a new variant from variable arguments.
+export const newVariant =
+ (item) =>
+ (...args) =>
+ new item(...args);
diff --git a/runtime/tests/equality.test.js b/runtime/tests/equality.test.js
new file mode 100644
index 000000000..d6b7998be
--- /dev/null
+++ b/runtime/tests/equality.test.js
@@ -0,0 +1,278 @@
+import { expect, test, describe } from "vitest";
+import { compare } from "../index_testing";
+
+test("comparing nulls", () => {
+ expect(compare(null, null)).toBe(true);
+ expect(compare(null, undefined)).toBe(false);
+ expect(compare(undefined, "")).toBe(false);
+});
+
+test("comparing nodes", () => {
+ expect(compare(document.body, document.body)).toBe(true);
+ expect(compare(document.body, document.head)).toBe(false);
+});
+
+test("comparing same symbols", () => {
+ expect(compare(Symbol("A"), Symbol("A"))).toBe(false);
+});
+
+test("comparing same arrays", () => {
+ expect(["A"] == ["A"]).toBe(false);
+ expect(compare(["A"], ["A"])).toBe(true);
+});
+
+test("comparing functions", () => {
+ expect(
+ compare(
+ () => {},
+ () => {},
+ ),
+ ).toBe(false);
+});
+
+test("comparing empty arrays", () => {
+ expect([] == []).toBe(false);
+ expect(compare([], [])).toBe(true);
+});
+
+test("comparing arrays with null", () => {
+ expect(compare([], null)).toBe(false);
+});
+
+test("comparing arrays with undefined", () => {
+ expect(compare([], undefined)).toBe(false);
+});
+
+test("comparing different length arrays", () => {
+ expect(["A"] == ["A"]).toBe(false);
+ expect(compare(["A", "B"], ["A"])).toBe(false);
+});
+
+test("comparing different arrays", () => {
+ expect(compare(["A"], ["B"])).toBe(false);
+});
+
+test("comparing same dates", () => {
+ expect(new Date() == new Date()).toBe(false);
+ expect(compare(new Date(), new Date())).toBe(true);
+});
+
+test("comparing different dates", () => {
+ expect(compare(new Date(2018, 1, 1), new Date(2018, 1, 2))).toBe(false);
+});
+
+test("comparing same strings", () => {
+ expect(compare("A", "A")).toBe(true);
+});
+
+test("comparing same numbers", () => {
+ expect(compare(0, 0.0)).toBe(true);
+});
+
+test("comparing booleans", () => {
+ expect(compare(true, true)).toBe(true);
+});
+
+test("comparing objects", () => {
+ expect(compare({ a: "a" }, { a: "a" })).toBe(true);
+ expect(compare({ a: "a" }, { a: "b" })).toBe(false);
+ expect(compare({ a: "a" }, { a: "a", b: "c" })).toBe(false);
+});
+
+describe("URLSearchParams", () => {
+ test("false for null", () => {
+ const a = new URLSearchParams("a=b&c=d");
+
+ expect(compare(a, null)).toBe(false);
+ });
+
+ test("false for undefined", () => {
+ const a = new URLSearchParams("a=b&c=d");
+
+ expect(compare(a, undefined)).toBe(false);
+ });
+
+ test("same data are equal", () => {
+ const a = new URLSearchParams("a=b&c=d");
+ const b = new URLSearchParams("a=b&c=d");
+
+ expect(compare(a, b)).toBe(true);
+ });
+});
+
+describe("Map", () => {
+ test("false for undefined", () => {
+ const a = new Map();
+
+ expect(compare(a, undefined)).toBe(false);
+ });
+
+ test("false for null", () => {
+ const a = new Map();
+
+ expect(compare(a, null)).toBe(false);
+ });
+
+ test("same data are equal", () => {
+ const a = new Map([
+ ["A", "B"],
+ ["X", "Y"],
+ ]);
+ const b = new Map([
+ ["A", "B"],
+ ["X", "Y"],
+ ]);
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("same data with different order are equal", () => {
+ const a = new Map([
+ ["X", "Y"],
+ ["A", "B"],
+ ]);
+ const b = new Map([
+ ["A", "B"],
+ ["X", "Y"],
+ ]);
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("empty maps are equal", () => {
+ const a = new Map();
+ const b = new Map();
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("different data are not equal", () => {
+ const a = new Map([
+ ["A", "B"],
+ ["X", "Z"],
+ ]);
+ const b = new Map([
+ ["A", "B"],
+ ["X", "Y"],
+ ]);
+
+ expect(compare(a, b)).toBe(false);
+ });
+
+ test("data with different number of keys are not equal", () => {
+ const a = new Map([["A", "B"]]);
+ const b = new Map([
+ ["A", "B"],
+ ["X", "Y"],
+ ]);
+
+ expect(compare(a, b)).toBe(false);
+ });
+});
+
+describe("Set", () => {
+ test("false for undefined", () => {
+ const a = new Set([]);
+
+ expect(compare(a, undefined)).toBe(false);
+ });
+
+ test("false for null", () => {
+ const a = new Set([]);
+
+ expect(compare(a, null)).toBe(false);
+ });
+
+ test("same data are equal", () => {
+ const a = new Set(["A", "B", "B"]);
+ const b = new Set(["A", "B", "B"]);
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("same data not in order are equal", () => {
+ const a = new Set(["B", "A", "A"]);
+ const b = new Set(["A", "B", "B"]);
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("different data does not equal", () => {
+ const a = new Set(["B", "C", "A"]);
+ const b = new Set(["A", "B", "B"]);
+
+ expect(compare(a, b)).toBe(false);
+ });
+});
+
+describe("FormData", () => {
+ test("false for undefined", () => {
+ const a = new FormData();
+
+ expect(compare(a, undefined)).toBe(false);
+ });
+
+ test("false for null", () => {
+ const a = new FormData();
+
+ expect(compare(a, null)).toBe(false);
+ });
+
+ test("empty form datas are equal", () => {
+ expect(compare(new FormData(), new FormData())).toBe(true);
+ });
+
+ test("same data form datas are equal", () => {
+ const a = new FormData();
+ a.append("a", "a");
+
+ const b = new FormData();
+ b.append("a", "a");
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("different datas are not equal", () => {
+ const a = new FormData();
+ a.append("a", "a");
+
+ const b = new FormData();
+ b.append("b", "a");
+
+ expect(compare(a, b)).toBe(false);
+ });
+
+ test("different datas are not equal", () => {
+ const a = new FormData();
+ a.append("a", "b");
+
+ const b = new FormData();
+ b.append("a", "a");
+
+ expect(compare(a, b)).toBe(false);
+ });
+
+ test("same multiple data form datas are equal", () => {
+ const a = new FormData();
+ a.append("a", "a");
+ a.append("a", "b");
+
+ const b = new FormData();
+ b.append("a", "b");
+ b.append("a", "a");
+
+ expect(compare(a, b)).toBe(true);
+ });
+
+ test("same multiple data form datas with different order are equal", () => {
+ const a = new FormData();
+ a.append("a", "b");
+ a.append("x", "y");
+
+ const b = new FormData();
+ b.append("x", "y");
+ b.append("a", "b");
+
+ expect(compare(a, b)).toBe(true);
+ });
+});
diff --git a/runtime/tests/normalize_event.test.js b/runtime/tests/normalize_event.test.js
new file mode 100644
index 000000000..6651d7384
--- /dev/null
+++ b/runtime/tests/normalize_event.test.js
@@ -0,0 +1,49 @@
+import { expect, test, describe } from "vitest";
+import { normalizeEvent } from "../index";
+
+describe("normalizeEvent", () => {
+ test("returns default values if they are not defined", () => {
+ const event = normalizeEvent({ test: "X", preventDefault: () => "P" });
+
+ expect(event.dataTransfer).not.toBe(undefined);
+
+ expect(event.dataTransfer.setData("test", "test")).toBe(null);
+ expect(event.dataTransfer.getData("not present")).toBe("");
+ expect(event.dataTransfer.getData("test")).toBe("test");
+ expect(event.dataTransfer.clearData()).toBe(null);
+
+ expect(event.clipboardData).not.toBe(undefined);
+ expect(event.preventDefault()).toBe("P");
+ expect(event.data).toBe("");
+ expect(event.altKey).toBe(false);
+ expect(event.charCode).toBe(-1);
+ expect(event.ctrlKey).toBe(false);
+ expect(event.key).toBe("");
+ expect(event.keyCode).toBe(-1);
+ expect(event.locale).toBe("");
+ expect(event.location).toBe(-1);
+ expect(event.metaKey).toBe(false);
+ expect(event.repeat).toBe(false);
+ expect(event.shiftKey).toBe(false);
+ expect(event.which).toBe(-1);
+ expect(event.button).toBe(-1);
+ expect(event.buttons).toBe(-1);
+ expect(event.clientX).toBe(-1);
+ expect(event.clientY).toBe(-1);
+ expect(event.pageX).toBe(-1);
+ expect(event.pageY).toBe(-1);
+ expect(event.screenY).toBe(-1);
+ expect(event.screenX).toBe(-1);
+ expect(event.detail).toBe(-1);
+ expect(event.deltaMode).toBe(-1);
+ expect(event.deltaX).toBe(-1);
+ expect(event.deltaY).toBe(-1);
+ expect(event.deltaZ).toBe(-1);
+ expect(event.animationName).toBe("");
+ expect(event.pseudoElement).toBe("");
+ expect(event.elapsedTime).toBe(-1);
+ expect(event.propertyName).toBe("");
+ expect(event.blah).toBe(undefined);
+ expect(event.test).toBe("X");
+ });
+});
diff --git a/runtime/tests/provider.test.js b/runtime/tests/provider.test.js
new file mode 100644
index 000000000..fd34acebd
--- /dev/null
+++ b/runtime/tests/provider.test.js
@@ -0,0 +1,29 @@
+import { render, fireEvent } from "@testing-library/preact";
+import { expect, test, describe } from "vitest";
+import { useState } from "preact/hooks";
+import { h } from "preact";
+
+import { createProvider, useProviders, useId, subscriptions } from "../index";
+
+const map = new Map();
+const provider = createProvider(map, () => {});
+
+describe("providers", () => {
+ test("works correctly", () => {
+ /*
+ const item = h(() => {
+ const [count, setCount] = useState(0);
+ const id = useId();
+
+ useProviders([() => provider(id, count == 1 ? {} : null)]);
+
+ return h("div", { onClick: () => setCount(1) }, "TEST");
+ });
+
+ const items = subscriptions(map);
+ const container = render(item);
+
+ fireEvent.click(container.getByText("TEST"));
+ */
+ });
+});
diff --git a/runtime/tests/styles.test.js b/runtime/tests/styles.test.js
new file mode 100644
index 000000000..d92dd27e0
--- /dev/null
+++ b/runtime/tests/styles.test.js
@@ -0,0 +1,32 @@
+import { expect, test, describe } from "vitest";
+import { insertStyles, style } from "../index";
+
+describe("insertStyles", () => {
+ test("adds styles to the document", () => {
+ insertStyles("test");
+ expect(document.head.querySelector("style").textContent).toBe("test");
+ });
+});
+
+describe("style", () => {
+ test("it creates an object from objects and maps", () => {
+ expect(
+ style([
+ "opacity:0; z-index: 100 ; ",
+ new Map([["a", "b"]]),
+ new Map([[101, "d"]]),
+ [["x", "y"]],
+ { c: "d" },
+ { z: 123 },
+ ]),
+ ).toEqual({
+ "z-index": "100",
+ opacity: "0",
+ a: "b",
+ 101: "d",
+ x: "y",
+ c: "d",
+ z: "123",
+ });
+ });
+});
diff --git a/runtime/tests/translate.test.js b/runtime/tests/translate.test.js
new file mode 100644
index 000000000..9dd24f128
--- /dev/null
+++ b/runtime/tests/translate.test.js
@@ -0,0 +1,15 @@
+import { expect, test, describe } from "vitest";
+import { setLocale, translate, locale } from "../index";
+
+describe("setLocale", () => {
+ test("setting locale", () => {
+ setLocale("en");
+ expect(locale.value).toEqual("en");
+ });
+});
+
+describe("translate", () => {
+ test("translates a key", () => {
+ expect(translate("test")).toEqual("");
+ });
+});
diff --git a/runtime/tests/utilities.test.js b/runtime/tests/utilities.test.js
new file mode 100644
index 000000000..b6e5c5812
--- /dev/null
+++ b/runtime/tests/utilities.test.js
@@ -0,0 +1,84 @@
+import { render, fireEvent } from "@testing-library/preact";
+import { expect, test, describe } from "vitest";
+import { useState } from "preact/hooks";
+import { h } from "preact";
+
+import {
+ useDidUpdate,
+ arrayAccess,
+ useFunction,
+ identity,
+ variant,
+ toArray,
+ access,
+ or,
+} from "../index";
+
+const Nothing = variant();
+const Just = variant(1);
+
+describe("arrayAccess", () => {
+ test("it returns a just for an element", () => {
+ let result = arrayAccess([0], 0, Just, Nothing);
+
+ expect(result).toBeInstanceOf(Just);
+ expect(result._0).toBe(0);
+ });
+
+ test("it returns nothing for an element", () => {
+ let result = arrayAccess([0], 1, Just, Nothing);
+
+ expect(result).toBeInstanceOf(Nothing);
+ });
+
+ test("it returns nothing if index is negative", () => {
+ let result = arrayAccess([0], -1, Just, Nothing);
+
+ expect(result).toBeInstanceOf(Nothing);
+ });
+});
+
+describe("or", () => {
+ test("it returns the given item", () => {
+ expect(or("a", "b")).toEqual("a");
+ });
+
+ test("it returns the given item", () => {
+ expect(or(null, "b")).toEqual("b");
+ });
+});
+
+describe("access", () => {
+ test("it returns the field", () => {
+ expect(access("a")({ a: "b" })).toEqual("b");
+ });
+});
+
+describe("identity", () => {
+ test("it returns the value", () => {
+ expect(identity("a")).toEqual("a");
+ });
+});
+
+describe("toArray", () => {
+ test("it returns an array for not arrays", () => {
+ expect(toArray(0)).toEqual([0]);
+ });
+
+ test("returns the input array for an arrays", () => {
+ expect(toArray([0])).toEqual([0]);
+ });
+});
+
+describe("useDidUpdate", () => {
+ test("calls on changes", () => {
+ const item = h(() => {
+ useDidUpdate(() => {});
+ const [count, setCount] = useState(0);
+ return h("div", { onClick: () => setCount(1) }, "TEST");
+ });
+
+ const container = render(item);
+ fireEvent.click(container.getByText("TEST"));
+ });
+});
diff --git a/runtime/tests/variant.test.js b/runtime/tests/variant.test.js
new file mode 100644
index 000000000..b85f5c23d
--- /dev/null
+++ b/runtime/tests/variant.test.js
@@ -0,0 +1,54 @@
+import { variant, compare, newVariant } from "../index";
+import { expect, test, describe } from "vitest";
+
+const RecordEnum = variant(["a", "b"]);
+const TestEnum2 = variant(2);
+const TestEnum = variant(0);
+
+describe("equality", () => {
+ test("same intance equals true", () => {
+ expect(compare(new TestEnum(), new TestEnum())).toEqual(true);
+ });
+
+ test("same parameters equals true", () => {
+ expect(compare(new TestEnum2("0", "1"), new TestEnum2("0", "1"))).toEqual(
+ true,
+ );
+ });
+
+ test("different instances equals false", () => {
+ expect(compare(new TestEnum2("0", "2"), new TestEnum())).toEqual(false);
+ });
+
+ test("different lengths equals false", () => {
+ const a = new TestEnum2("0", "2");
+ const b = new TestEnum2("0", "2");
+ b.length = 10;
+
+ expect(compare(a, b)).toEqual(false);
+ });
+
+ test("different parameters equals false", () => {
+ expect(compare(new TestEnum2("0", "2"), new TestEnum2("0", "1"))).toEqual(
+ false,
+ );
+ });
+
+ test("same enum equals true", () => {
+ expect(
+ compare(
+ newVariant(RecordEnum)("a", "b"),
+ newVariant(RecordEnum)("a", "b"),
+ ),
+ ).toEqual(true);
+ });
+
+ test("different enum equals false", () => {
+ expect(
+ compare(
+ newVariant(RecordEnum)("a", "b"),
+ newVariant(RecordEnum)("a", "c"),
+ ),
+ ).toEqual(false);
+ });
+});
diff --git a/runtime/vite.config.js b/runtime/vite.config.js
new file mode 100644
index 000000000..bfd0ef485
--- /dev/null
+++ b/runtime/vite.config.js
@@ -0,0 +1,10 @@
+import { defineConfig } from "vitest/config";
+
+export default defineConfig({
+ test: {
+ environment: "jsdom",
+ coverage: {
+ provider: "v8",
+ },
+ },
+});
diff --git a/runtime/yarn-error.log b/runtime/yarn-error.log
new file mode 100644
index 000000000..19ec79c1b
--- /dev/null
+++ b/runtime/yarn-error.log
@@ -0,0 +1,2009 @@
+Arguments:
+ /home/gus/.asdf/installs/nodejs/20.10.0/bin/node /home/gus/.asdf/installs/yarn/1.22.19/bin/yarn.js
+
+PATH:
+ /home/gus/.asdf/plugins/nodejs/shims:/home/gus/.asdf/installs/nodejs/20.10.0/.npm/bin:/home/gus/.asdf/installs/nodejs/20.10.0/bin:/home/gus/.asdf/installs/yarn/1.22.19/bin:/home/gus/.fly/bin:/home/gus/.asdf/shims:/home/gus/.asdf/bin:/home/gus/.cache/rebar3/bin:/home/gus/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/jvm/java-17-oracle/bin:/usr/lib/jvm/java-17-oracle/db/bin
+
+Yarn version:
+ 1.22.19
+
+Node version:
+ 20.10.0
+
+Platform:
+ linux x64
+
+Trace:
+ SyntaxError: /home/gus/Projects/mint-lang/mint/runtime/package.json: Expected double-quoted property name in JSON at position 242
+ at JSON.parse ()
+ at /home/gus/.asdf/installs/yarn/1.22.19/lib/cli.js:1629:59
+ at Generator.next ()
+ at step (/home/gus/.asdf/installs/yarn/1.22.19/lib/cli.js:310:30)
+ at /home/gus/.asdf/installs/yarn/1.22.19/lib/cli.js:321:13
+
+npm manifest:
+ {
+ "private": true,
+ "dependencies": {
+ "@preact/signals": "^1.2.2",
+ "fast-equals": "^5.0.1",
+ "indent-string": "^5.0.0",
+ "preact": "^10.19.3",
+ "route-parser": "mint-lang/mint-route-parser",
+ "uuid-random": "^1.3.2",
+ },
+ "devDependencies": {
+ "@testing-library/preact": "^3.2.3",
+ "@vitest/coverage-v8": "^1.2.1",
+ "esbuild": "^0.19.11",
+ "prettier": "^3.1.0",
+ "vitest": "^1.2.1",
+ "jsdom": "^23.2.0",
+ }
+ }
+
+yarn manifest:
+ No manifest
+
+Lockfile:
+ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+ # yarn lockfile v1
+
+
+ "@ampproject/remapping@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+ "@babel/code-frame@^7.10.4":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+ dependencies:
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
+
+ "@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
+ "@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+ "@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+ "@babel/parser@^7.23.3":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
+ integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
+
+ "@babel/runtime@^7.12.5":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193"
+ integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+ "@babel/types@^7.23.3":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
+ integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+ "@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+ "@esbuild/aix-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3"
+ integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==
+
+ "@esbuild/android-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220"
+ integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==
+
+ "@esbuild/android-arm64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz#fb7130103835b6d43ea499c3f30cfb2b2ed58456"
+ integrity sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA==
+
+ "@esbuild/android-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c"
+ integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==
+
+ "@esbuild/android-arm@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.8.tgz#b46e4d9e984e6d6db6c4224d72c86b7757e35bcb"
+ integrity sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA==
+
+ "@esbuild/android-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2"
+ integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==
+
+ "@esbuild/android-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.8.tgz#a13db9441b5a4f4e4fec4a6f8ffacfea07888db7"
+ integrity sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A==
+
+ "@esbuild/darwin-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf"
+ integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==
+
+ "@esbuild/darwin-arm64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz#49f5718d36541f40dd62bfdf84da9c65168a0fc2"
+ integrity sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw==
+
+ "@esbuild/darwin-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e"
+ integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==
+
+ "@esbuild/darwin-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz#75c5c88371eea4bfc1f9ecfd0e75104c74a481ac"
+ integrity sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q==
+
+ "@esbuild/freebsd-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a"
+ integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==
+
+ "@esbuild/freebsd-arm64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz#9d7259fea4fd2b5f7437b52b542816e89d7c8575"
+ integrity sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw==
+
+ "@esbuild/freebsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2"
+ integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==
+
+ "@esbuild/freebsd-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz#abac03e1c4c7c75ee8add6d76ec592f46dbb39e3"
+ integrity sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg==
+
+ "@esbuild/linux-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545"
+ integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==
+
+ "@esbuild/linux-arm64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz#c577932cf4feeaa43cb9cec27b89cbe0df7d9098"
+ integrity sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ==
+
+ "@esbuild/linux-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3"
+ integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==
+
+ "@esbuild/linux-arm@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz#d6014d8b98b5cbc96b95dad3d14d75bb364fdc0f"
+ integrity sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ==
+
+ "@esbuild/linux-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4"
+ integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==
+
+ "@esbuild/linux-ia32@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz#2379a0554307d19ac4a6cdc15b08f0ea28e7a40d"
+ integrity sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ==
+
+ "@esbuild/linux-loong64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121"
+ integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==
+
+ "@esbuild/linux-loong64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz#e2a5bbffe15748b49356a6cd7b2d5bf60c5a7123"
+ integrity sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ==
+
+ "@esbuild/linux-mips64el@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9"
+ integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==
+
+ "@esbuild/linux-mips64el@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz#1359331e6f6214f26f4b08db9b9df661c57cfa24"
+ integrity sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q==
+
+ "@esbuild/linux-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912"
+ integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==
+
+ "@esbuild/linux-ppc64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz#9ba436addc1646dc89dae48c62d3e951ffe70951"
+ integrity sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg==
+
+ "@esbuild/linux-riscv64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916"
+ integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==
+
+ "@esbuild/linux-riscv64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz#fbcf0c3a0b20f40b5fc31c3b7695f0769f9de66b"
+ integrity sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg==
+
+ "@esbuild/linux-s390x@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8"
+ integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==
+
+ "@esbuild/linux-s390x@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz#989e8a05f7792d139d5564ffa7ff898ac6f20a4a"
+ integrity sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg==
+
+ "@esbuild/linux-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766"
+ integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==
+
+ "@esbuild/linux-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz#b187295393a59323397fe5ff51e769ec4e72212b"
+ integrity sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg==
+
+ "@esbuild/netbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d"
+ integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==
+
+ "@esbuild/netbsd-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz#c1ec0e24ea82313cb1c7bae176bd5acd5bde7137"
+ integrity sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw==
+
+ "@esbuild/openbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2"
+ integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==
+
+ "@esbuild/openbsd-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz#0c5b696ac66c6d70cf9ee17073a581a28af9e18d"
+ integrity sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ==
+
+ "@esbuild/sunos-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767"
+ integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==
+
+ "@esbuild/sunos-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz#2a697e1f77926ff09fcc457d8f29916d6cd48fb1"
+ integrity sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w==
+
+ "@esbuild/win32-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee"
+ integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==
+
+ "@esbuild/win32-arm64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz#ec029e62a2fca8c071842ecb1bc5c2dd20b066f1"
+ integrity sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg==
+
+ "@esbuild/win32-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c"
+ integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==
+
+ "@esbuild/win32-ia32@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz#cbb9a3146bde64dc15543e48afe418c7a3214851"
+ integrity sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw==
+
+ "@esbuild/win32-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04"
+ integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==
+
+ "@esbuild/win32-x64@0.19.8":
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz#c8285183dbdb17008578dbacb6e22748709b4822"
+ integrity sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA==
+
+ "@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+ "@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
+ "@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+ "@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
+ "@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+ "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+ "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.20"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+ "@preact/signals-core@^1.4.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@preact/signals-core/-/signals-core-1.5.0.tgz#5d34db4d3c242c93e1cefb7ce8b2d10ecbdbfa79"
+ integrity sha512-U2diO1Z4i1n2IoFgMYmRdHWGObNrcuTRxyNEn7deSq2cru0vj0583HYQZHsAqcs7FE+hQyX3mjIV7LAfHCvy8w==
+
+ "@preact/signals@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@preact/signals/-/signals-1.2.2.tgz#78df53b2d7e6cdda0bb32843f12eb0418a0d82b0"
+ integrity sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==
+ dependencies:
+ "@preact/signals-core" "^1.4.0"
+
+ "@rollup/rollup-android-arm-eabi@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz#ccb02257556bacbc1e756ab9b0b973cea2c7a664"
+ integrity sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==
+
+ "@rollup/rollup-android-arm64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz#21bd0fbafdf442c6a17645b840f6a94556b0e9bb"
+ integrity sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==
+
+ "@rollup/rollup-darwin-arm64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz#9f2e5d5637677f9839dbe1622130d0592179136a"
+ integrity sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==
+
+ "@rollup/rollup-darwin-x64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz#1b06291ff1c41af94d2786cd167188c5bf7caec9"
+ integrity sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==
+
+ "@rollup/rollup-linux-arm-gnueabihf@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz#147069948bba00f435122f411210624e72638ebf"
+ integrity sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==
+
+ "@rollup/rollup-linux-arm64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz#3a50f0e7ae6e444d11c61fce12783196454a4efb"
+ integrity sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==
+
+ "@rollup/rollup-linux-arm64-musl@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz#82b5e75484d91c25d4e649d018d9523e72d6dac2"
+ integrity sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==
+
+ "@rollup/rollup-linux-riscv64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz#ca96f2d43a553d73aec736e991c07010561bc7a9"
+ integrity sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==
+
+ "@rollup/rollup-linux-x64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz#db1cece244ea46706c0e1a522ec19ca0173abc55"
+ integrity sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==
+
+ "@rollup/rollup-linux-x64-musl@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz#c15b26b86827f75977bf59ebd41ce5d788713936"
+ integrity sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==
+
+ "@rollup/rollup-win32-arm64-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz#60152948f9fb08e8c50c1555e334ca9f9f1f53aa"
+ integrity sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==
+
+ "@rollup/rollup-win32-ia32-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz#657288cff10311f997d8dbd648590441760ae6d9"
+ integrity sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==
+
+ "@rollup/rollup-win32-x64-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz#830f3a3fba67f6216a5884368431918029045afe"
+ integrity sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==
+
+ "@sinclair/typebox@^0.27.8":
+ version "0.27.8"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
+ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+
+ "@testing-library/dom@^8.11.1":
+ version "8.20.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f"
+ integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/runtime" "^7.12.5"
+ "@types/aria-query" "^5.0.1"
+ aria-query "5.1.3"
+ chalk "^4.1.0"
+ dom-accessibility-api "^0.5.9"
+ lz-string "^1.5.0"
+ pretty-format "^27.0.2"
+
+ "@testing-library/preact@^3.2.3":
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/@testing-library/preact/-/preact-3.2.3.tgz#0d331b7a7f934a4b0fc6c95ff3a9e1d6fa93094e"
+ integrity sha512-y6Kklp1XK3f1X2fWCbujmJyzkf+1BgLYXNgAx21j9+D4CoqMTz5qC4SQufb1L6q/jxLGACzrQ90ewVOTBvHOfg==
+ dependencies:
+ "@testing-library/dom" "^8.11.1"
+
+ "@types/aria-query@^5.0.1":
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708"
+ integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==
+
+ "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+ "@vitest/coverage-v8@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-1.1.1.tgz#8cf41ef4c4e8bf979937452f5ab446e29e61aba1"
+ integrity sha512-TCXSh6sA92t7D5p7HJ64sPCi+szP8E3NiKTsR3YR8vVEVZB9yclQu2btktCthxahKBl7PwheP5OuejYg13xccg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.1"
+ "@bcoe/v8-coverage" "^0.2.3"
+ debug "^4.3.4"
+ istanbul-lib-coverage "^3.2.2"
+ istanbul-lib-report "^3.0.1"
+ istanbul-lib-source-maps "^4.0.1"
+ istanbul-reports "^3.1.6"
+ magic-string "^0.30.5"
+ magicast "^0.3.2"
+ picocolors "^1.0.0"
+ std-env "^3.5.0"
+ test-exclude "^6.0.0"
+ v8-to-istanbul "^9.2.0"
+
+ "@vitest/expect@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.1.1.tgz#6b00a5e9ecccdc9da112e89214693a857564e39c"
+ integrity sha512-Qpw01C2Hyb3085jBkOJLQ7HRX0Ncnh2qV4p+xWmmhcIUlMykUF69zsnZ1vPmAjZpomw9+5tWEGOQ0GTfR8U+kA==
+ dependencies:
+ "@vitest/spy" "1.1.1"
+ "@vitest/utils" "1.1.1"
+ chai "^4.3.10"
+
+ "@vitest/runner@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.1.1.tgz#c2c2a6baa25f3964c3434e94628b324bc0f19587"
+ integrity sha512-8HokyJo1SnSi3uPFKfWm/Oq1qDwLC4QDcVsqpXIXwsRPAg3gIDh8EbZ1ri8cmQkBxdOu62aOF9B4xcqJhvt4xQ==
+ dependencies:
+ "@vitest/utils" "1.1.1"
+ p-limit "^5.0.0"
+ pathe "^1.1.1"
+
+ "@vitest/snapshot@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.1.1.tgz#40261901102e131cb09f23034884ad2c1c5af317"
+ integrity sha512-WnMHjv4VdHLbFGgCdVVvyRkRPnOKN75JJg+LLTdr6ah7YnL75W+7CTIMdzPEPzaDxA8r5yvSVlc1d8lH3yE28w==
+ dependencies:
+ magic-string "^0.30.5"
+ pathe "^1.1.1"
+ pretty-format "^29.7.0"
+
+ "@vitest/spy@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.1.1.tgz#49a9c3f9b86f07b86333fc14d1667691b9a77a5c"
+ integrity sha512-hDU2KkOTfFp4WFFPWwHFauddwcKuGQ7gF6Un/ZZkCogoAiTMN7/7YKvUDbywPZZ754iCQGjdUmXN3t4k0jm1IQ==
+ dependencies:
+ tinyspy "^2.2.0"
+
+ "@vitest/utils@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.1.1.tgz#493d1963d917a3ac29fbd4c36c1c31cfd17a7b41"
+ integrity sha512-E9LedH093vST/JuBSyHLFMpxJKW3dLhe/flUSPFedoyj4wKiFX7Jm8gYLtOIiin59dgrssfmFv0BJ1u8P/LC/A==
+ dependencies:
+ diff-sequences "^29.6.3"
+ loupe "^2.3.7"
+ pretty-format "^29.7.0"
+
+ acorn-walk@^8.3.0:
+ version "8.3.1"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43"
+ integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==
+
+ acorn@^8.10.0:
+ version "8.11.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+ integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
+ agent-base@^7.0.2, agent-base@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434"
+ integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==
+ dependencies:
+ debug "^4.3.4"
+
+ ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+ aria-query@5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+ dependencies:
+ deep-equal "^2.0.5"
+
+ array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+ assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+ asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+ available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+ balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+ brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+ cac@^6.7.14:
+ version "6.7.14"
+ resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959"
+ integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
+
+ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
+
+ chai@^4.3.10:
+ version "4.3.10"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384"
+ integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.3"
+ deep-eql "^4.1.3"
+ get-func-name "^2.0.2"
+ loupe "^2.3.6"
+ pathval "^1.1.1"
+ type-detect "^4.0.8"
+
+ chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+ chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+ check-error@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694"
+ integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+ dependencies:
+ get-func-name "^2.0.2"
+
+ color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+ color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+ color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+ color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+ combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+ concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+ convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+ cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+ cssstyle@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a"
+ integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==
+ dependencies:
+ rrweb-cssom "^0.6.0"
+
+ data-urls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde"
+ integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==
+ dependencies:
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+
+ debug@4, debug@^4.1.1, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+ decimal.js@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+ deep-eql@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
+ integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
+ dependencies:
+ type-detect "^4.0.0"
+
+ deep-equal@^2.0.5:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
+ integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.5"
+ es-get-iterator "^1.1.3"
+ get-intrinsic "^1.2.2"
+ is-arguments "^1.1.1"
+ is-array-buffer "^3.0.2"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.13"
+
+ define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+ delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+ diff-sequences@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+ integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
+
+ dom-accessibility-api@^0.5.9:
+ version "0.5.16"
+ resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453"
+ integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
+
+ entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+ es-get-iterator@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
+ integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ is-arguments "^1.1.1"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.7"
+ isarray "^2.0.5"
+ stop-iteration-iterator "^1.0.0"
+
+ esbuild@^0.19.3:
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96"
+ integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.19.11"
+ "@esbuild/android-arm" "0.19.11"
+ "@esbuild/android-arm64" "0.19.11"
+ "@esbuild/android-x64" "0.19.11"
+ "@esbuild/darwin-arm64" "0.19.11"
+ "@esbuild/darwin-x64" "0.19.11"
+ "@esbuild/freebsd-arm64" "0.19.11"
+ "@esbuild/freebsd-x64" "0.19.11"
+ "@esbuild/linux-arm" "0.19.11"
+ "@esbuild/linux-arm64" "0.19.11"
+ "@esbuild/linux-ia32" "0.19.11"
+ "@esbuild/linux-loong64" "0.19.11"
+ "@esbuild/linux-mips64el" "0.19.11"
+ "@esbuild/linux-ppc64" "0.19.11"
+ "@esbuild/linux-riscv64" "0.19.11"
+ "@esbuild/linux-s390x" "0.19.11"
+ "@esbuild/linux-x64" "0.19.11"
+ "@esbuild/netbsd-x64" "0.19.11"
+ "@esbuild/openbsd-x64" "0.19.11"
+ "@esbuild/sunos-x64" "0.19.11"
+ "@esbuild/win32-arm64" "0.19.11"
+ "@esbuild/win32-ia32" "0.19.11"
+ "@esbuild/win32-x64" "0.19.11"
+
+ esbuild@^0.19.8:
+ version "0.19.8"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.8.tgz#ad05b72281d84483fa6b5345bd246c27a207b8f1"
+ integrity sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.19.8"
+ "@esbuild/android-arm64" "0.19.8"
+ "@esbuild/android-x64" "0.19.8"
+ "@esbuild/darwin-arm64" "0.19.8"
+ "@esbuild/darwin-x64" "0.19.8"
+ "@esbuild/freebsd-arm64" "0.19.8"
+ "@esbuild/freebsd-x64" "0.19.8"
+ "@esbuild/linux-arm" "0.19.8"
+ "@esbuild/linux-arm64" "0.19.8"
+ "@esbuild/linux-ia32" "0.19.8"
+ "@esbuild/linux-loong64" "0.19.8"
+ "@esbuild/linux-mips64el" "0.19.8"
+ "@esbuild/linux-ppc64" "0.19.8"
+ "@esbuild/linux-riscv64" "0.19.8"
+ "@esbuild/linux-s390x" "0.19.8"
+ "@esbuild/linux-x64" "0.19.8"
+ "@esbuild/netbsd-x64" "0.19.8"
+ "@esbuild/openbsd-x64" "0.19.8"
+ "@esbuild/sunos-x64" "0.19.8"
+ "@esbuild/win32-arm64" "0.19.8"
+ "@esbuild/win32-ia32" "0.19.8"
+ "@esbuild/win32-x64" "0.19.8"
+
+ escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+ event-propagation-path@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/event-propagation-path/-/event-propagation-path-1.0.5.tgz#1eeffa9878c9043e314849cbfa275c7e6e8f15fc"
+ integrity sha512-1/UU/xRPq3h/7UrWejsYj3ZzJtEA3FdUxKZtWjQ26KLy6yDXxtD+z1wP5mdE+BrlZAIHk7W7cGyG1uaV/Cpstg==
+
+ execa@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
+ integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^8.0.1"
+ human-signals "^5.0.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^4.1.0"
+ strip-final-newline "^3.0.0"
+
+ fast-equals@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d"
+ integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==
+
+ for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+ form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+ fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+ fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+ function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+ functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+ get-func-name@^2.0.1, get-func-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+ get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
+ dependencies:
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+ get-stream@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
+ integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
+
+ glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+ gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+ has-bigints@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+ has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+ has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+ has-property-descriptors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+
+ has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+ has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+ has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+ hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ dependencies:
+ function-bind "^1.1.2"
+
+ html-encoding-sniffer@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448"
+ integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==
+ dependencies:
+ whatwg-encoding "^3.1.1"
+
+ html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+ http-proxy-agent@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673"
+ integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
+ https-proxy-agent@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b"
+ integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==
+ dependencies:
+ agent-base "^7.0.2"
+ debug "4"
+
+ human-signals@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
+ integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
+
+ iconv-lite@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ indent-string@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5"
+ integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
+
+ inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+ inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ internal-slot@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
+ integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+ is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+ is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+ is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+ is-callable@^1.1.3:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+ is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+ is-map@^2.0.1, is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+ is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+ is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+ is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+ is-set@^2.0.1, is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+ is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+ is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
+ is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+ is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+ is-typed-array@^1.1.10:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
+ is-weakmap@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
+ integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
+ is-weakset@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
+ integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+ isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+ isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+ istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+ istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+ istanbul-lib-source-maps@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+ istanbul-reports@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a"
+ integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+ js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+ jsdom@^23.0.1:
+ version "23.0.1"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-23.0.1.tgz#ede7ff76e89ca035b11178d200710d8982ebfee0"
+ integrity sha512-2i27vgvlUsGEBO9+/kJQRbtqtm+191b5zAZrU/UezVmnC2dlDAFLgDYJvAEi94T4kjsRKkezEtLQTgsNEsW2lQ==
+ dependencies:
+ cssstyle "^3.0.0"
+ data-urls "^5.0.0"
+ decimal.js "^10.4.3"
+ form-data "^4.0.0"
+ html-encoding-sniffer "^4.0.0"
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.2"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.7"
+ parse5 "^7.1.2"
+ rrweb-cssom "^0.6.0"
+ saxes "^6.0.0"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.1.3"
+ w3c-xmlserializer "^5.0.0"
+ webidl-conversions "^7.0.0"
+ whatwg-encoding "^3.1.1"
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+ ws "^8.14.2"
+ xml-name-validator "^5.0.0"
+
+ jsonc-parser@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
+ integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
+
+ local-pkg@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c"
+ integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==
+ dependencies:
+ mlly "^1.4.2"
+ pkg-types "^1.0.3"
+
+ loupe@^2.3.6, loupe@^2.3.7:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697"
+ integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==
+ dependencies:
+ get-func-name "^2.0.1"
+
+ lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+ lz-string@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941"
+ integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
+
+ magic-string@^0.30.5:
+ version "0.30.5"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9"
+ integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+ magicast@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.2.tgz#42dcade5573ed8f10f5540f9d04964e21dba9130"
+ integrity sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==
+ dependencies:
+ "@babel/parser" "^7.23.3"
+ "@babel/types" "^7.23.3"
+ source-map-js "^1.0.2"
+
+ make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+ merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+ mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+ mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+ mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+ minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+ mlly@^1.2.0, mlly@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e"
+ integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==
+ dependencies:
+ acorn "^8.10.0"
+ pathe "^1.1.1"
+ pkg-types "^1.0.3"
+ ufo "^1.3.0"
+
+ ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+ npm-run-path@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955"
+ integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==
+ dependencies:
+ path-key "^4.0.0"
+
+ nwsapi@^2.2.7:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
+ integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
+
+ object-inspect@^1.9.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+ object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+ object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+ object.assign@^4.1.4:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+ once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+ onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+ dependencies:
+ mimic-fn "^4.0.0"
+
+ p-limit@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985"
+ integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
+ parse5@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
+ path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+ path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+ path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
+ pathe@^1.1.0, pathe@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a"
+ integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==
+
+ pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+ picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+ pkg-types@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868"
+ integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==
+ dependencies:
+ jsonc-parser "^3.2.0"
+ mlly "^1.2.0"
+ pathe "^1.1.0"
+
+ postcss@^8.4.32:
+ version "8.4.32"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
+ integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+ preact@^10.19.2:
+ version "10.19.2"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.2.tgz#841797620dba649aaac1f8be42d37c3202dcea8b"
+ integrity sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg==
+
+ prettier@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e"
+ integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==
+
+ pretty-format@^27.0.2:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+ pretty-format@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
+ integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
+ psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+ punycode@^2.1.1, punycode@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+ querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+ react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+ react-is@^18.0.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+ regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+ regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+ requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+ rollup@^4.2.0:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.2.tgz#19d730219b7ec5f51372c6cf15cfb841990489fe"
+ integrity sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.9.2"
+ "@rollup/rollup-android-arm64" "4.9.2"
+ "@rollup/rollup-darwin-arm64" "4.9.2"
+ "@rollup/rollup-darwin-x64" "4.9.2"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.9.2"
+ "@rollup/rollup-linux-arm64-gnu" "4.9.2"
+ "@rollup/rollup-linux-arm64-musl" "4.9.2"
+ "@rollup/rollup-linux-riscv64-gnu" "4.9.2"
+ "@rollup/rollup-linux-x64-gnu" "4.9.2"
+ "@rollup/rollup-linux-x64-musl" "4.9.2"
+ "@rollup/rollup-win32-arm64-msvc" "4.9.2"
+ "@rollup/rollup-win32-ia32-msvc" "4.9.2"
+ "@rollup/rollup-win32-x64-msvc" "4.9.2"
+ fsevents "~2.3.2"
+
+ route-parser@mint-lang/mint-route-parser:
+ version "0.0.5"
+ resolved "https://codeload.github.com/mint-lang/mint-route-parser/tar.gz/903d07a62fe7649fccb6be6694445ee4217c933e"
+
+ rrweb-cssom@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
+ integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
+
+ "safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+ saxes@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
+ integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
+ dependencies:
+ xmlchars "^2.2.0"
+
+ semver@^7.5.3:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+ set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+ set-function-name@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+ shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+ shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+ side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+ siginfo@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30"
+ integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==
+
+ signal-exit@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+ source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+ source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+ stackback@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b"
+ integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
+
+ std-env@^3.5.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2"
+ integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==
+
+ stop-iteration-iterator@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
+ integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ dependencies:
+ internal-slot "^1.0.4"
+
+ strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
+ strip-literal@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07"
+ integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==
+ dependencies:
+ acorn "^8.10.0"
+
+ supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+ supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+ symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+ test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+ tinybench@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e"
+ integrity sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==
+
+ tinypool@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.1.tgz#b6c4e4972ede3e3e5cda74a3da1679303d386b03"
+ integrity sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==
+
+ tinyspy@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce"
+ integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==
+
+ to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+ tough-cookie@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
+ integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+ tr46@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec"
+ integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==
+ dependencies:
+ punycode "^2.3.1"
+
+ type-detect@^4.0.0, type-detect@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+ ufo@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496"
+ integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==
+
+ universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+ url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+ uuid-random@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/uuid-random/-/uuid-random-1.3.2.tgz#96715edbaef4e84b1dcf5024b00d16f30220e2d0"
+ integrity sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==
+
+ v8-to-istanbul@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad"
+ integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.12"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^2.0.0"
+
+ vite-node@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.1.1.tgz#8cf16d5f841898de919653462c56dc99bb7d2b94"
+ integrity sha512-2bGE5w4jvym5v8llF6Gu1oBrmImoNSs4WmRVcavnG2me6+8UQntTqLiAMFyiAobp+ZXhj5ZFhI7SmLiFr/jrow==
+ dependencies:
+ cac "^6.7.14"
+ debug "^4.3.4"
+ pathe "^1.1.1"
+ picocolors "^1.0.0"
+ vite "^5.0.0"
+
+ vite@^5.0.0:
+ version "5.0.10"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.10.tgz#1e13ef5c3cf5aa4eed81f5df6d107b3c3f1f6356"
+ integrity sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==
+ dependencies:
+ esbuild "^0.19.3"
+ postcss "^8.4.32"
+ rollup "^4.2.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+ vitest@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.1.1.tgz#8ebd1a3cdca05da6e589b7d1f504ae952fecbeef"
+ integrity sha512-Ry2qs4UOu/KjpXVfOCfQkTnwSXYGrqTbBZxw6reIYEFjSy1QUARRg5pxiI5BEXy+kBVntxUYNMlq4Co+2vD3fQ==
+ dependencies:
+ "@vitest/expect" "1.1.1"
+ "@vitest/runner" "1.1.1"
+ "@vitest/snapshot" "1.1.1"
+ "@vitest/spy" "1.1.1"
+ "@vitest/utils" "1.1.1"
+ acorn-walk "^8.3.0"
+ cac "^6.7.14"
+ chai "^4.3.10"
+ debug "^4.3.4"
+ execa "^8.0.1"
+ local-pkg "^0.5.0"
+ magic-string "^0.30.5"
+ pathe "^1.1.1"
+ picocolors "^1.0.0"
+ std-env "^3.5.0"
+ strip-literal "^1.3.0"
+ tinybench "^2.5.1"
+ tinypool "^0.8.1"
+ vite "^5.0.0"
+ vite-node "1.1.1"
+ why-is-node-running "^2.2.2"
+
+ w3c-xmlserializer@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c"
+ integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==
+ dependencies:
+ xml-name-validator "^5.0.0"
+
+ webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+ whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+ whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
+ whatwg-url@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6"
+ integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==
+ dependencies:
+ tr46 "^5.0.0"
+ webidl-conversions "^7.0.0"
+
+ which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+ which-collection@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
+ integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ dependencies:
+ is-map "^2.0.1"
+ is-set "^2.0.1"
+ is-weakmap "^2.0.1"
+ is-weakset "^2.0.1"
+
+ which-typed-array@^1.1.11, which-typed-array@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
+ integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.4"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+ which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+ why-is-node-running@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e"
+ integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==
+ dependencies:
+ siginfo "^2.0.0"
+ stackback "0.0.2"
+
+ wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ ws@^8.14.2:
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
+ integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
+
+ xml-name-validator@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673"
+ integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
+
+ xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+ yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+ yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
diff --git a/runtime/yarn.lock b/runtime/yarn.lock
new file mode 100644
index 000000000..170c2b76b
--- /dev/null
+++ b/runtime/yarn.lock
@@ -0,0 +1,1860 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@asamuzakjp/dom-selector@^2.0.1":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@asamuzakjp/dom-selector/-/dom-selector-2.0.2.tgz#160f601d9a465bbdf641410afdc527f37325506e"
+ integrity sha512-x1KXOatwofR6ZAYzXRBL5wrdV0vwNxlTCK9NCuLqAzQYARqGcvFwiJA6A1ERuh+dgeA4Dxm3JBYictIes+SqUQ==
+ dependencies:
+ bidi-js "^1.0.3"
+ css-tree "^2.3.1"
+ is-potential-custom-element-name "^1.0.1"
+
+"@babel/code-frame@^7.10.4":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+ dependencies:
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
+
+"@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
+ integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
+
+"@babel/runtime@^7.12.5":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193"
+ integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/types@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
+ integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@esbuild/aix-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3"
+ integrity sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==
+
+"@esbuild/android-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz#b45d000017385c9051a4f03e17078abb935be220"
+ integrity sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==
+
+"@esbuild/android-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.11.tgz#f46f55414e1c3614ac682b29977792131238164c"
+ integrity sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==
+
+"@esbuild/android-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.11.tgz#bfc01e91740b82011ef503c48f548950824922b2"
+ integrity sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==
+
+"@esbuild/darwin-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf"
+ integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==
+
+"@esbuild/darwin-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz#62f3819eff7e4ddc656b7c6815a31cf9a1e7d98e"
+ integrity sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==
+
+"@esbuild/freebsd-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz#d478b4195aa3ca44160272dab85ef8baf4175b4a"
+ integrity sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==
+
+"@esbuild/freebsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz#7bdcc1917409178257ca6a1a27fe06e797ec18a2"
+ integrity sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==
+
+"@esbuild/linux-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz#58ad4ff11685fcc735d7ff4ca759ab18fcfe4545"
+ integrity sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==
+
+"@esbuild/linux-arm@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz#ce82246d873b5534d34de1e5c1b33026f35e60e3"
+ integrity sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==
+
+"@esbuild/linux-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz#cbae1f313209affc74b80f4390c4c35c6ab83fa4"
+ integrity sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==
+
+"@esbuild/linux-loong64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz#5f32aead1c3ec8f4cccdb7ed08b166224d4e9121"
+ integrity sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==
+
+"@esbuild/linux-mips64el@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz#38eecf1cbb8c36a616261de858b3c10d03419af9"
+ integrity sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==
+
+"@esbuild/linux-ppc64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz#9c5725a94e6ec15b93195e5a6afb821628afd912"
+ integrity sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==
+
+"@esbuild/linux-riscv64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz#2dc4486d474a2a62bbe5870522a9a600e2acb916"
+ integrity sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==
+
+"@esbuild/linux-s390x@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz#4ad8567df48f7dd4c71ec5b1753b6f37561a65a8"
+ integrity sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==
+
+"@esbuild/linux-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz#b7390c4d5184f203ebe7ddaedf073df82a658766"
+ integrity sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==
+
+"@esbuild/netbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz#d633c09492a1721377f3bccedb2d821b911e813d"
+ integrity sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==
+
+"@esbuild/openbsd-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz#17388c76e2f01125bf831a68c03a7ffccb65d1a2"
+ integrity sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==
+
+"@esbuild/sunos-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz#e320636f00bb9f4fdf3a80e548cb743370d41767"
+ integrity sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==
+
+"@esbuild/win32-arm64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz#c778b45a496e90b6fc373e2a2bb072f1441fe0ee"
+ integrity sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==
+
+"@esbuild/win32-ia32@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz#481a65fee2e5cce74ec44823e6b09ecedcc5194c"
+ integrity sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==
+
+"@esbuild/win32-x64@0.19.11":
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz#a5d300008960bb39677c46bf16f53ec70d8dee04"
+ integrity sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.20"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@preact/signals-core@^1.4.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@preact/signals-core/-/signals-core-1.5.0.tgz#5d34db4d3c242c93e1cefb7ce8b2d10ecbdbfa79"
+ integrity sha512-U2diO1Z4i1n2IoFgMYmRdHWGObNrcuTRxyNEn7deSq2cru0vj0583HYQZHsAqcs7FE+hQyX3mjIV7LAfHCvy8w==
+
+"@preact/signals@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@preact/signals/-/signals-1.2.2.tgz#78df53b2d7e6cdda0bb32843f12eb0418a0d82b0"
+ integrity sha512-ColCqdo4cRP18bAuIR4Oik5rDpiyFtPIJIygaYPMEAwTnl4buWkBOflGBSzhYyPyJfKpkwlekrvK+1pzQ2ldWw==
+ dependencies:
+ "@preact/signals-core" "^1.4.0"
+
+"@rollup/rollup-android-arm-eabi@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.2.tgz#ccb02257556bacbc1e756ab9b0b973cea2c7a664"
+ integrity sha512-RKzxFxBHq9ysZ83fn8Iduv3A283K7zPPYuhL/z9CQuyFrjwpErJx0h4aeb/bnJ+q29GRLgJpY66ceQ/Wcsn3wA==
+
+"@rollup/rollup-android-arm64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.2.tgz#21bd0fbafdf442c6a17645b840f6a94556b0e9bb"
+ integrity sha512-yZ+MUbnwf3SHNWQKJyWh88ii2HbuHCFQnAYTeeO1Nb8SyEiWASEi5dQUygt3ClHWtA9My9RQAYkjvrsZ0WK8Xg==
+
+"@rollup/rollup-darwin-arm64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.2.tgz#9f2e5d5637677f9839dbe1622130d0592179136a"
+ integrity sha512-vqJ/pAUh95FLc/G/3+xPqlSBgilPnauVf2EXOQCZzhZJCXDXt/5A8mH/OzU6iWhb3CNk5hPJrh8pqJUPldN5zw==
+
+"@rollup/rollup-darwin-x64@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.2.tgz#1b06291ff1c41af94d2786cd167188c5bf7caec9"
+ integrity sha512-otPHsN5LlvedOprd3SdfrRNhOahhVBwJpepVKUN58L0RnC29vOAej1vMEaVU6DadnpjivVsNTM5eNt0CcwTahw==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.2.tgz#147069948bba00f435122f411210624e72638ebf"
+ integrity sha512-ewG5yJSp+zYKBYQLbd1CUA7b1lSfIdo9zJShNTyc2ZP1rcPrqyZcNlsHgs7v1zhgfdS+kW0p5frc0aVqhZCiYQ==
+
+"@rollup/rollup-linux-arm64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.2.tgz#3a50f0e7ae6e444d11c61fce12783196454a4efb"
+ integrity sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==
+
+"@rollup/rollup-linux-arm64-musl@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.2.tgz#82b5e75484d91c25d4e649d018d9523e72d6dac2"
+ integrity sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==
+
+"@rollup/rollup-linux-riscv64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.2.tgz#ca96f2d43a553d73aec736e991c07010561bc7a9"
+ integrity sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==
+
+"@rollup/rollup-linux-x64-gnu@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.2.tgz#db1cece244ea46706c0e1a522ec19ca0173abc55"
+ integrity sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==
+
+"@rollup/rollup-linux-x64-musl@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.2.tgz#c15b26b86827f75977bf59ebd41ce5d788713936"
+ integrity sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==
+
+"@rollup/rollup-win32-arm64-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.2.tgz#60152948f9fb08e8c50c1555e334ca9f9f1f53aa"
+ integrity sha512-x1CWburlbN5JjG+juenuNa4KdedBdXLjZMp56nHFSHTOsb/MI2DYiGzLtRGHNMyydPGffGId+VgjOMrcltOksA==
+
+"@rollup/rollup-win32-ia32-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.2.tgz#657288cff10311f997d8dbd648590441760ae6d9"
+ integrity sha512-VVzCB5yXR1QlfsH1Xw1zdzQ4Pxuzv+CPr5qpElpKhVxlxD3CRdfubAG9mJROl6/dmj5gVYDDWk8sC+j9BI9/kQ==
+
+"@rollup/rollup-win32-x64-msvc@4.9.2":
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.2.tgz#830f3a3fba67f6216a5884368431918029045afe"
+ integrity sha512-SYRedJi+mweatroB+6TTnJYLts0L0bosg531xnQWtklOI6dezEagx4Q0qDyvRdK+qgdA3YZpjjGuPFtxBmddBA==
+
+"@sinclair/typebox@^0.27.8":
+ version "0.27.8"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
+ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+
+"@testing-library/dom@^8.11.1":
+ version "8.20.1"
+ resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.20.1.tgz#2e52a32e46fc88369eef7eef634ac2a192decd9f"
+ integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==
+ dependencies:
+ "@babel/code-frame" "^7.10.4"
+ "@babel/runtime" "^7.12.5"
+ "@types/aria-query" "^5.0.1"
+ aria-query "5.1.3"
+ chalk "^4.1.0"
+ dom-accessibility-api "^0.5.9"
+ lz-string "^1.5.0"
+ pretty-format "^27.0.2"
+
+"@testing-library/preact@^3.2.3":
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/@testing-library/preact/-/preact-3.2.3.tgz#0d331b7a7f934a4b0fc6c95ff3a9e1d6fa93094e"
+ integrity sha512-y6Kklp1XK3f1X2fWCbujmJyzkf+1BgLYXNgAx21j9+D4CoqMTz5qC4SQufb1L6q/jxLGACzrQ90ewVOTBvHOfg==
+ dependencies:
+ "@testing-library/dom" "^8.11.1"
+
+"@types/aria-query@^5.0.1":
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708"
+ integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==
+
+"@types/estree@^1.0.0":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+"@vitest/coverage-v8@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/coverage-v8/-/coverage-v8-1.2.1.tgz#e76d64c8f0a8cb882543f12f7a2bc7615b84cbee"
+ integrity sha512-fJEhKaDwGMZtJUX7BRcGxooGwg1Hl0qt53mVup/ZJeznhvL5EodteVnb/mcByhEcvVWbK83ZF31c7nPEDi4LOQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.1"
+ "@bcoe/v8-coverage" "^0.2.3"
+ debug "^4.3.4"
+ istanbul-lib-coverage "^3.2.2"
+ istanbul-lib-report "^3.0.1"
+ istanbul-lib-source-maps "^4.0.1"
+ istanbul-reports "^3.1.6"
+ magic-string "^0.30.5"
+ magicast "^0.3.3"
+ picocolors "^1.0.0"
+ std-env "^3.5.0"
+ test-exclude "^6.0.0"
+ v8-to-istanbul "^9.2.0"
+
+"@vitest/expect@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.2.1.tgz#574c0ac138a9e34522da202ea4c48a3adfe7240e"
+ integrity sha512-/bqGXcHfyKgFWYwIgFr1QYDaR9e64pRKxgBNWNXPefPFRhgm+K3+a/dS0cUGEreWngets3dlr8w8SBRw2fCfFQ==
+ dependencies:
+ "@vitest/spy" "1.2.1"
+ "@vitest/utils" "1.2.1"
+ chai "^4.3.10"
+
+"@vitest/runner@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.2.1.tgz#13e65b47eb04e572b99757e55f063f8f025822b2"
+ integrity sha512-zc2dP5LQpzNzbpaBt7OeYAvmIsRS1KpZQw4G3WM/yqSV1cQKNKwLGmnm79GyZZjMhQGlRcSFMImLjZaUQvNVZQ==
+ dependencies:
+ "@vitest/utils" "1.2.1"
+ p-limit "^5.0.0"
+ pathe "^1.1.1"
+
+"@vitest/snapshot@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.2.1.tgz#bd2dcae2322b90bab1660421ff9dae73fc84ecc0"
+ integrity sha512-Tmp/IcYEemKaqAYCS08sh0vORLJkMr0NRV76Gl8sHGxXT5151cITJCET20063wk0Yr/1koQ6dnmP6eEqezmd/Q==
+ dependencies:
+ magic-string "^0.30.5"
+ pathe "^1.1.1"
+ pretty-format "^29.7.0"
+
+"@vitest/spy@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.2.1.tgz#2777444890de9d32e55e600e34a13b2074cabc18"
+ integrity sha512-vG3a/b7INKH7L49Lbp0IWrG6sw9j4waWAucwnksPB1r1FTJgV7nkBByd9ufzu6VWya/QTvQW4V9FShZbZIB2UQ==
+ dependencies:
+ tinyspy "^2.2.0"
+
+"@vitest/utils@1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.2.1.tgz#ad798cb13ec9e9e97b13be65d135e9e8e3c586aa"
+ integrity sha512-bsH6WVZYe/J2v3+81M5LDU8kW76xWObKIURpPrOXm2pjBniBu2MERI/XP60GpS4PHU3jyK50LUutOwrx4CyHUg==
+ dependencies:
+ diff-sequences "^29.6.3"
+ estree-walker "^3.0.3"
+ loupe "^2.3.7"
+ pretty-format "^29.7.0"
+
+acorn-walk@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa"
+ integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
+
+acorn@^8.10.0:
+ version "8.11.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+ integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
+agent-base@^7.0.2, agent-base@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434"
+ integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==
+ dependencies:
+ debug "^4.3.4"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+aria-query@5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+ dependencies:
+ deep-equal "^2.0.5"
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+assertion-error@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
+ integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+bidi-js@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2"
+ integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==
+ dependencies:
+ require-from-string "^2.0.2"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+cac@^6.7.14:
+ version "6.7.14"
+ resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959"
+ integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
+
+call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
+
+chai@^4.3.10:
+ version "4.3.10"
+ resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384"
+ integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==
+ dependencies:
+ assertion-error "^1.1.0"
+ check-error "^1.0.3"
+ deep-eql "^4.1.3"
+ get-func-name "^2.0.2"
+ loupe "^2.3.6"
+ pathval "^1.1.1"
+ type-detect "^4.0.8"
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+check-error@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694"
+ integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+ dependencies:
+ get-func-name "^2.0.2"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-tree@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20"
+ integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==
+ dependencies:
+ mdn-data "2.0.30"
+ source-map-js "^1.0.1"
+
+cssstyle@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a"
+ integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==
+ dependencies:
+ rrweb-cssom "^0.6.0"
+
+data-urls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde"
+ integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==
+ dependencies:
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+
+debug@4, debug@^4.1.1, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+decimal.js@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+deep-eql@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
+ integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
+ dependencies:
+ type-detect "^4.0.0"
+
+deep-equal@^2.0.5:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
+ integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.5"
+ es-get-iterator "^1.1.3"
+ get-intrinsic "^1.2.2"
+ is-arguments "^1.1.1"
+ is-array-buffer "^3.0.2"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.13"
+
+define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+diff-sequences@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+ integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
+
+dom-accessibility-api@^0.5.9:
+ version "0.5.16"
+ resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453"
+ integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==
+
+entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+es-get-iterator@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
+ integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ is-arguments "^1.1.1"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.7"
+ isarray "^2.0.5"
+ stop-iteration-iterator "^1.0.0"
+
+esbuild@^0.19.11, esbuild@^0.19.3:
+ version "0.19.11"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96"
+ integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.19.11"
+ "@esbuild/android-arm" "0.19.11"
+ "@esbuild/android-arm64" "0.19.11"
+ "@esbuild/android-x64" "0.19.11"
+ "@esbuild/darwin-arm64" "0.19.11"
+ "@esbuild/darwin-x64" "0.19.11"
+ "@esbuild/freebsd-arm64" "0.19.11"
+ "@esbuild/freebsd-x64" "0.19.11"
+ "@esbuild/linux-arm" "0.19.11"
+ "@esbuild/linux-arm64" "0.19.11"
+ "@esbuild/linux-ia32" "0.19.11"
+ "@esbuild/linux-loong64" "0.19.11"
+ "@esbuild/linux-mips64el" "0.19.11"
+ "@esbuild/linux-ppc64" "0.19.11"
+ "@esbuild/linux-riscv64" "0.19.11"
+ "@esbuild/linux-s390x" "0.19.11"
+ "@esbuild/linux-x64" "0.19.11"
+ "@esbuild/netbsd-x64" "0.19.11"
+ "@esbuild/openbsd-x64" "0.19.11"
+ "@esbuild/sunos-x64" "0.19.11"
+ "@esbuild/win32-arm64" "0.19.11"
+ "@esbuild/win32-ia32" "0.19.11"
+ "@esbuild/win32-x64" "0.19.11"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+estree-walker@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d"
+ integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==
+ dependencies:
+ "@types/estree" "^1.0.0"
+
+execa@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c"
+ integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^8.0.1"
+ human-signals "^5.0.0"
+ is-stream "^3.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^5.1.0"
+ onetime "^6.0.0"
+ signal-exit "^4.1.0"
+ strip-final-newline "^3.0.0"
+
+fast-equals@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.0.1.tgz#a4eefe3c5d1c0d021aeed0bc10ba5e0c12ee405d"
+ integrity sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-func-name@^2.0.1, get-func-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41"
+ integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
+ dependencies:
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-stream@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2"
+ integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
+
+glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+has-bigints@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ dependencies:
+ function-bind "^1.1.2"
+
+html-encoding-sniffer@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448"
+ integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==
+ dependencies:
+ whatwg-encoding "^3.1.1"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+http-proxy-agent@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673"
+ integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
+https-proxy-agent@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b"
+ integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==
+ dependencies:
+ agent-base "^7.0.2"
+ debug "4"
+
+human-signals@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28"
+ integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
+
+iconv-lite@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+indent-string@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5"
+ integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
+ integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-map@^2.0.1, is-map@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
+ integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-set@^2.0.1, is-set@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
+ integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+ integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
+is-weakmap@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
+ integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
+
+is-weakset@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d"
+ integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.6:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a"
+ integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsdom@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-23.2.0.tgz#08083220146d41c467efa1c6969f02b525ba6c1d"
+ integrity sha512-L88oL7D/8ufIES+Zjz7v0aes+oBMh2Xnh3ygWvL0OaICOomKEPKuPnIfBJekiXr+BHbbMjrWn/xqrDQuxFTeyA==
+ dependencies:
+ "@asamuzakjp/dom-selector" "^2.0.1"
+ cssstyle "^4.0.1"
+ data-urls "^5.0.0"
+ decimal.js "^10.4.3"
+ form-data "^4.0.0"
+ html-encoding-sniffer "^4.0.0"
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.2"
+ is-potential-custom-element-name "^1.0.1"
+ parse5 "^7.1.2"
+ rrweb-cssom "^0.6.0"
+ saxes "^6.0.0"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.1.3"
+ w3c-xmlserializer "^5.0.0"
+ webidl-conversions "^7.0.0"
+ whatwg-encoding "^3.1.1"
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+ ws "^8.16.0"
+ xml-name-validator "^5.0.0"
+
+jsonc-parser@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
+ integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
+
+local-pkg@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c"
+ integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==
+ dependencies:
+ mlly "^1.4.2"
+ pkg-types "^1.0.3"
+
+loupe@^2.3.6, loupe@^2.3.7:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697"
+ integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==
+ dependencies:
+ get-func-name "^2.0.1"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+lz-string@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941"
+ integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
+
+magic-string@^0.30.5:
+ version "0.30.5"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9"
+ integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+magicast@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/magicast/-/magicast-0.3.3.tgz#a15760f982deec9dabc5f314e318d7c6bddcb27b"
+ integrity sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==
+ dependencies:
+ "@babel/parser" "^7.23.6"
+ "@babel/types" "^7.23.6"
+ source-map-js "^1.0.2"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+mdn-data@2.0.30:
+ version "2.0.30"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc"
+ integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+ integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
+
+minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+mlly@^1.2.0, mlly@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.2.tgz#7cf406aa319ff6563d25da6b36610a93f2a8007e"
+ integrity sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==
+ dependencies:
+ acorn "^8.10.0"
+ pathe "^1.1.1"
+ pkg-types "^1.0.3"
+ ufo "^1.3.0"
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+npm-run-path@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955"
+ integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==
+ dependencies:
+ path-key "^4.0.0"
+
+object-inspect@^1.9.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+ integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+ dependencies:
+ mimic-fn "^4.0.0"
+
+p-limit@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985"
+ integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==
+ dependencies:
+ yocto-queue "^1.0.0"
+
+parse5@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-key@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+ integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
+pathe@^1.1.0, pathe@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a"
+ integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==
+
+pathval@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d"
+ integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+pkg-types@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868"
+ integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==
+ dependencies:
+ jsonc-parser "^3.2.0"
+ mlly "^1.2.0"
+ pathe "^1.1.0"
+
+postcss@^8.4.32:
+ version "8.4.32"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9"
+ integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+preact@^10.19.3:
+ version "10.19.3"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899"
+ integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==
+
+prettier@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e"
+ integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==
+
+pretty-format@^27.0.2:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+pretty-format@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
+ integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.1, punycode@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react-is@^18.0.0:
+ version "18.2.0"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
+ integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+rollup@^4.2.0:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.2.tgz#19d730219b7ec5f51372c6cf15cfb841990489fe"
+ integrity sha512-66RB8OtFKUTozmVEh3qyNfH+b+z2RXBVloqO2KCC/pjFaGaHtxP9fVfOQKPSGXg2mElmjmxjW/fZ7iKrEpMH5Q==
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.9.2"
+ "@rollup/rollup-android-arm64" "4.9.2"
+ "@rollup/rollup-darwin-arm64" "4.9.2"
+ "@rollup/rollup-darwin-x64" "4.9.2"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.9.2"
+ "@rollup/rollup-linux-arm64-gnu" "4.9.2"
+ "@rollup/rollup-linux-arm64-musl" "4.9.2"
+ "@rollup/rollup-linux-riscv64-gnu" "4.9.2"
+ "@rollup/rollup-linux-x64-gnu" "4.9.2"
+ "@rollup/rollup-linux-x64-musl" "4.9.2"
+ "@rollup/rollup-win32-arm64-msvc" "4.9.2"
+ "@rollup/rollup-win32-ia32-msvc" "4.9.2"
+ "@rollup/rollup-win32-x64-msvc" "4.9.2"
+ fsevents "~2.3.2"
+
+route-parser@mint-lang/mint-route-parser:
+ version "0.0.5"
+ resolved "https://codeload.github.com/mint-lang/mint-route-parser/tar.gz/903d07a62fe7649fccb6be6694445ee4217c933e"
+
+rrweb-cssom@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
+ integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
+
+"safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+saxes@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
+ integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
+ dependencies:
+ xmlchars "^2.2.0"
+
+semver@^7.5.3:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+set-function-name@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+siginfo@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30"
+ integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==
+
+signal-exit@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+source-map-js@^1.0.1, source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+stackback@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b"
+ integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
+
+std-env@^3.5.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2"
+ integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==
+
+stop-iteration-iterator@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
+ integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ dependencies:
+ internal-slot "^1.0.4"
+
+strip-final-newline@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+ integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
+
+strip-literal@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07"
+ integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==
+ dependencies:
+ acorn "^8.10.0"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+tinybench@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.5.1.tgz#3408f6552125e53a5a48adee31261686fd71587e"
+ integrity sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==
+
+tinypool@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-0.8.1.tgz#b6c4e4972ede3e3e5cda74a3da1679303d386b03"
+ integrity sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==
+
+tinyspy@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tinyspy/-/tinyspy-2.2.0.tgz#9dc04b072746520b432f77ea2c2d17933de5d6ce"
+ integrity sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+tough-cookie@^4.1.3:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
+ integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec"
+ integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==
+ dependencies:
+ punycode "^2.3.1"
+
+type-detect@^4.0.0, type-detect@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+ufo@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496"
+ integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+uuid-random@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/uuid-random/-/uuid-random-1.3.2.tgz#96715edbaef4e84b1dcf5024b00d16f30220e2d0"
+ integrity sha512-UOzej0Le/UgkbWEO8flm+0y+G+ljUon1QWTEZOq1rnMAsxo2+SckbiZdKzAHHlVh6gJqI1TjC/xwgR50MuCrBQ==
+
+v8-to-istanbul@^9.2.0:
+ version "9.2.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad"
+ integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.12"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^2.0.0"
+
+vite-node@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.2.1.tgz#bca96ae91b2b1ee9a7aa73685908362d70ce26a8"
+ integrity sha512-fNzHmQUSOY+y30naohBvSW7pPn/xn3Ib/uqm+5wAJQJiqQsU0NBR78XdRJb04l4bOFKjpTWld0XAfkKlrDbySg==
+ dependencies:
+ cac "^6.7.14"
+ debug "^4.3.4"
+ pathe "^1.1.1"
+ picocolors "^1.0.0"
+ vite "^5.0.0"
+
+vite@^5.0.0:
+ version "5.0.10"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.10.tgz#1e13ef5c3cf5aa4eed81f5df6d107b3c3f1f6356"
+ integrity sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==
+ dependencies:
+ esbuild "^0.19.3"
+ postcss "^8.4.32"
+ rollup "^4.2.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vitest@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.2.1.tgz#9afb705826a2c6260a71b625d28b49117833dce6"
+ integrity sha512-TRph8N8rnSDa5M2wKWJCMnztCZS9cDcgVTQ6tsTFTG/odHJ4l5yNVqvbeDJYJRZ6is3uxaEpFs8LL6QM+YFSdA==
+ dependencies:
+ "@vitest/expect" "1.2.1"
+ "@vitest/runner" "1.2.1"
+ "@vitest/snapshot" "1.2.1"
+ "@vitest/spy" "1.2.1"
+ "@vitest/utils" "1.2.1"
+ acorn-walk "^8.3.2"
+ cac "^6.7.14"
+ chai "^4.3.10"
+ debug "^4.3.4"
+ execa "^8.0.1"
+ local-pkg "^0.5.0"
+ magic-string "^0.30.5"
+ pathe "^1.1.1"
+ picocolors "^1.0.0"
+ std-env "^3.5.0"
+ strip-literal "^1.3.0"
+ tinybench "^2.5.1"
+ tinypool "^0.8.1"
+ vite "^5.0.0"
+ vite-node "1.2.1"
+ why-is-node-running "^2.2.2"
+
+w3c-xmlserializer@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c"
+ integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==
+ dependencies:
+ xml-name-validator "^5.0.0"
+
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
+whatwg-url@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6"
+ integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==
+ dependencies:
+ tr46 "^5.0.0"
+ webidl-conversions "^7.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-collection@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
+ integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
+ dependencies:
+ is-map "^2.0.1"
+ is-set "^2.0.1"
+ is-weakmap "^2.0.1"
+ is-weakset "^2.0.1"
+
+which-typed-array@^1.1.11, which-typed-array@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
+ integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.4"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+why-is-node-running@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e"
+ integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==
+ dependencies:
+ siginfo "^2.0.0"
+ stackback "0.0.2"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4"
+ integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
+
+xml-name-validator@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673"
+ integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yocto-queue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251"
+ integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
diff --git a/spec/compilers/case_with_nested_tuple_destructuring b/spec/compilers/case_with_nested_tuple_destructuring
index 556ea4b71..436d7f072 100644
--- a/spec/compilers/case_with_nested_tuple_destructuring
+++ b/spec/compilers/case_with_nested_tuple_destructuring
@@ -1,10 +1,10 @@
component Main {
fun render : String {
- case ({"A", {"B"}}) {
- {"A", {"C"}} =>
+ case ({"A", {"B", ""}}) {
+ {"A", {"C", ""}} =>
"B"
- {"A", {"B"}} =>
+ {"A", {"B", ""}} =>
"A"
{a, b} =>
@@ -18,12 +18,13 @@ component Main {
--------------------------------------------------------------------------------
class A extends _C {
render() {
- return _match([`A`, [`B`]],[
+ return _match([`A`, [`B`, ``]],[
[
[
`A`,
[
- `C`
+ `C`,
+ ``
]
],
() => {
@@ -34,7 +35,8 @@ class A extends _C {
[
`A`,
[
- `B`
+ `B`,
+ ``
]
],
() => {
diff --git a/spec/compilers/constant_store_exposed b/spec/compilers/constant_store_exposed
index 386310f21..080dd5e4d 100644
--- a/spec/compilers/constant_store_exposed
+++ b/spec/compilers/constant_store_exposed
@@ -13,8 +13,8 @@ component Main {
}
--------------------------------------------------------------------------------
class A extends _C {
- get a() {
- return B.b;
+ get b() {
+ return B.a;
}
componentWillUnmount() {
@@ -40,7 +40,7 @@ const B = new(class extends _S {
this.state = {};
this._d({
- b: () => {
+ a: () => {
return `ASD`
}
});
diff --git a/spec/compilers/if_let_await b/spec/compilers/if_let_await
index f04a7da60..bba9f6c12 100644
--- a/spec/compilers/if_let_await
+++ b/spec/compilers/if_let_await
@@ -5,11 +5,15 @@ enum T {
component Main {
fun render : String {
- if (let T::A(a) = await T::A("")) {
- a
- } else {
- "b"
+ {
+ if (let T::A(a) = await T::A("")) {
+ a
+ } else {
+ "b"
+ }
}
+
+ ""
}
}
--------------------------------------------------------------------------------
@@ -30,7 +34,7 @@ class B extends _E {
class C extends _C {
render() {
- return (async () => {
+ (async () => {
let b = await _n(A)(``);
return _match(b,[
@@ -50,6 +54,8 @@ class C extends _C {
]
]);
})();
+
+ return ``;
}
};
diff --git a/spec/compilers/store b/spec/compilers/store
index f24b8a744..a19d8a621 100644
--- a/spec/compilers/store
+++ b/spec/compilers/store
@@ -15,8 +15,8 @@ component Main {
}
--------------------------------------------------------------------------------
class A extends _C {
- get a() {
- return B.b;
+ get b() {
+ return B.a;
}
componentWillUnmount() {
@@ -39,12 +39,12 @@ const B = new(class extends _S {
super();
this.state = {
- b: ``
+ a: ``
};
}
- get b() {
- return this.state.b;
+ get a() {
+ return this.state.a;
}
c() {
diff --git a/spec/compilers/store_with_get b/spec/compilers/store_with_get
index d09d51cd7..f875102f5 100644
--- a/spec/compilers/store_with_get
+++ b/spec/compilers/store_with_get
@@ -15,8 +15,8 @@ component Main {
}
--------------------------------------------------------------------------------
class A extends _C {
- get a() {
- return B.b;
+ get b() {
+ return B.a;
}
componentWillUnmount() {
@@ -39,12 +39,12 @@ const B = new(class extends _S {
super();
this.state = {
- b: ``
+ a: ``
};
}
- get b() {
- return this.state.b;
+ get a() {
+ return this.state.a;
}
get c() {
diff --git a/spec/compilers2/access b/spec/compilers2/access
new file mode 100644
index 000000000..52c19f469
--- /dev/null
+++ b/spec/compilers2/access
@@ -0,0 +1,15 @@
+type X {
+ name : String
+}
+
+component Main {
+ fun render : String {
+ { name: "test" }.name
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return {
+ name: `test`
+ }.name
+};
diff --git a/spec/compilers2/access_deep b/spec/compilers2/access_deep
new file mode 100644
index 000000000..dd7eb3008
--- /dev/null
+++ b/spec/compilers2/access_deep
@@ -0,0 +1,35 @@
+type Locale {
+ level1: Level1
+}
+
+type Level1 {
+ level2: Level2
+}
+
+type Level2 {
+ name : String
+}
+
+store Settings {
+ state locale : Locale = { level1: { level2: { name: "Test" }} }
+}
+
+component Main {
+ fun render : String {
+ Settings.locale.level1.level2.name
+ }
+}
+--------------------------------------------------------------------------------
+import { signal as A } from "runtime";
+
+export const
+ a = A({
+ level1: {
+ level2: {
+ name: `Test`
+ }
+ }
+ }),
+ B = () => {
+ return a.value.level1.level2.name
+ };
diff --git a/spec/compilers2/argument b/spec/compilers2/argument
new file mode 100644
index 000000000..e38d7c8a5
--- /dev/null
+++ b/spec/compilers2/argument
@@ -0,0 +1,19 @@
+component Main {
+ fun test (a : String, b : Number) : Number {
+ b
+ }
+
+ fun render : String {
+ test("", 0)
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = (b, c) => {
+ return c
+ };
+ a(``, 0);
+ return ``
+};
diff --git a/spec/compilers2/argument_with_default b/spec/compilers2/argument_with_default
new file mode 100644
index 000000000..a8433d8b6
--- /dev/null
+++ b/spec/compilers2/argument_with_default
@@ -0,0 +1,19 @@
+component Main {
+ fun test (a : String, b : Number = 0) : Number {
+ b
+ }
+
+ fun render : String {
+ test("")
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = (b, c = 0) => {
+ return c
+ };
+ a(``);
+ return ``
+};
diff --git a/spec/compilers2/argument_with_default_inline_function b/spec/compilers2/argument_with_default_inline_function
new file mode 100644
index 000000000..ef98ddc90
--- /dev/null
+++ b/spec/compilers2/argument_with_default_inline_function
@@ -0,0 +1,20 @@
+component Main {
+ fun render : String {
+ let test =
+ (a : String, b : Number = 0) : Number {
+ b
+ }
+
+ test("")
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = (b, c = 0) => {
+ return c
+ };
+ a(``);
+ return ``
+};
diff --git a/spec/compilers2/array_access b/spec/compilers2/array_access
new file mode 100644
index 000000000..0e9118709
--- /dev/null
+++ b/spec/compilers2/array_access
@@ -0,0 +1,36 @@
+type Maybe(a) {
+ Nothing
+ Just(a)
+}
+
+component Main {
+ fun render : String {
+ [
+ "Hello",
+ "Blah",
+ "Joe"
+ ][1]
+
+ [][1]
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ arrayAccess as E,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = () => {
+ E([
+ `Hello`,
+ `Blah`,
+ `Joe`
+ ], 1, C, A);
+ E([], 1, C, A);
+ return ``
+ };
diff --git a/spec/compilers2/array_literal b/spec/compilers2/array_literal
new file mode 100644
index 000000000..c2e86a127
--- /dev/null
+++ b/spec/compilers2/array_literal
@@ -0,0 +1,20 @@
+component Main {
+ fun render : String {
+ [
+ "Hello",
+ "Blah",
+ "Joe"
+ ]
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ [
+ `Hello`,
+ `Blah`,
+ `Joe`
+ ];
+ return ``
+};
diff --git a/spec/compilers2/block b/spec/compilers2/block
new file mode 100644
index 000000000..07661b944
--- /dev/null
+++ b/spec/compilers2/block
@@ -0,0 +1,12 @@
+component Main {
+ fun render : String {
+ let a = "Some string..."
+
+ a + ", other string..."
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = `Some string...`;
+ return a + `, other string...`
+};
diff --git a/spec/compilers2/block_with_await b/spec/compilers2/block_with_await
new file mode 100644
index 000000000..97dfafca4
--- /dev/null
+++ b/spec/compilers2/block_with_await
@@ -0,0 +1,27 @@
+component Main {
+ fun promise : Promise(String) {
+ `` as Promise(String)
+ }
+
+ fun promiseTest : Promise(String) {
+ await promise()
+ }
+
+ fun render : String {
+ promiseTest()
+
+ "Hello"
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const
+ a = () => {
+ return undefined
+ },
+ b = async () => {
+ return await a()
+ };
+ b();
+ return `Hello`
+};
diff --git a/spec/compilers2/block_with_early_return b/spec/compilers2/block_with_early_return
new file mode 100644
index 000000000..da0242f99
--- /dev/null
+++ b/spec/compilers2/block_with_early_return
@@ -0,0 +1,33 @@
+enum Test {
+ A(String)
+ B(String)
+}
+
+component Main {
+ fun render : String {
+ let Test::A(a) =
+ Test::A("Some string...") or return "RETURN"
+
+ a
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as H,
+ destructure as E,
+ newVariant as F,
+ pattern as G,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ D = () => {
+ const a = E(F(C)(`Some string...`), G(C, [H]));
+ if (a === false) {
+ return `RETURN`
+ };
+ const [b] = a;
+ return b
+ };
diff --git a/spec/compilers2/block_with_early_return_2 b/spec/compilers2/block_with_early_return_2
new file mode 100644
index 000000000..022607659
--- /dev/null
+++ b/spec/compilers2/block_with_early_return_2
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ return "YES"
+ "NO"
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return `YES`;
+ return `NO`
+};
diff --git a/spec/compilers2/block_with_early_return_await b/spec/compilers2/block_with_early_return_await
new file mode 100644
index 000000000..0b504f2e6
--- /dev/null
+++ b/spec/compilers2/block_with_early_return_await
@@ -0,0 +1,40 @@
+enum Test {
+ A(String)
+ B(String)
+}
+
+component Main {
+ fun render : String {
+ {
+ let Test::A(a) =
+ await Test::A("Some string...") or return "RETURN"
+
+ a
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as H,
+ destructure as E,
+ newVariant as F,
+ pattern as G,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ D = () => {
+ (async () => {
+ const a = E(await F(C)(`Some string...`), G(C, [H]));
+ if (a === false) {
+ return `RETURN`
+ };
+ const [b] = a;
+ return b
+ })();
+ return ``
+ };
diff --git a/spec/compilers2/block_with_tuple_destructuring b/spec/compilers2/block_with_tuple_destructuring
new file mode 100644
index 000000000..c625e9694
--- /dev/null
+++ b/spec/compilers2/block_with_tuple_destructuring
@@ -0,0 +1,18 @@
+component Main {
+ fun render : String {
+ let {a, b} = {"Some string...", "B"}
+
+ a + ", other string..."
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const [
+ a,
+ b
+ ] = [
+ `Some string...`,
+ `B`
+ ];
+ return a + `, other string...`
+};
diff --git a/spec/compilers2/bool_literal_false b/spec/compilers2/bool_literal_false
new file mode 100644
index 000000000..f602b7803
--- /dev/null
+++ b/spec/compilers2/bool_literal_false
@@ -0,0 +1,12 @@
+component Main {
+ fun render : String {
+ false
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ false;
+ return ``
+};
diff --git a/spec/compilers2/bool_literal_true b/spec/compilers2/bool_literal_true
new file mode 100644
index 000000000..67d0b3639
--- /dev/null
+++ b/spec/compilers2/bool_literal_true
@@ -0,0 +1,12 @@
+component Main {
+ fun render : String {
+ true
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ true;
+ return ``
+};
diff --git a/spec/compilers2/call_labelled b/spec/compilers2/call_labelled
new file mode 100644
index 000000000..d3a9a60aa
--- /dev/null
+++ b/spec/compilers2/call_labelled
@@ -0,0 +1,16 @@
+component Main {
+ fun test (argument1 : String, argument2: Number) : String {
+ ""
+ }
+
+ fun render : String {
+ test(argument2: 0, argument1: "")
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = (b, c) => {
+ return ``
+ };
+ return a(``, 0)
+};
diff --git a/spec/compilers2/case b/spec/compilers2/case
new file mode 100644
index 000000000..3ad6df678
--- /dev/null
+++ b/spec/compilers2/case
@@ -0,0 +1,37 @@
+component Main {
+ fun render : String {
+ case ("Hello") {
+ "test" => true
+ "Hello" => false
+ => false
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { match as B } from "runtime";
+
+export const A = () => {
+ B(`Hello`, [
+ [
+ `test`,
+ () => {
+ return true
+ }
+ ],
+ [
+ `Hello`,
+ () => {
+ return false
+ }
+ ],
+ [
+ null,
+ () => {
+ return false
+ }
+ ]
+ ]);
+ return ``
+};
diff --git a/spec/compilers2/case_await b/spec/compilers2/case_await
new file mode 100644
index 000000000..94409b5d0
--- /dev/null
+++ b/spec/compilers2/case_await
@@ -0,0 +1,40 @@
+component Main {
+ fun render : String {
+ case await "Hello" {
+ "test" => true
+ "Hello" => false
+ => false
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { match as B } from "runtime";
+
+export const A = () => {
+ (async () => {
+ let a = await `Hello`;
+ return B(a, [
+ [
+ `test`,
+ () => {
+ return true
+ }
+ ],
+ [
+ `Hello`,
+ () => {
+ return false
+ }
+ ],
+ [
+ null,
+ () => {
+ return false
+ }
+ ]
+ ])
+ })();
+ return ``
+};
diff --git a/spec/compilers2/case_empty b/spec/compilers2/case_empty
new file mode 100644
index 000000000..aa8d7544a
--- /dev/null
+++ b/spec/compilers2/case_empty
@@ -0,0 +1,18 @@
+component Main {
+ fun render : String {
+ case ("Hello") {
+ => "false"
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { match as B } from "runtime";
+
+export const A = () => {
+ return B(`Hello`, [[
+ null,
+ () => {
+ return `false`
+ }
+ ]])
+};
diff --git a/spec/compilers2/case_with_array_destructuring b/spec/compilers2/case_with_array_destructuring
new file mode 100644
index 000000000..cef7e8153
--- /dev/null
+++ b/spec/compilers2/case_with_array_destructuring
@@ -0,0 +1,62 @@
+component Main {
+ fun render : Array(String) {
+ case ([]) {
+ [] => [""]
+ ["a"] => ["a"]
+ [a] => [a]
+ [a, b] => [a, b]
+ [a, ...middle, b] => middle
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as C,
+ patternSpread as D,
+ match as B
+} from "runtime";
+
+export const A = () => {
+ return B([], [
+ [
+ [],
+ () => {
+ return [``]
+ }
+ ],
+ [
+ [`a`],
+ () => {
+ return [`a`]
+ }
+ ],
+ [
+ [C],
+ (a) => {
+ return [a]
+ }
+ ],
+ [
+ [
+ C,
+ C
+ ],
+ (b, c) => {
+ return [
+ b,
+ c
+ ]
+ }
+ ],
+ [
+ [
+ C,
+ D,
+ C
+ ],
+ (d, e, f) => {
+ return e
+ }
+ ]
+ ])
+};
diff --git a/spec/compilers2/case_with_nested_tuple_destructuring b/spec/compilers2/case_with_nested_tuple_destructuring
new file mode 100644
index 000000000..22a047387
--- /dev/null
+++ b/spec/compilers2/case_with_nested_tuple_destructuring
@@ -0,0 +1,78 @@
+component Main {
+ fun render : String {
+ case ({"A", {"B", "C"}}) {
+ {"A", {"C", "D"}} =>
+ "B"
+
+ {"A", {"B", "C"}} =>
+ "A"
+
+ {a, b} =>
+ a
+
+ {a, {b, c}} =>
+ b
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as C,
+ match as B
+} from "runtime";
+
+export const A = () => {
+ return B([
+ `A`,
+ [
+ `B`,
+ `C`
+ ]
+ ], [
+ [
+ [
+ `A`,
+ [
+ `C`,
+ `D`
+ ]
+ ],
+ () => {
+ return `B`
+ }
+ ],
+ [
+ [
+ `A`,
+ [
+ `B`,
+ `C`
+ ]
+ ],
+ () => {
+ return `A`
+ }
+ ],
+ [
+ [
+ C,
+ C
+ ],
+ (a, b) => {
+ return a
+ }
+ ],
+ [
+ [
+ C,
+ [
+ C,
+ C
+ ]
+ ],
+ (c, d, e) => {
+ return d
+ }
+ ]
+ ])
+};
diff --git a/spec/compilers2/case_with_tuple_destructuring b/spec/compilers2/case_with_tuple_destructuring
new file mode 100644
index 000000000..f6aafec87
--- /dev/null
+++ b/spec/compilers2/case_with_tuple_destructuring
@@ -0,0 +1,58 @@
+component Main {
+ fun render : String {
+ case ({"A", 0, true}) {
+ {"A", 0, false} =>
+ "B"
+
+ {"A", 0, true} =>
+ "A"
+
+ {a, b, c} =>
+ a
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as C,
+ match as B
+} from "runtime";
+
+export const A = () => {
+ return B([
+ `A`,
+ 0,
+ true
+ ], [
+ [
+ [
+ `A`,
+ 0,
+ false
+ ],
+ () => {
+ return `B`
+ }
+ ],
+ [
+ [
+ `A`,
+ 0,
+ true
+ ],
+ () => {
+ return `A`
+ }
+ ],
+ [
+ [
+ C,
+ C,
+ C
+ ],
+ (a, b, c) => {
+ return a
+ }
+ ]
+ ])
+};
diff --git a/spec/compilers2/case_with_tuple_destructuring_bool b/spec/compilers2/case_with_tuple_destructuring_bool
new file mode 100644
index 000000000..56c0eac41
--- /dev/null
+++ b/spec/compilers2/case_with_tuple_destructuring_bool
@@ -0,0 +1,47 @@
+component Main {
+ fun render : String {
+ case ({false, true}) {
+ {true, false} =>
+ "B"
+
+ {false, true} =>
+ "A"
+
+ => "C"
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { match as B } from "runtime";
+
+export const A = () => {
+ return B([
+ false,
+ true
+ ], [
+ [
+ [
+ true,
+ false
+ ],
+ () => {
+ return `B`
+ }
+ ],
+ [
+ [
+ false,
+ true
+ ],
+ () => {
+ return `A`
+ }
+ ],
+ [
+ null,
+ () => {
+ return `C`
+ }
+ ]
+ ])
+};
diff --git a/spec/compilers2/case_with_type_destructuring b/spec/compilers2/case_with_type_destructuring
new file mode 100644
index 000000000..14441b717
--- /dev/null
+++ b/spec/compilers2/case_with_type_destructuring
@@ -0,0 +1,58 @@
+enum A(a) {
+ B(a)
+}
+
+enum C(a) {
+ D(A(a))
+ X
+}
+
+component Main {
+ fun render : String {
+ case (C::D(A::B(""))) {
+ C::X => ""
+ C::D(a) =>
+ case (a) {
+ A::B(c) =>
+ c
+ }
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as I,
+ newVariant as G,
+ pattern as H,
+ variant as B,
+ match as F
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = B(1),
+ E = () => {
+ F(G(C)(G(D)(``)), [
+ [
+ H(A, []),
+ () => {
+ return ``
+ }
+ ],
+ [
+ H(C, [I]),
+ (a) => {
+ return F(a, [[
+ H(D, [I]),
+ (b) => {
+ return b
+ }
+ ]])
+ }
+ ]
+ ]);
+ return ``
+ };
diff --git a/spec/compilers2/component b/spec/compilers2/component
new file mode 100644
index 000000000..49d297c64
--- /dev/null
+++ b/spec/compilers2/component
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return ``
+};
diff --git a/spec/compilers2/component_async b/spec/compilers2/component_async
new file mode 100644
index 000000000..b0733c87b
--- /dev/null
+++ b/spec/compilers2/component_async
@@ -0,0 +1,81 @@
+async component Test {
+ fun render : Html {
+
+ Greeter.greet("async")
+ Greeter.both()
+
+ }
+}
+
+module Greeter {
+ // Only used in Test so it should be compiled with it.
+ fun greet (name : String) {
+ "I'm #{name}!"
+ }
+
+ // Only used in Main so it should be compiled with it.
+ fun main {
+ "I'm in Main!"
+ }
+
+ // Only used in both so it should be compiled with Main.
+ fun both {
+ "I'm in both!"
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ Greeter.main()
+ Greeter.both()
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ lazyComponent as E,
+ createElement as D,
+ lazy as B
+} from "runtime";
+
+export const
+ a = () => {
+ return `I'm in Main!`
+ },
+ b = () => {
+ return `I'm in both!`
+ },
+ A = B('/__mint__/test.js'),
+ C = () => {
+ return D(`div`, {}, [
+ a(),
+ b(),
+ D(E, {
+ key: `Test`,
+ x: A,
+ p: {},
+ c: []
+ })
+ ])
+ };
+
+---=== /__mint__/test.js ===---
+import { createElement as B } from "runtime";
+
+import { b as c } from "/index.js";
+
+export const
+ a = (b) => {
+ return `I'm ${b}!`
+ },
+ A = () => {
+ return B(`div`, {}, [
+ a(`async`),
+ c()
+ ])
+ };
+
+export default A;
diff --git a/spec/compilers2/component_async_2 b/spec/compilers2/component_async_2
new file mode 100644
index 000000000..f605b6747
--- /dev/null
+++ b/spec/compilers2/component_async_2
@@ -0,0 +1,83 @@
+async component First {
+ fun render : Html {
+
+ "First"
+
+ }
+}
+
+async component Second {
+ fun render : Html {
+
+
+ "Second"
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ lazyComponent as F,
+ createElement as E,
+ lazy as B
+} from "runtime";
+
+export const
+ A = B('/__mint__/first.js'),
+ C = B('/__mint__/second.js'),
+ D = () => {
+ return E(`div`, {}, [
+ E(F, {
+ key: `First`,
+ x: A,
+ p: {},
+ c: []
+ }),
+ E(F, {
+ key: `Second`,
+ x: C,
+ p: {},
+ c: []
+ })
+ ])
+ };
+
+---=== /__mint__/first.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {}, [`First`])
+};
+
+export default A;
+
+---=== /__mint__/second.js ===---
+import {
+ lazyComponent as C,
+ createElement as B
+} from "runtime";
+
+import { A as D } from "/index.js";
+
+export const A = () => {
+ return B(`div`, {}, [
+ B(C, {
+ key: `First`,
+ x: D,
+ p: {},
+ c: []
+ }),
+ `Second`
+ ])
+};
+
+export default A;
diff --git a/spec/compilers2/component_async_3 b/spec/compilers2/component_async_3
new file mode 100644
index 000000000..ed9efc6b4
--- /dev/null
+++ b/spec/compilers2/component_async_3
@@ -0,0 +1,99 @@
+module Test {
+ fun blah {
+ halb()
+ }
+
+ fun halb() {
+ ""
+ }
+}
+
+async component First {
+ fun render : Html {
+
+ "First"
+ Test.blah()
+
+ }
+}
+
+async component Second {
+ fun render : Html {
+
+ "Second"
+ Test.blah()
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+
+
+ Test.blah()
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ lazyComponent as F,
+ createElement as E,
+ lazy as B
+} from "runtime";
+
+export const
+ a = () => {
+ return ``
+ },
+ b = () => {
+ return a()
+ },
+ A = B('/__mint__/first.js'),
+ C = B('/__mint__/second.js'),
+ D = () => {
+ return E(`div`, {}, [
+ E(F, {
+ key: `First`,
+ x: A,
+ p: {},
+ c: []
+ }),
+ E(F, {
+ key: `Second`,
+ x: C,
+ p: {},
+ c: []
+ }),
+ b()
+ ])
+ };
+
+---=== /__mint__/first.js ===---
+import { createElement as B } from "runtime";
+
+import { b as a } from "/index.js";
+
+export const A = () => {
+ return B(`div`, {}, [
+ `First`,
+ a()
+ ])
+};
+
+export default A;
+
+---=== /__mint__/second.js ===---
+import { createElement as B } from "runtime";
+
+import { b as a } from "/index.js";
+
+export const A = () => {
+ return B(`div`, {}, [
+ `Second`,
+ a()
+ ])
+};
+
+export default A;
diff --git a/spec/compilers2/component_children b/spec/compilers2/component_children
new file mode 100644
index 000000000..95d7c6e87
--- /dev/null
+++ b/spec/compilers2/component_children
@@ -0,0 +1,28 @@
+component Test {
+ property children : Array(Html) = []
+
+ fun render : Array(Html) {
+ children
+ }
+}
+
+component Main {
+ fun render : Html {
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as C,
+ toArray as D
+} from "runtime";
+
+export const
+ A = ({
+ children: a = []
+ }) => {
+ return a
+ },
+ B = () => {
+ return C(A, {}, D(``))
+ };
diff --git a/spec/compilers2/component_global b/spec/compilers2/component_global
new file mode 100644
index 000000000..d147d4cdc
--- /dev/null
+++ b/spec/compilers2/component_global
@@ -0,0 +1,45 @@
+global component Notifications {
+ state test : String = ""
+
+ get value : String {
+ test
+ }
+
+ fun notify (value : String) : String {
+ value
+ }
+
+ fun render : Html {
+
+ value
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ <{ Notifications.notify("Hello") }>
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ signal as D
+} from "runtime";
+
+export const
+ A = () => {
+ return B(`div`, {}, [a()])
+ },
+ b = (c) => {
+ return c
+ },
+ C = () => {
+ return B(`div`, {}, [b(`Hello`)])
+ },
+ d = D(``),
+ a = () => {
+ return d.value
+ };
diff --git a/spec/compilers2/component_instance_access b/spec/compilers2/component_instance_access
new file mode 100644
index 000000000..7e98c80e8
--- /dev/null
+++ b/spec/compilers2/component_instance_access
@@ -0,0 +1,83 @@
+enum Maybe(value) {
+ Just(value)
+ Nothing
+}
+
+component Instance {
+ get name : String {
+ "Instance"
+ }
+
+ fun render : Html {
+
+ }
+}
+
+component Main {
+ fun handleClick : String {
+ case (instance) {
+ Maybe::Just(component) => component.name
+ Maybe::Nothing => ""
+ }
+ }
+
+ fun render : Html {
+
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as K,
+ createElement as F,
+ pattern as J,
+ useMemo as E,
+ variant as B,
+ setRef as L,
+ useRef as H,
+ match as I
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(0),
+ D = ({
+ _
+ }) => {
+ const a = () => {
+ return `Instance`
+ };
+ const b = E(() => {
+ return {
+ a
+ }
+ }, []);
+ (_ ? _(b) : null);
+ return F(`div`, {})
+ },
+ G = () => {
+ const
+ c = H(new C()),
+ d = () => {
+ return I(c.current, [
+ [
+ J(A, [K]),
+ (e) => {
+ return e.a()
+ }
+ ],
+ [
+ J(C, []),
+ () => {
+ return ``
+ }
+ ]
+ ])
+ };
+ return F(`div`, {
+ "onClick": d
+ }, [F(D, {
+ _: L(c, A)
+ })])
+ };
diff --git a/spec/compilers2/component_instance_access_ref b/spec/compilers2/component_instance_access_ref
new file mode 100644
index 000000000..48aa999a4
--- /dev/null
+++ b/spec/compilers2/component_instance_access_ref
@@ -0,0 +1,79 @@
+enum Maybe(value) {
+ Just(value)
+ Nothing
+}
+
+component Instance {
+ fun render : Html {
+
+ }
+}
+
+component Main {
+ fun handleClick {
+ case (instance) {
+ Maybe::Just(component) => component.base
+ Maybe::Nothing => Maybe::Nothing
+ }
+ }
+
+ fun render : Html {
+
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as L,
+ createElement as G,
+ pattern as K,
+ useMemo as F,
+ variant as B,
+ setRef as H,
+ useRef as E,
+ match as J
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = ({
+ _
+ }) => {
+ const a = E(new A());
+ const b = F(() => {
+ return {
+ a
+ }
+ }, []);
+ (_ ? _(b) : null);
+ return G(`div`, {
+ ref: H(a, C)
+ })
+ },
+ I = () => {
+ const
+ c = E(new A()),
+ d = () => {
+ return J(c.current, [
+ [
+ K(C, [L]),
+ (e) => {
+ return e.a.current
+ }
+ ],
+ [
+ K(A, []),
+ () => {
+ return new A()
+ }
+ ]
+ ])
+ };
+ return G(`div`, {
+ "onClick": d
+ }, [G(D, {
+ _: H(c, C)
+ })])
+ };
diff --git a/spec/compilers2/component_namespaced b/spec/compilers2/component_namespaced
new file mode 100644
index 000000000..86aeb18c9
--- /dev/null
+++ b/spec/compilers2/component_namespaced
@@ -0,0 +1,21 @@
+component Ui.Dropdown {
+ fun render : String {
+ "test"
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as C } from "runtime";
+
+export const
+ A = () => {
+ return `test`
+ },
+ B = () => {
+ return C(A, {})
+ };
diff --git a/spec/compilers2/component_namespaced_with_style b/spec/compilers2/component_namespaced_with_style
new file mode 100644
index 000000000..2de48b257
--- /dev/null
+++ b/spec/compilers2/component_namespaced_with_style
@@ -0,0 +1,35 @@
+component Ui.Dropdown {
+ style base {
+ background: red;
+ }
+
+ fun render : Html {
+
+ "test"
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const
+ A = () => {
+ return B(`div`, {
+ className: `Ui·Dropdown_base`
+ }, [`test`])
+ },
+ C = () => {
+ return B(A, {})
+ };
+
+---=== /index.css ===---
+.Ui·Dropdown_base {
+ background: red;
+}
diff --git a/spec/compilers2/component_readonly b/spec/compilers2/component_readonly
new file mode 100644
index 000000000..0512da641
--- /dev/null
+++ b/spec/compilers2/component_readonly
@@ -0,0 +1,27 @@
+component Test {
+ property readonly : Bool = false
+
+ fun render : Html {
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ A = ({
+ a = false
+ }) => {
+ return B(`div`, {})
+ },
+ C = () => {
+ return B(A, {
+ a: true
+ })
+ };
diff --git a/spec/compilers2/component_with_provider b/spec/compilers2/component_with_provider
new file mode 100644
index 000000000..377f88997
--- /dev/null
+++ b/spec/compilers2/component_with_provider
@@ -0,0 +1,50 @@
+record MouseProvider.Data {
+ moves : Function(Position, Void),
+ ups : Function(Position, Void)
+}
+
+provider MouseProvider : MouseProvider.Data {
+ fun update : Void {
+ void
+ }
+}
+
+component Main {
+ use MouseProvider {
+ moves: (data : Position) : Void { void },
+ ups: (data : Position) : Void { void }
+ } when {
+ false
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createProvider as B,
+ createElement as E,
+ useId as D
+} from "runtime";
+
+export const
+ a = new Map(),
+ A = B(a, () => {
+ return null
+ }),
+ C = () => {
+ const b = D();
+ A(b, () => {
+ return (false ? {
+ moves: (c) => {
+ return null
+ },
+ ups: (d) => {
+ return null
+ }
+ } : null)
+ });
+ return E(`div`, {})
+ };
+
diff --git a/spec/compilers2/component_with_provider_and_lifecycle_functions b/spec/compilers2/component_with_provider_and_lifecycle_functions
new file mode 100644
index 000000000..6e718c4c0
--- /dev/null
+++ b/spec/compilers2/component_with_provider_and_lifecycle_functions
@@ -0,0 +1,74 @@
+record MouseProvider.Data {
+ moves : Function(Position, Void),
+ ups : Function(Position, Void)
+}
+
+provider MouseProvider : MouseProvider.Data {
+ fun update : Void {
+ void
+ }
+}
+
+component Main {
+ use MouseProvider {
+ moves: (data : Position) : Void { void },
+ ups: (data : Position) : Void { void }
+ } when {
+ false
+ }
+
+ fun componentWillUnmount : Void {
+ void
+ }
+
+ fun componentDidUpdate : Void {
+ void
+ }
+
+ fun componentDidMount : Void {
+ void
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createProvider as B,
+ createElement as G,
+ useDidUpdate as F,
+ useEffect as E,
+ useId as D
+} from "runtime";
+
+export const
+ a = new Map(),
+ A = B(a, () => {
+ return null
+ }),
+ C = () => {
+ const b = D();
+ E(() => {
+ (() => {
+ return null
+ })();
+ return () => {
+ return null
+ }
+ }, []);
+ F(() => {
+ return null
+ });
+ A(b, () => {
+ return (false ? {
+ moves: (c) => {
+ return null
+ },
+ ups: (d) => {
+ return null
+ }
+ } : null)
+ });
+ return G(`div`, {})
+ };
diff --git a/spec/compilers2/component_with_provider_and_store b/spec/compilers2/component_with_provider_and_store
new file mode 100644
index 000000000..916a36c6e
--- /dev/null
+++ b/spec/compilers2/component_with_provider_and_store
@@ -0,0 +1,64 @@
+record MouseProvider.Data {
+ moves : Function(Position, Void),
+ ups : Function(Position, Void)
+}
+
+provider MouseProvider : MouseProvider.Data {
+ fun update : Void {
+ void
+ }
+}
+
+store Blah {
+ state test : String = ""
+
+ fun x : String {
+ "hello"
+ }
+}
+
+component Main {
+ use MouseProvider {
+ moves: (data : Position) : Void { void },
+ ups: (data : Position) : Void { void }
+ } when {
+ false
+ }
+
+ connect Blah exposing { test, x }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createProvider as C,
+ createElement as F,
+ signal as A,
+ useId as E
+} from "runtime";
+
+export const
+ a = new Map(),
+ b = () => {
+ return `hello`
+ },
+ c = A(``),
+ B = C(a, () => {
+ return null
+ }),
+ D = () => {
+ const d = E();
+ B(d, () => {
+ return (false ? {
+ moves: (e) => {
+ return null
+ },
+ ups: (f) => {
+ return null
+ }
+ } : null)
+ });
+ return F(`div`, {})
+ };
diff --git a/spec/compilers2/constant_component b/spec/compilers2/constant_component
new file mode 100644
index 000000000..22be68c2f
--- /dev/null
+++ b/spec/compilers2/constant_component
@@ -0,0 +1,12 @@
+component Main {
+ const NAME = "ASD"
+
+ fun render : String {
+ NAME
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = `ASD`;
+ return a
+};
diff --git a/spec/compilers2/constant_global_component b/spec/compilers2/constant_global_component
new file mode 100644
index 000000000..ab6ceeb77
--- /dev/null
+++ b/spec/compilers2/constant_global_component
@@ -0,0 +1,26 @@
+global component Test {
+ const NAME = "ASD"
+
+ fun render : String {
+ NAME
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ <{ Test:NAME }>
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as C } from "runtime";
+
+export const
+ A = () => {
+ return a
+ },
+ a = `ASD`,
+ B = () => {
+ return C(`div`, {}, [a])
+ };
diff --git a/spec/compilers2/constant_module b/spec/compilers2/constant_module
new file mode 100644
index 000000000..c9b757655
--- /dev/null
+++ b/spec/compilers2/constant_module
@@ -0,0 +1,20 @@
+module Test {
+ const NAME = "ASD"
+}
+
+component Main {
+ fun render : Html {
+
+ <{ Test:NAME }>
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ a = `ASD`,
+ A = () => {
+ return B(`div`, {}, [a])
+ };
+
diff --git a/spec/compilers2/constant_store b/spec/compilers2/constant_store
new file mode 100644
index 000000000..9d7123561
--- /dev/null
+++ b/spec/compilers2/constant_store
@@ -0,0 +1,20 @@
+store Test {
+ const NAME = "ASD"
+}
+
+component Main {
+ fun render : Html {
+
+ <{ Test:NAME }>
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ a = `ASD`,
+ A = () => {
+ return B(`div`, {}, [a])
+ };
+
diff --git a/spec/compilers2/constant_store_exposed b/spec/compilers2/constant_store_exposed
new file mode 100644
index 000000000..0a74765f7
--- /dev/null
+++ b/spec/compilers2/constant_store_exposed
@@ -0,0 +1,21 @@
+store Test {
+ const NAME = "ASD"
+}
+
+component Main {
+ connect Test exposing { NAME }
+
+ fun render : Html {
+
+ <{ NAME }>
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ a = `ASD`,
+ A = () => {
+ return B(`div`, {}, [a])
+ };
diff --git a/spec/compilers2/css_definition b/spec/compilers2/css_definition
new file mode 100644
index 000000000..3006a5bf0
--- /dev/null
+++ b/spec/compilers2/css_definition
@@ -0,0 +1,41 @@
+component Main {
+ style test {
+ margin: #{margin}px 0px;
+ }
+
+ get margin : Number {
+ 10
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = () => {
+ return 10
+ },
+ b = () => {
+ const _ = {
+ [`--a-a`]: a() + `px 0px`
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([b()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ margin: var(--a-a);
+}
diff --git a/spec/compilers2/css_font_face b/spec/compilers2/css_font_face
new file mode 100644
index 000000000..0550231bf
--- /dev/null
+++ b/spec/compilers2/css_font_face
@@ -0,0 +1,39 @@
+component Main {
+ style test {
+ @font-face {
+ src: url(sansation_light.woff);
+ font-family: myFirstFont;
+ }
+
+ @font-face {
+ src: url(sansation_light2.woff);
+ font-family: myFirstFont;
+ font-weight: bold;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `Main_test`
+ })
+};
+
+---=== /index.css ===---
+@font-face {
+ src: url(sansation_light.woff);
+ font-family: myFirstFont;
+}
+
+@font-face {
+ src: url(sansation_light2.woff);
+ font-family: myFirstFont;
+ font-weight: bold;
+}
diff --git a/spec/compilers2/css_font_face_with_quotes b/spec/compilers2/css_font_face_with_quotes
new file mode 100644
index 000000000..ce9c36851
--- /dev/null
+++ b/spec/compilers2/css_font_face_with_quotes
@@ -0,0 +1,33 @@
+component Main {
+ style test {
+ @font-face {
+ src: url(sansation_light.woff);
+ font-family: myFirstFont;
+ }
+
+ font-family: "myFirstFont";
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `Main_test`
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ font-family: "myFirstFont";
+}
+
+@font-face {
+ src: url(sansation_light.woff);
+ font-family: myFirstFont;
+}
diff --git a/spec/compilers2/css_keyframes b/spec/compilers2/css_keyframes
new file mode 100644
index 000000000..85ab9073e
--- /dev/null
+++ b/spec/compilers2/css_keyframes
@@ -0,0 +1,72 @@
+component Main {
+ state opacity : Number = 1
+
+ style test {
+ @keyframes animation {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: #{opacity};
+ }
+ }
+
+ @keyframes animation {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(1),
+ b = () => {
+ const _ = {
+ [`--a-a`]: a.value
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([b()])
+ })
+};
+
+---=== /index.css ===---
+@keyframes animation {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: var(--a-a);
+ }
+}
+
+@keyframes animation {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
diff --git a/spec/compilers2/css_media b/spec/compilers2/css_media
new file mode 100644
index 000000000..917190c9b
--- /dev/null
+++ b/spec/compilers2/css_media
@@ -0,0 +1,54 @@
+component Main {
+ style test {
+ div {
+ color: #{color};
+ }
+
+ @media (screen) {
+ color: #{color};
+ }
+ }
+
+ get color : String {
+ "blue"
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = () => {
+ return `blue`
+ },
+ b = () => {
+ const _ = {
+ [`--a-a`]: a(),
+ [`--b-a`]: a()
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([b()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test div {
+ color: var(--a-a);
+}
+
+@media (screen) {
+ .Main_test {
+ color: var(--b-a);
+ }
+}
diff --git a/spec/compilers2/css_media_with_if b/spec/compilers2/css_media_with_if
new file mode 100644
index 000000000..c458704cb
--- /dev/null
+++ b/spec/compilers2/css_media_with_if
@@ -0,0 +1,46 @@
+component Main {
+ style test {
+ color: yellow;
+
+ @media (max-width: 300px) {
+ if (true) {
+ color: red;
+ }
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ (true ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : null);
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: yellow;
+}
+
+@media (max-width: 300px) {
+ .Main_test {
+ color: var(--a-a);
+ }
+}
diff --git a/spec/compilers2/css_selector b/spec/compilers2/css_selector
new file mode 100644
index 000000000..16e697543
--- /dev/null
+++ b/spec/compilers2/css_selector
@@ -0,0 +1,51 @@
+component Main {
+ style test {
+ div {
+ color: #{color};
+ }
+
+ &:focus {
+ color: red;
+ }
+ }
+
+ get color : String {
+ "blue"
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = () => {
+ return `blue`
+ },
+ b = () => {
+ const _ = {
+ [`--a-a`]: a()
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([b()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test div {
+ color: var(--a-a);
+}
+
+.Main_test:focus {
+ color: red;
+}
diff --git a/spec/compilers2/css_selector_multiple b/spec/compilers2/css_selector_multiple
new file mode 100644
index 000000000..4f6f0f2b3
--- /dev/null
+++ b/spec/compilers2/css_selector_multiple
@@ -0,0 +1,56 @@
+component Main {
+ style test {
+ div {
+ color: #{color};
+ }
+
+ &:focus,
+ &:hover {
+ color: red;
+ }
+ }
+
+ get color : String {
+ "blue"
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = () => {
+ return `blue`
+ },
+ b = () => {
+ const _ = {
+ [`--a-a`]: a()
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([b()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test div {
+ color: var(--a-a);
+}
+
+.Main_test:focus {
+ color: red;
+}
+
+.Main_test:hover {
+ color: red;
+}
diff --git a/spec/compilers2/css_string b/spec/compilers2/css_string
new file mode 100644
index 000000000..e25e9d948
--- /dev/null
+++ b/spec/compilers2/css_string
@@ -0,0 +1,42 @@
+component Main {
+ state name : String = "Joe"
+
+ style unicode {
+ span::after {
+ content: "Hi" blah #{name} "Here is some content; Thanks #{name}";
+ }
+ }
+
+ fun render {
+
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`Joe`),
+ b = () => {
+ const _ = {
+ [`--a-a`]: `"Hi"` + ` blah ` + a.value + ` ` + `"Here is some content; Thanks ${a.value}"`
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_unicode`,
+ style: D([b()])
+ }, [C(`span`, {})])
+};
+
+---=== /index.css ===---
+.Main_unicode span::after {
+ content: var(--a-a);
+}
diff --git a/spec/compilers2/css_supports b/spec/compilers2/css_supports
new file mode 100644
index 000000000..1a6353b51
--- /dev/null
+++ b/spec/compilers2/css_supports
@@ -0,0 +1,42 @@
+component Main {
+ state color : String = "blue"
+
+ style test {
+ @supports (screen) {
+ color: #{color};
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`blue`),
+ b = () => {
+ const _ = {
+ [`--a-a`]: a.value
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([b()])
+ })
+};
+
+---=== /index.css ===---
+@supports (screen) {
+ .Main_test {
+ color: var(--a-a);
+ }
+}
diff --git a/spec/compilers2/css_with_ands b/spec/compilers2/css_with_ands
new file mode 100644
index 000000000..814229ebc
--- /dev/null
+++ b/spec/compilers2/css_with_ands
@@ -0,0 +1,41 @@
+component Main {
+ style test {
+ &:focus {
+ color: red;
+ }
+
+ &[someattribute] {
+ color: red;
+ }
+
+ &.someclass {
+ color: red;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `Main_test`
+ })
+};
+
+---=== /index.css ===---
+.Main_test:focus {
+ color: red;
+}
+
+.Main_test[someattribute] {
+ color: red;
+}
+
+.Main_test.someclass {
+ color: red;
+}
diff --git a/spec/compilers2/css_with_arguments b/spec/compilers2/css_with_arguments
new file mode 100644
index 000000000..e93e6dbce
--- /dev/null
+++ b/spec/compilers2/css_with_arguments
@@ -0,0 +1,33 @@
+component Main {
+ style test(color : String) {
+ color: #{color};
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = (b) => {
+ const _ = {
+ [`--a-a`]: b
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([a(`red`)])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: var(--a-a);
+}
diff --git a/spec/compilers2/css_with_case b/spec/compilers2/css_with_case
new file mode 100644
index 000000000..05798a814
--- /dev/null
+++ b/spec/compilers2/css_with_case
@@ -0,0 +1,58 @@
+component Main {
+ style test {
+ color: yellow;
+
+ case ("a") {
+ "a" =>
+ color: red;
+
+ =>
+ color: blue;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ style as D,
+ match as B
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ B(`a`, [
+ [
+ `a`,
+ () => {
+ return Object.assign(_, {
+ [`--a-a`]: `red`
+ })
+ }
+ ],
+ [
+ null,
+ () => {
+ return Object.assign(_, {
+ [`--a-a`]: `blue`
+ })
+ }
+ ]
+ ]);
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: var(--a-a, yellow);
+}
diff --git a/spec/compilers2/css_with_else_if b/spec/compilers2/css_with_else_if
new file mode 100644
index 000000000..073255d44
--- /dev/null
+++ b/spec/compilers2/css_with_else_if
@@ -0,0 +1,47 @@
+component Main {
+ style base(color : String) {
+ height: 20px;
+
+ if (color == "red") {
+ background: red;
+ } else if (color == "blue") {
+ background: blue;
+ }
+ }
+
+
+ fun render : Html {
+
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ compare as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const a = (b) => {
+ const _ = {};
+ (B(b, `red`) ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : (B(b, `blue`) ? Object.assign(_, {
+ [`--a-a`]: `blue`
+ }) : null));
+ return _
+ };
+ return C(`div`, {}, [C(`div`, {
+ className: `Main_base`,
+ style: D([a(`blue`)])
+ })])
+};
+
+---=== /index.css ===---
+.Main_base {
+ height: 20px;
+ background: var(--a-a);
+}
diff --git a/spec/compilers2/css_with_if b/spec/compilers2/css_with_if
new file mode 100644
index 000000000..eb124a0e9
--- /dev/null
+++ b/spec/compilers2/css_with_if
@@ -0,0 +1,42 @@
+component Main {
+ style test {
+ color: yellow;
+
+ if (true) {
+ color: red;
+ } else {
+ color: blue;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ (true ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : Object.assign(_, {
+ [`--a-a`]: `blue`
+ }));
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: var(--a-a, yellow);
+}
diff --git a/spec/compilers2/css_with_if_and_case b/spec/compilers2/css_with_if_and_case
new file mode 100644
index 000000000..03c03faf9
--- /dev/null
+++ b/spec/compilers2/css_with_if_and_case
@@ -0,0 +1,66 @@
+component Main {
+ style test {
+ color: yellow;
+
+ case (true) {
+ true => color: yellow;
+ => color: cyan;
+ }
+
+ if (true) {
+ color: red;
+ } else {
+ color: blue;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ style as D,
+ match as B
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ B(true, [
+ [
+ true,
+ () => {
+ return Object.assign(_, {
+ [`--a-a`]: `yellow`
+ })
+ }
+ ],
+ [
+ null,
+ () => {
+ return Object.assign(_, {
+ [`--a-a`]: `cyan`
+ })
+ }
+ ]
+ ]);
+ (true ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : Object.assign(_, {
+ [`--a-a`]: `blue`
+ }));
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: var(--a-a, yellow);
+}
diff --git a/spec/compilers2/css_with_if_same_condition b/spec/compilers2/css_with_if_same_condition
new file mode 100644
index 000000000..a76dc7e4e
--- /dev/null
+++ b/spec/compilers2/css_with_if_same_condition
@@ -0,0 +1,59 @@
+component Main {
+ style test {
+ .tag {
+ if (true) {
+ color: red;
+ } else {
+ color: blue;
+ }
+ }
+
+ .string {
+ if (true) {
+ color: yellow;
+ } else {
+ color: cyan;
+ }
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ (true ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : Object.assign(_, {
+ [`--a-a`]: `blue`
+ }));
+ (true ? Object.assign(_, {
+ [`--b-a`]: `yellow`
+ }) : Object.assign(_, {
+ [`--b-a`]: `cyan`
+ }));
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test .tag {
+ color: var(--a-a);
+}
+
+.Main_test .string {
+ color: var(--b-a);
+}
diff --git a/spec/compilers2/css_with_if_with_interpolation b/spec/compilers2/css_with_if_with_interpolation
new file mode 100644
index 000000000..f97486d78
--- /dev/null
+++ b/spec/compilers2/css_with_if_with_interpolation
@@ -0,0 +1,42 @@
+component Main {
+ style test {
+ color: yellow;
+
+ if (true) {
+ color: #{"red"};
+ } else {
+ color: blue;
+ }
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ const _ = {};
+ (true ? Object.assign(_, {
+ [`--a-a`]: `red`
+ }) : Object.assign(_, {
+ [`--a-a`]: `blue`
+ }));
+ return _
+ };
+ return B(`div`, {
+ className: `Main_test`,
+ style: C([a()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ color: var(--a-a, yellow);
+}
diff --git a/spec/compilers2/dce_remove_component b/spec/compilers2/dce_remove_component
new file mode 100644
index 000000000..bf8074864
--- /dev/null
+++ b/spec/compilers2/dce_remove_component
@@ -0,0 +1,6 @@
+component Test {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
diff --git a/spec/compilers2/dce_remove_component_computed_property b/spec/compilers2/dce_remove_component_computed_property
new file mode 100644
index 000000000..789edc727
--- /dev/null
+++ b/spec/compilers2/dce_remove_component_computed_property
@@ -0,0 +1,15 @@
+component Main {
+ get test : String {
+ ""
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {})
+};
diff --git a/spec/compilers2/dce_remove_component_function b/spec/compilers2/dce_remove_component_function
new file mode 100644
index 000000000..7c6b96bd2
--- /dev/null
+++ b/spec/compilers2/dce_remove_component_function
@@ -0,0 +1,15 @@
+component Main {
+ fun test : String {
+ ""
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {})
+};
diff --git a/spec/compilers2/dce_remove_enum b/spec/compilers2/dce_remove_enum
new file mode 100644
index 000000000..7b9580bc0
--- /dev/null
+++ b/spec/compilers2/dce_remove_enum
@@ -0,0 +1,6 @@
+enum Test {
+ X
+ Y
+ Z
+}
+--------------------------------------------------------------------------------
diff --git a/spec/compilers2/dce_remove_module b/spec/compilers2/dce_remove_module
new file mode 100644
index 000000000..ffd83a5f9
--- /dev/null
+++ b/spec/compilers2/dce_remove_module
@@ -0,0 +1,6 @@
+module Test {
+ fun test : String {
+ ""
+ }
+}
+--------------------------------------------------------------------------------
diff --git a/spec/compilers2/dce_remove_module_function b/spec/compilers2/dce_remove_module_function
new file mode 100644
index 000000000..1660281fc
--- /dev/null
+++ b/spec/compilers2/dce_remove_module_function
@@ -0,0 +1,23 @@
+module Test {
+ fun test : String {
+ ""
+ }
+
+ fun x : String {
+ ""
+ }
+}
+
+component Main {
+ fun render : String {
+ Test.test()
+ }
+}
+--------------------------------------------------------------------------------
+export const
+ a = () => {
+ return ``
+ },
+ A = () => {
+ return a()
+ };
diff --git a/spec/compilers2/dce_remove_provider b/spec/compilers2/dce_remove_provider
new file mode 100644
index 000000000..8811ff795
--- /dev/null
+++ b/spec/compilers2/dce_remove_provider
@@ -0,0 +1,10 @@
+provider MouseProvider : Unit {
+ fun update : Void {
+ void
+ }
+
+ fun attach : Void {
+ void
+ }
+}
+--------------------------------------------------------------------------------
diff --git a/spec/compilers2/dce_remove_store b/spec/compilers2/dce_remove_store
new file mode 100644
index 000000000..da746ab3e
--- /dev/null
+++ b/spec/compilers2/dce_remove_store
@@ -0,0 +1,6 @@
+store Test {
+ fun test : String {
+ ""
+ }
+}
+--------------------------------------------------------------------------------
diff --git a/spec/compilers2/dce_style b/spec/compilers2/dce_style
new file mode 100644
index 000000000..a92e80daa
--- /dev/null
+++ b/spec/compilers2/dce_style
@@ -0,0 +1,15 @@
+component Main {
+ style test {
+ color: red;
+ }
+
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {})
+};
diff --git a/spec/compilers2/decode b/spec/compilers2/decode
new file mode 100644
index 000000000..f677fdb1f
--- /dev/null
+++ b/spec/compilers2/decode
@@ -0,0 +1,42 @@
+type Result(error, value) {
+ Err(error)
+ Ok(value)
+}
+
+record X.Y {
+ blah : String
+}
+
+record X {
+ name : String,
+ y: X.Y
+}
+
+component Main {
+ fun render : String {
+ decode `null` as Object as X
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ decodeString as E,
+ decoder as D,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ a = D({
+ blah: E(C, A)
+ }, C, A),
+ b = D({
+ name: E(C, A),
+ y: a
+ }, C, A),
+ F = () => {
+ b((null));
+ return ``
+ };
diff --git a/spec/compilers2/decode_function b/spec/compilers2/decode_function
new file mode 100644
index 000000000..6e717a7f0
--- /dev/null
+++ b/spec/compilers2/decode_function
@@ -0,0 +1,42 @@
+type Result(error, value) {
+ Err(error)
+ Ok(value)
+}
+
+record X.Y {
+ blah : String
+}
+
+record X {
+ name : String,
+ y: X.Y
+}
+
+component Main {
+ fun render : String {
+ (decode as X)(`null`)
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ decodeString as E,
+ decoder as D,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ a = D({
+ blah: E(C, A)
+ }, C, A),
+ b = D({
+ name: E(C, A),
+ y: a
+ }, C, A),
+ F = () => {
+ (b)((null));
+ return ``
+ };
diff --git a/spec/compilers2/decode_map b/spec/compilers2/decode_map
new file mode 100644
index 000000000..19962e432
--- /dev/null
+++ b/spec/compilers2/decode_map
@@ -0,0 +1,26 @@
+type Result(error, value) {
+ Err(error)
+ Ok(value)
+}
+
+component Main {
+ fun render : String {
+ decode (`[]`) as Map(String, Number)
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ decodeNumber as F,
+ decodeMap as E,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ D = () => {
+ E(F(C, A), C, A)((([])));
+ return ``
+ };
diff --git a/spec/compilers2/decode_tuple b/spec/compilers2/decode_tuple
new file mode 100644
index 000000000..753da0846
--- /dev/null
+++ b/spec/compilers2/decode_tuple
@@ -0,0 +1,31 @@
+type Result(error, value) {
+ Err(error)
+ Ok(value)
+}
+
+component Main {
+ fun render : String {
+ decode (`[]`) as Tuple(String, Number, String)
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ decodeNumber as G,
+ decodeString as F,
+ decodeTuple as E,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ D = () => {
+ E([
+ F(C, A),
+ G(C, A),
+ F(C, A)
+ ], C, A)((([])));
+ return ``
+ };
diff --git a/spec/compilers2/decoder b/spec/compilers2/decoder
new file mode 100644
index 000000000..fe34d2910
--- /dev/null
+++ b/spec/compilers2/decoder
@@ -0,0 +1,66 @@
+type Result(error, value) {
+ Err(error)
+ Ok(value)
+}
+
+type Maybe(a) {
+ Just(a)
+ Nothing
+}
+
+record Y {
+ size : Number using "SIIIZEEE"
+}
+
+record X {
+ maybe : Maybe(String),
+ array : Array(String),
+ string : String,
+ number : Number,
+ bool : Bool,
+ time : Time,
+ y : Y
+}
+
+component Main {
+ fun render : String {
+ decode `` as Object as X
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ decodeBoolean as K,
+ decodeString as I,
+ decodeNumber as G,
+ decodeArray as J,
+ decodeMaybe as H,
+ decodeTime as L,
+ decoder as F,
+ variant as B
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(1),
+ D = B(1),
+ E = B(0),
+ a = F({
+ size: [
+ G(C, A),
+ "SIIIZEEE"
+ ]
+ }, C, A),
+ b = F({
+ maybe: H(I(C, A), C, A, D, E),
+ array: J(I(C, A), C, A),
+ string: I(C, A),
+ number: G(C, A),
+ bool: K(C, A),
+ time: L(C, A),
+ y: a
+ }, C, A),
+ M = () => {
+ b(undefined);
+ return ``
+ };
diff --git a/spec/compilers2/defer b/spec/compilers2/defer
new file mode 100644
index 000000000..566bb5083
--- /dev/null
+++ b/spec/compilers2/defer
@@ -0,0 +1,60 @@
+module Test {
+ const TEST = defer { test() + B.c() }
+
+ fun test {
+ "Hello!"
+ }
+}
+
+module B {
+ fun c {
+ "Blah"
+ }
+}
+
+component Main {
+ fun componentDidMount : Promise(String) {
+ let a = await Test.TEST
+
+ a
+ }
+
+ fun render : Html {
+
+ B.c()
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as D,
+ useEffect as B,
+ load as C
+} from "runtime";
+
+export const
+ a = () => {
+ return `Blah`
+ },
+ b = `/__mint__/d35d0e81d757e8f90c0687897aad44d12fb193211.js`,
+ A = () => {
+ B(() => {
+ (async () => {
+ const c = await C(b);
+ return c
+ })()
+ }, []);
+ return D(`div`, {}, [a()])
+ };
+
+---=== /__mint__/d35d0e81d757e8f90c0687897aad44d12fb193211.js ===---
+import { a as c } from "/index.js";
+
+export const
+ a = () => {
+ return `Hello!`
+ },
+ b = a() + c();
+
+export default b;
diff --git a/spec/compilers2/defer_2 b/spec/compilers2/defer_2
new file mode 100644
index 000000000..6c22dcc1b
--- /dev/null
+++ b/spec/compilers2/defer_2
@@ -0,0 +1,53 @@
+module Data {
+ const ITEMS = defer [ defer ITEM_1 ]
+ const ITEM_1 = "Hello"
+}
+
+component Main {
+ fun componentDidMount : Promise(String) {
+ let [item] = await Data.ITEMS or return ""
+ await item
+ }
+
+ fun render : Html {
+
""
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ patternVariable as E,
+ createElement as F,
+ destructure as C,
+ useEffect as B,
+ load as D
+} from "runtime";
+
+export const
+ a = `/__mint__/d5f8d9aa357303a4ba78b554c55d598bd238f679b.js`,
+ A = () => {
+ B(() => {
+ (async () => {
+ const b = C(await D(a), [E]);
+ if (b === false) {
+ return ``
+ };
+ const [c] = b;
+ return await D(c)
+ })()
+ }, []);
+ return F(`div`, {}, [``])
+ };
+
+---=== /__mint__/d96571c631d11ed793b887a131e80107a65e05223.js ===---
+export const
+ a = `Hello`,
+ b = a;
+
+export default b;
+
+---=== /__mint__/d5f8d9aa357303a4ba78b554c55d598bd238f679b.js ===---
+export const a = [`/__mint__/d96571c631d11ed793b887a131e80107a65e05223.js`];
+
+export default a;
+
diff --git a/spec/compilers2/destructuring b/spec/compilers2/destructuring
new file mode 100644
index 000000000..2e35db8a0
--- /dev/null
+++ b/spec/compilers2/destructuring
@@ -0,0 +1,59 @@
+enum Test {
+ Item(
+ matchString : String,
+ content : String,
+ key : String)
+ None
+}
+
+component Main {
+ fun render : String {
+ let item =
+ Test::Item(
+ matchString: "MATCHSTRING",
+ content: "CONTENT",
+ key: "KEY")
+
+ case item {
+ Test::Item(content) => content
+ Test::None => ""
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as I,
+ patternRecord as H,
+ newVariant as E,
+ pattern as G,
+ variant as B,
+ match as F
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B([
+ "matchString",
+ "content",
+ "key"
+ ]),
+ D = () => {
+ const a = E(C)(`MATCHSTRING`, `CONTENT`, `KEY`);
+ return F(a, [
+ [
+ G(C, H([[
+ `content`,
+ I
+ ]])),
+ (b) => {
+ return b
+ }
+ ],
+ [
+ G(A, []),
+ () => {
+ return ``
+ }
+ ]
+ ])
+ };
diff --git a/spec/compilers2/directives/asset b/spec/compilers2/directives/asset
new file mode 100644
index 000000000..bb4e2ec0c
--- /dev/null
+++ b/spec/compilers2/directives/asset
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ @asset(../../fixtures/icon.svg)
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return `/assets/icon_c97b81630bc53286dadc8996727d348e.svg`
+};
diff --git a/spec/compilers2/directives/documentation b/spec/compilers2/directives/documentation
new file mode 100644
index 000000000..e0f781118
--- /dev/null
+++ b/spec/compilers2/directives/documentation
@@ -0,0 +1,12 @@
+component Main {
+ fun render : String {
+ @documentation(Main)
+
+ "Hello There"
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ {"description":null,"name":"Main","connects":[],"computed-properties":[],"properties":[],"functions":[{"type":"String","description":null,"name":"render","source":"fun render : String {\n @documentation(Main)\n\n \"Hello There\"\n}","arguments":[]}],"providers":[],"states":[]};
+ return `Hello There`
+};
diff --git a/spec/compilers2/directives/format b/spec/compilers2/directives/format
new file mode 100644
index 000000000..9d06e114b
--- /dev/null
+++ b/spec/compilers2/directives/format
@@ -0,0 +1,23 @@
+component Main {
+ fun render : String {
+ let {result, formatted} =
+ @format {
+ "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloH" \
+ "Bello"
+ }
+
+ result + formatted
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const [
+ a,
+ b
+ ] = [
+ `HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHBello`,
+ `"HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloH" \\
+"Bello"`
+ ];
+ return a + b
+};
diff --git a/spec/compilers2/directives/highlight b/spec/compilers2/directives/highlight
new file mode 100644
index 000000000..a5c9896bc
--- /dev/null
+++ b/spec/compilers2/directives/highlight
@@ -0,0 +1,23 @@
+component Main {
+ fun render : Html {
+ @highlight {
+ "Test"
+ }[1]
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return [
+ `Test`,
+ B(C, {}, [B("span", {
+ className: "line"
+ }, [B("span", {
+ className: "string"
+ }, [`"Test"`])])])
+ ][1]
+};
diff --git a/spec/compilers2/directives/highlight-file b/spec/compilers2/directives/highlight-file
new file mode 100644
index 000000000..158bae7bd
--- /dev/null
+++ b/spec/compilers2/directives/highlight-file
@@ -0,0 +1,63 @@
+component Main {
+ fun render : Html {
+ @highlight-file(../../fixtures/Test.mint)
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B("span", {
+ className: "line"
+ }, [
+ B("span", {
+ className: "keyword"
+ }, [`component`]),
+ ` `,
+ B("span", {
+ className: "type"
+ }, [`Main`]),
+ ` {
+`
+ ]),
+ B("span", {
+ className: "line"
+ }, [
+ ` `,
+ B("span", {
+ className: "keyword"
+ }, [`fun`]),
+ ` render : `,
+ B("span", {
+ className: "type"
+ }, [`Html`]),
+ ` {
+`
+ ]),
+ B("span", {
+ className: "line"
+ }, [
+ ` <`,
+ B("span", {
+ className: "namespace"
+ }, [`div`]),
+ `>`,
+ B("span", {
+ className: "namespace"
+ }, [`div`]),
+ `>
+`
+ ]),
+ B("span", {
+ className: "line"
+ }, [` }
+`]),
+ B("span", {
+ className: "line"
+ }, [`}`])
+ ])
+};
diff --git a/spec/compilers2/directives/svg b/spec/compilers2/directives/svg
new file mode 100644
index 000000000..28c9b3dc0
--- /dev/null
+++ b/spec/compilers2/directives/svg
@@ -0,0 +1,18 @@
+component Main {
+ fun render : Html {
+ @svg(../../fixtures/icon.svg)
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`svg`, {
+ dangerouslySetInnerHTML: {
+ __html: ``
+ },
+ viewBox: `0 0 24 24`,
+ height: `24`,
+ width: `24`
+ })
+};
diff --git a/spec/compilers2/encode b/spec/compilers2/encode
new file mode 100644
index 000000000..0b2ea5858
--- /dev/null
+++ b/spec/compilers2/encode
@@ -0,0 +1,30 @@
+record Test {
+ name : String,
+ age : Number
+}
+
+component Main {
+ fun render : String {
+ encode { name: "Hello", age: 20 }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ identity as B,
+ encoder as A
+} from "runtime";
+
+export const
+ a = A({
+ name: B,
+ age: B
+ }),
+ C = () => {
+ a({
+ name: `Hello`,
+ age: 20
+ });
+ return ``
+ };
diff --git a/spec/compilers2/encode_nested b/spec/compilers2/encode_nested
new file mode 100644
index 000000000..d478d8f3c
--- /dev/null
+++ b/spec/compilers2/encode_nested
@@ -0,0 +1,39 @@
+record Test {
+ nested : Nested,
+ name : String
+}
+
+type Nested {
+ name : String
+}
+
+component Main {
+ fun render : String {
+ encode { name: "Hello", nested: { name: "Test" } }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ identity as B,
+ encoder as A
+} from "runtime";
+
+export const
+ a = A({
+ name: B
+ }),
+ b = A({
+ nested: a,
+ name: B
+ }),
+ C = () => {
+ b({
+ name: `Hello`,
+ nested: {
+ name: `Test`
+ }
+ });
+ return ``
+ };
diff --git a/spec/compilers2/encode_with_mapping b/spec/compilers2/encode_with_mapping
new file mode 100644
index 000000000..6409d531a
--- /dev/null
+++ b/spec/compilers2/encode_with_mapping
@@ -0,0 +1,33 @@
+record Test {
+ name : String using "test_name",
+ age : Number
+}
+
+component Main {
+ fun render : String {
+ encode { name: "Hello", age: 20 }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ identity as B,
+ encoder as A
+} from "runtime";
+
+export const
+ a = A({
+ name: [
+ B,
+ "test_name"
+ ],
+ age: B
+ }),
+ C = () => {
+ a({
+ name: `Hello`,
+ age: 20
+ });
+ return ``
+ };
diff --git a/spec/compilers2/env b/spec/compilers2/env
new file mode 100644
index 000000000..ed8ec9192
--- /dev/null
+++ b/spec/compilers2/env
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ @TEST
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return `TRUE`
+};
diff --git a/spec/compilers2/field b/spec/compilers2/field
new file mode 100644
index 000000000..ae7b07631
--- /dev/null
+++ b/spec/compilers2/field
@@ -0,0 +1,25 @@
+record Test {
+ a : String,
+ b : Number
+}
+
+component Main {
+ fun render : Html {
+ {
+ a: "Hello",
+ b: 0
+ }
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ {
+ a: `Hello`,
+ b: 0
+ };
+ return B(`div`, {})
+};
diff --git a/spec/compilers2/for b/spec/compilers2/for
new file mode 100644
index 000000000..f2a33ef28
--- /dev/null
+++ b/spec/compilers2/for
@@ -0,0 +1,27 @@
+component Main {
+ fun render : Array(Html) {
+ for (item of ["A", "B"]) {
+
+ <{ item }>
+
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return (() => {
+ const _0 = [];
+ const _1 = [
+ `A`,
+ `B`
+ ];
+ let _i = -1;
+ for (let a of _1) {
+ _i++;
+ _0.push(B(`div`, {}, [a]))
+ };
+ return _0
+ })()
+};
diff --git a/spec/compilers2/for_with_index b/spec/compilers2/for_with_index
new file mode 100644
index 000000000..527e1e375
--- /dev/null
+++ b/spec/compilers2/for_with_index
@@ -0,0 +1,37 @@
+component Main {
+ fun render : Array(Html) {
+ for (item, index of ["A", "B"]) {
+
+ <{ item }>
+
+ } when {
+ index == 10
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as C,
+ compare as B
+} from "runtime";
+
+export const A = () => {
+ return (() => {
+ const _0 = [];
+ const _1 = [
+ `A`,
+ `B`
+ ];
+ let _i = -1;
+ for (let a of _1) {
+ _i++;
+ const b = _i;
+ const _2 = B(b, 10);
+ if (!_2) {
+ continue
+ };
+ _0.push(C(`div`, {}, [a]))
+ };
+ return _0
+ })()
+};
diff --git a/spec/compilers2/for_with_index_2 b/spec/compilers2/for_with_index_2
new file mode 100644
index 000000000..ec9fbac8f
--- /dev/null
+++ b/spec/compilers2/for_with_index_2
@@ -0,0 +1,28 @@
+component Main {
+ fun render : Array(Html) {
+ for (item, index of ["A", "B"]) {
+
+ <{ item }>
+
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return (() => {
+ const _0 = [];
+ const _1 = [
+ `A`,
+ `B`
+ ];
+ let _i = -1;
+ for (let a of _1) {
+ _i++;
+ const b = _i;
+ _0.push(B(`div`, {}, [a]))
+ };
+ return _0
+ })()
+};
diff --git a/spec/compilers2/function b/spec/compilers2/function
new file mode 100644
index 000000000..818cf7f9b
--- /dev/null
+++ b/spec/compilers2/function
@@ -0,0 +1,19 @@
+component Main {
+ fun test : Bool {
+ true
+ }
+
+ fun render : String {
+ test()
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = () => {
+ return true
+ };
+ a();
+ return ``
+};
diff --git a/spec/compilers2/function_call_simple b/spec/compilers2/function_call_simple
new file mode 100644
index 000000000..bd1275c9c
--- /dev/null
+++ b/spec/compilers2/function_call_simple
@@ -0,0 +1,27 @@
+component Main {
+ fun a : String {
+ "test"
+ }
+
+ fun test : String {
+ a()
+ }
+
+ fun render : String {
+ test()
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const
+ a = () => {
+ return `test`
+ },
+ b = () => {
+ return a()
+ };
+ b();
+ return ``
+};
diff --git a/spec/compilers2/function_call_with_arguments b/spec/compilers2/function_call_with_arguments
new file mode 100644
index 000000000..9188dc239
--- /dev/null
+++ b/spec/compilers2/function_call_with_arguments
@@ -0,0 +1,28 @@
+component Main {
+ fun call (a : String, b : Bool) : Bool {
+ b
+ }
+
+ fun test : Bool {
+ call("Hello", true)
+ }
+
+ fun render : String {
+ test()
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const
+ a = (b, c) => {
+ return c
+ },
+ d = () => {
+ return a(`Hello`, true)
+ };
+ d();
+ return ``
+};
+
diff --git a/spec/compilers2/get b/spec/compilers2/get
new file mode 100644
index 000000000..54aa99bc6
--- /dev/null
+++ b/spec/compilers2/get
@@ -0,0 +1,16 @@
+component Main {
+ get test : String {
+ ""
+ }
+
+ fun render : String {
+ test
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = () => {
+ return ``
+ };
+ return a()
+};
diff --git a/spec/compilers2/here_doc_markdown b/spec/compilers2/here_doc_markdown
new file mode 100644
index 000000000..a1ea4d5a5
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown
@@ -0,0 +1,21 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN
+ ## Hello There
+
+ WTF
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B('h2', {}, [`Hello There`]),
+ B('p', {}, [`WTF`])
+ ])
+};
diff --git a/spec/compilers2/here_doc_markdown_escape b/spec/compilers2/here_doc_markdown_escape
new file mode 100644
index 000000000..3cf29eb3a
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_escape
@@ -0,0 +1,77 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN(highlight)
+ \#{name}
+ ```mint
+ `Something`
+ "\#{name}"
+ "First line" \
+ "Second line" \
+ "Third line"
+ ```
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B('p', {}, [`#{name}`]),
+ B('pre', {}, [B('code', {
+ class: "language-mint"
+ }, [
+ B('span', {
+ className: "line"
+ }, [`\`Something\`
+`]),
+ B('span', {
+ className: "line"
+ }, [
+ ``,
+ B('span', {
+ className: "string"
+ }, [`"#{`]),
+ B('span', {
+ className: "variable"
+ }, [`name`]),
+ B('span', {
+ className: "string"
+ }, [`}"`]),
+ `
+`
+ ]),
+ B('span', {
+ className: "line"
+ }, [
+ ``,
+ B('span', {
+ className: "string"
+ }, [`"First line" \`]),
+ `
+`
+ ]),
+ B('span', {
+ className: "line"
+ }, [
+ ``,
+ B('span', {
+ className: "string"
+ }, [`"Second line" \`]),
+ `
+`
+ ]),
+ B('span', {
+ className: "line"
+ }, [
+ ``,
+ B('span', {
+ className: "string"
+ }, [`"Third line"`])
+ ])
+ ])])
+ ])
+};
diff --git a/spec/compilers2/here_doc_markdown_with_code_block b/spec/compilers2/here_doc_markdown_with_code_block
new file mode 100644
index 000000000..c99f48923
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_with_code_block
@@ -0,0 +1,39 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN(highlight)
+ Text
+
+ ```mint
+ module Time {}
+ ```
+
+ Text
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B('p', {}, [`Text`]),
+ B('pre', {}, [B('code', {
+ class: "language-mint"
+ }, [B('span', {
+ className: "line"
+ }, [
+ B('span', {
+ className: "keyword"
+ }, [`module`]),
+ ` `,
+ B('span', {
+ className: "type"
+ }, [`Time`]),
+ ` {}`
+ ])])]),
+ B('p', {}, [`Text`])
+ ])
+};
diff --git a/spec/compilers2/here_doc_markdown_with_code_block_multiline b/spec/compilers2/here_doc_markdown_with_code_block_multiline
new file mode 100644
index 000000000..213689456
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_with_code_block_multiline
@@ -0,0 +1,65 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN(highlight)
+ Text
+
+ ```mint
+ module Time {
+ const NOW = ""
+ }
+ ```
+
+ Text
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B('p', {}, [`Text`]),
+ B('pre', {}, [B('code', {
+ class: "language-mint"
+ }, [
+ B('span', {
+ className: "line"
+ }, [
+ B('span', {
+ className: "keyword"
+ }, [`module`]),
+ ` `,
+ B('span', {
+ className: "type"
+ }, [`Time`]),
+ ` {
+`
+ ]),
+ B('span', {
+ className: "line"
+ }, [
+ ` `,
+ B('span', {
+ className: "keyword"
+ }, [`const`]),
+ ` `,
+ B('span', {
+ className: "type"
+ }, [`NOW`]),
+ ` = `,
+ B('span', {
+ className: "string"
+ }, [`""`]),
+ `
+`
+ ]),
+ B('span', {
+ className: "line"
+ }, [`}`])
+ ])]),
+ B('p', {}, [`Text`])
+ ])
+};
diff --git a/spec/compilers2/here_doc_markdown_with_html_interpolation b/spec/compilers2/here_doc_markdown_with_html_interpolation
new file mode 100644
index 000000000..6af563022
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_with_html_interpolation
@@ -0,0 +1,23 @@
+component Main {
+ const HTML =
+
+ fun render : Html {
+ <<#MARKDOWN
+ #{HTML} Some text...
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ const a = B(`div`, {});
+ return B(C, {}, [B('p', {}, [
+ ``,
+ a,
+ ` Some text...`
+ ])])
+};
diff --git a/spec/compilers2/here_doc_markdown_with_inline_code b/spec/compilers2/here_doc_markdown_with_inline_code
new file mode 100644
index 000000000..0c6fa1023
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_with_inline_code
@@ -0,0 +1,20 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN
+ * When open pressing `Esc` closes it.
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [B('ul', {}, [B('li', {}, [
+ `When open pressing `,
+ B('code', {}, [`Esc`]),
+ ` closes it.`
+ ])])])
+};
diff --git a/spec/compilers2/here_doc_markdown_with_interpolation b/spec/compilers2/here_doc_markdown_with_interpolation
new file mode 100644
index 000000000..34a9bb2b4
--- /dev/null
+++ b/spec/compilers2/here_doc_markdown_with_interpolation
@@ -0,0 +1,29 @@
+component Main {
+ fun render : Html {
+ <<#MARKDOWN
+ ## Hello There
+ #{
"Hello"
}
+ World!
+ MARKDOWN
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(C, {}, [
+ B('h2', {}, [`Hello There`]),
+ B('p', {}, [
+ ``,
+ B(`div`, {}, [`Hello`]),
+ ``,
+ `
+`,
+ `World`,
+ `!`
+ ])
+ ])
+};
diff --git a/spec/compilers2/here_doc_with_interpolation b/spec/compilers2/here_doc_with_interpolation
new file mode 100644
index 000000000..96d8db68c
--- /dev/null
+++ b/spec/compilers2/here_doc_with_interpolation
@@ -0,0 +1,17 @@
+component Main {
+ fun render : String {
+ <<-TEXT
+ Hello There!
+ #{"interpolation"}
+ This line should be indented by 2 spaces.
+ This line should be indented by 4 spaces.
+ TEXT
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return ` Hello There!
+ ${`interpolation`}
+ This line should be indented by 2 spaces.
+ This line should be indented by 4 spaces.`
+};
diff --git a/spec/compilers2/here_doc_without_indentation b/spec/compilers2/here_doc_without_indentation
new file mode 100644
index 000000000..52cc1dde9
--- /dev/null
+++ b/spec/compilers2/here_doc_without_indentation
@@ -0,0 +1,15 @@
+component Main {
+ fun render : String {
+ <<~TEXT
+ Hello There!
+ This line should be indented by 2 spaces.
+ This line should be indented by 4 spaces.
+ TEXT
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return `Hello There!
+ This line should be indented by 2 spaces.
+ This line should be indented by 4 spaces.`
+};
diff --git a/spec/compilers2/html_attribute_class b/spec/compilers2/html_attribute_class
new file mode 100644
index 000000000..519e241fc
--- /dev/null
+++ b/spec/compilers2/html_attribute_class
@@ -0,0 +1,14 @@
+component Main {
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `something`
+ })
+};
diff --git a/spec/compilers2/html_attribute_class_with_style b/spec/compilers2/html_attribute_class_with_style
new file mode 100644
index 000000000..2685d207d
--- /dev/null
+++ b/spec/compilers2/html_attribute_class_with_style
@@ -0,0 +1,24 @@
+component Main {
+ style base {
+ width: 100%;
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `something` + ` Main_base`
+ })
+};
+
+---=== /index.css ===---
+.Main_base {
+ width: 100%;
+}
diff --git a/spec/compilers2/html_attribute_html_expression b/spec/compilers2/html_attribute_html_expression
new file mode 100644
index 000000000..a542c1fe0
--- /dev/null
+++ b/spec/compilers2/html_attribute_html_expression
@@ -0,0 +1,27 @@
+component Thing {
+ property things : Html = <>>
+
+ fun render : Html {
+
+ }
+}
+
+component Main {
+ fun render {
+ />
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ A = ({
+ a = null
+ }) => {
+ return B(`div`, {})
+ },
+ C = () => {
+ return B(A, {
+ a: `x`
+ })
+ };
diff --git a/spec/compilers2/html_attribute_readonly b/spec/compilers2/html_attribute_readonly
new file mode 100644
index 000000000..92595174e
--- /dev/null
+++ b/spec/compilers2/html_attribute_readonly
@@ -0,0 +1,13 @@
+component Main {
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ readOnly: true
+ })
+};
diff --git a/spec/compilers2/html_attribute_ref b/spec/compilers2/html_attribute_ref
new file mode 100644
index 000000000..ddfd8bb45
--- /dev/null
+++ b/spec/compilers2/html_attribute_ref
@@ -0,0 +1,29 @@
+enum Maybe(value) {
+ Just(value)
+ Nothing
+}
+
+component Main {
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as F,
+ variant as B,
+ setRef as G,
+ useRef as E
+} from "runtime";
+
+export const
+ A = B(1),
+ C = B(0),
+ D = () => {
+ const a = E(new C());
+ return F(`div`, {
+ ref: G(a, A)
+ })
+ };
+
diff --git a/spec/compilers2/html_attribute_simple b/spec/compilers2/html_attribute_simple
new file mode 100644
index 000000000..f4c3e3b44
--- /dev/null
+++ b/spec/compilers2/html_attribute_simple
@@ -0,0 +1,14 @@
+component Main {
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ "title": `Hello`
+ })
+};
diff --git a/spec/compilers2/html_attribute_with_expression b/spec/compilers2/html_attribute_with_expression
new file mode 100644
index 000000000..d7032bb6f
--- /dev/null
+++ b/spec/compilers2/html_attribute_with_expression
@@ -0,0 +1,14 @@
+component Main {
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ "title": `Hello ` + `there!`
+ })
+};
diff --git a/spec/compilers2/html_component b/spec/compilers2/html_component
new file mode 100644
index 000000000..466e355a9
--- /dev/null
+++ b/spec/compilers2/html_component
@@ -0,0 +1,21 @@
+component Test {
+ fun render : Html {
+
+ }
+}
+
+component Main {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const
+ A = () => {
+ return B(`div`, {})
+ },
+ C = () => {
+ return B(A, {})
+ };
diff --git a/spec/compilers2/html_expression b/spec/compilers2/html_expression
new file mode 100644
index 000000000..090a63a62
--- /dev/null
+++ b/spec/compilers2/html_expression
@@ -0,0 +1,11 @@
+component Main {
+ fun render : Html {
+
<{ "Hello" }>
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {}, [`Hello`])
+};
diff --git a/spec/compilers2/html_fragment b/spec/compilers2/html_fragment
new file mode 100644
index 000000000..357ab866b
--- /dev/null
+++ b/spec/compilers2/html_fragment
@@ -0,0 +1,22 @@
+component Main {
+ fun render : Html {
+
+ <>
+ <{ "A" }>
+ "B"
+ >
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ fragment as C
+} from "runtime";
+
+export const A = () => {
+ return B(`div`, {}, [B(C, {}, [
+ `A`,
+ `B`
+ ])])
+};
diff --git a/spec/compilers2/html_fragment_empty b/spec/compilers2/html_fragment_empty
new file mode 100644
index 000000000..b8538d67b
--- /dev/null
+++ b/spec/compilers2/html_fragment_empty
@@ -0,0 +1,14 @@
+component Main {
+ fun render : Html {
+
+ <>
+ >
+
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {}, [null])
+};
diff --git a/spec/compilers2/html_with_custom_style b/spec/compilers2/html_with_custom_style
new file mode 100644
index 000000000..8ae077222
--- /dev/null
+++ b/spec/compilers2/html_with_custom_style
@@ -0,0 +1,24 @@
+component Main {
+ get styles : Map(String, String) {
+ ``
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = () => {
+ return undefined
+ };
+ return B(`div`, {
+ style: C([a()])
+ })
+};
diff --git a/spec/compilers2/html_with_multiple_styles b/spec/compilers2/html_with_multiple_styles
new file mode 100644
index 000000000..7e193145c
--- /dev/null
+++ b/spec/compilers2/html_with_multiple_styles
@@ -0,0 +1,32 @@
+component Main {
+ style one {
+ color: red;
+ }
+
+ style two {
+ color: blue;
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import { createElement as B } from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ className: `Main_one Main_two`
+ })
+};
+
+---=== /index.css ===---
+.Main_one {
+ color: red;
+}
+
+.Main_two {
+ color: blue;
+}
diff --git a/spec/compilers2/html_with_multiple_styles_and_parameters b/spec/compilers2/html_with_multiple_styles_and_parameters
new file mode 100644
index 000000000..373d02728
--- /dev/null
+++ b/spec/compilers2/html_with_multiple_styles_and_parameters
@@ -0,0 +1,42 @@
+component Main {
+ style one {
+ color: red;
+ }
+
+ style two(color : String) {
+ color: #{color};
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const a = (b) => {
+ const _ = {
+ [`--a-a`]: b
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_one Main_two`,
+ style: C([a(`blue`)])
+ })
+};
+
+---=== /index.css ===---
+.Main_one {
+ color: red;
+}
+
+.Main_two {
+ color: var(--a-a);
+}
diff --git a/spec/compilers2/html_with_multiple_styles_and_parameters_2 b/spec/compilers2/html_with_multiple_styles_and_parameters_2
new file mode 100644
index 000000000..a06d81605
--- /dev/null
+++ b/spec/compilers2/html_with_multiple_styles_and_parameters_2
@@ -0,0 +1,52 @@
+component Main {
+ style one(color: String) {
+ color: #{color};
+ }
+
+ style two(color : String) {
+ color: #{color};
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = (b) => {
+ const _ = {
+ [`--a-a`]: b
+ };
+ return _
+ },
+ c = (d) => {
+ const _ = {
+ [`--b-a`]: d
+ };
+ return _
+ };
+ return B(`div`, {
+ className: `Main_one Main_two`,
+ style: C([
+ a(`red`),
+ c(`blue`)
+ ])
+ })
+};
+
+---=== /index.css ===---
+.Main_one {
+ color: var(--a-a);
+}
+
+.Main_two {
+ color: var(--b-a);
+}
diff --git a/spec/compilers2/html_with_pseudos b/spec/compilers2/html_with_pseudos
new file mode 100644
index 000000000..2c4061e18
--- /dev/null
+++ b/spec/compilers2/html_with_pseudos
@@ -0,0 +1,73 @@
+component Main {
+ state hoverBackground : String = "yellow"
+ state background : String = "blue"
+
+ style test {
+ background: #{background};
+ color: red;
+
+ &:hover {
+ background: #{hoverBackground};
+ color: cyan;
+ }
+
+ &::first-line {
+ text-transform: uppercase;
+ }
+
+ div {
+ font-family: #{"Hello"};
+ color: blue;
+ }
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`yellow`),
+ b = B(`blue`),
+ c = () => {
+ const _ = {
+ [`--a-a`]: b.value,
+ [`--b-a`]: a.value,
+ [`--c-a`]: `Hello`
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([c()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ background: var(--a-a);
+ color: red;
+}
+
+.Main_test:hover {
+ background: var(--b-a);
+ color: cyan;
+}
+
+.Main_test::first-line {
+ text-transform: uppercase;
+}
+
+.Main_test div {
+ font-family: var(--c-a);
+ color: blue;
+}
diff --git a/spec/compilers2/html_with_string_style b/spec/compilers2/html_with_string_style
new file mode 100644
index 000000000..9db1acead
--- /dev/null
+++ b/spec/compilers2/html_with_string_style
@@ -0,0 +1,16 @@
+component Main {
+ fun render : Html {
+
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createElement as B,
+ style as C
+} from "runtime";
+
+export const A = () => {
+ return B(`div`, {
+ style: C([`opacity:0;`])
+ })
+};
diff --git a/spec/compilers2/html_with_style b/spec/compilers2/html_with_style
new file mode 100644
index 000000000..e6f79f6cb
--- /dev/null
+++ b/spec/compilers2/html_with_style
@@ -0,0 +1,87 @@
+component Main {
+ state background : String = "blue"
+ state color : String = "yellow"
+
+ style test {
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+ -webkit-touch-callout: none;
+
+ border-color: #{background};
+ background: #{background};
+ border: #{background};
+ color: #{color};
+
+ & {
+ font-size: 1em;
+ }
+
+ &.big {
+ font-size: 1.5em;
+ }
+
+ &[data-foo="bar"] {
+ font-size: 3em;
+ }
+
+ > span {
+ font-size: .8em;
+ }
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`blue`),
+ b = B(`yellow`),
+ c = () => {
+ const _ = {
+ [`--a-a`]: a.value,
+ [`--a-b`]: a.value,
+ [`--a-c`]: a.value,
+ [`--a-d`]: b.value
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([c()])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ -webkit-tap-highlight-color: rgba(0,0,0,0);
+ -webkit-touch-callout: none;
+ border-color: var(--a-a);
+ background: var(--a-b);
+ border: var(--a-c);
+ color: var(--a-d);
+}
+
+.Main_test {
+ font-size: 1em;
+}
+
+.Main_test.big {
+ font-size: 1.5em;
+}
+
+.Main_test[data-foo="bar"] {
+ font-size: 3em;
+}
+
+.Main_test > span {
+ font-size: .8em;
+}
diff --git a/spec/compilers2/html_with_style_and_custom_style b/spec/compilers2/html_with_style_and_custom_style
new file mode 100644
index 000000000..6e34cf75b
--- /dev/null
+++ b/spec/compilers2/html_with_style_and_custom_style
@@ -0,0 +1,51 @@
+component Main {
+ state background : String = "blue"
+
+ get styles : Map(String, String) {
+ ``
+ }
+
+ style test {
+ background: #{background};
+ color: red;
+ }
+
+ fun render : Html {
+
+
+ }
+}
+--------------------------------------------------------------------------------
+---=== /index.js ===---
+import {
+ createElement as C,
+ useSignal as B,
+ style as D
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`blue`),
+ b = () => {
+ return undefined
+ },
+ c = () => {
+ const _ = {
+ [`--a-a`]: a.value
+ };
+ return _
+ };
+ return C(`div`, {
+ className: `Main_test`,
+ style: D([
+ c(),
+ b()
+ ])
+ })
+};
+
+---=== /index.css ===---
+.Main_test {
+ background: var(--a-a);
+ color: red;
+}
diff --git a/spec/compilers2/if b/spec/compilers2/if
new file mode 100644
index 000000000..289e867a6
--- /dev/null
+++ b/spec/compilers2/if
@@ -0,0 +1,18 @@
+component Main {
+ fun render : String {
+ if ("asd" == "asd2") {
+ true
+ } else {
+ false
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ (B(`asd`, `asd2`) ? true : false);
+ return ``
+};
diff --git a/spec/compilers2/if_let b/spec/compilers2/if_let
new file mode 100644
index 000000000..8b24d071c
--- /dev/null
+++ b/spec/compilers2/if_let
@@ -0,0 +1,42 @@
+enum T {
+ A(String)
+ B
+}
+
+component Main {
+ fun render : String {
+ if (let T::A(a) = T::A("")) {
+ a
+ } else {
+ "b"
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as H,
+ newVariant as F,
+ pattern as G,
+ variant as B,
+ match as E
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = () => {
+ return E(F(C)(``), [
+ [
+ G(C, [H]),
+ (a) => {
+ return a
+ }
+ ],
+ [
+ null,
+ () => {
+ return `b`
+ }
+ ]
+ ])
+ };
diff --git a/spec/compilers2/if_let_await b/spec/compilers2/if_let_await
new file mode 100644
index 000000000..2d9cfa126
--- /dev/null
+++ b/spec/compilers2/if_let_await
@@ -0,0 +1,50 @@
+enum T {
+ A(String)
+ B
+}
+
+component Main {
+ fun render : String {
+ {
+ if (let T::A(a) = await T::A("")) {
+ a
+ } else {
+ "b"
+ }
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ patternVariable as H,
+ newVariant as E,
+ pattern as G,
+ variant as B,
+ match as F
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = () => {
+ (async () => {
+ let a = await E(C)(``);
+ return F(a, [
+ [
+ G(C, [H]),
+ (b) => {
+ return b
+ }
+ ],
+ [
+ null,
+ () => {
+ return `b`
+ }
+ ]
+ ])
+ })();
+ return ``
+ };
diff --git a/spec/compilers2/if_without_else_array b/spec/compilers2/if_without_else_array
new file mode 100644
index 000000000..bfe041aa5
--- /dev/null
+++ b/spec/compilers2/if_without_else_array
@@ -0,0 +1,13 @@
+component Main {
+ fun render : Array(String) {
+ if ("asd" == "asd2") {
+ ["ARRAY"]
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ return (B(`asd`, `asd2`) ? [`ARRAY`] : [])
+};
diff --git a/spec/compilers2/if_without_else_promise b/spec/compilers2/if_without_else_promise
new file mode 100644
index 000000000..5eda37343
--- /dev/null
+++ b/spec/compilers2/if_without_else_promise
@@ -0,0 +1,16 @@
+component Main {
+ fun render : String {
+ if ("asd" == "asd2") {
+ next {}
+ }
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ (B(`asd`, `asd2`) ? null : null);
+ return ``
+};
diff --git a/spec/compilers2/if_without_else_string b/spec/compilers2/if_without_else_string
new file mode 100644
index 000000000..e4d06eac2
--- /dev/null
+++ b/spec/compilers2/if_without_else_string
@@ -0,0 +1,13 @@
+component Main {
+ fun render : String {
+ if ("asd" == "asd2") {
+ "TRUE"
+ }
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ return (B(`asd`, `asd2`) ? `TRUE` : "")
+};
diff --git a/spec/compilers2/indirect_connect b/spec/compilers2/indirect_connect
new file mode 100644
index 000000000..4bd06e1bc
--- /dev/null
+++ b/spec/compilers2/indirect_connect
@@ -0,0 +1,32 @@
+store Test {
+ state a : String = ""
+
+ fun b : String {
+ "hello"
+ }
+}
+
+store A {
+ state test : Array(String) = [""]
+ state other : String = ""
+}
+
+component Main {
+ connect Test exposing { a }
+
+ fun render : String {
+ A.other
+ }
+}
+--------------------------------------------------------------------------------
+import { signal as A } from "runtime";
+
+export const
+ a = () => {
+ return `hello`
+ },
+ b = A(``),
+ c = A(``),
+ B = () => {
+ return c.value
+ };
diff --git a/spec/compilers2/inline_function b/spec/compilers2/inline_function
new file mode 100644
index 000000000..0f55720b5
--- /dev/null
+++ b/spec/compilers2/inline_function
@@ -0,0 +1,15 @@
+component Main {
+ fun render : String {
+ let a =
+ () : String { "Hello" }
+
+ a()
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = () => {
+ return `Hello`
+ };
+ return a()
+};
diff --git a/spec/compilers2/inline_function_recursive b/spec/compilers2/inline_function_recursive
new file mode 100644
index 000000000..31ad0068b
--- /dev/null
+++ b/spec/compilers2/inline_function_recursive
@@ -0,0 +1,35 @@
+module Test {
+ fun factorial(n : Number) : Number {
+ let helper = (n : Number, acc : Number) : Number {
+ if (n == 0) {
+ acc
+ } else {
+ helper(n - 1, acc * n)
+ }
+ }
+
+ helper(n, 1)
+ }
+}
+
+component Main {
+ fun render : String {
+ Test.factorial(3)
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as A } from "runtime";
+
+export const
+ a = (b) => {
+ const c = (d, e) => {
+ return (A(d, 0) ? e : c(d - 1, e * d))
+ };
+ return c(b, 1)
+ },
+ B = () => {
+ a(3);
+ return ``
+ };
diff --git a/spec/compilers2/inline_function_with_arguments b/spec/compilers2/inline_function_with_arguments
new file mode 100644
index 000000000..2038ed326
--- /dev/null
+++ b/spec/compilers2/inline_function_with_arguments
@@ -0,0 +1,25 @@
+component Main {
+ fun test : String {
+ let getName =
+ (name : String) : String { name }
+
+ getName("Joe")
+ }
+
+ fun render : String {
+ test()
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ const a = () => {
+ const b = (c) => {
+ return c
+ };
+ return b(`Joe`)
+ };
+ a();
+ return ``
+};
diff --git a/spec/compilers2/js b/spec/compilers2/js
new file mode 100644
index 000000000..7639d253d
--- /dev/null
+++ b/spec/compilers2/js
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ ` "Hello" `
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return ("Hello")
+};
diff --git a/spec/compilers2/js_with_double_interpolation b/spec/compilers2/js_with_double_interpolation
new file mode 100644
index 000000000..aa012544b
--- /dev/null
+++ b/spec/compilers2/js_with_double_interpolation
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ ` "Hello" + #{`"World!"`} `
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return ("Hello" + ("World!"))
+};
diff --git a/spec/compilers2/js_with_interpolation b/spec/compilers2/js_with_interpolation
new file mode 100644
index 000000000..169797cdd
--- /dev/null
+++ b/spec/compilers2/js_with_interpolation
@@ -0,0 +1,9 @@
+component Main {
+ fun render : String {
+ ` "Hello" + #{"World!"} `
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ return ("Hello" + `World!`)
+};
diff --git a/spec/compilers2/locale_key b/spec/compilers2/locale_key
new file mode 100644
index 000000000..50ca436fb
--- /dev/null
+++ b/spec/compilers2/locale_key
@@ -0,0 +1,27 @@
+locale en {
+ test: "Hello"
+}
+
+component Main {
+ fun render : String {
+ :test
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ translations as C,
+ translate as B,
+ locale as D
+} from "runtime";
+
+export const A = () => {
+ return B(`test`)
+};
+
+C.value = {
+ en: {
+ 'test': `Hello`
+ }
+};
+
+D.value = `en`;
diff --git a/spec/compilers2/member_access b/spec/compilers2/member_access
new file mode 100644
index 000000000..e4e597a1a
--- /dev/null
+++ b/spec/compilers2/member_access
@@ -0,0 +1,43 @@
+record X {
+ name : String
+}
+
+module Array {
+ fun map (array : Array(a), method : Function(a, b)) : Array(b) {
+ ``
+ }
+}
+
+component Main {
+ fun render : String {
+ [
+ {
+ name: "Joe"
+ },
+ {
+ name: "Doe"
+ }
+ ]
+ |> Array.map(.name)
+
+ "asd"
+ }
+}
+--------------------------------------------------------------------------------
+import { access as B } from "runtime";
+
+export const
+ a = (b, c) => {
+ return undefined
+ },
+ A = () => {
+ a([
+ {
+ name: `Joe`
+ },
+ {
+ name: `Doe`
+ }
+ ], B(`name`));
+ return `asd`
+ };
diff --git a/spec/compilers2/module b/spec/compilers2/module
new file mode 100644
index 000000000..42cafa5a2
--- /dev/null
+++ b/spec/compilers2/module
@@ -0,0 +1,23 @@
+module Html.Testing {
+ fun renderAll : Html {
+
+ <{ "It should work" }>
+
+ }
+}
+
+component Main {
+ fun render : Html {
+ Html.Testing.renderAll()
+ }
+}
+--------------------------------------------------------------------------------
+import { createElement as A } from "runtime";
+
+export const
+ a = () => {
+ return A(`p`, {}, [`It should work`])
+ },
+ B = () => {
+ return a()
+ };
diff --git a/spec/compilers2/module_access b/spec/compilers2/module_access
new file mode 100644
index 000000000..25926594f
--- /dev/null
+++ b/spec/compilers2/module_access
@@ -0,0 +1,30 @@
+module Test {
+ fun a : String {
+ "Hello"
+ }
+
+ fun b : Function(String) {
+ Test.a
+ }
+}
+
+component Main {
+ fun render : String {
+ let x =
+ Test.b()
+
+ x()
+ }
+}
+--------------------------------------------------------------------------------
+export const
+ a = () => {
+ return `Hello`
+ },
+ b = () => {
+ return a
+ },
+ A = () => {
+ const c = b();
+ return c()
+ };
diff --git a/spec/compilers2/module_access_get b/spec/compilers2/module_access_get
new file mode 100644
index 000000000..9ae01c00a
--- /dev/null
+++ b/spec/compilers2/module_access_get
@@ -0,0 +1,26 @@
+store Test {
+ get a : String {
+ "Hello"
+ }
+
+ fun b : String {
+ Test.a
+ }
+}
+
+component Main {
+ fun render : String {
+ Test.b()
+ }
+}
+--------------------------------------------------------------------------------
+export const
+ a = () => {
+ return `Hello`
+ },
+ b = () => {
+ return a()
+ },
+ A = () => {
+ return b()
+ };
diff --git a/spec/compilers2/module_access_subscriptions b/spec/compilers2/module_access_subscriptions
new file mode 100644
index 000000000..37a938ae9
--- /dev/null
+++ b/spec/compilers2/module_access_subscriptions
@@ -0,0 +1,51 @@
+record Test {
+ test : String
+}
+
+provider Test : Test {
+ fun update : Promise(Void) {
+ subscriptions
+ await void
+ }
+
+ fun print (a : String) : String {
+ a
+ }
+}
+
+component Main {
+ use Test {
+ test: ""
+ }
+
+ fun render : String {
+ Test.subscriptions
+ Test.print("a")
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ createProvider as B,
+ subscriptions as C,
+ useId as E
+} from "runtime";
+
+export const
+ a = new Map(),
+ b = (c) => {
+ return c
+ },
+ A = B(a, async () => {
+ C(a);
+ return await null
+ }),
+ D = () => {
+ const d = E();
+ A(d, () => {
+ return {
+ test: ``
+ }
+ });
+ C(a);
+ return b(`a`)
+ };
diff --git a/spec/compilers2/module_call b/spec/compilers2/module_call
new file mode 100644
index 000000000..e8690f524
--- /dev/null
+++ b/spec/compilers2/module_call
@@ -0,0 +1,26 @@
+module Test {
+ fun a (value : String) : String {
+ value
+ }
+
+ fun b : String {
+ Test.a("Lorem ipsum dolor sit amet")
+ }
+}
+
+component Main {
+ fun render : String {
+ Test.b()
+ }
+}
+--------------------------------------------------------------------------------
+export const
+ a = (b) => {
+ return b
+ },
+ c = () => {
+ return a(`Lorem ipsum dolor sit amet`)
+ },
+ A = () => {
+ return c()
+ };
diff --git a/spec/compilers2/module_call_piped b/spec/compilers2/module_call_piped
new file mode 100644
index 000000000..21ba67372
--- /dev/null
+++ b/spec/compilers2/module_call_piped
@@ -0,0 +1,27 @@
+module Test {
+ fun a (x : Bool, value : String) : String {
+ value
+ }
+
+ fun b : String {
+ true
+ |> Test.a("Lorem ipsum dolor sit amet")
+ }
+}
+
+component Main {
+ fun render : String {
+ Test.b()
+ }
+}
+--------------------------------------------------------------------------------
+export const
+ a = (b, c) => {
+ return c
+ },
+ d = () => {
+ return a(true, `Lorem ipsum dolor sit amet`)
+ },
+ A = () => {
+ return d()
+ };
diff --git a/spec/compilers2/next_call b/spec/compilers2/next_call
new file mode 100644
index 000000000..ffd98b9d9
--- /dev/null
+++ b/spec/compilers2/next_call
@@ -0,0 +1,37 @@
+component Main {
+ state name : String = "Joe"
+ state age : Number = 24
+
+ fun test : Promise(Void) {
+ next
+ {
+ name: "Hello",
+ age: 30
+ }
+ }
+
+ fun render : String {
+ test()
+
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ useSignal as B,
+ batch as C
+} from "runtime";
+
+export const A = () => {
+ const
+ a = B(`Joe`),
+ b = B(24),
+ c = () => {
+ return C(() => {
+ a.value = `Hello`;
+ b.value = 30
+ })
+ };
+ c();
+ return ``
+};
diff --git a/spec/compilers2/next_call_empty b/spec/compilers2/next_call_empty
new file mode 100644
index 000000000..dc991181f
--- /dev/null
+++ b/spec/compilers2/next_call_empty
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ next {}
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ null;
+ return ``
+};
diff --git a/spec/compilers2/number_literal_negative b/spec/compilers2/number_literal_negative
new file mode 100644
index 000000000..a348075c2
--- /dev/null
+++ b/spec/compilers2/number_literal_negative
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ -42
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ -42;
+ return ``
+};
diff --git a/spec/compilers2/number_literal_simple b/spec/compilers2/number_literal_simple
new file mode 100644
index 000000000..efcc15473
--- /dev/null
+++ b/spec/compilers2/number_literal_simple
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ 10
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ 10;
+ return ``
+};
diff --git a/spec/compilers2/number_literal_with_decimal b/spec/compilers2/number_literal_with_decimal
new file mode 100644
index 000000000..70c37398a
--- /dev/null
+++ b/spec/compilers2/number_literal_with_decimal
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ 10.120
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ 10.120;
+ return ``
+};
diff --git a/spec/compilers2/operation_chained b/spec/compilers2/operation_chained
new file mode 100644
index 000000000..c43a8147b
--- /dev/null
+++ b/spec/compilers2/operation_chained
@@ -0,0 +1,13 @@
+component Main {
+ fun render : String {
+ "a" == "b" && true != false
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ B(`a`, `b`) && !B(true, false);
+ return ``
+};
diff --git a/spec/compilers2/operation_or b/spec/compilers2/operation_or
new file mode 100644
index 000000000..16ad0c78c
--- /dev/null
+++ b/spec/compilers2/operation_or
@@ -0,0 +1,24 @@
+enum Maybe(a) {
+ Nothing
+ Just(a)
+}
+
+component Main {
+ fun render : String {
+ Maybe::Nothing or "Hello"
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import {
+ variant as B,
+ or as E
+} from "runtime";
+
+export const
+ A = B(0),
+ C = B(1),
+ D = () => {
+ E(new A()._0, `Hello`);
+ return ``
+ };
diff --git a/spec/compilers2/operation_simple b/spec/compilers2/operation_simple
new file mode 100644
index 000000000..6df75f44b
--- /dev/null
+++ b/spec/compilers2/operation_simple
@@ -0,0 +1,13 @@
+component Main {
+ fun render : String {
+ "a" == "b"
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+import { compare as B } from "runtime";
+
+export const A = () => {
+ B(`a`, `b`);
+ return ``
+};
diff --git a/spec/compilers2/parenthesized_expression b/spec/compilers2/parenthesized_expression
new file mode 100644
index 000000000..b9352f3c8
--- /dev/null
+++ b/spec/compilers2/parenthesized_expression
@@ -0,0 +1,11 @@
+component Main {
+ fun render : String {
+ (true)
+ ""
+ }
+}
+--------------------------------------------------------------------------------
+export const A = () => {
+ (true);
+ return ``
+};
diff --git a/spec/compilers2/pipe b/spec/compilers2/pipe
new file mode 100644
index 000000000..c734a2cbe
--- /dev/null
+++ b/spec/compilers2/pipe
@@ -0,0 +1,21 @@
+component Main {
+ fun render : Html {
+