Commit d06216d

Anton Golub <antongolub@antongolub.com>
2024-09-20 22:51:52
perf: shrink a few bytes (#908)
1 parent 9354a39
scripts/build-dts.mjs
@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-import fs from 'fs/promises'
+import fs from 'node:fs/promises'
 import { generateDtsBundle } from 'dts-bundle-generator'
 import glob from 'fast-glob'
 
src/core.ts
@@ -326,39 +326,32 @@ export class ProcessPromise extends Promise<ProcessOutput> {
           self._resolved = true
           const { error, status, signal, duration, ctx } = data
           const { stdout, stderr, stdall } = ctx.store
-
-          // Lazy getters
-          const _stdout = once(() => stdout.join(''))
-          const _stderr = once(() => stderr.join(''))
-          const _stdall = once(() => stdall.join(''))
-          const _duration = () => duration
-          let _code = () => status
-          let _signal = () => signal
-          let _message = once(() => ProcessOutput.getExitMessage(
-            status,
-            signal,
-            _stderr(),
-            self._from
-          ))
+          const dto: ProcessOutputLazyDto = {
+            // Lazy getters
+            code: () => status,
+            signal: () => signal,
+            duration: () => duration,
+            stdout: once(() => stdout.join('')),
+            stderr: once(() => stderr.join('')),
+            stdall: once(() => stdall.join('')),
+            message: once(() => ProcessOutput.getExitMessage(
+              status,
+              signal,
+              dto.stderr(),
+              self._from
+            )),
+            ...error && {
+              code: () => null,
+              signal: () => null,
+              message: () => ProcessOutput.getErrorMessage(error, self._from)
+            }
+          }
 
           // Ensures EOL
           if (stdout.length && !stdout[stdout.length - 1]?.toString().endsWith('\n')) c.on.stdout?.(eol, c)
           if (stderr.length && !stderr[stderr.length - 1]?.toString().endsWith('\n')) c.on.stderr?.(eol, c)
-          if (error) {
-            _code = () => null
-            _signal = () => null
-            _message = () => ProcessOutput.getErrorMessage(error, self._from)
-          }
 
-          const output = new ProcessOutput({
-            code: _code,
-            signal: _signal,
-            stdout: _stdout,
-            stderr: _stderr,
-            stdall: _stdall,
-            message: _message,
-            duration: _duration
-          })
+          const output = new ProcessOutput(dto)
           self._output = output
 
           if (error || status !== 0 && !self.isNothrow()) {
@@ -487,10 +480,10 @@ export class ProcessPromise extends Promise<ProcessOutput> {
         this.stdout.pipe(dest.stdin)
       }
       return dest
-    } else {
-      this._postrun = () => this.stdout.pipe(dest as Writable)
-      return this
     }
+
+    this._postrun = () => this.stdout.pipe(dest as Writable)
+    return this
   }
 
   abort(reason?: string) {
src/util.ts
@@ -17,6 +17,8 @@ import path from 'node:path'
 import fs from 'node:fs'
 import { chalk } from './vendor-core.js'
 
+export { isStringLiteral } from './vendor-core.js'
+
 export function tempdir(prefix = `zx-${randomId()}`) {
   const dirpath = path.join(os.tmpdir(), prefix)
   fs.mkdirSync(dirpath, { recursive: true })
@@ -45,18 +47,6 @@ export function isString(obj: any) {
   return typeof obj === 'string'
 }
 
-export const isStringLiteral = (
-  pieces: any,
-  ...rest: any[]
-): pieces is TemplateStringsArray => {
-  return (
-    pieces?.length > 0 &&
-    pieces.raw?.length === pieces.length &&
-    Object.isFrozen(pieces) &&
-    rest.length + 1 === pieces.length
-  )
-}
-
 const pad = (v: string) => (v === ' ' ? ' ' : '')
 
 export function preferLocalBin(
src/vendor-core.ts
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-export { exec, buildCmd, type TSpawnStore } from 'zurk/spawn'
+export { exec, buildCmd, isStringLiteral, type TSpawnStore } from 'zurk/spawn'
 
 export type RequestInfo = Parameters<typeof globalThis.fetch>[0]
 export type RequestInit = Parameters<typeof globalThis.fetch>[1]
package-lock.json
@@ -18,7 +18,7 @@
         "@types/node": ">=20.11.30",
         "@types/which": "^3.0.4",
         "@webpod/ingrid": "^0.0.0-beta.3",
-        "@webpod/ps": "^0.0.0-beta.7",
+        "@webpod/ps": "^0.0.0-beta.8",
         "c8": "^10.1.2",
         "chalk": "^5.3.0",
         "create-require": "^1.1.1",
@@ -46,7 +46,7 @@
         "typescript": "^5.6.2",
         "which": "^4.0.0",
         "yaml": "^2.5.1",
-        "zurk": "^0.3.4"
+        "zurk": "^0.4.3"
       },
       "engines": {
         "node": ">= 12.17.0"
@@ -649,9 +649,9 @@
       }
     },
     "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
-      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -867,9 +867,9 @@
       }
     },
     "node_modules/@ts-graphviz/adapter": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.3.tgz",
-      "integrity": "sha512-wHSN23UdLz4vuYUBZCzq2/tfLicwStSo3cUWnzvMNxG2ngcuYauQCQInv4CI5IObq+PFol28RVrG9Ffa9BuIRA==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@ts-graphviz/adapter/-/adapter-2.0.4.tgz",
+      "integrity": "sha512-fQMtFNeKEUy8yvQwzVxal6nbhnLMV5hfMGxugK6RBnAQ7R7ig6uTjHep6DKt3X/PpSf2A96NDgBLwfcv3OEE5w==",
       "dev": true,
       "funding": [
         {
@@ -883,16 +883,16 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@ts-graphviz/common": "^2.1.2"
+        "@ts-graphviz/common": "^2.1.3"
       },
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@ts-graphviz/ast": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.3.tgz",
-      "integrity": "sha512-NhOgJdOHGSn5h5ydsFreLIKFBwQ59drzZ6y0B98+KeEMqduv5hXxcQoDabw8yzeNe9B92AfR5OpUYthcdAsYgw==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@ts-graphviz/ast/-/ast-2.0.4.tgz",
+      "integrity": "sha512-qCzhBW3fgLW1eMnbRnm4brvoXciOlJnQTlYPNqunz7TpUNolPst/bFcb53EUCBk2oo09AIX3fbRvdpJUvD7osQ==",
       "dev": true,
       "funding": [
         {
@@ -906,16 +906,16 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@ts-graphviz/common": "^2.1.2"
+        "@ts-graphviz/common": "^2.1.3"
       },
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@ts-graphviz/common": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.2.tgz",
-      "integrity": "sha512-Wyh5fOZNYyNP1mymbcHg/9atWR33NhHWIDrNa4hfbel3v340YQ+q+LMwAuIPuPt1qXINvOEhkowO5dvJWqfnPA==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@ts-graphviz/common/-/common-2.1.3.tgz",
+      "integrity": "sha512-cGqlvgiAkHwlkItj6hgzcVTFAP0k5id7loHE7CnSEfGfCKBoDyG/KHhKJo5WdauZmqb82xKDheBhS73ZxZOqmg==",
       "dev": true,
       "funding": [
         {
@@ -933,9 +933,9 @@
       }
     },
     "node_modules/@ts-graphviz/core": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.3.tgz",
-      "integrity": "sha512-EZ+XlSwjdLtscoBOnA/Ba6QBrmoxAR73tJFjnWxaJQsZxWBQv6bLUrDgZUdXkXRAOSkRHn0uXY6Wq/3SsV2WtQ==",
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@ts-graphviz/core/-/core-2.0.4.tgz",
+      "integrity": "sha512-NYUv1h9EDHlHDA5iYJBvSdrScvrI/u8CKg0XDBFf3EU1qX9OTKN37AECoxFWdMl4X7cwmFuH5ujJ91PN7CTKZw==",
       "dev": true,
       "funding": [
         {
@@ -949,8 +949,8 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@ts-graphviz/ast": "^2.0.3",
-        "@ts-graphviz/common": "^2.1.2"
+        "@ts-graphviz/ast": "^2.0.4",
+        "@ts-graphviz/common": "^2.1.3"
       },
       "engines": {
         "node": ">=18"
@@ -1006,9 +1006,9 @@
       }
     },
     "node_modules/@types/estree": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
       "dev": true,
       "license": "MIT"
     },
@@ -1055,13 +1055,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.14.6",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz",
-      "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==",
+      "version": "22.5.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz",
+      "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~5.26.4"
+        "undici-types": "~6.19.2"
       }
     },
     "node_modules/@types/normalize-package-data": {
@@ -1197,63 +1197,63 @@
       }
     },
     "node_modules/@vue/compiler-core": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.3.tgz",
-      "integrity": "sha512-adAfy9boPkP233NTyvLbGEqVuIfK/R0ZsBsIOW4BZNfb4BRpRW41Do1u+ozJpsb+mdoy80O20IzAsHaihRb5qA==",
+      "version": "3.5.7",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.7.tgz",
+      "integrity": "sha512-A0gay3lK71MddsSnGlBxRPOugIVdACze9L/rCo5X5srCyjQfZOfYtSFMJc3aOZCM+xN55EQpb4R97rYn/iEbSw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/parser": "^7.25.3",
-        "@vue/shared": "3.5.3",
+        "@vue/shared": "3.5.7",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
         "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-dom": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.3.tgz",
-      "integrity": "sha512-wnzFArg9zpvk/811CDOZOadJRugf1Bgl/TQ3RfV4nKfSPok4hi0w10ziYUQR6LnnBAUlEXYLUfZ71Oj9ds/+QA==",
+      "version": "3.5.7",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.7.tgz",
+      "integrity": "sha512-GYWl3+gO8/g0ZdYaJ18fYHdI/WVic2VuuUd1NsPp60DWXKy+XjdhFsDW7FbUto8siYYZcosBGn9yVBkjhq1M8Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-core": "3.5.3",
-        "@vue/shared": "3.5.3"
+        "@vue/compiler-core": "3.5.7",
+        "@vue/shared": "3.5.7"
       }
     },
     "node_modules/@vue/compiler-sfc": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.3.tgz",
-      "integrity": "sha512-P3uATLny2tfyvMB04OQFe7Sczteno7SLFxwrOA/dw01pBWQHB5HL15a8PosoNX2aG/EAMGqnXTu+1LnmzFhpTQ==",
+      "version": "3.5.7",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.7.tgz",
+      "integrity": "sha512-EjOJtCWJrC7HqoCEzOwpIYHm+JH7YmkxC1hG6VkqIukYRqj8KFUlTLK6hcT4nGgtVov2+ZfrdrRlcaqS78HnBA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@babel/parser": "^7.25.3",
-        "@vue/compiler-core": "3.5.3",
-        "@vue/compiler-dom": "3.5.3",
-        "@vue/compiler-ssr": "3.5.3",
-        "@vue/shared": "3.5.3",
+        "@vue/compiler-core": "3.5.7",
+        "@vue/compiler-dom": "3.5.7",
+        "@vue/compiler-ssr": "3.5.7",
+        "@vue/shared": "3.5.7",
         "estree-walker": "^2.0.2",
         "magic-string": "^0.30.11",
-        "postcss": "^8.4.44",
+        "postcss": "^8.4.47",
         "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-ssr": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.3.tgz",
-      "integrity": "sha512-F/5f+r2WzL/2YAPl7UlKcJWHrvoZN8XwEBLnT7S4BXwncH25iDOabhO2M2DWioyTguJAGavDOawejkFXj8EM1w==",
+      "version": "3.5.7",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.7.tgz",
+      "integrity": "sha512-oZx+jXP2k5arV/8Ly3TpQbfFyimMw2ANrRqvHJoKjPqtEzazxQGZjCLOfq8TnZ3wy2TOXdqfmVp4q7FyYeHV4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-dom": "3.5.3",
-        "@vue/shared": "3.5.3"
+        "@vue/compiler-dom": "3.5.7",
+        "@vue/shared": "3.5.7"
       }
     },
     "node_modules/@vue/shared": {
-      "version": "3.5.3",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.3.tgz",
-      "integrity": "sha512-Jp2v8nylKBT+PlOUjun2Wp/f++TfJVFjshLzNtJDdmFJabJa7noGMncqXRM1vXGX+Yo2V7WykQFNxusSim8SCA==",
+      "version": "3.5.7",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.7.tgz",
+      "integrity": "sha512-NBE1PBIvzIedxIc2RZiKXvGbJkrZ2/hLf3h8GlS4/sP9xcXEZMFWOazFkNd6aGeUCMaproe5MHVYB3/4AW9q9g==",
       "dev": true,
       "license": "MIT"
     },
@@ -1265,20 +1265,20 @@
       "license": "MIT"
     },
     "node_modules/@webpod/ps": {
-      "version": "0.0.0-beta.7",
-      "resolved": "https://registry.npmjs.org/@webpod/ps/-/ps-0.0.0-beta.7.tgz",
-      "integrity": "sha512-hsdJszpYGeV4RjctCYFuPzIpoKJduDSAntftXJx/+OKDiO7OgScU4EGOHrUqQNQ5VgK1Verlu16fLkz5KCgq8g==",
+      "version": "0.0.0-beta.8",
+      "resolved": "https://registry.npmjs.org/@webpod/ps/-/ps-0.0.0-beta.8.tgz",
+      "integrity": "sha512-IKjOLcp9rCTOjEfafw2dEFwgAQzHRYOKRBHz51DiHM0HFWSOqHURqTJ51iW5c64KWfTXn92pHjXMpj24ASWy3A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "@webpod/ingrid": "^0.0.0-beta.3",
-        "zurk": "^0.3.0"
+        "zurk": "^0.4.2"
       }
     },
     "node_modules/acorn": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
-      "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -1289,9 +1289,9 @@
       }
     },
     "node_modules/acorn-walk": {
-      "version": "8.3.3",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
-      "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+      "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2261,9 +2261,9 @@
       }
     },
     "node_modules/escalade": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
-      "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2526,9 +2526,9 @@
       }
     },
     "node_modules/foreground-child": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
-      "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+      "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -2590,9 +2590,9 @@
       }
     },
     "node_modules/fx": {
-      "version": "34.0.0",
-      "resolved": "https://registry.npmjs.org/fx/-/fx-34.0.0.tgz",
-      "integrity": "sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==",
+      "version": "35.0.0",
+      "resolved": "https://registry.npmjs.org/fx/-/fx-35.0.0.tgz",
+      "integrity": "sha512-O07q+Lknrom5RUX/u53tjo2KTTLUnL0K703JbqMYb19ORijfJNvijzFqqYXEjdk25T9R14S6t6wHD8fCWXCM0g==",
       "dev": true,
       "license": "MIT",
       "bin": {
@@ -2631,9 +2631,9 @@
       "license": "ISC"
     },
     "node_modules/get-tsconfig": {
-      "version": "4.7.5",
-      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz",
-      "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==",
+      "version": "4.8.1",
+      "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz",
+      "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2797,9 +2797,9 @@
       "license": "BSD-3-Clause"
     },
     "node_modules/ignore": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
-      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
       "dev": true,
       "license": "MIT",
       "engines": {
@@ -2873,13 +2873,16 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.13.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
-      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "hasown": "^2.0.0"
+        "hasown": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -3051,17 +3054,14 @@
       }
     },
     "node_modules/jackspeak": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.1.tgz",
-      "integrity": "sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
       "dev": true,
       "license": "BlueOak-1.0.0",
       "dependencies": {
         "@isaacs/cliui": "^8.0.2"
       },
-      "engines": {
-        "node": ">=18"
-      },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
       },
@@ -3943,14 +3943,11 @@
       }
     },
     "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "10.3.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.1.tgz",
-      "integrity": "sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==",
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
       "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=18"
-      }
+      "license": "ISC"
     },
     "node_modules/path-type": {
       "version": "5.0.0",
@@ -4012,9 +4009,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.45",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
-      "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
+      "version": "8.4.47",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
+      "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
       "dev": true,
       "funding": [
         {
@@ -4033,8 +4030,8 @@
       "license": "MIT",
       "dependencies": {
         "nanoid": "^3.3.7",
-        "picocolors": "^1.0.1",
-        "source-map-js": "^1.2.0"
+        "picocolors": "^1.1.0",
+        "source-map-js": "^1.2.1"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
@@ -4568,9 +4565,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "dev": true,
       "license": "ISC",
       "bin": {
@@ -4663,9 +4660,9 @@
       }
     },
     "node_modules/source-map-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
-      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
       "dev": true,
       "license": "BSD-3-Clause",
       "engines": {
@@ -4702,9 +4699,9 @@
       }
     },
     "node_modules/spdx-license-ids": {
-      "version": "3.0.18",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz",
-      "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==",
+      "version": "3.0.20",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+      "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
       "dev": true,
       "license": "CC0-1.0"
     },
@@ -4936,9 +4933,9 @@
       }
     },
     "node_modules/test-exclude/node_modules/glob": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.3.tgz",
-      "integrity": "sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==",
+      "version": "10.4.5",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -4952,9 +4949,6 @@
       "bin": {
         "glob": "dist/esm/bin.mjs"
       },
-      "engines": {
-        "node": ">=18"
-      },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
       }
@@ -5064,9 +5058,9 @@
       }
     },
     "node_modules/ts-graphviz": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-2.1.2.tgz",
-      "integrity": "sha512-9GnOA3yiFaqZeHBEZXWa6kqc61FVhAhxQU5g3KLyGrhRr7OsDGRzs+1z35ctvD+hTTEhrBza6D41+qz+3qs7Zw==",
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-2.1.3.tgz",
+      "integrity": "sha512-QIgqE5Fdk8xeI/twUCzlNIVkxVt2S7pK+GMQHgi5xtu/zHDL3+LE4TsK2hOBCh4DxXvugGl0xLvWFA6T0iAVsA==",
       "dev": true,
       "funding": [
         {
@@ -5080,10 +5074,10 @@
       ],
       "license": "MIT",
       "dependencies": {
-        "@ts-graphviz/adapter": "^2.0.3",
-        "@ts-graphviz/ast": "^2.0.3",
-        "@ts-graphviz/common": "^2.1.2",
-        "@ts-graphviz/core": "^2.0.3"
+        "@ts-graphviz/adapter": "^2.0.4",
+        "@ts-graphviz/ast": "^2.0.4",
+        "@ts-graphviz/common": "^2.1.3",
+        "@ts-graphviz/core": "^2.0.4"
       },
       "engines": {
         "node": ">=18"
@@ -5202,9 +5196,9 @@
       }
     },
     "node_modules/tslib": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
-      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz",
+      "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
       "dev": true,
       "license": "0BSD"
     },
@@ -5256,9 +5250,9 @@
       }
     },
     "node_modules/undici-types": {
-      "version": "5.26.5",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+      "version": "6.19.8",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+      "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
       "dev": true,
       "license": "MIT"
     },
@@ -5300,9 +5294,9 @@
       "license": "MIT"
     },
     "node_modules/v8-to-istanbul": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz",
-      "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==",
+      "version": "9.3.0",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+      "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
       "dev": true,
       "license": "ISC",
       "dependencies": {
@@ -5557,9 +5551,9 @@
       }
     },
     "node_modules/zurk": {
-      "version": "0.3.4",
-      "resolved": "https://registry.npmjs.org/zurk/-/zurk-0.3.4.tgz",
-      "integrity": "sha512-Mu0uXIAgYezo9zprkW/jzjgBo6jkCCGNPpdpQr4W5aRUTDRHCcy9KvOY+cKg6XYfPp0ArqsQsFbeZSf2f8Ka6Q==",
+      "version": "0.4.3",
+      "resolved": "https://registry.npmjs.org/zurk/-/zurk-0.4.3.tgz",
+      "integrity": "sha512-+Br2vm7SQa9G18E0E4vJgh4IDAtkcoJHm3E6M1w4Jq8glrcHi5oon0G+/x86vM7WzeFTQ0EfZq4VxadSJFh0LQ==",
       "dev": true,
       "license": "MIT"
     }
package.json
@@ -97,7 +97,7 @@
     "@types/node": ">=20.11.30",
     "@types/which": "^3.0.4",
     "@webpod/ingrid": "^0.0.0-beta.3",
-    "@webpod/ps": "^0.0.0-beta.7",
+    "@webpod/ps": "^0.0.0-beta.8",
     "c8": "^10.1.2",
     "chalk": "^5.3.0",
     "create-require": "^1.1.1",
@@ -125,7 +125,7 @@
     "typescript": "^5.6.2",
     "which": "^4.0.0",
     "yaml": "^2.5.1",
-    "zurk": "^0.3.4"
+    "zurk": "^0.4.3"
   },
   "publishConfig": {
     "registry": "https://wombat-dressing-room.appspot.com"