From 8f9d19d1614f332776b99d80eb42b12153fe23c5 Mon Sep 17 00:00:00 2001 From: CodedSakura Date: Sat, 28 Jun 2025 19:21:41 +0300 Subject: [PATCH] begin work on gui --- .idea/inspectionProfiles/Project_Default.xml | 23 +++ .idea/watcherTasks.xml | 4 + index.js | 43 ++++- package.json | 6 +- public/index.html | 67 ++++++- public/script.js | 112 ++++++++++++ public/style.scss | 140 ++++++++++++++ wasmoon-test.js | 26 --- yarn.lock | 183 +++++++++++++++++++ 9 files changed, 564 insertions(+), 40 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/watcherTasks.xml create mode 100644 public/script.js create mode 100644 public/style.scss delete mode 100644 wasmoon-test.js diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..918532d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,23 @@ + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..fb0d65a --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/index.js b/index.js index 2e4c155..e4c3527 100644 --- a/index.js +++ b/index.js @@ -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,9 +18,37 @@ 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 () { - return console.log(`listening on ${this.address().port}`); - } + Number(process.env["PORT"] ?? 8080), + function () { + return console.log(`listening on ${this.address().port}`); + } ); diff --git a/package.json b/package.json index 881d81d..6a1cc90 100644 --- a/package.json +++ b/package.json @@ -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" + } } diff --git a/public/index.html b/public/index.html index c0a5937..da2f6af 100644 --- a/public/index.html +++ b/public/index.html @@ -1,16 +1,65 @@ - - + + Factorio recipes - + + + + + -worms! +
+
+ + @ + + * + +
+ + + + + + + + + + + + + + + + + + + + + + + +
- \ No newline at end of file + diff --git a/public/script.js b/public/script.js new file mode 100644 index 0000000..2ae6bfa --- /dev/null +++ b/public/script.js @@ -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"); +}); diff --git a/public/style.scss b/public/style.scss new file mode 100644 index 0000000..c77d765 --- /dev/null +++ b/public/style.scss @@ -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; +} diff --git a/wasmoon-test.js b/wasmoon-test.js deleted file mode 100644 index 5a0e339..0000000 --- a/wasmoon-test.js +++ /dev/null @@ -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); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 20bc861..6d32321 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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"