@php-wasm/util 0.7.20 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +1 -1
  2. package/index.mjs +106 -102
  3. package/package.json +2 -2
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=Symbol("SleepFinished");function m(t){return new Promise(e=>{setTimeout(()=>e(f),t)})}class a extends Error{constructor(){super("Acquiring lock timed out")}}class p{constructor({concurrency:e,timeout:i}){this._running=0,this.concurrency=e,this.timeout=i,this.queue=[]}get remaining(){return this.concurrency-this.running}get running(){return this._running}async acquire(){for(;;)if(this._running>=this.concurrency){const e=new Promise(i=>{this.queue.push(i)});this.timeout!==void 0?await Promise.race([e,m(this.timeout)]).then(i=>{if(i===f)throw new a}):await e}else{this._running++;let e=!1;return()=>{e||(e=!0,this._running--,this.queue.length>0&&this.queue.shift()())}}}async run(e){const i=await this.acquire();try{return await e()}finally{i()}}}class E extends Error{constructor(e,i){super(e),this.userFriendlyMessage=i,this.userFriendlyMessage||(this.userFriendlyMessage=e)}}function y(...t){let e=t.join("/");const i=e[0]==="/",s=e.substring(e.length-1)==="/";return e=h(e),!e&&!i&&(e="."),e&&s&&(e+="/"),e}function w(t){if(t==="/")return"/";t=h(t);const e=t.lastIndexOf("/");return e===-1?"":e===0?"/":t.substr(0,e)}function P(t){if(t==="/")return"/";t=h(t);const e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)}function h(t){const e=t[0]==="/";return t=S(t.split("/").filter(i=>!!i),!e).join("/"),(e?"/":"")+t.replace(/\/$/,"")}function S(t,e){let i=0;for(let s=t.length-1;s>=0;s--){const n=t[s];n==="."?t.splice(s,1):n===".."?(t.splice(s,1),i++):i&&(t.splice(s,1),i--)}if(e)for(;i;i--)t.unshift("..");return t}function D(t){let s=0,n="";const l=[];let r="";for(let o=0;o<t.length;o++){const u=t[o];u==="\\"?((t[o+1]==='"'||t[o+1]==="'")&&o++,r+=t[o]):s===0?u==='"'||u==="'"?(s=1,n=u):u.match(/\s/)?(r.trim().length&&l.push(r.trim()),r=u):l.length&&!r?r=l.pop()+u:r+=u:s===1&&(u===n?(s=0,n=""):r+=u)}return r&&l.push(r.trim()),l}function O(t){return function(e,i=[],s={}){const n=new b,l=new _(n);return setTimeout(async()=>{let r=[];if(i.length)r=[e,...i];else if(typeof e=="string")r=D(e);else if(Array.isArray(e))r=e;else throw new Error("Invalid command ",e);try{await t(r,l,s)}catch(o){n.emit("error",o),typeof o=="object"&&o!==null&&"message"in o&&typeof o.message=="string"&&l.stderr(o.message),l.exit(1)}n.emit("spawn",!0)}),n}}class c{constructor(){this.listeners={}}emit(e,i){this.listeners[e]&&this.listeners[e].forEach(function(s){s(i)})}on(e,i){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(i)}}class _ extends c{constructor(e){super(),this.childProcess=e,this.exited=!1,this.stdinData=[],e.on("stdin",i=>{this.stdinData?this.stdinData.push(i.slice()):this.emit("stdin",i)})}stdout(e){typeof e=="string"&&(e=new TextEncoder().encode(e)),this.childProcess.stdout.emit("data",e)}stdoutEnd(){this.childProcess.stdout.emit("end",{})}stderr(e){typeof e=="string"&&(e=new TextEncoder().encode(e)),this.childProcess.stderr.emit("data",e)}stderrEnd(){this.childProcess.stderr.emit("end",{})}exit(e){this.exited||(this.exited=!0,this.childProcess.emit("exit",e))}flushStdin(){if(this.stdinData)for(let e=0;e<this.stdinData.length;e++)this.emit("stdin",this.stdinData[e]);this.stdinData=null}}let T=9743;class b extends c{constructor(e=T++){super(),this.pid=e,this.stdout=new c,this.stderr=new c;const i=this;this.stdin={write:s=>{i.emit("stdin",s)}}}}function d(t=36,e="!@#$%^&*()_+=-[]/.,<>?"){const i="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"+e;let s="";for(let n=t;n>0;--n)s+=i[Math.floor(Math.random()*i.length)];return s}function x(){return d(36,"-_")}function g(t){return`json_decode(base64_decode('${q(JSON.stringify(t))}'), true)`}function M(t){const e={};for(const i in t)e[i]=g(t[i]);return e}function q(t){return U(new TextEncoder().encode(t))}function U(t){const e=String.fromCodePoint(...t);return btoa(e)}exports.AcquireTimeoutError=a;exports.PhpWasmError=E;exports.Semaphore=p;exports.basename=P;exports.createSpawnHandler=O;exports.dirname=w;exports.joinPaths=y;exports.normalizePath=h;exports.phpVar=g;exports.phpVars=M;exports.randomFilename=x;exports.randomString=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=Symbol("SleepFinished");function m(t){return new Promise(e=>{setTimeout(()=>e(f),t)})}class a extends Error{constructor(){super("Acquiring lock timed out")}}class E{constructor({concurrency:e,timeout:s}){this._running=0,this.concurrency=e,this.timeout=s,this.queue=[]}get remaining(){return this.concurrency-this.running}get running(){return this._running}async acquire(){for(;;)if(this._running>=this.concurrency){const e=new Promise(s=>{this.queue.push(s)});this.timeout!==void 0?await Promise.race([e,m(this.timeout)]).then(s=>{if(s===f)throw new a}):await e}else{this._running++;let e=!1;return()=>{e||(e=!0,this._running--,this.queue.length>0&&this.queue.shift()())}}}async run(e){const s=await this.acquire();try{return await e()}finally{s()}}}class p extends Error{constructor(e,s){super(e),this.userFriendlyMessage=s,this.userFriendlyMessage||(this.userFriendlyMessage=e)}}function y(...t){let e=t.join("/");const s=e[0]==="/",i=e.substring(e.length-1)==="/";return e=c(e),!e&&!s&&(e="."),e&&i&&(e+="/"),e}function P(t){if(t==="/")return"/";t=c(t);const e=t.lastIndexOf("/");return e===-1?"":e===0?"/":t.substr(0,e)}function w(t){if(t==="/")return"/";t=c(t);const e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)}function c(t){const e=t[0]==="/";return t=O(t.split("/").filter(s=>!!s),!e).join("/"),(e?"/":"")+t.replace(/\/$/,"")}function O(t,e){let s=0;for(let i=t.length-1;i>=0;i--){const n=t[i];n==="."?t.splice(i,1):n===".."?(t.splice(i,1),s++):s&&(t.splice(i,1),s--)}if(e)for(;s;s--)t.unshift("..");return t}function S(t,e){return t==="/"?!0:(t=c(t),e=c(e),e.startsWith(t+"/")||e===t)}function D(t){let i=0,n="";const l=[];let r="";for(let o=0;o<t.length;o++){const u=t[o];u==="\\"?((t[o+1]==='"'||t[o+1]==="'")&&o++,r+=t[o]):i===0?u==='"'||u==="'"?(i=1,n=u):u.match(/\s/)?(r.trim().length&&l.push(r.trim()),r=u):l.length&&!r?r=l.pop()+u:r+=u:i===1&&(u===n?(i=0,n=""):r+=u)}return r&&l.push(r.trim()),l}function _(t){return function(e,s=[],i={}){const n=new x,l=new T(n);return setTimeout(async()=>{let r=[];if(s.length)r=[e,...s];else if(typeof e=="string")r=D(e);else if(Array.isArray(e))r=e;else throw new Error("Invalid command ",e);try{await t(r,l,i)}catch(o){n.emit("error",o),typeof o=="object"&&o!==null&&"message"in o&&typeof o.message=="string"&&l.stderr(o.message),l.exit(1)}n.emit("spawn",!0)}),n}}class h{constructor(){this.listeners={}}emit(e,s){this.listeners[e]&&this.listeners[e].forEach(function(i){i(s)})}on(e,s){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(s)}}class T extends h{constructor(e){super(),this.childProcess=e,this.exited=!1,this.stdinData=[],e.on("stdin",s=>{this.stdinData?this.stdinData.push(s.slice()):this.emit("stdin",s)})}stdout(e){typeof e=="string"&&(e=new TextEncoder().encode(e)),this.childProcess.stdout.emit("data",e)}stdoutEnd(){this.childProcess.stdout.emit("end",{})}stderr(e){typeof e=="string"&&(e=new TextEncoder().encode(e)),this.childProcess.stderr.emit("data",e)}stderrEnd(){this.childProcess.stderr.emit("end",{})}exit(e){this.exited||(this.exited=!0,this.childProcess.emit("exit",e))}flushStdin(){if(this.stdinData)for(let e=0;e<this.stdinData.length;e++)this.emit("stdin",this.stdinData[e]);this.stdinData=null}}let b=9743;class x extends h{constructor(e=b++){super(),this.pid=e,this.stdout=new h,this.stderr=new h;const s=this;this.stdin={write:i=>{s.emit("stdin",i)}}}}function d(t=36,e="!@#$%^&*()_+=-[]/.,<>?"){const s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"+e;let i="";for(let n=t;n>0;--n)i+=s[Math.floor(Math.random()*s.length)];return i}function M(){return d(36,"-_")}function g(t){return`json_decode(base64_decode('${U(JSON.stringify(t))}'), true)`}function q(t){const e={};for(const s in t)e[s]=g(t[s]);return e}function U(t){return A(new TextEncoder().encode(t))}function A(t){const e=String.fromCodePoint(...t);return btoa(e)}exports.AcquireTimeoutError=a;exports.PhpWasmError=p;exports.Semaphore=E;exports.basename=w;exports.createSpawnHandler=_;exports.dirname=P;exports.isParentOf=S;exports.joinPaths=y;exports.normalizePath=c;exports.phpVar=g;exports.phpVars=q;exports.randomFilename=M;exports.randomString=d;
package/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  const f = Symbol("SleepFinished");
2
- function d(t) {
3
- return new Promise((e) => {
4
- setTimeout(() => e(f), t);
2
+ function d(e) {
3
+ return new Promise((t) => {
4
+ setTimeout(() => t(f), e);
5
5
  });
6
6
  }
7
7
  class a extends Error {
@@ -9,9 +9,9 @@ class a extends Error {
9
9
  super("Acquiring lock timed out");
10
10
  }
11
11
  }
12
- class O {
13
- constructor({ concurrency: e, timeout: s }) {
14
- this._running = 0, this.concurrency = e, this.timeout = s, this.queue = [];
12
+ class _ {
13
+ constructor({ concurrency: t, timeout: s }) {
14
+ this._running = 0, this.concurrency = t, this.timeout = s, this.queue = [];
15
15
  }
16
16
  get remaining() {
17
17
  return this.concurrency - this.running;
@@ -22,99 +22,102 @@ class O {
22
22
  async acquire() {
23
23
  for (; ; )
24
24
  if (this._running >= this.concurrency) {
25
- const e = new Promise((s) => {
25
+ const t = new Promise((s) => {
26
26
  this.queue.push(s);
27
27
  });
28
- this.timeout !== void 0 ? await Promise.race([e, d(this.timeout)]).then(
28
+ this.timeout !== void 0 ? await Promise.race([t, d(this.timeout)]).then(
29
29
  (s) => {
30
30
  if (s === f)
31
31
  throw new a();
32
32
  }
33
- ) : await e;
33
+ ) : await t;
34
34
  } else {
35
35
  this._running++;
36
- let e = !1;
36
+ let t = !1;
37
37
  return () => {
38
- e || (e = !0, this._running--, this.queue.length > 0 && this.queue.shift()());
38
+ t || (t = !0, this._running--, this.queue.length > 0 && this.queue.shift()());
39
39
  };
40
40
  }
41
41
  }
42
- async run(e) {
42
+ async run(t) {
43
43
  const s = await this.acquire();
44
44
  try {
45
- return await e();
45
+ return await t();
46
46
  } finally {
47
47
  s();
48
48
  }
49
49
  }
50
50
  }
51
51
  class x extends Error {
52
- constructor(e, s) {
53
- super(e), this.userFriendlyMessage = s, this.userFriendlyMessage || (this.userFriendlyMessage = e);
52
+ constructor(t, s) {
53
+ super(t), this.userFriendlyMessage = s, this.userFriendlyMessage || (this.userFriendlyMessage = t);
54
54
  }
55
55
  }
56
- function T(...t) {
57
- let e = t.join("/");
58
- const s = e[0] === "/", i = e.substring(e.length - 1) === "/";
59
- return e = h(e), !e && !s && (e = "."), e && i && (e += "/"), e;
56
+ function T(...e) {
57
+ let t = e.join("/");
58
+ const s = t[0] === "/", i = t.substring(t.length - 1) === "/";
59
+ return t = c(t), !t && !s && (t = "."), t && i && (t += "/"), t;
60
60
  }
61
- function S(t) {
62
- if (t === "/")
61
+ function S(e) {
62
+ if (e === "/")
63
63
  return "/";
64
- t = h(t);
65
- const e = t.lastIndexOf("/");
66
- return e === -1 ? "" : e === 0 ? "/" : t.substr(0, e);
64
+ e = c(e);
65
+ const t = e.lastIndexOf("/");
66
+ return t === -1 ? "" : t === 0 ? "/" : e.substr(0, t);
67
67
  }
68
- function b(t) {
69
- if (t === "/")
68
+ function b(e) {
69
+ if (e === "/")
70
70
  return "/";
71
- t = h(t);
72
- const e = t.lastIndexOf("/");
73
- return e === -1 ? t : t.substr(e + 1);
74
- }
75
- function h(t) {
76
- const e = t[0] === "/";
77
- return t = g(
78
- t.split("/").filter((s) => !!s),
79
- !e
80
- ).join("/"), (e ? "/" : "") + t.replace(/\/$/, "");
81
- }
82
- function g(t, e) {
71
+ e = c(e);
72
+ const t = e.lastIndexOf("/");
73
+ return t === -1 ? e : e.substr(t + 1);
74
+ }
75
+ function c(e) {
76
+ const t = e[0] === "/";
77
+ return e = g(
78
+ e.split("/").filter((s) => !!s),
79
+ !t
80
+ ).join("/"), (t ? "/" : "") + e.replace(/\/$/, "");
81
+ }
82
+ function g(e, t) {
83
83
  let s = 0;
84
- for (let i = t.length - 1; i >= 0; i--) {
85
- const r = t[i];
86
- r === "." ? t.splice(i, 1) : r === ".." ? (t.splice(i, 1), s++) : s && (t.splice(i, 1), s--);
84
+ for (let i = e.length - 1; i >= 0; i--) {
85
+ const r = e[i];
86
+ r === "." ? e.splice(i, 1) : r === ".." ? (e.splice(i, 1), s++) : s && (e.splice(i, 1), s--);
87
87
  }
88
- if (e)
88
+ if (t)
89
89
  for (; s; s--)
90
- t.unshift("..");
91
- return t;
90
+ e.unshift("..");
91
+ return e;
92
+ }
93
+ function M(e, t) {
94
+ return e === "/" ? !0 : (e = c(e), t = c(t), t.startsWith(e + "/") || t === e);
92
95
  }
93
- function m(t) {
96
+ function m(e) {
94
97
  let i = 0, r = "";
95
98
  const l = [];
96
99
  let n = "";
97
- for (let o = 0; o < t.length; o++) {
98
- const u = t[o];
99
- u === "\\" ? ((t[o + 1] === '"' || t[o + 1] === "'") && o++, n += t[o]) : i === 0 ? u === '"' || u === "'" ? (i = 1, r = u) : u.match(/\s/) ? (n.trim().length && l.push(n.trim()), n = u) : l.length && !n ? n = l.pop() + u : n += u : i === 1 && (u === r ? (i = 0, r = "") : n += u);
100
+ for (let o = 0; o < e.length; o++) {
101
+ const u = e[o];
102
+ u === "\\" ? ((e[o + 1] === '"' || e[o + 1] === "'") && o++, n += e[o]) : i === 0 ? u === '"' || u === "'" ? (i = 1, r = u) : u.match(/\s/) ? (n.trim().length && l.push(n.trim()), n = u) : l.length && !n ? n = l.pop() + u : n += u : i === 1 && (u === r ? (i = 0, r = "") : n += u);
100
103
  }
101
104
  return n && l.push(n.trim()), l;
102
105
  }
103
- function M(t) {
104
- return function(e, s = [], i = {}) {
105
- const r = new p(), l = new E(r);
106
+ function U(e) {
107
+ return function(t, s = [], i = {}) {
108
+ const r = new w(), l = new E(r);
106
109
  return setTimeout(async () => {
107
110
  let n = [];
108
111
  if (s.length)
109
- n = [e, ...s];
110
- else if (typeof e == "string")
111
- n = m(e);
112
- else if (Array.isArray(e))
113
- n = e;
112
+ n = [t, ...s];
113
+ else if (typeof t == "string")
114
+ n = m(t);
115
+ else if (Array.isArray(t))
116
+ n = t;
114
117
  else
115
- throw new Error("Invalid command ", e);
118
+ throw new Error("Invalid command ", t);
116
119
  try {
117
- await t(n, l, i);
120
+ await e(n, l, i);
118
121
  } catch (o) {
119
122
  r.emit("error", o), typeof o == "object" && o !== null && "message" in o && typeof o.message == "string" && l.stderr(o.message), l.exit(1);
120
123
  }
@@ -122,51 +125,51 @@ function M(t) {
122
125
  }), r;
123
126
  };
124
127
  }
125
- class c {
128
+ class h {
126
129
  constructor() {
127
130
  this.listeners = {};
128
131
  }
129
- emit(e, s) {
130
- this.listeners[e] && this.listeners[e].forEach(function(i) {
132
+ emit(t, s) {
133
+ this.listeners[t] && this.listeners[t].forEach(function(i) {
131
134
  i(s);
132
135
  });
133
136
  }
134
- on(e, s) {
135
- this.listeners[e] || (this.listeners[e] = []), this.listeners[e].push(s);
137
+ on(t, s) {
138
+ this.listeners[t] || (this.listeners[t] = []), this.listeners[t].push(s);
136
139
  }
137
140
  }
138
- class E extends c {
139
- constructor(e) {
140
- super(), this.childProcess = e, this.exited = !1, this.stdinData = [], e.on("stdin", (s) => {
141
+ class E extends h {
142
+ constructor(t) {
143
+ super(), this.childProcess = t, this.exited = !1, this.stdinData = [], t.on("stdin", (s) => {
141
144
  this.stdinData ? this.stdinData.push(s.slice()) : this.emit("stdin", s);
142
145
  });
143
146
  }
144
- stdout(e) {
145
- typeof e == "string" && (e = new TextEncoder().encode(e)), this.childProcess.stdout.emit("data", e);
147
+ stdout(t) {
148
+ typeof t == "string" && (t = new TextEncoder().encode(t)), this.childProcess.stdout.emit("data", t);
146
149
  }
147
150
  stdoutEnd() {
148
151
  this.childProcess.stdout.emit("end", {});
149
152
  }
150
- stderr(e) {
151
- typeof e == "string" && (e = new TextEncoder().encode(e)), this.childProcess.stderr.emit("data", e);
153
+ stderr(t) {
154
+ typeof t == "string" && (t = new TextEncoder().encode(t)), this.childProcess.stderr.emit("data", t);
152
155
  }
153
156
  stderrEnd() {
154
157
  this.childProcess.stderr.emit("end", {});
155
158
  }
156
- exit(e) {
157
- this.exited || (this.exited = !0, this.childProcess.emit("exit", e));
159
+ exit(t) {
160
+ this.exited || (this.exited = !0, this.childProcess.emit("exit", t));
158
161
  }
159
162
  flushStdin() {
160
163
  if (this.stdinData)
161
- for (let e = 0; e < this.stdinData.length; e++)
162
- this.emit("stdin", this.stdinData[e]);
164
+ for (let t = 0; t < this.stdinData.length; t++)
165
+ this.emit("stdin", this.stdinData[t]);
163
166
  this.stdinData = null;
164
167
  }
165
168
  }
166
169
  let y = 9743;
167
- class p extends c {
168
- constructor(e = y++) {
169
- super(), this.pid = e, this.stdout = new c(), this.stderr = new c();
170
+ class w extends h {
171
+ constructor(t = y++) {
172
+ super(), this.pid = t, this.stdout = new h(), this.stderr = new h();
170
173
  const s = this;
171
174
  this.stdin = {
172
175
  write: (i) => {
@@ -175,45 +178,46 @@ class p extends c {
175
178
  };
176
179
  }
177
180
  }
178
- function w(t = 36, e = "!@#$%^&*()_+=-[]/.,<>?") {
179
- const s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + e;
181
+ function p(e = 36, t = "!@#$%^&*()_+=-[]/.,<>?") {
182
+ const s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + t;
180
183
  let i = "";
181
- for (let r = t; r > 0; --r)
184
+ for (let r = e; r > 0; --r)
182
185
  i += s[Math.floor(Math.random() * s.length)];
183
186
  return i;
184
187
  }
185
- function U() {
186
- return w(36, "-_");
188
+ function q() {
189
+ return p(36, "-_");
187
190
  }
188
- function D(t) {
189
- return `json_decode(base64_decode('${P(
190
- JSON.stringify(t)
191
+ function P(e) {
192
+ return `json_decode(base64_decode('${D(
193
+ JSON.stringify(e)
191
194
  )}'), true)`;
192
195
  }
193
- function q(t) {
194
- const e = {};
195
- for (const s in t)
196
- e[s] = D(t[s]);
197
- return e;
196
+ function A(e) {
197
+ const t = {};
198
+ for (const s in e)
199
+ t[s] = P(e[s]);
200
+ return t;
198
201
  }
199
- function P(t) {
200
- return _(new TextEncoder().encode(t));
202
+ function D(e) {
203
+ return O(new TextEncoder().encode(e));
201
204
  }
202
- function _(t) {
203
- const e = String.fromCodePoint(...t);
204
- return btoa(e);
205
+ function O(e) {
206
+ const t = String.fromCodePoint(...e);
207
+ return btoa(t);
205
208
  }
206
209
  export {
207
210
  a as AcquireTimeoutError,
208
211
  x as PhpWasmError,
209
- O as Semaphore,
212
+ _ as Semaphore,
210
213
  b as basename,
211
- M as createSpawnHandler,
214
+ U as createSpawnHandler,
212
215
  S as dirname,
216
+ M as isParentOf,
213
217
  T as joinPaths,
214
- h as normalizePath,
215
- D as phpVar,
216
- q as phpVars,
217
- U as randomFilename,
218
- w as randomString
218
+ c as normalizePath,
219
+ P as phpVar,
220
+ A as phpVars,
221
+ q as randomFilename,
222
+ p as randomString
219
223
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@php-wasm/util",
3
- "version": "0.7.20",
3
+ "version": "0.9.2",
4
4
  "type": "commonjs",
5
5
  "typedoc": {
6
6
  "entryPoint": "./src/index.ts",
@@ -12,7 +12,7 @@
12
12
  "access": "public",
13
13
  "directory": "../../../dist/packages/php-wasm/util"
14
14
  },
15
- "gitHead": "5915ef756c88da8dcb665f9f0e49ddc0c0b10d50",
15
+ "gitHead": "40dca15bf2d5c21c2ee57a878940cb6f7f7851f0",
16
16
  "engines": {
17
17
  "node": ">=18.18.0",
18
18
  "npm": ">=8.11.0"