Commit 6045c34

Anton Golub <antongolub@antongolub.com>
2025-10-14 19:05:14
chore: update globby to v15 (#1354)
1 parent a4d1bc2
build/3rd-party-licenses
@@ -15,7 +15,7 @@ THIRD PARTY LICENSES
   https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk
   MIT
 
-@sindresorhus/merge-streams@2.3.0
+@sindresorhus/merge-streams@4.0.0
   Sindre Sorhus <sindresorhus@gmail.com>
   sindresorhus/merge-streams
   MIT
@@ -70,7 +70,7 @@ glob-parent@5.1.2
   gulpjs/glob-parent
   ISC
 
-globby@14.1.0
+globby@15.0.0
   Sindre Sorhus <sindresorhus@gmail.com>
   sindresorhus/globby
   MIT
@@ -145,7 +145,7 @@ yaml@2.8.1
   github:eemeli/yaml
   ISC
 
-zurk@0.11.9
+zurk@0.11.10
   Anton Golub <antongolub@antongolub.com>
   git+https://github.com/webpod/zurk.git
   MIT
build/index.cjs
@@ -60,7 +60,7 @@ var versions = {
   dotenv: "0.2.3",
   fetch: "1.6.7",
   fs: "11.3.2",
-  glob: "14.1.0",
+  glob: "15.0.0",
   minimist: "1.2.8",
   ps: "1.0.0",
   which: "5.0.0",
build/util.d.ts
@@ -13,7 +13,7 @@ export declare const getLast: <T>(arr: {
 }) => T;
 export declare function preferLocalBin(env: NodeJS.ProcessEnv, ...dirs: (string | undefined)[]): {
     [x: string]: string | undefined;
-    TZ?: string;
+    TZ?: string | undefined;
 };
 export declare function quote(arg: string): string;
 export declare function quotePowerShell(arg: string): string;
build/vendor-extra.cjs
@@ -10890,7 +10890,7 @@ function zn(i) {
     if (i[H].disturbed = true, i[H].error) throw i[H].error;
     const { body: o3 } = i;
     if (o3 === null) return import_node_buffer.Buffer.alloc(0);
-    if (!(o3 instanceof import_node_stream2.default)) return import_node_buffer.Buffer.alloc(0);
+    if (!(o3 instanceof import_node_stream3.default)) return import_node_buffer.Buffer.alloc(0);
     const a = [];
     let f2 = 0;
     try {
@@ -11007,7 +11007,7 @@ function Ai(i, o3) {
       let w2 = null;
       const A = n2(() => {
         const g2 = new _r("The operation was aborted.");
-        f2(g2), l.body && l.body instanceof import_node_stream2.default.Readable && l.body.destroy(g2), !(!w2 || !w2.body) && w2.body.emit("error", g2);
+        f2(g2), l.body && l.body instanceof import_node_stream3.default.Readable && l.body.destroy(g2), !(!w2 || !w2.body) && w2.body.emit("error", g2);
       }, "abort");
       if (v2 && v2.aborted) {
         A();
@@ -11062,7 +11062,7 @@ function Ai(i, o3) {
               }
               const U = { headers: new ye(l.headers), follow: l.follow, counter: l.counter + 1, agent: l.agent, compress: l.compress, method: l.method, body: In(l), signal: l.signal, size: l.size, referrer: l.referrer, referrerPolicy: l.referrerPolicy };
               if (!Js(l.url, j) || !Xs(l.url, j)) for (const jt of ["authorization", "www-authenticate", "cookie", "cookie2"]) U.headers.delete(jt);
-              if (g2.statusCode !== 303 && l.body && o3.body instanceof import_node_stream2.default.Readable) {
+              if (g2.statusCode !== 303 && l.body && o3.body instanceof import_node_stream3.default.Readable) {
                 f2(new G("Cannot follow redirect with body being a readable stream", "unsupported-redirect")), q();
                 return;
               }
@@ -11078,7 +11078,7 @@ function Ai(i, o3) {
         v2 && g2.once("end", () => {
           v2.removeEventListener("abort", T2);
         });
-        let I2 = (0, import_node_stream2.pipeline)(g2, new import_node_stream2.PassThrough(), (z) => {
+        let I2 = (0, import_node_stream3.pipeline)(g2, new import_node_stream3.PassThrough(), (z) => {
           z && f2(z);
         });
         process.version < "v12.10" && g2.on("aborted", T2);
@@ -11089,19 +11089,19 @@ function Ai(i, o3) {
         }
         const ge = { flush: import_node_zlib.default.Z_SYNC_FLUSH, finishFlush: import_node_zlib.default.Z_SYNC_FLUSH };
         if (Q === "gzip" || Q === "x-gzip") {
-          I2 = (0, import_node_stream2.pipeline)(I2, import_node_zlib.default.createGunzip(ge), (z) => {
+          I2 = (0, import_node_stream3.pipeline)(I2, import_node_zlib.default.createGunzip(ge), (z) => {
             z && f2(z);
           }), w2 = new le(I2, F4), a(w2);
           return;
         }
         if (Q === "deflate" || Q === "x-deflate") {
-          const z = (0, import_node_stream2.pipeline)(g2, new import_node_stream2.PassThrough(), (j) => {
+          const z = (0, import_node_stream3.pipeline)(g2, new import_node_stream3.PassThrough(), (j) => {
             j && f2(j);
           });
           z.once("data", (j) => {
-            (j[0] & 15) === 8 ? I2 = (0, import_node_stream2.pipeline)(I2, import_node_zlib.default.createInflate(), (U) => {
+            (j[0] & 15) === 8 ? I2 = (0, import_node_stream3.pipeline)(I2, import_node_zlib.default.createInflate(), (U) => {
               U && f2(U);
-            }) : I2 = (0, import_node_stream2.pipeline)(I2, import_node_zlib.default.createInflateRaw(), (U) => {
+            }) : I2 = (0, import_node_stream3.pipeline)(I2, import_node_zlib.default.createInflateRaw(), (U) => {
               U && f2(U);
             }), w2 = new le(I2, F4), a(w2);
           }), z.once("end", () => {
@@ -11110,7 +11110,7 @@ function Ai(i, o3) {
           return;
         }
         if (Q === "br") {
-          I2 = (0, import_node_stream2.pipeline)(I2, import_node_zlib.default.createBrotliDecompress(), (z) => {
+          I2 = (0, import_node_stream3.pipeline)(I2, import_node_zlib.default.createBrotliDecompress(), (z) => {
             z && f2(z);
           }), w2 = new le(I2, F4), a(w2);
           return;
@@ -11278,14 +11278,14 @@ function Ui() {
   var _a2, _b2, _c, _d;
   !((_b2 = (_a2 = globalThis.process) == null ? void 0 : _a2.versions) == null ? void 0 : _b2.node) && !((_d = (_c = globalThis.process) == null ? void 0 : _c.env) == null ? void 0 : _d.DISABLE_NODE_FETCH_NATIVE_WARN || true) && console.warn("[node-fetch-native] Node.js compatible build of `node-fetch-native` is being used in a non-Node.js environment. Please make sure you are using proper export conditions or report this issue to https://github.com/unjs/node-fetch-native. You can set `process.env.DISABLE_NODE_FETCH_NATIVE_WARN` to disable this warning.");
 }
-var import_node_http, import_node_https, import_node_zlib, import_node_stream2, import_node_buffer, import_node_util2, import_node_url2, import_node_net, import_node_fs4, import_node_path3, Os, fi, n2, ci, O, be, X, ve, zt, bt, Cr, ze, It, Ft, mt, ee, yt, He, Ve, gt, pi, kt, xs, bi, mi, yi, gi, ut, Vs, qn, Wt, Qs, Ys, _i, Gs, Si, On, Ue, br, Un, ft, xn, G, mr, wi, yr, Ks, Js, Xs, el, H, Nn, xe, In, tl, Ri, rl, nl, gr, Fn, Pr, ye, il, jn, se, Ne, le, al, Ci, sl, $2, qt, dl, vr, dt, hl, Hn, _r, Ln, Pi, bl, ml, $n, yl, gl, _l, Sl, vi, Ei, Er, Sr, wl, Bi, Dn, zi, Ii, Fi, wr, Vn, pt, Tr, Mn, $i, ql, Ol, Mi;
+var import_node_http, import_node_https, import_node_zlib, import_node_stream3, import_node_buffer, import_node_util2, import_node_url2, import_node_net, import_node_fs4, import_node_path3, Os, fi, n2, ci, O, be, X, ve, zt, bt, Cr, ze, It, Ft, mt, ee, yt, He, Ve, gt, pi, kt, xs, bi, mi, yi, gi, ut, Vs, qn, Wt, Qs, Ys, _i, Gs, Si, On, Ue, br, Un, ft, xn, G, mr, wi, yr, Ks, Js, Xs, el, H, Nn, xe, In, tl, Ri, rl, nl, gr, Fn, Pr, ye, il, jn, se, Ne, le, al, Ci, sl, $2, qt, dl, vr, dt, hl, Hn, _r, Ln, Pi, bl, ml, $n, yl, gl, _l, Sl, vi, Ei, Er, Sr, wl, Bi, Dn, zi, Ii, Fi, wr, Vn, pt, Tr, Mn, $i, ql, Ol, Mi;
 var init_node = __esm({
   "node_modules/node-fetch-native/dist/node.mjs"() {
     "use strict";
     import_node_http = __toESM(require("http"), 1);
     import_node_https = __toESM(require("https"), 1);
     import_node_zlib = __toESM(require("zlib"), 1);
-    import_node_stream2 = __toESM(require("stream"), 1);
+    import_node_stream3 = __toESM(require("stream"), 1);
     import_node_buffer = require("buffer");
     import_node_util2 = require("util");
     init_node_fetch_native_DfbY2q_x();
@@ -11536,14 +11536,14 @@ var init_node = __esm({
       const a = new URL(o3).protocol, f2 = new URL(i).protocol;
       return a === f2;
     }, "isSameProtocol");
-    el = (0, import_node_util2.promisify)(import_node_stream2.default.pipeline);
+    el = (0, import_node_util2.promisify)(import_node_stream3.default.pipeline);
     H = Symbol("Body internals");
     Nn = class Nn2 {
       constructor(o3, { size: a = 0 } = {}) {
         let f2 = null;
-        o3 === null ? o3 = null : wi(o3) ? o3 = import_node_buffer.Buffer.from(o3.toString()) : yr(o3) || import_node_buffer.Buffer.isBuffer(o3) || (import_node_util2.types.isAnyArrayBuffer(o3) ? o3 = import_node_buffer.Buffer.from(o3) : ArrayBuffer.isView(o3) ? o3 = import_node_buffer.Buffer.from(o3.buffer, o3.byteOffset, o3.byteLength) : o3 instanceof import_node_stream2.default || (o3 instanceof br ? (o3 = Zs(o3), f2 = o3.type.split("=")[1]) : o3 = import_node_buffer.Buffer.from(String(o3))));
+        o3 === null ? o3 = null : wi(o3) ? o3 = import_node_buffer.Buffer.from(o3.toString()) : yr(o3) || import_node_buffer.Buffer.isBuffer(o3) || (import_node_util2.types.isAnyArrayBuffer(o3) ? o3 = import_node_buffer.Buffer.from(o3) : ArrayBuffer.isView(o3) ? o3 = import_node_buffer.Buffer.from(o3.buffer, o3.byteOffset, o3.byteLength) : o3 instanceof import_node_stream3.default || (o3 instanceof br ? (o3 = Zs(o3), f2 = o3.type.split("=")[1]) : o3 = import_node_buffer.Buffer.from(String(o3))));
         let l = o3;
-        import_node_buffer.Buffer.isBuffer(o3) ? l = import_node_stream2.default.Readable.from(o3) : yr(o3) && (l = import_node_stream2.default.Readable.from(o3.stream())), this[H] = { body: o3, stream: l, boundary: f2, disturbed: false, error: null }, this.size = a, o3 instanceof import_node_stream2.default && o3.on("error", (p2) => {
+        import_node_buffer.Buffer.isBuffer(o3) ? l = import_node_stream3.default.Readable.from(o3) : yr(o3) && (l = import_node_stream3.default.Readable.from(o3.stream())), this[H] = { body: o3, stream: l, boundary: f2, disturbed: false, error: null }, this.size = a, o3 instanceof import_node_stream3.default && o3.on("error", (p2) => {
           const h2 = p2 instanceof ft ? p2 : new G(`Invalid response body while trying to fetch ${this.url}: ${p2.message}`, "system", p2);
           this[H].error = h2;
         });
@@ -11602,10 +11602,10 @@ var init_node = __esm({
     In = n2((i, o3) => {
       let a, f2, { body: l } = i[H];
       if (i.bodyUsed) throw new Error("cannot clone body after it is used");
-      return l instanceof import_node_stream2.default && typeof l.getBoundary != "function" && (a = new import_node_stream2.PassThrough({ highWaterMark: o3 }), f2 = new import_node_stream2.PassThrough({ highWaterMark: o3 }), l.pipe(a), l.pipe(f2), i[H].stream = a, l = f2), l;
+      return l instanceof import_node_stream3.default && typeof l.getBoundary != "function" && (a = new import_node_stream3.PassThrough({ highWaterMark: o3 }), f2 = new import_node_stream3.PassThrough({ highWaterMark: o3 }), l.pipe(a), l.pipe(f2), i[H].stream = a, l = f2), l;
     }, "clone");
     tl = (0, import_node_util2.deprecate)((i) => i.getBoundary(), "form-data doesn't follow the spec and requires special treatment. Use alternative package", "https://github.com/node-fetch/node-fetch/issues/1167");
-    Ri = n2((i, o3) => i === null ? null : typeof i == "string" ? "text/plain;charset=UTF-8" : wi(i) ? "application/x-www-form-urlencoded;charset=UTF-8" : yr(i) ? i.type || null : import_node_buffer.Buffer.isBuffer(i) || import_node_util2.types.isAnyArrayBuffer(i) || ArrayBuffer.isView(i) ? null : i instanceof br ? `multipart/form-data; boundary=${o3[H].boundary}` : i && typeof i.getBoundary == "function" ? `multipart/form-data;boundary=${tl(i)}` : i instanceof import_node_stream2.default ? null : "text/plain;charset=UTF-8", "extractContentType");
+    Ri = n2((i, o3) => i === null ? null : typeof i == "string" ? "text/plain;charset=UTF-8" : wi(i) ? "application/x-www-form-urlencoded;charset=UTF-8" : yr(i) ? i.type || null : import_node_buffer.Buffer.isBuffer(i) || import_node_util2.types.isAnyArrayBuffer(i) || ArrayBuffer.isView(i) ? null : i instanceof br ? `multipart/form-data; boundary=${o3[H].boundary}` : i && typeof i.getBoundary == "function" ? `multipart/form-data;boundary=${tl(i)}` : i instanceof import_node_stream3.default ? null : "text/plain;charset=UTF-8", "extractContentType");
     rl = n2((i) => {
       const { body: o3 } = i[H];
       return o3 === null ? 0 : yr(o3) ? o3.size : import_node_buffer.Buffer.isBuffer(o3) ? o3.length : o3 && typeof o3.getLengthSync == "function" && o3.hasKnownLength && o3.hasKnownLength() ? o3.getLengthSync() : null;
@@ -12288,6 +12288,7 @@ module.exports = __toCommonJS(vendor_extra_exports);
 var import_node_process2 = __toESM(require("process"), 1);
 var import_node_fs3 = __toESM(require("fs"), 1);
 var import_node_path2 = __toESM(require("path"), 1);
+var import_node_stream2 = require("stream");
 
 // node_modules/@sindresorhus/merge-streams/index.js
 var import_node_events = require("events");
@@ -12310,19 +12311,16 @@ function mergeStreams(streams) {
   for (const stream of streams) {
     passThroughStream.add(stream);
   }
-  if (streams.length === 0) {
-    endStream(passThroughStream);
-  }
   return passThroughStream;
 }
 var getHighWaterMark = (streams, objectMode) => {
   if (streams.length === 0) {
-    return 16384;
+    return (0, import_node_stream.getDefaultHighWaterMark)(objectMode);
   }
   const highWaterMarks = streams.filter(({ readableObjectMode }) => readableObjectMode === objectMode).map(({ readableHighWaterMark }) => readableHighWaterMark);
   return Math.max(...highWaterMarks);
 };
-var _streams, _ended, _aborted, _onFinished;
+var _streams, _ended, _aborted, _onFinished, _unpipeEvent, _streamPromises;
 var MergedStream = class extends import_node_stream.PassThrough {
   constructor() {
     super(...arguments);
@@ -12330,6 +12328,8 @@ var MergedStream = class extends import_node_stream.PassThrough {
     __privateAdd(this, _ended, /* @__PURE__ */ new Set([]));
     __privateAdd(this, _aborted, /* @__PURE__ */ new Set([]));
     __privateAdd(this, _onFinished);
+    __privateAdd(this, _unpipeEvent, Symbol("unpipe"));
+    __privateAdd(this, _streamPromises, /* @__PURE__ */ new WeakMap());
   }
   add(stream) {
     var _a2;
@@ -12338,37 +12338,49 @@ var MergedStream = class extends import_node_stream.PassThrough {
       return;
     }
     __privateGet(this, _streams).add(stream);
-    (_a2 = __privateGet(this, _onFinished)) != null ? _a2 : __privateSet(this, _onFinished, onMergedStreamFinished(this, __privateGet(this, _streams)));
-    endWhenStreamsDone({
+    (_a2 = __privateGet(this, _onFinished)) != null ? _a2 : __privateSet(this, _onFinished, onMergedStreamFinished(this, __privateGet(this, _streams), __privateGet(this, _unpipeEvent)));
+    const streamPromise = endWhenStreamsDone({
       passThroughStream: this,
       stream,
       streams: __privateGet(this, _streams),
       ended: __privateGet(this, _ended),
       aborted: __privateGet(this, _aborted),
-      onFinished: __privateGet(this, _onFinished)
+      onFinished: __privateGet(this, _onFinished),
+      unpipeEvent: __privateGet(this, _unpipeEvent)
     });
+    __privateGet(this, _streamPromises).set(stream, streamPromise);
     stream.pipe(this, { end: false });
   }
   remove(stream) {
-    validateStream(stream);
-    if (!__privateGet(this, _streams).has(stream)) {
-      return false;
-    }
-    stream.unpipe(this);
-    return true;
+    return __async(this, null, function* () {
+      validateStream(stream);
+      if (!__privateGet(this, _streams).has(stream)) {
+        return false;
+      }
+      const streamPromise = __privateGet(this, _streamPromises).get(stream);
+      if (streamPromise === void 0) {
+        return false;
+      }
+      __privateGet(this, _streamPromises).delete(stream);
+      stream.unpipe(this);
+      yield streamPromise;
+      return true;
+    });
   }
 };
 _streams = new WeakMap();
 _ended = new WeakMap();
 _aborted = new WeakMap();
 _onFinished = new WeakMap();
-var onMergedStreamFinished = (passThroughStream, streams) => __async(null, null, function* () {
+_unpipeEvent = new WeakMap();
+_streamPromises = new WeakMap();
+var onMergedStreamFinished = (passThroughStream, streams, unpipeEvent) => __async(null, null, function* () {
   updateMaxListeners(passThroughStream, PASSTHROUGH_LISTENERS_COUNT);
   const controller = new AbortController();
   try {
     yield Promise.race([
       onMergedStreamEnd(passThroughStream, controller),
-      onInputStreamsUnpipe(passThroughStream, streams, controller)
+      onInputStreamsUnpipe(passThroughStream, streams, unpipeEvent, controller)
     ]);
   } finally {
     controller.abort();
@@ -12376,9 +12388,14 @@ var onMergedStreamFinished = (passThroughStream, streams) => __async(null, null,
   }
 });
 var onMergedStreamEnd = (_0, _1) => __async(null, [_0, _1], function* (passThroughStream, { signal }) {
-  yield (0, import_promises.finished)(passThroughStream, { signal, cleanup: true });
+  try {
+    yield (0, import_promises.finished)(passThroughStream, { signal, cleanup: true });
+  } catch (error) {
+    errorOrAbortStream(passThroughStream, error);
+    throw error;
+  }
 });
-var onInputStreamsUnpipe = (_0, _1, _2) => __async(null, [_0, _1, _2], function* (passThroughStream, streams, { signal }) {
+var onInputStreamsUnpipe = (_0, _1, _2, _3) => __async(null, [_0, _1, _2, _3], function* (passThroughStream, streams, unpipeEvent, { signal }) {
   try {
     for (var iter = __forAwait((0, import_node_events.on)(passThroughStream, "unpipe", { signal })), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
       const [unpipedStream] = temp.value;
@@ -12402,20 +12419,34 @@ var validateStream = (stream) => {
     throw new TypeError(`Expected a readable stream, got: \`${typeof stream}\`.`);
   }
 };
-var endWhenStreamsDone = (_0) => __async(null, [_0], function* ({ passThroughStream, stream, streams, ended, aborted, onFinished }) {
+var endWhenStreamsDone = (_0) => __async(null, [_0], function* ({ passThroughStream, stream, streams, ended, aborted, onFinished, unpipeEvent }) {
   updateMaxListeners(passThroughStream, PASSTHROUGH_LISTENERS_PER_STREAM);
   const controller = new AbortController();
   try {
     yield Promise.race([
-      afterMergedStreamFinished(onFinished, stream),
-      onInputStreamEnd({ passThroughStream, stream, streams, ended, aborted, controller }),
-      onInputStreamUnpipe({ stream, streams, ended, aborted, controller })
+      afterMergedStreamFinished(onFinished, stream, controller),
+      onInputStreamEnd({
+        passThroughStream,
+        stream,
+        streams,
+        ended,
+        aborted,
+        controller
+      }),
+      onInputStreamUnpipe({
+        stream,
+        streams,
+        ended,
+        aborted,
+        unpipeEvent,
+        controller
+      })
     ]);
   } finally {
     controller.abort();
     updateMaxListeners(passThroughStream, -PASSTHROUGH_LISTENERS_PER_STREAM);
   }
-  if (streams.size === ended.size + aborted.size) {
+  if (streams.size > 0 && streams.size === ended.size + aborted.size) {
     if (ended.size === 0 && aborted.size > 0) {
       abortStream(passThroughStream);
     } else {
@@ -12423,22 +12454,26 @@ var endWhenStreamsDone = (_0) => __async(null, [_0], function* ({ passThroughStr
     }
   }
 });
-var isAbortError = (error) => (error == null ? void 0 : error.code) === "ERR_STREAM_PREMATURE_CLOSE";
-var afterMergedStreamFinished = (onFinished, stream) => __async(null, null, function* () {
+var afterMergedStreamFinished = (_0, _1, _2) => __async(null, [_0, _1, _2], function* (onFinished, stream, { signal }) {
   try {
     yield onFinished;
-    abortStream(stream);
-  } catch (error) {
-    if (isAbortError(error)) {
+    if (!signal.aborted) {
       abortStream(stream);
-    } else {
-      errorStream(stream, error);
+    }
+  } catch (error) {
+    if (!signal.aborted) {
+      errorOrAbortStream(stream, error);
     }
   }
 });
 var onInputStreamEnd = (_0) => __async(null, [_0], function* ({ passThroughStream, stream, streams, ended, aborted, controller: { signal } }) {
   try {
-    yield (0, import_promises.finished)(stream, { signal, cleanup: true, readable: true, writable: false });
+    yield (0, import_promises.finished)(stream, {
+      signal,
+      cleanup: true,
+      readable: true,
+      writable: false
+    });
     if (streams.has(stream)) {
       ended.add(stream);
     }
@@ -12453,18 +12488,28 @@ var onInputStreamEnd = (_0) => __async(null, [_0], function* ({ passThroughStrea
     }
   }
 });
-var onInputStreamUnpipe = (_0) => __async(null, [_0], function* ({ stream, streams, ended, aborted, controller: { signal } }) {
+var onInputStreamUnpipe = (_0) => __async(null, [_0], function* ({ stream, streams, ended, aborted, unpipeEvent, controller: { signal } }) {
   yield (0, import_node_events.once)(stream, unpipeEvent, { signal });
+  if (!stream.readable) {
+    return (0, import_node_events.once)(signal, "abort", { signal });
+  }
   streams.delete(stream);
   ended.delete(stream);
   aborted.delete(stream);
 });
-var unpipeEvent = Symbol("unpipe");
 var endStream = (stream) => {
   if (stream.writable) {
     stream.end();
   }
 };
+var errorOrAbortStream = (stream, error) => {
+  if (isAbortError(error)) {
+    abortStream(stream);
+  } else {
+    errorStream(stream, error);
+  }
+};
+var isAbortError = (error) => (error == null ? void 0 : error.code) === "ERR_STREAM_PREMATURE_CLOSE";
 var abortStream = (stream) => {
   if (stream.readable || stream.writable) {
     stream.destroy();
@@ -12571,7 +12616,24 @@ var ignoreFilesGlobOptions = {
   dot: true
 };
 var GITIGNORE_FILES_PATTERN = "**/.gitignore";
-var applyBaseToPattern = (pattern, base) => isNegativePattern(pattern) ? "!" + import_node_path.default.posix.join(base, pattern.slice(1)) : import_node_path.default.posix.join(base, pattern);
+var applyBaseToPattern = (pattern, base) => {
+  if (!base) {
+    return pattern;
+  }
+  const isNegative = isNegativePattern(pattern);
+  const cleanPattern = isNegative ? pattern.slice(1) : pattern;
+  const slashIndex = cleanPattern.indexOf("/");
+  const hasNonTrailingSlash = slashIndex !== -1 && slashIndex !== cleanPattern.length - 1;
+  let result;
+  if (!hasNonTrailingSlash) {
+    result = import_node_path.default.posix.join(base, "**", cleanPattern);
+  } else if (cleanPattern.startsWith("/")) {
+    result = import_node_path.default.posix.join(base, cleanPattern.slice(1));
+  } else {
+    result = import_node_path.default.posix.join(base, cleanPattern);
+  }
+  return isNegative ? "!" + result : result;
+};
 var parseIgnoreFile = (file, cwd) => {
   const base = slash(import_node_path.default.relative(cwd, import_node_path.default.dirname(file.filePath)));
   return file.content.split(/\r?\n/).filter((line) => line && !line.startsWith("#")).map((pattern) => applyBaseToPattern(pattern, base));
@@ -12584,6 +12646,12 @@ var toRelativePath = (fileOrDirectory, cwd) => {
     }
     throw new Error(`Path ${fileOrDirectory} is not in cwd ${cwd}`);
   }
+  if (fileOrDirectory.startsWith("./")) {
+    return fileOrDirectory.slice(2);
+  }
+  if (fileOrDirectory.startsWith("../")) {
+    return void 0;
+  }
   return fileOrDirectory;
 };
 var getIsIgnoredPredicate = (files, cwd) => {
@@ -12592,6 +12660,9 @@ var getIsIgnoredPredicate = (files, cwd) => {
   return (fileOrDirectory) => {
     fileOrDirectory = toPath(fileOrDirectory);
     fileOrDirectory = toRelativePath(fileOrDirectory, cwd);
+    if (fileOrDirectory === void 0) {
+      return false;
+    }
     return fileOrDirectory ? ignores.ignores(slash(fileOrDirectory)) : false;
   };
 };
@@ -12612,14 +12683,12 @@ var isIgnoredByIgnoreFiles = (patterns, options) => __async(null, null, function
     deep,
     ignore
   }, ignoreFilesGlobOptions));
-  const files = yield Promise.all(
-    paths.map((filePath) => __async(null, null, function* () {
-      return {
-        filePath,
-        content: yield import_promises3.default.readFile(filePath, "utf8")
-      };
-    }))
-  );
+  const files = yield Promise.all(paths.map((filePath) => __async(null, null, function* () {
+    return {
+      filePath,
+      content: yield import_promises3.default.readFile(filePath, "utf8")
+    };
+  })));
   return getIsIgnoredPredicate(files, cwd);
 });
 var isIgnoredByIgnoreFilesSync = (patterns, options) => {
@@ -12649,6 +12718,16 @@ var normalizePathForDirectoryGlob = (filePath, cwd) => {
   const path3 = isNegativePattern(filePath) ? filePath.slice(1) : filePath;
   return import_node_path2.default.isAbsolute(path3) ? path3 : import_node_path2.default.join(cwd, path3);
 };
+var shouldExpandGlobstarDirectory = (pattern) => {
+  const match = pattern == null ? void 0 : pattern.match(/\*\*\/([^/]+)$/);
+  if (!match) {
+    return false;
+  }
+  const dirname = match[1];
+  const hasWildcards = /[*?[\]{}]/.test(dirname);
+  const hasExtension = import_node_path2.default.extname(dirname) && !dirname.startsWith(".");
+  return !hasWildcards && !hasExtension;
+};
 var getDirectoryGlob = ({ directoryPath, files, extensions }) => {
   const extensionGlob = (extensions == null ? void 0 : extensions.length) > 0 ? `.${extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0]}` : "";
   return files ? files.map((file) => import_node_path2.default.posix.join(directoryPath, `**/${import_node_path2.default.extname(file) ? file : `${file}${extensionGlob}`}`)) : [import_node_path2.default.posix.join(directoryPath, `**${extensionGlob ? `/*${extensionGlob}` : ""}`)];
@@ -12658,18 +12737,28 @@ var directoryToGlob = (_0, ..._1) => __async(null, [_0, ..._1], function* (direc
   files,
   extensions
 } = {}) {
-  const globs = yield Promise.all(
-    directoryPaths.map((directoryPath) => __async(null, null, function* () {
-      return (yield isDirectory(normalizePathForDirectoryGlob(directoryPath, cwd))) ? getDirectoryGlob({ directoryPath, files, extensions }) : directoryPath;
-    }))
-  );
+  const globs = yield Promise.all(directoryPaths.map((directoryPath) => __async(null, null, function* () {
+    const checkPattern = isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath;
+    if (shouldExpandGlobstarDirectory(checkPattern)) {
+      return getDirectoryGlob({ directoryPath, files, extensions });
+    }
+    const pathToCheck = normalizePathForDirectoryGlob(directoryPath, cwd);
+    return (yield isDirectory(pathToCheck)) ? getDirectoryGlob({ directoryPath, files, extensions }) : directoryPath;
+  })));
   return globs.flat();
 });
 var directoryToGlobSync = (directoryPaths, {
   cwd = import_node_process2.default.cwd(),
   files,
   extensions
-} = {}) => directoryPaths.flatMap((directoryPath) => isDirectorySync(normalizePathForDirectoryGlob(directoryPath, cwd)) ? getDirectoryGlob({ directoryPath, files, extensions }) : directoryPath);
+} = {}) => directoryPaths.flatMap((directoryPath) => {
+  const checkPattern = isNegativePattern(directoryPath) ? directoryPath.slice(1) : directoryPath;
+  if (shouldExpandGlobstarDirectory(checkPattern)) {
+    return getDirectoryGlob({ directoryPath, files, extensions });
+  }
+  const pathToCheck = normalizePathForDirectoryGlob(directoryPath, cwd);
+  return isDirectorySync(pathToCheck) ? getDirectoryGlob({ directoryPath, files, extensions }) : directoryPath;
+});
 var toPatternsArray = (patterns) => {
   patterns = [...new Set([patterns].flat())];
   assertPatternsInput(patterns);
@@ -12713,15 +12802,11 @@ var getIgnoreFilesPatterns = (options) => {
 };
 var getFilter = (options) => __async(null, null, function* () {
   const ignoreFilesPatterns = getIgnoreFilesPatterns(options);
-  return createFilterFunction(
-    ignoreFilesPatterns.length > 0 && (yield isIgnoredByIgnoreFiles(ignoreFilesPatterns, options))
-  );
+  return createFilterFunction(ignoreFilesPatterns.length > 0 && (yield isIgnoredByIgnoreFiles(ignoreFilesPatterns, options)));
 });
 var getFilterSync = (options) => {
   const ignoreFilesPatterns = getIgnoreFilesPatterns(options);
-  return createFilterFunction(
-    ignoreFilesPatterns.length > 0 && isIgnoredByIgnoreFilesSync(ignoreFilesPatterns, options)
-  );
+  return createFilterFunction(ignoreFilesPatterns.length > 0 && isIgnoredByIgnoreFilesSync(ignoreFilesPatterns, options));
 };
 var createFilterFunction = (isIgnored) => {
   const seen = /* @__PURE__ */ new Set();
@@ -12771,19 +12856,17 @@ var generateTasks = (patterns, options) => __async(null, null, function* () {
     return globTasks;
   }
   const directoryToGlobOptions = normalizeExpandDirectoriesOption(expandDirectories, cwd);
-  return Promise.all(
-    globTasks.map((task) => __async(null, null, function* () {
-      let { patterns: patterns2, options: options2 } = task;
-      [
-        patterns2,
-        options2.ignore
-      ] = yield Promise.all([
-        directoryToGlob(patterns2, directoryToGlobOptions),
-        directoryToGlob(options2.ignore, { cwd })
-      ]);
-      return { patterns: patterns2, options: options2 };
-    }))
-  );
+  return Promise.all(globTasks.map((task) => __async(null, null, function* () {
+    let { patterns: patterns2, options: options2 } = task;
+    [
+      patterns2,
+      options2.ignore
+    ] = yield Promise.all([
+      directoryToGlob(patterns2, directoryToGlobOptions),
+      directoryToGlob(options2.ignore, { cwd })
+    ]);
+    return { patterns: patterns2, options: options2 };
+  })));
 });
 var generateTasksSync = (patterns, options) => {
   const globTasks = convertNegativePatterns(patterns, options);
@@ -12820,12 +12903,13 @@ var globbyStream = normalizeArgumentsSync((patterns, options) => {
   const tasks = generateTasksSync(patterns, options);
   const filter = getFilterSync(options);
   const streams = tasks.map((task) => import_fast_glob2.default.stream(task.patterns, task.options));
+  if (streams.length === 0) {
+    return import_node_stream2.Readable.from([]);
+  }
   const stream = mergeStreams(streams).filter((fastGlobResult) => filter(fastGlobResult));
   return stream;
 });
-var isDynamicPattern = normalizeArgumentsSync(
-  (patterns, options) => patterns.some((pattern) => import_fast_glob2.default.isDynamicPattern(pattern, options))
-);
+var isDynamicPattern = normalizeArgumentsSync((patterns, options) => patterns.some((pattern) => import_fast_glob2.default.isDynamicPattern(pattern, options)));
 var generateGlobTasks = normalizeArguments(generateTasks);
 var generateGlobTasksSync = normalizeArgumentsSync(generateTasksSync);
 var { convertPathToPattern } = import_fast_glob2.default;
build/vendor-extra.d.ts
@@ -266,6 +266,8 @@ type Options$1 = {
 	/**
 	Respect ignore patterns in `.gitignore` files that apply to the globbed files.
 
+	Performance note: This option searches for all `.gitignore` files in the entire directory tree before globbing, which can be slow. For better performance, use `ignoreFiles: '.gitignore'` to only respect the root `.gitignore` file.
+
 	@default false
 	*/
 	readonly gitignore?: boolean;
@@ -274,6 +276,8 @@ type Options$1 = {
 
 	This is a more generic form of the `gitignore` option, allowing you to find ignore files with a [compatible syntax](http://git-scm.com/docs/gitignore). For instance, this works with Babel's `.babelignore`, Prettier's `.prettierignore`, or ESLint's `.eslintignore` files.
 
+	Performance tip: Using a specific path like `'.gitignore'` is much faster than recursive patterns.
+
 	@default undefined
 	*/
 	readonly ignoreFiles?: string | readonly string[];
@@ -288,6 +292,11 @@ type GitignoreOptions = {
 	readonly cwd?: URL | string;
 };
 type GlobbyFilterFunction = (path: URL | string) => boolean;
+type AsyncIterableReadable<Value> = Omit<NodeJS.ReadableStream, typeof Symbol.asyncIterator> & {
+	[Symbol.asyncIterator](): NodeJS.AsyncIterator<Value>;
+};
+type GlobbyStream = AsyncIterableReadable<string>;
+type GlobbyEntryStream = AsyncIterableReadable<GlobEntry>;
 declare function globby(patterns: string | readonly string[], options: Options$1 & {
 	objectMode: true;
 }): Promise<GlobEntry[]>;
@@ -296,7 +305,10 @@ declare function globbySync(patterns: string | readonly string[], options: Optio
 	objectMode: true;
 }): GlobEntry[];
 declare function globbySync(patterns: string | readonly string[], options?: Options$1): string[];
-declare function globbyStream(patterns: string | readonly string[], options?: Options$1): NodeJS.ReadableStream;
+declare function globbyStream(patterns: string | readonly string[], options: Options$1 & {
+	objectMode: true;
+}): GlobbyEntryStream;
+declare function globbyStream(patterns: string | readonly string[], options?: Options$1): GlobbyStream;
 declare function generateGlobTasks(patterns: string | readonly string[], options?: Options$1): Promise<GlobTask[]>;
 declare function generateGlobTasksSync(patterns: string | readonly string[], options?: Options$1): GlobTask[];
 declare function isDynamicPattern(patterns: string | readonly string[], options?: FastGlobOptionsWithoutCwd & {
src/versions.ts
@@ -19,7 +19,7 @@ export const versions: Record<string, string> = {
   dotenv: '0.2.3',
   fetch: '1.6.7',
   fs: '11.3.2',
-  glob: '14.1.0',
+  glob: '15.0.0',
   minimist: '1.2.8',
   ps: '1.0.0',
   which: '5.0.0',
.size-limit.json
@@ -19,7 +19,7 @@
       "README.md",
       "LICENSE"
     ],
-    "limit": "128.80 kB",
+    "limit": "128.81 kB",
     "brotli": false,
     "gzip": false
   },
@@ -33,21 +33,21 @@
       "build/globals.js",
       "build/deno.js"
     ],
-    "limit": "817.2 kB",
+    "limit": "820.20 kB",
     "brotli": false,
     "gzip": false
   },
   {
     "name": "libdefs",
     "path": "build/*.d.ts",
-    "limit": "40.65 kB",
+    "limit": "41.355 kB",
     "brotli": false,
     "gzip": false
   },
   {
     "name": "vendor",
     "path": "build/vendor-*.{cjs,d.ts}",
-    "limit": "767.70 kB",
+    "limit": "771.40 kB",
     "brotli": false,
     "gzip": false
   },
@@ -66,7 +66,7 @@
       "README.md",
       "LICENSE"
     ],
-    "limit": "874.70 kB",
+    "limit": "878.45 kB",
     "brotli": false,
     "gzip": false
   }
package-lock.json
@@ -12,12 +12,12 @@
         "zx": "build/cli.js"
       },
       "devDependencies": {
-        "@commitlint/cli": "^20.0.0",
+        "@commitlint/cli": "^20.1.0",
         "@commitlint/config-conventional": "^20.0.0",
         "@size-limit/file": "11.2.0",
         "@types/fs-extra": "11.0.4",
         "@types/minimist": "1.2.5",
-        "@types/node": "24.7.1",
+        "@types/node": "24.7.2",
         "@types/which": "3.0.4",
         "@webpod/ingrid": "1.1.1",
         "@webpod/ps": "1.0.0",
@@ -38,9 +38,9 @@
         "esbuild-plugin-utils": "0.1.0",
         "fs-extra": "11.3.2",
         "get-port": "7.1.0",
-        "globby": "14.1.0",
+        "globby": "15.0.0",
         "jsr": "0.13.5",
-        "lefthook": "1.13.4",
+        "lefthook": "1.13.6",
         "madge": "8.0.0",
         "minimist": "1.2.8",
         "node-fetch-native": "1.6.7",
@@ -53,7 +53,7 @@
         "vitepress": "1.6.4",
         "which": "5.0.0",
         "yaml": "2.8.1",
-        "zurk": "0.11.9"
+        "zurk": "0.11.10"
       },
       "engines": {
         "node": ">= 12.17.0"
@@ -384,15 +384,15 @@
       }
     },
     "node_modules/@commitlint/cli": {
-      "version": "20.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.0.0.tgz",
-      "integrity": "sha512-I3D7Yldq8ZhOB3qEaTvXWIgib6tSZhbCpRObfFQ/aYI0J9AH8NMwT07Ak+bpE3n6Yn7EtbqEhQUkJZ/jZ5kCeQ==",
+      "version": "20.1.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.1.0.tgz",
+      "integrity": "sha512-pW5ujjrOovhq5RcYv5xCpb4GkZxkO2+GtOdBW2/qrr0Ll9tl3PX0aBBobGQl3mdZUbOBgwAexEQLeH6uxL0VYg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@commitlint/format": "^20.0.0",
         "@commitlint/lint": "^20.0.0",
-        "@commitlint/load": "^20.0.0",
+        "@commitlint/load": "^20.1.0",
         "@commitlint/read": "^20.0.0",
         "@commitlint/types": "^20.0.0",
         "tinyexec": "^1.0.0",
@@ -506,15 +506,15 @@
       }
     },
     "node_modules/@commitlint/load": {
-      "version": "20.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.0.0.tgz",
-      "integrity": "sha512-WiNKO9fDPlLY90Rruw2HqHKcghrmj5+kMDJ4GcTlX1weL8K07Q6b27C179DxnsrjGCRAKVwFKyzxV4x+xDY28Q==",
+      "version": "20.1.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.1.0.tgz",
+      "integrity": "sha512-qo9ER0XiAimATQR5QhvvzePfeDfApi/AFlC1G+YN+ZAY8/Ua6IRrDrxRvQAr+YXUKAxUsTDSp9KXeXLBPsNRWg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@commitlint/config-validator": "^20.0.0",
         "@commitlint/execute-rule": "^20.0.0",
-        "@commitlint/resolve-extends": "^20.0.0",
+        "@commitlint/resolve-extends": "^20.1.0",
         "@commitlint/types": "^20.0.0",
         "chalk": "^5.3.0",
         "cosmiconfig": "^9.0.0",
@@ -570,9 +570,9 @@
       }
     },
     "node_modules/@commitlint/resolve-extends": {
-      "version": "20.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.0.0.tgz",
-      "integrity": "sha512-BA4vva1hY8y0/Hl80YDhe9TJZpRFMsUYzVxvwTLPTEBotbGx/gS49JlVvtF1tOCKODQp7pS7CbxCpiceBgp3Dg==",
+      "version": "20.1.0",
+      "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.1.0.tgz",
+      "integrity": "sha512-cxKXQrqHjZT3o+XPdqDCwOWVFQiae++uwd9dUBC7f2MdV58ons3uUvASdW7m55eat5sRiQ6xUHyMWMRm6atZWw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -1857,9 +1857,9 @@
       "license": "MIT"
     },
     "node_modules/@sindresorhus/merge-streams": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
-      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
+      "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2126,9 +2126,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "24.7.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz",
-      "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==",
+      "version": "24.7.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.2.tgz",
+      "integrity": "sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -3149,13 +3149,13 @@
       }
     },
     "node_modules/cosmiconfig-typescript-loader": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz",
-      "integrity": "sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==",
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.2.0.tgz",
+      "integrity": "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "jiti": "^2.4.1"
+        "jiti": "^2.6.1"
       },
       "engines": {
         "node": ">=v18"
@@ -4379,21 +4379,21 @@
       }
     },
     "node_modules/globby": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
-      "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
+      "version": "15.0.0",
+      "resolved": "https://registry.npmjs.org/globby/-/globby-15.0.0.tgz",
+      "integrity": "sha512-oB4vkQGqlMl682wL1IlWd02tXCbquGWM4voPEI85QmNKCaw8zGTm1f1rubFgkg3Eli2PtKlFgrnmUqasbQWlkw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@sindresorhus/merge-streams": "^2.1.0",
+        "@sindresorhus/merge-streams": "^4.0.0",
         "fast-glob": "^3.3.3",
-        "ignore": "^7.0.3",
+        "ignore": "^7.0.5",
         "path-type": "^6.0.0",
         "slash": "^5.1.0",
         "unicorn-magic": "^0.3.0"
       },
       "engines": {
-        "node": ">=18"
+        "node": ">=20"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -4935,9 +4935,9 @@
       }
     },
     "node_modules/jiti": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
-      "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+      "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -5056,9 +5056,9 @@
       }
     },
     "node_modules/lefthook": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.13.4.tgz",
-      "integrity": "sha512-4EJfkcNlZW69ISxyEuBzkyivER/XIVCJcGYTemVBf5DWlBwK97hSrbgDH8O5JuHiCR5lW83hDa1T5TW/dRfnGg==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.13.6.tgz",
+      "integrity": "sha512-ojj4/4IJ29Xn4drd5emqVgilegAPN3Kf0FQM2p/9+lwSTpU+SZ1v4Ig++NF+9MOa99UKY8bElmVrLhnUUNFh5g==",
       "dev": true,
       "hasInstallScript": true,
       "license": "MIT",
@@ -5066,22 +5066,22 @@
         "lefthook": "bin/index.js"
       },
       "optionalDependencies": {
-        "lefthook-darwin-arm64": "1.13.4",
-        "lefthook-darwin-x64": "1.13.4",
-        "lefthook-freebsd-arm64": "1.13.4",
-        "lefthook-freebsd-x64": "1.13.4",
-        "lefthook-linux-arm64": "1.13.4",
-        "lefthook-linux-x64": "1.13.4",
-        "lefthook-openbsd-arm64": "1.13.4",
-        "lefthook-openbsd-x64": "1.13.4",
-        "lefthook-windows-arm64": "1.13.4",
-        "lefthook-windows-x64": "1.13.4"
+        "lefthook-darwin-arm64": "1.13.6",
+        "lefthook-darwin-x64": "1.13.6",
+        "lefthook-freebsd-arm64": "1.13.6",
+        "lefthook-freebsd-x64": "1.13.6",
+        "lefthook-linux-arm64": "1.13.6",
+        "lefthook-linux-x64": "1.13.6",
+        "lefthook-openbsd-arm64": "1.13.6",
+        "lefthook-openbsd-x64": "1.13.6",
+        "lefthook-windows-arm64": "1.13.6",
+        "lefthook-windows-x64": "1.13.6"
       }
     },
     "node_modules/lefthook-darwin-arm64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.13.4.tgz",
-      "integrity": "sha512-A/t0OYW9NCEqJ+j3volPvetfgErveioYxTG0tzgmJoMOR4joFN0vkjahKQpKPIMQ1HSqFQtiRefXL3M97rCD1A==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.13.6.tgz",
+      "integrity": "sha512-m6Lb77VGc84/Qo21Lhq576pEvcgFCnvloEiP02HbAHcIXD0RTLy9u2yAInrixqZeaz13HYtdDaI7OBYAAdVt8A==",
       "cpu": [
         "arm64"
       ],
@@ -5093,9 +5093,9 @@
       ]
     },
     "node_modules/lefthook-darwin-x64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.13.4.tgz",
-      "integrity": "sha512-pBCy4pm8HEjsDSPNYv4Y4p94ZJYC7Q3KOMkYVH6no7e7ide2adetRq5eylNM7OyKF6fDA3VMv8ywINxHVKu3tg==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.13.6.tgz",
+      "integrity": "sha512-CoRpdzanu9RK3oXR1vbEJA5LN7iB+c7hP+sONeQJzoOXuq4PNKVtEaN84Gl1BrVtCNLHWFAvCQaZPPiiXSy8qg==",
       "cpu": [
         "x64"
       ],
@@ -5107,9 +5107,9 @@
       ]
     },
     "node_modules/lefthook-freebsd-arm64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.13.4.tgz",
-      "integrity": "sha512-km8VRaIhORrebspVVwP+j01rYv2Wl8gDpEPcz42az9tfcp1o2d87Hi3zZ3DNSucSq+e7bMul1WNFYnk9xRy0jw==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.13.6.tgz",
+      "integrity": "sha512-X4A7yfvAJ68CoHTqP+XvQzdKbyd935sYy0bQT6Ajz7FL1g7hFiro8dqHSdPdkwei9hs8hXeV7feyTXbYmfjKQQ==",
       "cpu": [
         "arm64"
       ],
@@ -5121,9 +5121,9 @@
       ]
     },
     "node_modules/lefthook-freebsd-x64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.13.4.tgz",
-      "integrity": "sha512-eWiFL4uFSg1XhLnbSo8dNF8K5yJ1Al3HauV1XbDfa8rUoonJfGWxOz6z22qzKj8mVkwl7Tk1hhjnAyNtXZNG8g==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.13.6.tgz",
+      "integrity": "sha512-ai2m+Sj2kGdY46USfBrCqLKe9GYhzeq01nuyDYCrdGISePeZ6udOlD1k3lQKJGQCHb0bRz4St0r5nKDSh1x/2A==",
       "cpu": [
         "x64"
       ],
@@ -5135,9 +5135,9 @@
       ]
     },
     "node_modules/lefthook-linux-arm64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.13.4.tgz",
-      "integrity": "sha512-0aHeK1WoRPHwvgbEXdo1Q25MMCWNeY5wouhcShHpxhmrVBX1c0rYkWC9mQgR+632eUKkA/48+1J69x3mvtMZRg==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.13.6.tgz",
+      "integrity": "sha512-cbo4Wtdq81GTABvikLORJsAWPKAJXE8Q5RXsICFUVznh5PHigS9dFW/4NXywo0+jfFPCT6SYds2zz4tCx6DA0Q==",
       "cpu": [
         "arm64"
       ],
@@ -5149,9 +5149,9 @@
       ]
     },
     "node_modules/lefthook-linux-x64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.13.4.tgz",
-      "integrity": "sha512-f0rM3o5b7HNX+eKnCZzOPPWV+uPwOgfZEIKd1MqfkxxreQ+kloAcuUcNt6huwrs8foR7+45eC31T5plII3aTnw==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.13.6.tgz",
+      "integrity": "sha512-uJl9vjCIIBTBvMZkemxCE+3zrZHlRO7Oc+nZJ+o9Oea3fu+W82jwX7a7clw8jqNfaeBS+8+ZEQgiMHWCloTsGw==",
       "cpu": [
         "x64"
       ],
@@ -5163,9 +5163,9 @@
       ]
     },
     "node_modules/lefthook-openbsd-arm64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.13.4.tgz",
-      "integrity": "sha512-ov9rjWPOtphlNG2SOPQAPBSeWVTfB/vbh5AcvPECnVVe9jZTCthhKIyr9wx/UfKKqGxlL4wi7jk7BQ1BEJuC5w==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.13.6.tgz",
+      "integrity": "sha512-7r153dxrNRQ9ytRs2PmGKKkYdvZYFPre7My7XToSTiRu5jNCq++++eAKVkoyWPduk97dGIA+YWiEr5Noe0TK2A==",
       "cpu": [
         "arm64"
       ],
@@ -5177,9 +5177,9 @@
       ]
     },
     "node_modules/lefthook-openbsd-x64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.13.4.tgz",
-      "integrity": "sha512-4TVuVG86fJhWGBx8nR+USq00lYHuzLp1PqrW3vDKmTwxlMf3gmquO6PyQ85I5jfr1G2QpKn/cVJCvj3ExMUOxg==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.13.6.tgz",
+      "integrity": "sha512-Z+UhLlcg1xrXOidK3aLLpgH7KrwNyWYE3yb7ITYnzJSEV8qXnePtVu8lvMBHs/myzemjBzeIr/U/+ipjclR06g==",
       "cpu": [
         "x64"
       ],
@@ -5191,9 +5191,9 @@
       ]
     },
     "node_modules/lefthook-windows-arm64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.13.4.tgz",
-      "integrity": "sha512-y46ZgRAgyMy5MQYkZoSBtHYUYj0+54cM0VDT/Lu/jz1GRFAE8JkrRVetk3geqECpnMGxBkSgfhcbGDYeEvJQdw==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.13.6.tgz",
+      "integrity": "sha512-Uxef6qoDxCmUNQwk8eBvddYJKSBFglfwAY9Y9+NnnmiHpWTjjYiObE9gT2mvGVpEgZRJVAatBXc+Ha5oDD/OgQ==",
       "cpu": [
         "arm64"
       ],
@@ -5205,9 +5205,9 @@
       ]
     },
     "node_modules/lefthook-windows-x64": {
-      "version": "1.13.4",
-      "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.13.4.tgz",
-      "integrity": "sha512-p2YfWuj/43gUT0nHJ6j0pTRpLLwX9n2bio60POuXOrr3RVxdv5MEaQchdRhqYG5uWj7Zsm86K9FWkNuxPG81IA==",
+      "version": "1.13.6",
+      "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.13.6.tgz",
+      "integrity": "sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA==",
       "cpu": [
         "x64"
       ],
@@ -8204,9 +8204,9 @@
       }
     },
     "node_modules/zurk": {
-      "version": "0.11.9",
-      "resolved": "https://registry.npmjs.org/zurk/-/zurk-0.11.9.tgz",
-      "integrity": "sha512-BMIT/2nWCm1om9vYwWTho7bt8NuUU+Pd48QeGHTogX5sUtan1sRyGTbLnwzCiKku3TdRnQzmvVfRRknBAzZEpQ==",
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/zurk/-/zurk-0.11.10.tgz",
+      "integrity": "sha512-6rX6b2cMQ0Njxl2wa+xPLJVFELmMnBBqdWdkonJY8lET5XRFe3DjTlVZsDb+SG971XKEPD5upb9prE23h+t/LA==",
       "dev": true,
       "license": "MIT"
     },
package.json
@@ -109,12 +109,12 @@
     "test:workflow": "zizmor .github/workflows -v -p --min-severity=medium"
   },
   "devDependencies": {
-    "@commitlint/cli": "^20.0.0",
+    "@commitlint/cli": "^20.1.0",
     "@commitlint/config-conventional": "^20.0.0",
     "@size-limit/file": "11.2.0",
     "@types/fs-extra": "11.0.4",
     "@types/minimist": "1.2.5",
-    "@types/node": "24.7.1",
+    "@types/node": "24.7.2",
     "@types/which": "3.0.4",
     "@webpod/ingrid": "1.1.1",
     "@webpod/ps": "1.0.0",
@@ -135,9 +135,9 @@
     "esbuild-plugin-utils": "0.1.0",
     "fs-extra": "11.3.2",
     "get-port": "7.1.0",
-    "globby": "14.1.0",
+    "globby": "15.0.0",
     "jsr": "0.13.5",
-    "lefthook": "1.13.4",
+    "lefthook": "1.13.6",
     "madge": "8.0.0",
     "minimist": "1.2.8",
     "node-fetch-native": "1.6.7",
@@ -150,7 +150,7 @@
     "vitepress": "1.6.4",
     "which": "5.0.0",
     "yaml": "2.8.1",
-    "zurk": "0.11.9"
+    "zurk": "0.11.10"
   },
   "overrides": {
     "globby": {