From fd950d4476da7650936bc2be9f6325b15de21260 Mon Sep 17 00:00:00 2001 From: Felix Roos Date: Fri, 17 May 2024 20:36:41 +0200 Subject: [PATCH] tidy tidal package - move tidal repl to examples - make hs2js synchronous --- .../tidal => examples/tidal-repl}/.gitignore | 0 .../tidal => examples/tidal-repl}/README.md | 0 .../tidal => examples/tidal-repl}/index.html | 3 +- examples/tidal-repl/main.js | 80 ++++++++++++++ examples/tidal-repl/package.json | 36 ++++++ .../tidal-repl}/public/README.md | 0 packages/hs2js/package.json | 8 +- packages/hs2js/src/hs2js.mjs | 4 +- packages/hs2js/src/parser.mjs | 11 +- packages/tidal/package.json | 26 ++--- packages/tidal/tidal.mjs | 53 ++------- pnpm-lock.yaml | 104 ++++-------------- 12 files changed, 171 insertions(+), 154 deletions(-) rename {packages/tidal => examples/tidal-repl}/.gitignore (100%) rename {packages/tidal => examples/tidal-repl}/README.md (100%) rename {packages/tidal => examples/tidal-repl}/index.html (91%) create mode 100644 examples/tidal-repl/main.js create mode 100644 examples/tidal-repl/package.json rename {packages/tidal => examples/tidal-repl}/public/README.md (100%) diff --git a/packages/tidal/.gitignore b/examples/tidal-repl/.gitignore similarity index 100% rename from packages/tidal/.gitignore rename to examples/tidal-repl/.gitignore diff --git a/packages/tidal/README.md b/examples/tidal-repl/README.md similarity index 100% rename from packages/tidal/README.md rename to examples/tidal-repl/README.md diff --git a/packages/tidal/index.html b/examples/tidal-repl/index.html similarity index 91% rename from packages/tidal/index.html rename to examples/tidal-repl/index.html index 7f88bf0a..0d17855e 100644 --- a/packages/tidal/index.html +++ b/examples/tidal-repl/index.html @@ -23,6 +23,7 @@

-    
+    
   
 
diff --git a/examples/tidal-repl/main.js b/examples/tidal-repl/main.js
new file mode 100644
index 00000000..9e572ea8
--- /dev/null
+++ b/examples/tidal-repl/main.js
@@ -0,0 +1,80 @@
+import { run, parse } from 'hs2js';
+import { initStrudel, reify, late, samples, stack } from '@strudel/web';
+
+initStrudel({
+  prebake: () => samples('github:tidalcycles/dirt-samples'),
+});
+
+const textarea = document.getElementById('code');
+if (window.location.hash) {
+  textarea.value = atob(window.location.hash.slice(1));
+} else {
+  textarea.value = 'd1 $ s "jvbass(3,8)"';
+}
+textarea.addEventListener('input', (e) => {
+  window.location.hash = btoa(e.target.value);
+  update();
+});
+update();
+
+function getInfixOperators() {
+  let operators = {
+    '>': 'set',
+    '#': 'set',
+    '+': 'add',
+    '-': 'sub',
+    '*': 'mul',
+    '/': 'div',
+  };
+  let alignments = {
+    in: (s) => '|' + s,
+    out: (s) => s + '|',
+    mix: (s) => '|' + s + '|',
+  };
+  let ops = {};
+  Object.entries(operators).forEach(([o, name]) => {
+    // operator without alignment
+    ops[o] = (l, r) => reify(l)[name](reify(r));
+    Object.entries(alignments).forEach(([a, getSymbol]) => {
+      // get symbol with alignment
+      let symbol = getSymbol(o);
+      ops[symbol] = (l, r) => reify(l)[name][a](reify(r));
+    });
+  });
+  ops['~>'] = (l, r) => reify(l).late(reify(r));
+  ops['<~'] = (l, r) => reify(l).early(reify(r));
+  ops['<$>'] = (l, r) => reify(r).fmap(l).outerJoin(); // is this right?
+  return ops;
+}
+const ops = getInfixOperators();
+
+async function update() {
+  let result, tree;
+  try {
+    tree = await parse(textarea.value);
+  } catch (err) {
+    console.warn('parse error');
+    console.error(err);
+  }
+  console.log('parsed tree');
+  console.log(tree.rootNode.toString());
+  try {
+    let patterns = {};
+    window.p = (name, pattern) => {
+      patterns[name] = pattern;
+    };
+    window.d1 = (pat) => window.p(1, pat);
+    window.d2 = (pat) => window.p(2, pat);
+    window.d3 = (pat) => window.p(3, pat);
+    window.rot = late;
+    result = run(tree.rootNode, window, ops);
+    if (Object.values(patterns).length) {
+      stack(...Object.values(patterns)).play();
+    }
+  } catch (err) {
+    console.warn('eval error');
+    console.error(err);
+    result = 'ERROR: ' + err.message;
+  }
+  document.getElementById('result').innerHTML = 'Result: ' + result;
+}
diff --git a/examples/tidal-repl/package.json b/examples/tidal-repl/package.json
new file mode 100644
index 00000000..0e2d8aa5
--- /dev/null
+++ b/examples/tidal-repl/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "@strudel/tidal",
+  "private": true,
+  "version": "0.0.1",
+  "type": "module",
+  "scripts": {
+    "dev": "vite",
+    "build": "pnpm copy-wasm && vite build",
+    "preview": "vite preview",
+    "copy-wasm": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tidalcycles/strudel.git"
+  },
+  "keywords": [
+    "titdalcycles",
+    "strudel",
+    "pattern",
+    "livecoding",
+    "algorave"
+  ],
+  "author": "Felix Roos ",
+  "license": "AGPL-3.0-or-later",
+  "bugs": {
+    "url": "https://github.com/tidalcycles/strudel/issues"
+  },
+  "homepage": "https://github.com/tidalcycles/strudel#readme",
+  "dependencies": {
+    "@strudel/web": "workspace:*",
+    "hs2js": "workspace:*"
+  },
+  "devDependencies": {
+    "vite": "^5.0.8"
+  }
+}
diff --git a/packages/tidal/public/README.md b/examples/tidal-repl/public/README.md
similarity index 100%
rename from packages/tidal/public/README.md
rename to examples/tidal-repl/public/README.md
diff --git a/packages/hs2js/package.json b/packages/hs2js/package.json
index 1f980fcc..1d3907b1 100644
--- a/packages/hs2js/package.json
+++ b/packages/hs2js/package.json
@@ -2,8 +2,12 @@
   "name": "hs2js",
   "version": "0.0.7",
   "description": "Experimental Haskell in JavaScript interpreter",
-  "main": "dist/index.js",
-  "module": "dist/index.mjs",
+  "main": "src/index.mjs",
+  "type": "module",
+  "publishConfig": {
+    "main": "dist/index.js",
+    "module": "dist/index.mjs"
+  },
   "scripts": {
     "build-wasm": "tree-sitter build-wasm node_modules/tree-sitter-haskell && mv tree-sitter-haskell.wasm ./dist/ && cp node_modules/web-tree-sitter/tree-sitter.wasm ./dist/",
     "build": "vite build && npm run build-wasm",
diff --git a/packages/hs2js/src/hs2js.mjs b/packages/hs2js/src/hs2js.mjs
index e7b7cf46..4161b0e6 100644
--- a/packages/hs2js/src/hs2js.mjs
+++ b/packages/hs2js/src/hs2js.mjs
@@ -127,7 +127,7 @@ export function run(node, scope, ops = {}) {
   }
 }
 
-export async function evaluate(haskellCode, scope = globalThis, ops) {
-  const ast = await parse(haskellCode);
+export function evaluate(haskellCode, scope = globalThis, ops) {
+  const ast = parse(haskellCode);
   return run(ast.rootNode, scope, ops);
 }
diff --git a/packages/hs2js/src/parser.mjs b/packages/hs2js/src/parser.mjs
index 6fbd9ae2..25644c7e 100644
--- a/packages/hs2js/src/parser.mjs
+++ b/packages/hs2js/src/parser.mjs
@@ -5,15 +5,18 @@ export function setBase(path) {
   base = path;
 }
 
+let isReady = false,
+  parser;
 async function _loadParser() {
   await Parser.init({
     locateFile(scriptName, scriptDirectory) {
       return `${base}${scriptName}`;
     },
   });
-  const parser = new Parser();
+  parser = new Parser();
   const Lang = await Parser.Language.load(`${base}tree-sitter-haskell.wasm`);
   parser.setLanguage(Lang);
+  isReady = true;
   return parser;
 }
 
@@ -25,8 +28,10 @@ export function loadParser() {
   return parserLoaded;
 }
 
-export async function parse(code) {
-  const parser = await loadParser();
+export function parse(code) {
+  if (!isReady) {
+    throw new Error('hs2js not ready. await loadParser before calling evaluate or parse functions');
+  }
   // for some reason, the parser doesn't like new lines..
   return parser.parse(code.replaceAll('\n\n', '~~~~').replaceAll('\n', '').replaceAll('~~~~', '\n'));
 }
diff --git a/packages/tidal/package.json b/packages/tidal/package.json
index 0e2d8aa5..772f5f4d 100644
--- a/packages/tidal/package.json
+++ b/packages/tidal/package.json
@@ -1,36 +1,26 @@
 {
   "name": "@strudel/tidal",
-  "private": true,
-  "version": "0.0.1",
-  "type": "module",
-  "scripts": {
-    "dev": "vite",
-    "build": "pnpm copy-wasm && vite build",
-    "preview": "vite preview",
-    "copy-wasm": "cp node_modules/hs2js/dist/tree-sitter.wasm public && cp node_modules/hs2js/dist/tree-sitter-haskell.wasm public"
-  },
+  "version": "0.0.7",
+  "description": "Experimental Tidal Code interpreter",
+  "module": "tidal.mjs",
   "repository": {
     "type": "git",
-    "url": "git+https://github.com/tidalcycles/strudel.git"
+    "url": "git+https://github.com/felixroos/hs2js.git"
   },
   "keywords": [
-    "titdalcycles",
-    "strudel",
-    "pattern",
-    "livecoding",
-    "algorave"
+    "haskell",
+    "javascript"
   ],
   "author": "Felix Roos ",
   "license": "AGPL-3.0-or-later",
   "bugs": {
     "url": "https://github.com/tidalcycles/strudel/issues"
   },
-  "homepage": "https://github.com/tidalcycles/strudel#readme",
+  "homepage": "https://github.com/tidalcycles/strudel/tree/main/packages/hs2js",
   "dependencies": {
-    "@strudel/web": "workspace:*",
     "hs2js": "workspace:*"
   },
   "devDependencies": {
-    "vite": "^5.0.8"
+    "vite": "^5.0.10"
   }
 }
diff --git a/packages/tidal/tidal.mjs b/packages/tidal/tidal.mjs
index 0d948504..60a76946 100644
--- a/packages/tidal/tidal.mjs
+++ b/packages/tidal/tidal.mjs
@@ -1,20 +1,4 @@
-import { run, parse } from 'hs2js';
-import { initStrudel, reify, late, samples, stack } from '@strudel/web';
-initStrudel({
-  prebake: () => samples('github:tidalcycles/dirt-samples'),
-});
-
-const textarea = document.getElementById('code');
-if (window.location.hash) {
-  textarea.value = atob(window.location.hash.slice(1));
-} else {
-  textarea.value = 'd1 $ s "jvbass(3,8)"';
-}
-textarea.addEventListener('input', (e) => {
-  window.location.hash = btoa(e.target.value);
-  update();
-});
-update();
+import { evaluate, loadParser } from 'hs2js';
 
 function getInfixOperators() {
   let operators = {
@@ -47,33 +31,10 @@ function getInfixOperators() {
 }
 const ops = getInfixOperators();
 
-async function update() {
-  let result, tree;
-  try {
-    tree = await parse(textarea.value);
-  } catch (err) {
-    console.warn('parse error');
-    console.error(err);
-  }
-  console.log('parsed tree');
-  console.log(tree.rootNode.toString());
-  try {
-    let patterns = {};
-    window.p = (name, pattern) => {
-      patterns[name] = pattern;
-    };
-    window.d1 = (pat) => window.p(1, pat);
-    window.d2 = (pat) => window.p(2, pat);
-    window.d3 = (pat) => window.p(3, pat);
-    window.rot = late;
-    result = run(tree.rootNode, window, ops);
-    if (Object.values(patterns).length) {
-      stack(...Object.values(patterns)).play();
-    }
-  } catch (err) {
-    console.warn('eval error');
-    console.error(err);
-    result = 'ERROR: ' + err.message;
-  }
-  document.getElementById('result').innerHTML = 'Result: ' + result;
+export async function initTidal() {
+  return loadParser();
+}
+
+export function tidal(code) {
+  return evaluate(code, window, ops);
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8ac9adb0..7beea16b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -140,6 +140,19 @@ importers:
         specifier: ^5.0.10
         version: 5.0.10
 
+  examples/tidal-repl:
+    dependencies:
+      '@strudel/web':
+        specifier: workspace:*
+        version: link:../../packages/web
+      hs2js:
+        specifier: workspace:*
+        version: link:../../packages/hs2js
+    devDependencies:
+      vite:
+        specifier: ^5.0.8
+        version: 5.2.2(@types/node@20.10.6)
+
   packages/codemirror:
     dependencies:
       '@codemirror/autocomplete':
@@ -424,21 +437,12 @@ importers:
 
   packages/tidal:
     dependencies:
-      '@hpcc-js/wasm':
-        specifier: ^2.15.3
-        version: 2.16.2
-      '@strudel/web':
-        specifier: workspace:*
-        version: link:../web
       hs2js:
         specifier: workspace:*
         version: link:../hs2js
-      jgf-dot:
-        specifier: ^1.1.1
-        version: 1.1.1
     devDependencies:
       vite:
-        specifier: ^5.0.8
+        specifier: ^5.0.10
         version: 5.2.2(@types/node@20.10.6)
 
   packages/tonal:
@@ -619,6 +623,9 @@ importers:
       '@strudel/soundfonts':
         specifier: workspace:*
         version: link:../packages/soundfonts
+      '@strudel/tidal':
+        specifier: workspace:*
+        version: link:../packages/tidal
       '@strudel/tonal':
         specifier: workspace:*
         version: link:../packages/tonal
@@ -3069,13 +3076,6 @@ packages:
       react: 18.2.0
     dev: false
 
-  /@hpcc-js/wasm@2.16.2:
-    resolution: {integrity: sha512-THiidUMYR8/cIfFT3MVcWuRE7bQKh295nrFBxGvUNc4Nq8e2uU1LtiplHs7AUkJ0GxgvZoR+8TQ1/E3Qb/uE2g==}
-    hasBin: true
-    dependencies:
-      yargs: 17.7.2
-    dev: false
-
   /@humanwhocodes/config-array@0.11.13:
     resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==}
     engines: {node: '>=10.10.0'}
@@ -6269,6 +6269,7 @@ packages:
       string-width: 4.2.3
       strip-ansi: 6.0.1
       wrap-ansi: 7.0.0
+    dev: true
 
   /clone-buffer@1.0.0:
     resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==}
@@ -6986,10 +6987,6 @@ packages:
     engines: {node: '>=12'}
     dev: true
 
-  /dotty@0.0.1:
-    resolution: {integrity: sha512-eDT0hfJEnQbGaZcTuCfj2igPkQ7qa/n9K2pGGDxhEqKhARLq+xE1TonvpOPHq+7KeG+D6A/V8BwCcsdPom2TQg==}
-    dev: false
-
   /dset@3.1.3:
     resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==}
     engines: {node: '>=4'}
@@ -7911,10 +7908,6 @@ packages:
     resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
     dev: true
 
-  /gather-stream@1.0.0:
-    resolution: {integrity: sha512-NspYMi3rN3EKmMdejUXbtluDYrcRlTEBBFhWzVRZVsOx94OPxlXp0AzyPKyLiT7iaurcoTE/KcHsHP/PowNEaA==}
-    dev: false
-
   /gauge@4.0.4:
     resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -8252,33 +8245,6 @@ packages:
   /graphemer@1.4.0:
     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
 
-  /graphlib-dot@0.6.4:
-    resolution: {integrity: sha512-rdhDTu0mBlloTpFMfkQq+e3y4yL22OqP5MhQbkw6QUURqa+4YLgv3XZy2fA64wdEcJNZ+waI76URemVgdFtzng==}
-    dependencies:
-      graphlib: 2.1.8
-      lodash: 4.17.21
-    dev: false
-
-  /graphlib-json-graph@1.0.0:
-    resolution: {integrity: sha512-sJsFuthZnSL5knaDDZhDx8fg1Zy5t/7ZqVHiytoeSzezGhMoSFD3T3K5YQakKFEyXtYjOzbnvsyr2qo+6/qq/Q==}
-    dependencies:
-      graphlib: 1.0.7
-      par: 0.3.0
-      prop: 0.1.1
-    dev: false
-
-  /graphlib@1.0.7:
-    resolution: {integrity: sha512-jNb7RbqTIRyZRmcVCxGefOlGWjNdbjcT2tFj36zhnRa8yhAlOvydh9nBixfLQIqSU+DwCx47tg3ysw8NIYhpsA==}
-    dependencies:
-      lodash: 3.10.1
-    dev: false
-
-  /graphlib@2.1.8:
-    resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==}
-    dependencies:
-      lodash: 4.17.21
-    dev: false
-
   /gray-matter@4.0.3:
     resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
     engines: {node: '>=6.0'}
@@ -9184,15 +9150,6 @@ packages:
       supports-color: 7.2.0
     dev: true
 
-  /jgf-dot@1.1.1:
-    resolution: {integrity: sha512-/aw9bwVfn67A+lvjxtbocBuhB2rNdL5UY5rlHhKVh9ValvVJETU5lQ0jitDxiIjIPAEeuR4B1aFNA7E3wKNV1A==}
-    hasBin: true
-    dependencies:
-      graphlib-dot: 0.6.4
-      graphlib-json-graph: 1.0.0
-      read-file-stdin: 0.2.1
-    dev: false
-
   /jiti@1.21.0:
     resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
     hasBin: true
@@ -9649,12 +9606,9 @@ packages:
     resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
     dev: true
 
-  /lodash@3.10.1:
-    resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==}
-    dev: false
-
   /lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+    dev: true
 
   /log-symbols@4.1.0:
     resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
@@ -11370,11 +11324,6 @@ packages:
       - supports-color
     dev: true
 
-  /par@0.3.0:
-    resolution: {integrity: sha512-6V910zFAoHnxjX6ILkwbQcpIkD3KI2gBAPfCtZQNaJTvTxgIoKXSwDQIE3ty0zbOGdBXHRnl6rd66a5jj12pfw==}
-    engines: {node: '>=0.6'}
-    dev: false
-
   /parent-module@1.0.1:
     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
     engines: {node: '>=6'}
@@ -11845,12 +11794,6 @@ packages:
       read: 2.1.0
     dev: true
 
-  /prop@0.1.1:
-    resolution: {integrity: sha512-hf5DdgiPkcoVxBfuSknP918U0lDC+7lArIjIB2U4Gh79p1Xtc0JP6W5DW3c0wC0x9/A6CsAISh3202I1GlMgkw==}
-    dependencies:
-      dotty: 0.0.1
-    dev: false
-
   /property-information@6.2.0:
     resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==}
 
@@ -11982,12 +11925,6 @@ packages:
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
     dev: true
 
-  /read-file-stdin@0.2.1:
-    resolution: {integrity: sha512-dAqysQ4kfj9m5aejZOPr+aRGXZJXdLkMOLZ3BXMwMBQHiO+aylGBFJPh88AYPQrOf+D43F4Uc2oUIW9kBlItLA==}
-    dependencies:
-      gather-stream: 1.0.0
-    dev: false
-
   /read-package-json-fast@3.0.2:
     resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==}
     engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -14642,6 +14579,7 @@ packages:
       ansi-styles: 4.3.0
       string-width: 4.2.3
       strip-ansi: 6.0.1
+    dev: true
 
   /wrap-ansi@8.1.0:
     resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
@@ -14733,6 +14671,7 @@ packages:
   /y18n@5.0.8:
     resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
     engines: {node: '>=10'}
+    dev: true
 
   /yallist@3.1.1:
     resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
@@ -14803,6 +14742,7 @@ packages:
       string-width: 4.2.3
       y18n: 5.0.8
       yargs-parser: 21.1.1
+    dev: true
 
   /yocto-queue@0.1.0:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}