begin work on gui

This commit is contained in:
CodedSakura 2025-06-28 19:21:41 +03:00
parent 8685b03f0c
commit 8f9d19d161
9 changed files with 564 additions and 40 deletions

View File

@ -0,0 +1,23 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="HtmlUnknownTag" enabled="true" level="WARNING" enabled_by_default="true">
<option name="myValues">
<value>
<list size="9">
<item index="0" class="java.lang.String" itemvalue="nobr" />
<item index="1" class="java.lang.String" itemvalue="noembed" />
<item index="2" class="java.lang.String" itemvalue="comment" />
<item index="3" class="java.lang.String" itemvalue="noscript" />
<item index="4" class="java.lang.String" itemvalue="embed" />
<item index="5" class="java.lang.String" itemvalue="script" />
<item index="6" class="java.lang.String" itemvalue="f-grid" />
<item index="7" class="java.lang.String" itemvalue="f-item" />
<item index="8" class="java.lang.String" itemvalue="f-row" />
</list>
</value>
</option>
<option name="myCustomValuesEnabled" value="true" />
</inspection_tool>
</profile>
</component>

4
.idea/watcherTasks.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions" suppressed-tasks="SCSS" />
</project>

View File

@ -1,5 +1,12 @@
const express = require("express");
const { join: joinPath } = require("path");
const homeDir = require("os").homedir();
const fs = require("fs/promises");
const sass = require("sass");
const FACTORIO_DATA_DIR = process.env["FACTORIO_DATA_DIR"] ?? `${homeDir}/.steam/steam/steamapps/common/Factorio/data`;
const exists = path => fs.stat(path).then(() => true, () => false);
const app = express();
@ -11,6 +18,34 @@ app.get("/data.json", (_req, res) => {
res.sendFile(joinPath(__dirname, "build/data.json"));
});
app.get(/.*\.css$/, async (req, res) => {
const strippedFilepath = joinPath("public", req.path.slice(0, -4));
const isScss = await exists(strippedFilepath + ".scss");
const isSass = await exists(strippedFilepath + ".sass");
try {
if (isScss) {
res.type('css').send(sass.compile(strippedFilepath + ".scss").css);
return;
}
if (isSass) {
res.type('css').send(sass.compile(strippedFilepath + ".sass").css);
return;
}
} catch(e) {
console.error(e);
}
res.type('css').send("body { background: red; }");
});
app.get(/__.*__/, async (req, res) => {
const [ , mod, path ] = /^\/__(.+?)__\/(.+)/.exec(req.path);
const data = await fs.readFile(joinPath(FACTORIO_DATA_DIR, mod, path));
res.type('png').send(data);
})
app.listen(
Number(process.env["PORT"] ?? 8080),
function () {

View File

@ -1,7 +1,11 @@
{
"dependencies": {
"express": "^5.0.1",
"sass": "^1.83.1",
"wasmoon": "^1.16.0"
},
"type": "commonjs"
"type": "commonjs",
"scripts": {
"run": "node index.js"
}
}

View File

@ -1,16 +1,65 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Factorio recipes</title>
<script type="text/javascript">
fetch("data.json")
.then(d => d.json())
.then(console.log);
</script>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Titillium+Web:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700&display=swap" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="style.css" />
<script type="text/javascript" src="script.js"></script>
</head>
<body>
worms!
<div id="item-list">
<div>
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
@
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
*
<input value="4" />
</div>
<f-grid>
<f-row>
<f-item name="basic-oil-processing"></f-item>
<f-item name="advanced-oil-processing"></f-item>
</f-row>
<f-row>
<f-item name="iron-gear-wheel"></f-item>
<f-item name="iron-stick"></f-item>
<f-item name="copper-cable"></f-item>
<f-item name="barrel"></f-item>
<f-item name="electronic-circuit"></f-item>
<f-item name="advanced-circuit"></f-item>
<f-item name="processing-unit"></f-item>
<f-item name="engine-unit"></f-item>
<f-item name="electric-engine-unit"></f-item>
<f-item name="flying-robot-frame"></f-item>
<f-item name="low-density-structure"></f-item>
<f-item name="rocket-fuel"></f-item>
<f-item name="rocket-fuel" id="test-item"></f-item>
</f-row>
<f-row id="test-row"></f-row>
</f-grid>
<!--<div>
<div class="spacer"></div>
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
@
<input value="4" disabled />
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
=
<input value="4" disabled />
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
+
<input value="4" disabled />
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
->
<input value="4" disabled />
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
+
<input value="4" disabled />
<button><img src="__base__/graphics/icons/low-density-structure.png" class="item" /></button>
</div>-->
</div>
</body>
</html>

112
public/script.js Normal file
View File

@ -0,0 +1,112 @@
const ticksInSecond = 60;
class FactorioItemElement extends HTMLElement {
static observedAttributes = [ "name" ];
async connectedCallback() {
const name = this.getAttribute("name");
const button = document.createElement("button");
const img = document.createElement("img");
img.setAttribute("src", await this.getImagePath(name));
img.setAttribute("alt", name);
button.appendChild(img);
button.setAttribute("title", name);
this.appendChild(button);
}
async attributeChangedCallback(attribute, _oldValue, newValue) {
await dataPromise;
await new Promise(setTimeout); // skip one 'frame' to wait for the connectCallback to run
if (attribute === "name") {
if (this.children.length > 0) {
const button = this.firstElementChild;
const img = button.firstElementChild;
img.setAttribute("src", await this.getImagePath(newValue));
button.setAttribute("title", newValue);
img.setAttribute("alt", newValue);
}
}
}
async getImagePath(name) {
await dataPromise;
const recipe = data.recipe[name];
const item = data.item[name];
if (!item) {
if (recipe) {
return recipe.icon ?? null;
}
return null;
}
return item.icon;
}
static new(name) {
const elem = document.createElement("f-item");
elem.setAttribute("name", name);
return elem;
}
}
class NoTextElement extends HTMLElement {
constructor() {
super();
this.observer = new MutationObserver(mutations => {
mutations.forEach(m => {
m.addedNodes.forEach(n => {
if (n.nodeType === Node.TEXT_NODE) {
this.removeChild(n);
}
})
})
});
this.observer.observe(this, {
childList: true,
subtree: false,
});
}
}
window.customElements.define("f-item", FactorioItemElement);
window.customElements.define("f-grid", class extends NoTextElement {});
window.customElements.define("f-row", class extends NoTextElement {});
let data = null;
const dataPromise = Promise.all([
new Promise(res => {
window.addEventListener("load", res);
}),
fetch("data.json").then(d => d.json()),
]).then(([_, resData]) => {
data = resData;
console.log(data.recipe);
console.log(data.item);
// console.log(data.furnace);
// console.log(data["assembling-machine"]);
// console.log(data.module);
// console.log(data.planet);
// console.log(data.resource);
// console.log(data.generator);
// console.log(data["burner-generator"]);
// console.log(data.boiler);
// console.log(data.quality);
// console.log(data["rocket-silo"]);
// console.log(data.plant);
// console.log(data["mining-drill"]);
// document.body
console.log(data.recipe["rocket-silo"]);
console.log(data.item["rocket-silo"]);
const testRow = document.getElementById("test-row");
testRow.appendChild((i = document.createElement("f-item"), i.setAttribute("name", "uranium-processing"), i));
testRow.appendChild(FactorioItemElement.new("uranium-235"));
testRow.appendChild(FactorioItemElement.new("uranium-238"));
testRow.appendChild(FactorioItemElement.new("uranium-fuel-cell"));
testRow.appendChild(FactorioItemElement.new("depleted-uranium-fuel-cell"));
document.getElementById("test-item").setAttribute("name", "rocket-part");
});

140
public/style.scss Normal file
View File

@ -0,0 +1,140 @@
$bg: #3F3F3F;
$btn: #313131;
$btn-hov: #e39827;
$btn-act: #DB7900;
$inp: #818181;
$inp-act: #F0DAB2;
$inp-dis: #303030;
$inp-dis-col: #818181;
$item-shadow-color: #000;
$grid-bg: #242324;
$shadow-offset: 2px;
$shadow-blur: 2px;
* {
box-sizing: border-box;
}
body {
/* margin: 0;*/
background: $bg;
font-family: "Titillium Web", sans-serif;
color: #ffffffee;
font-weight: 600;
font-size: 18px;
}
button {
all: unset;
display: inline-block;
vertical-align: middle;
padding: 2px;
background-image: url("assets/item-button-9pr.png");
background-repeat: no-repeat;
background-origin: padding-box;
background-position: center center;
background-size: contain;
//border-image-
//background: $btn;
//box-shadow:
// 0 ( $shadow-offset) $shadow-blur #454545 inset,
// 0 (-$shadow-offset) $shadow-blur #191919 inset,
// ( $shadow-offset) 0 $shadow-blur #212121 inset,
// (-$shadow-offset) 0 $shadow-blur #212121 inset;
//border-radius: 4px;
&:hover {
background-image: url("assets/item-button-hover.png");
// box-shadow:
// 0 ( $shadow-offset) $shadow-blur #454545 inset,
// 0 (-$shadow-offset) $shadow-blur #191919 inset,
// ( $shadow-offset) 0 $shadow-blur #212121 inset,
// (-$shadow-offset) 0 $shadow-blur #212121 inset,
// 0 0 5px #888 inset;
// background: $btn-hov;
}
&:active {
background-image: url("assets/item-button-pressed.png");
// background: $btn-act;
// box-shadow:
// 0 (-$shadow-offset+1) $shadow-blur #454545 inset,
// 0 ( $shadow-offset+1) $shadow-blur #191919 inset,
// ( $shadow-offset) 0 $shadow-blur #212121 inset,
// (-$shadow-offset) 0 $shadow-blur #212121 inset,
// 0 0 5px #111 inset;
}
//&:focus-visible {
// outline: 2px solid white;
//}
f-item & {
padding: 3px;
margin: 1px;
}
}
f-item img {
width: 32px;
height: 32px;
object-position: 0 0;
filter: drop-shadow(0 0 4px $item-shadow-color);
object-fit: cover;
display: block;
vertical-align: middle;
pointer-events: none;
}
f-grid {
display: block;
max-width: 400px;
//background: $grid-bg;
background-image: url("assets/empty-square-76x76.png");
background-repeat: repeat;
background-size: 40px 40px;
f-row {
display: block;
}
}
input {
all: unset;
display: inline-block;
background: $inp;
padding: 2px;
height: 32px;
width: 64px;
vertical-align: middle;
text-align: center;
color: black;
font-weight: normal;
font-size: 16px;
box-shadow:
0 (-$shadow-offset) $shadow-blur #454545 inset,
0 ( $shadow-offset) $shadow-blur #191919 inset,
( $shadow-offset) 0 $shadow-blur #212121 inset,
(-$shadow-offset) 0 $shadow-blur #212121 inset;
border-radius: 4px;
&::selection {
background: $btn-hov;
}
&:focus {
background: $inp-act;
}
&:disabled {
background: $inp-dis;
color: $inp-dis-col;
}
}
.spacer {
display: inline-block;
content: "";
width: 32px;
}

View File

@ -1,26 +0,0 @@
const { LuaFactory } = require('wasmoon');
const main = async () => {
const luaFactory = new LuaFactory();
const lua = await luaFactory.createEngine({ enableProxy: false });
lua.global.set("data", { a: 1, b: 2 });
await lua.doString("print(11, data.a)").catch(console.error);
await lua.doString("print(12, pairs(data))").catch(console.error);
lua.global.set("getData", () => ({ a: 1, b: 2 }));
await lua.doString("data = getData()");
await lua.doString("print(21, data.a)").catch(console.error);
await lua.doString("print(22, pairs(data))").catch(console.error);
lua.global.set("data", { data: { a: 1, b: 2 } });
await lua.doString("data = data.data");
await lua.doString("print(31, data.a)").catch(console.error);
await lua.doString("print(32, pairs(data))").catch(console.error);
await lua.doString("data = { a = 1, b = 2 }");
await lua.doString("print(41, data.a)").catch(console.error);
await lua.doString("print(42, pairs(data))").catch(console.error);
};
main().catch(console.error);

183
yarn.lock
View File

@ -2,6 +2,95 @@
# yarn lockfile v1
"@parcel/watcher-android-arm64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a"
integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==
"@parcel/watcher-darwin-arm64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f"
integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==
"@parcel/watcher-darwin-x64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb"
integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==
"@parcel/watcher-freebsd-x64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82"
integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==
"@parcel/watcher-linux-arm-glibc@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42"
integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==
"@parcel/watcher-linux-arm-musl@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4"
integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==
"@parcel/watcher-linux-arm64-glibc@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03"
integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==
"@parcel/watcher-linux-arm64-musl@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732"
integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==
"@parcel/watcher-linux-x64-glibc@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d"
integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==
"@parcel/watcher-linux-x64-musl@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef"
integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
"@parcel/watcher-win32-arm64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154"
integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==
"@parcel/watcher-win32-ia32@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220"
integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==
"@parcel/watcher-win32-x64@2.5.0":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7"
integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==
"@parcel/watcher@^2.4.1":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10"
integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==
dependencies:
detect-libc "^1.0.3"
is-glob "^4.0.3"
micromatch "^4.0.5"
node-addon-api "^7.0.0"
optionalDependencies:
"@parcel/watcher-android-arm64" "2.5.0"
"@parcel/watcher-darwin-arm64" "2.5.0"
"@parcel/watcher-darwin-x64" "2.5.0"
"@parcel/watcher-freebsd-x64" "2.5.0"
"@parcel/watcher-linux-arm-glibc" "2.5.0"
"@parcel/watcher-linux-arm-musl" "2.5.0"
"@parcel/watcher-linux-arm64-glibc" "2.5.0"
"@parcel/watcher-linux-arm64-musl" "2.5.0"
"@parcel/watcher-linux-x64-glibc" "2.5.0"
"@parcel/watcher-linux-x64-musl" "2.5.0"
"@parcel/watcher-win32-arm64" "2.5.0"
"@parcel/watcher-win32-ia32" "2.5.0"
"@parcel/watcher-win32-x64" "2.5.0"
"@types/emscripten@1.39.10":
version "1.39.10"
resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.39.10.tgz#da6e58a6171b46a41d3694f812d845d515c77e18"
@ -36,6 +125,13 @@ body-parser@^2.0.1:
raw-body "^3.0.0"
type-is "~1.6.18"
braces@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.1.1"
bytes@3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
@ -57,6 +153,13 @@ call-bound@^1.0.2:
call-bind-apply-helpers "^1.0.1"
get-intrinsic "^1.2.6"
chokidar@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30"
integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==
dependencies:
readdirp "^4.0.1"
content-disposition@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2"
@ -117,6 +220,11 @@ destroy@1.2.0, destroy@^1.2.0:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
detect-libc@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
dunder-proto@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
@ -206,6 +314,13 @@ express@^5.0.1:
utils-merge "1.0.1"
vary "~1.1.2"
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"
finalhandler@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.0.0.tgz#9d3c79156dfa798069db7de7dd53bc37546f564b"
@ -297,6 +412,11 @@ iconv-lite@0.6.3:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
immutable@^5.0.2:
version "5.0.3"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1"
integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==
inherits@2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
@ -307,6 +427,23 @@ ipaddr.js@1.9.1:
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-promise@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3"
@ -337,6 +474,14 @@ methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
micromatch@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@ -381,6 +526,11 @@ negotiator@^1.0.0:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a"
integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==
node-addon-api@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
object-inspect@^1.13.3:
version "1.13.3"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
@ -410,6 +560,11 @@ path-to-regexp@^8.0.0:
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4"
integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==
picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
proxy-addr@~2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
@ -440,6 +595,11 @@ raw-body@^3.0.0:
iconv-lite "0.6.3"
unpipe "1.0.0"
readdirp@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.1.tgz#bd115327129672dc47f87408f05df9bd9ca3ef55"
integrity sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==
router@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/router/-/router-2.0.0.tgz#8692720b95de83876870d7bc638dd3c7e1ae8a27"
@ -463,6 +623,17 @@ safe-buffer@5.2.1:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass@^1.83.1:
version "1.83.1"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846"
integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA==
dependencies:
chokidar "^4.0.0"
immutable "^5.0.2"
source-map-js ">=0.6.2 <2.0.0"
optionalDependencies:
"@parcel/watcher" "^2.4.1"
send@^1.0.0, send@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/send/-/send-1.1.0.tgz#4efe6ff3bb2139b0e5b2648d8b18d4dec48fc9c5"
@ -536,11 +707,23 @@ side-channel@^1.0.6:
side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2"
"source-map-js@>=0.6.2 <2.0.0":
version "1.2.1"
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
statuses@2.0.1, statuses@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
toidentifier@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"