From 8de4b4288d2afd9d2f77b471183df3f9833c59fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 10:39:15 -0400 Subject: [PATCH 1/8] refactor: define template commands with citty --- bun.lock | 211 +++++++------------------------------ package.json | 5 +- scripts/index.ts | 47 +++------ scripts/template/add.ts | 42 +++++--- scripts/template/index.ts | 22 ++-- scripts/template/rename.ts | 38 +++---- scripts/template/setup.ts | 85 ++++++++------- scripts/utils.ts | 5 - 8 files changed, 157 insertions(+), 298 deletions(-) delete mode 100644 scripts/utils.ts diff --git a/bun.lock b/bun.lock index ffb52a83..48331e26 100644 --- a/bun.lock +++ b/bun.lock @@ -7,8 +7,8 @@ "devDependencies": { "@turbo/gen": "2.10.7", "@types/bun": "1.3.14", - "@types/yargs": "17.0.35", "adamantite": "0.35.0", + "citty": "0.2.2", "consola": "3.4.2", "faultier": "3.0.1", "knip": "6.32.2", @@ -20,7 +20,6 @@ "turbo": "2.10.7", "typescript": "7.0.2", "varlock": "1.16.0", - "yargs": "18.0.0", }, }, "apps/api": { @@ -2800,7 +2799,7 @@ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], - "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], @@ -3140,7 +3139,7 @@ "eslint-plugin-no-unsanitized": ["eslint-plugin-no-unsanitized@4.1.5", "", { "peerDependencies": { "eslint": "^9 || ^10" } }, "sha512-MSB4hXPVFQrI8weqzs6gzl7reP2k/qSjtCoL2vUMSDejIIq9YL1ZKvq5/ORBXab/PvfBBrWO2jWviYpL+4Ghfg=="], - "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], @@ -3154,7 +3153,7 @@ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], - "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], @@ -5162,7 +5161,7 @@ "wouter": ["wouter@3.10.0", "", { "dependencies": { "mitt": "^3.0.1", "regexparam": "^3.0.0", "use-sync-external-store": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-zTfddD80zc2/J5l8JKcdvzOK6AwP0kpyHEI3DxRN2bn8U1oJPnrSVm8v+X3WwDamvLAOxTO7ZvkxkpRWlyeJ1Q=="], - "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -5194,7 +5193,7 @@ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], @@ -5226,8 +5225,6 @@ "@aklinker1/rollup-plugin-visualizer/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "@aklinker1/rollup-plugin-visualizer/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "@astrojs/markdown-satteri/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.10.2", "", { "dependencies": { "@types/hast": "^3.0.4", "@types/mdast": "^4.0.4", "js-yaml": "^4.3.0", "picomatch": "^4.0.4", "retext-smartypants": "^6.2.0", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "unified": "^11.0.5" } }, "sha512-yt7fMgPYqSM4Tmr+taTW6Per+hjJ8Pk6lA1PAcDyqzOt8HzJ6Kje5WzCxA2Sd+9wsUW7uhkLeoTMK0cXPwH9rQ=="], "@astrojs/react/@vitejs/plugin-react": ["@vitejs/plugin-react@5.2.0", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw=="], @@ -5384,8 +5381,6 @@ "@electron/rebuild/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], - "@electron/rebuild/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], "@esbuild-kit/esm-loader/get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], @@ -5446,8 +5441,6 @@ "@expo/xcpretty/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "@grpc/proto-loader/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], "@inlang/paraglide-js/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], @@ -5488,8 +5481,6 @@ "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.12", "", {}, "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g=="], "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -5620,8 +5611,6 @@ "@react-native/codegen/hermes-parser": ["hermes-parser@0.36.0", "", { "dependencies": { "hermes-estree": "0.36.0" } }, "sha512-GdpwMmH5x6IpC1cijvcvYnlPB60Mh6kTSF/NFdYV/j56gYdi+0RIakYs+eqOV+bbO0SW7mgVVGSsTJxyPQfo3w=="], - "@react-native/codegen/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "@react-native/dev-middleware/chrome-launcher": ["chrome-launcher@0.15.2", "", { "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", "lighthouse-logger": "^1.0.0" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" } }, "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ=="], "@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="], @@ -5754,8 +5743,6 @@ "addons-linter/image-size": ["image-size@2.0.2", "", { "bin": { "image-size": "bin/image-size.js" } }, "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w=="], - "addons-linter/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], @@ -5788,6 +5775,8 @@ "boxen/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "boxen/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "c12/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], "cacache/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], @@ -5818,6 +5807,12 @@ "cli-truncate/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], "columnify/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -5888,6 +5883,8 @@ "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "eslint/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + "eslint/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], "eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], @@ -5896,6 +5893,10 @@ "eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "esquery/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-util-build-jsx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "expo/expo-file-system": ["expo-file-system@57.0.1", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-w7/ERvQFrGP2apTO9lDtZ+O6JQIhfakL7+Xqzh+rfMO9B4LB4qwrz+YvLgir8KFRVX64JHBnRuYBVLY1oQZcqw=="], @@ -5998,8 +5999,6 @@ "linkedom/htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="], - "listr2/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "load-json-file/parse-json": ["parse-json@2.2.0", "", { "dependencies": { "error-ex": "^1.2.0" } }, "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ=="], "load-json-file/strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], @@ -6008,8 +6007,6 @@ "log-update/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="], - "log-update/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "magicast/@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], "make-fetch-happen/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], @@ -6040,8 +6037,6 @@ "metro/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], - "metro/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "metro-babel-transformer/hermes-parser": ["hermes-parser@0.35.0", "", { "dependencies": { "hermes-estree": "0.35.0" } }, "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA=="], "metro-source-map/@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], @@ -6144,8 +6139,6 @@ "react-native/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], - "react-native/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "react-native-svg/css-tree": ["css-tree@1.1.3", "", { "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" } }, "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q=="], "react-native-web/@react-native/normalize-colors": ["@react-native/normalize-colors@0.74.89", "", {}, "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg=="], @@ -6232,8 +6225,6 @@ "web-ext/jose": ["jose@5.9.6", "", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="], - "web-ext/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "web-ext-run/@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], "web-ext-run/debounce": ["debounce@1.2.1", "", {}, "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="], @@ -6252,12 +6243,12 @@ "webpack/enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="], - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "whatwg-encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -6270,18 +6261,16 @@ "xcode/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "@aklinker1/rollup-plugin-visualizer/open/define-lazy-prop": ["define-lazy-prop@2.0.0", "", {}, "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og=="], "@aklinker1/rollup-plugin-visualizer/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "@aklinker1/rollup-plugin-visualizer/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "@aklinker1/rollup-plugin-visualizer/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@aklinker1/rollup-plugin-visualizer/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@aklinker1/rollup-plugin-visualizer/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], "@astrojs/react/@vitejs/plugin-react/react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], @@ -6416,12 +6405,6 @@ "@electron/rebuild/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "@electron/rebuild/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@electron/rebuild/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@electron/rebuild/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.18.20", "", { "os": "android", "cpu": "arm64" }, "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ=="], @@ -6544,12 +6527,6 @@ "@expo/xcpretty/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@grpc/proto-loader/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@grpc/proto-loader/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@grpc/proto-loader/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "@inngest/ai/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "@inquirer/core/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -6560,8 +6537,6 @@ "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "@npmcli/move-file/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -6648,12 +6623,6 @@ "@react-native/codegen/hermes-parser/hermes-estree": ["hermes-estree@0.36.0", "", {}, "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w=="], - "@react-native/codegen/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@react-native/codegen/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@react-native/codegen/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "@react-native/dev-middleware/chrome-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], "@react-native/dev-middleware/chrome-launcher/lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="], @@ -6836,18 +6805,14 @@ "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "addons-linter/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "addons-linter/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "addons-linter/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "babel-plugin-syntax-hermes-parser/hermes-parser/hermes-estree": ["hermes-estree@0.36.0", "", {}, "sha512-A1+8zn5oss2CFP7pKsOaxorQG6FNIz1WU1VDqruLPPZl3LVgeE2C5xfFg8Ow6/Ow4mSslLLtYP1J3n38eKyW9w=="], + "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], "cacache/glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], @@ -6872,6 +6837,10 @@ "cli-truncate/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "compression/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "configstore/dot-prop/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -7018,6 +6987,8 @@ "eslint/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "eslint/eslint-scope/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "expo-modules-autolinking/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -7098,18 +7069,10 @@ "linkedom/htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], - "listr2/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "listr2/wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - "log-update/ansi-escapes/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], "log-update/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], - "log-update/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - - "log-update/wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], - "make-fetch-happen/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], "make-fetch-happen/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -7124,12 +7087,6 @@ "metro/hermes-parser/hermes-estree": ["hermes-estree@0.35.0", "", {}, "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg=="], - "metro/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "metro/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "metro/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "minimizer-webpack-plugin/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], "minipass-collect/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], @@ -7164,12 +7121,6 @@ "react-native-svg/css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], - "react-native/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "react-native/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "react-native/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - "read-pkg-up/find-up/locate-path": ["locate-path@2.0.0", "", { "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA=="], "rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -7224,25 +7175,15 @@ "web-ext-run/pino/thread-stream": ["thread-stream@3.2.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-zLBvqpwr4Esa0kRjcrzGU6zL25lePWaCLMx0RQFrmteozIfeNdaMLpG5U7PeHzvlFkAWaRKA9/KVW4F60iB+qw=="], - "web-ext/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "web-ext/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "web-ext/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], - - "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "wxt/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - - "@aklinker1/rollup-plugin-visualizer/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "@aklinker1/rollup-plugin-visualizer/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wxt/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "@aklinker1/rollup-plugin-visualizer/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "@aklinker1/rollup-plugin-visualizer/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "@dotenvx/dotenvx/conf/dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], @@ -7292,14 +7233,6 @@ "@electron/rebuild/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "@electron/rebuild/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@electron/rebuild/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@electron/rebuild/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@electron/rebuild/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@expo/cli/ora/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], "@expo/cli/ora/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], @@ -7326,26 +7259,10 @@ "@expo/package-manager/ora/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], - "@grpc/proto-loader/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@grpc/proto-loader/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@grpc/proto-loader/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@inquirer/core/wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "@npmcli/move-file/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "@react-native/codegen/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@react-native/codegen/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@react-native/codegen/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@react-native/codegen/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@react-native/dev-middleware/chrome-launcher/is-wsl/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], "@react-native/dev-middleware/chrome-launcher/lighthouse-logger/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], @@ -7396,14 +7313,6 @@ "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "addons-linter/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "addons-linter/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "addons-linter/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "addons-linter/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "cacache/rimraf/glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], "cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], @@ -7440,32 +7349,12 @@ "linkedom/css-select/domutils/domelementtype": ["domelementtype@3.0.0", "", {}, "sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg=="], - "listr2/wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "log-update/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "log-update/wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - - "metro/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "metro/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "metro/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "metro/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], "pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], - "react-native/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "react-native/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "react-native/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "react-native/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@2.0.0", "", { "dependencies": { "p-limit": "^1.1.0" } }, "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg=="], "read-pkg-up/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], @@ -7484,16 +7373,6 @@ "web-ext-run/fx-runner/which/isexe": ["isexe@1.1.2", "", {}, "sha512-d2eJzK691yZwPHcv1LbeAOa91yMJ9QmfTgSO1oXB65ezVhXQsxBac2vEB4bMVms9cGzaA99n6V2viHMq82VLDw=="], - "web-ext/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "web-ext/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "web-ext/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "web-ext/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@aklinker1/rollup-plugin-visualizer/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@electron-forge/cli/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/@types/node": ["@types/node@22.20.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q=="], "@electron-forge/cli/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -7556,8 +7435,6 @@ "@electron/rebuild/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "@electron/rebuild/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@expo/cli/ora/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], "@expo/cli/ora/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], @@ -7574,20 +7451,14 @@ "@expo/package-manager/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "@grpc/proto-loader/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@npmcli/move-file/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], - "@react-native/codegen/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@react-native/dev-middleware/chrome-launcher/lighthouse-logger/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "@react-native/dev-middleware/serve-static/send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/core/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "addons-linter/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "cacache/rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "electron-installer-debian/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -7598,18 +7469,12 @@ "linkedom/css-select/domutils/dom-serializer/entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - "metro/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - "react-native/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "read-pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@1.3.0", "", { "dependencies": { "p-try": "^1.0.0" } }, "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="], "username/execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="], - "web-ext/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@electron-forge/cli/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], "@electron-forge/cli/@inquirer/prompts/@inquirer/checkbox/@inquirer/core/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], diff --git a/package.json b/package.json index 7dc7bb84..9f98897a 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "devDependencies": { "@turbo/gen": "2.10.7", "@types/bun": "1.3.14", - "@types/yargs": "17.0.35", "adamantite": "0.35.0", + "citty": "0.2.2", "consola": "3.4.2", "faultier": "3.0.1", "knip": "6.32.2", @@ -53,8 +53,7 @@ "sherif": "1.13.0", "turbo": "2.10.7", "typescript": "7.0.2", - "varlock": "1.16.0", - "yargs": "18.0.0" + "varlock": "1.16.0" }, "overrides": { "@types/react": "19.2.4", diff --git a/scripts/index.ts b/scripts/index.ts index 93e045f4..783a5ea9 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -1,38 +1,15 @@ -import consola from "consola" -import { isFault } from "faultier" -import yargs from "yargs" -import { hideBin } from "yargs/helpers" +import { defineCommand, runMain } from "citty" import template from "./template" -try { - await yargs(hideBin(process.argv)) - .scriptName("bun scripts") - .usage("$0 ") - .command(template) - .epilogue("Add your own project commands to scripts/index.ts.") - .demandCommand(1, "Choose a command. Run --help to see available commands.") - .strict() - .help() - .fail((message, error: unknown, yargs) => { - if (error !== undefined) throw error as Error - - yargs.showHelp() - if (message) consola.error(message) - process.exitCode = 1 - }) - .parseAsync() -} catch (error) { - if (isFault(error)) { - consola.error(error.flatten()) - - const details = error.flatten({ field: "details" }) - if (details) consola.error(details) - } else if (error instanceof Error) { - consola.error(error.stack ?? error.message) - } else { - consola.error(String(error)) - } - - process.exitCode = 1 -} +const main = defineCommand({ + meta: { + description: "Run project and template commands", + name: "bun scripts", + }, + subCommands: { + template, + }, +}) + +await runMain(main) diff --git a/scripts/template/add.ts b/scripts/template/add.ts index c78818a5..d39f2686 100644 --- a/scripts/template/add.ts +++ b/scripts/template/add.ts @@ -1,7 +1,7 @@ import { join } from "node:path" +import { defineCommand } from "citty" import consola from "consola" -import { defineCommand } from "../utils" import { restorePortlessWorkspaces } from "./portless" import { renameProject } from "./rename" import { @@ -129,22 +129,30 @@ async function addWorkspaces( } export default defineCommand({ - builder: (yargs) => - yargs - .positional("kind", { - choices: ["app", "package"] as const, - demandOption: true, - describe: "Workspace type to add", - type: "string", - }) - .positional("name", { - demandOption: true, - describe: "Name of the template workspace to copy", - type: "string", - }), - command: "add ", - describe: "Copy an app or package from the init template", - handler: async (args) => { + args: { + kind: { + description: "Workspace type to add", + required: true, + type: "positional", + }, + name: { + description: "Name of the template workspace to copy", + required: true, + type: "positional", + }, + }, + meta: { + description: "Copy an app or package from the init template", + name: "add", + }, + run: async ({ args }) => { + if (args.kind !== "app" && args.kind !== "package") { + throw TemplateFault.create("InvalidArgumentsError").withDescription( + `Unknown workspace type: ${args.kind}.`, + "The workspace type must be app or package." + ) + } + const rootDir = process.cwd() const scope = await getProjectScope(rootDir) const target: TemplateWorkspace = { kind: args.kind, name: args.name } diff --git a/scripts/template/index.ts b/scripts/template/index.ts index 889798f1..3e843daa 100644 --- a/scripts/template/index.ts +++ b/scripts/template/index.ts @@ -1,17 +1,17 @@ -import { defineCommand } from "../utils" +import { defineCommand } from "citty" + import add from "./add" import rename from "./rename" import setup from "./setup" export default defineCommand({ - builder: (yargs) => - yargs - .command(setup) - .command(rename) - .command(add) - .demandCommand(1, "Choose a template command. Run --help to see available commands.") - .strict(), - command: "template", - describe: "Configure and maintain this template project", - handler: () => Promise.resolve(), + meta: { + description: "Configure and maintain this template project", + name: "template", + }, + subCommands: { + add, + rename, + setup, + }, }) diff --git a/scripts/template/rename.ts b/scripts/template/rename.ts index ab6f07ef..ef2f9ea8 100644 --- a/scripts/template/rename.ts +++ b/scripts/template/rename.ts @@ -1,7 +1,7 @@ import { join, resolve } from "node:path" +import { defineCommand } from "citty" import consola from "consola" -import { defineCommand } from "../utils" import { updatePortlessProjectName } from "./portless" import { checkIsPathWithinRoot, @@ -65,23 +65,25 @@ export async function renameProject({ } export default defineCommand({ - builder: (yargs) => - yargs - .option("name", { - describe: "New root package name", - type: "string", - }) - .option("scope", { - describe: "New npm scope, without the leading @ (defaults to --name)", - type: "string", - }) - .option("workspace", { - describe: "Rewrite only this workspace directory", - type: "string", - }), - command: "rename", - describe: "Rename the project and replace the template workspace scope", - handler: async (args) => { + args: { + name: { + description: "New root package name", + type: "string", + }, + scope: { + description: "New npm scope, without the leading @ (defaults to --name)", + type: "string", + }, + workspace: { + description: "Rewrite only this workspace directory", + type: "string", + }, + }, + meta: { + description: "Rename the project and replace the template workspace scope", + name: "rename", + }, + run: async ({ args }) => { const projectRoot = resolve(process.cwd()) const projectName = args.name if (!args.workspace && !projectName) { diff --git a/scripts/template/setup.ts b/scripts/template/setup.ts index 0da5edb0..94861a68 100644 --- a/scripts/template/setup.ts +++ b/scripts/template/setup.ts @@ -1,7 +1,7 @@ import { join, relative } from "node:path" +import { defineCommand } from "citty" import consola from "consola" -import { defineCommand } from "../utils" import { renameProject } from "./rename" import { getDependencyNames, @@ -23,8 +23,19 @@ type TemplateStamp = { template: "metaideas/init" } -function getSelectedNames(values: string[] | undefined) { - return values?.flatMap((value) => value.split(",")).filter(Boolean) +function getOptionValues(rawArgs: string[], optionName: string) { + const values: string[] = [] + + for (const [index, argument] of rawArgs.entries()) { + if (argument === `--${optionName}`) { + const value = rawArgs[index + 1] + if (value && !value.startsWith("-")) values.push(value) + } else if (argument.startsWith(`--${optionName}=`)) { + values.push(argument.slice(optionName.length + 3)) + } + } + + return values.length > 0 ? values.flatMap((value) => value.split(",")).filter(Boolean) : undefined } async function promptForWorkspaceNames(kind: "app" | "package", names: string[]) { @@ -209,37 +220,39 @@ async function cleanupTemplateFiles(rootDir: string) { } export default defineCommand({ - builder: (yargs) => - yargs - .option("name", { - describe: "Project name for the root package", - type: "string", - }) - .option("keep-apps", { - array: true, - describe: "Apps to keep (comma-separated or repeated)", - type: "string", - }) - .option("keep-packages", { - array: true, - describe: "Packages to keep (comma-separated or repeated)", - type: "string", - }) - .option("yes", { - describe: "Accept defaults for any option not provided and skip prompts", - type: "boolean", - }) - .option("git", { - describe: "Initialize a git repository; use --no-git to skip", - type: "boolean", - }) - .option("install", { - describe: "Run bun install; use --no-install to skip", - type: "boolean", - }), - command: "setup", - describe: "Select workspaces, rename the project, and remove template files", - handler: async (args) => { + args: { + git: { + description: "Initialize a git repository", + negativeDescription: "Skip git repository initialization", + type: "boolean", + }, + install: { + description: "Run bun install", + negativeDescription: "Skip bun install", + type: "boolean", + }, + "keep-apps": { + description: "Apps to keep (comma-separated or repeated)", + type: "string", + }, + "keep-packages": { + description: "Packages to keep (comma-separated or repeated)", + type: "string", + }, + name: { + description: "Project name for the root package", + type: "string", + }, + yes: { + description: "Accept defaults for any option not provided and skip prompts", + type: "boolean", + }, + }, + meta: { + description: "Select workspaces, rename the project, and remove template files", + name: "setup", + }, + run: async ({ args, rawArgs }) => { const rootDir = process.cwd() const yes = args.yes ?? false @@ -250,7 +263,7 @@ export default defineCommand({ const sourceScope = await getProjectScope(rootDir).catch(() => TEMPLATE_SCOPE) const keepApps = - getSelectedNames(args.keepApps) ?? + getOptionValues(rawArgs, "keep-apps") ?? (yes ? apps.map((workspace) => workspace.name) : await promptForWorkspaceNames( @@ -258,7 +271,7 @@ export default defineCommand({ apps.map((workspace) => workspace.name) )) const keepPackages = - getSelectedNames(args.keepPackages) ?? + getOptionValues(rawArgs, "keep-packages") ?? (yes ? packages.map((workspace) => workspace.name) : await promptForWorkspaceNames( diff --git a/scripts/utils.ts b/scripts/utils.ts deleted file mode 100644 index f6cb002c..00000000 --- a/scripts/utils.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { CommandModule } from "yargs" - -export function defineCommand(command: CommandModule) { - return command -} From 996b9efe8774690a230f70fcc0aa468c475fead0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 10:57:58 -0400 Subject: [PATCH 2/8] fix: preserve template CLI validation behavior --- scripts/template/__tests__/setup.test.ts | 19 ++++++++ scripts/template/add.ts | 6 +-- scripts/template/rename.ts | 4 +- scripts/template/setup.ts | 18 ++++--- scripts/utils.ts | 62 ++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 scripts/template/__tests__/setup.test.ts create mode 100644 scripts/utils.ts diff --git a/scripts/template/__tests__/setup.test.ts b/scripts/template/__tests__/setup.test.ts new file mode 100644 index 00000000..dc749a94 --- /dev/null +++ b/scripts/template/__tests__/setup.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from "bun:test" + +import { getOptionValues } from "../setup" + +describe("getOptionValues", () => { + test("reads kebab-case and camel-case options", () => { + expect(getOptionValues(["--keep-apps", "app,web"], "keep-apps")).toEqual(["app", "web"]) + expect(getOptionValues(["--keepApps", "app,web"], "keep-apps")).toEqual(["app", "web"]) + }) + + test("accumulates repeated and inline options", () => { + expect( + getOptionValues( + ["--keep-apps=app", "--keepApps", "web,docs", "--keep-apps=desktop"], + "keep-apps" + ) + ).toEqual(["app", "web", "docs", "desktop"]) + }) +}) diff --git a/scripts/template/add.ts b/scripts/template/add.ts index d39f2686..9e89e275 100644 --- a/scripts/template/add.ts +++ b/scripts/template/add.ts @@ -1,7 +1,7 @@ import { join } from "node:path" -import { defineCommand } from "citty" import consola from "consola" +import { defineTemplateCommand } from "../utils" import { restorePortlessWorkspaces } from "./portless" import { renameProject } from "./rename" import { @@ -128,10 +128,10 @@ async function addWorkspaces( ] } -export default defineCommand({ +export default defineTemplateCommand({ args: { kind: { - description: "Workspace type to add", + description: "Workspace type to add: app or package", required: true, type: "positional", }, diff --git a/scripts/template/rename.ts b/scripts/template/rename.ts index ef2f9ea8..f54dbc0e 100644 --- a/scripts/template/rename.ts +++ b/scripts/template/rename.ts @@ -1,7 +1,7 @@ import { join, resolve } from "node:path" -import { defineCommand } from "citty" import consola from "consola" +import { defineTemplateCommand } from "../utils" import { updatePortlessProjectName } from "./portless" import { checkIsPathWithinRoot, @@ -64,7 +64,7 @@ export async function renameProject({ return { changedFiles: [...changedFiles] } } -export default defineCommand({ +export default defineTemplateCommand({ args: { name: { description: "New root package name", diff --git a/scripts/template/setup.ts b/scripts/template/setup.ts index 94861a68..7f959dcb 100644 --- a/scripts/template/setup.ts +++ b/scripts/template/setup.ts @@ -1,7 +1,7 @@ import { join, relative } from "node:path" -import { defineCommand } from "citty" import consola from "consola" +import { defineTemplateCommand, normalizeOptionName } from "../utils" import { renameProject } from "./rename" import { getDependencyNames, @@ -23,15 +23,21 @@ type TemplateStamp = { template: "metaideas/init" } -function getOptionValues(rawArgs: string[], optionName: string) { +export function getOptionValues(rawArgs: string[], optionName: string) { const values: string[] = [] + const normalizedOptionName = normalizeOptionName(optionName) for (const [index, argument] of rawArgs.entries()) { - if (argument === `--${optionName}`) { + if (!argument.startsWith("--")) continue + + const [name, inlineValue] = argument.slice(2).split("=", 2) + if (!name || normalizeOptionName(name) !== normalizedOptionName) continue + + if (inlineValue === undefined) { const value = rawArgs[index + 1] if (value && !value.startsWith("-")) values.push(value) - } else if (argument.startsWith(`--${optionName}=`)) { - values.push(argument.slice(optionName.length + 3)) + } else { + values.push(inlineValue) } } @@ -219,7 +225,7 @@ async function cleanupTemplateFiles(rootDir: string) { await writeJson(packageJsonPath, packageJson) } -export default defineCommand({ +export default defineTemplateCommand({ args: { git: { description: "Initialize a git repository", diff --git a/scripts/utils.ts b/scripts/utils.ts new file mode 100644 index 00000000..7cdc1e75 --- /dev/null +++ b/scripts/utils.ts @@ -0,0 +1,62 @@ +import { defineCommand, type ArgsDef, type CommandContext, type CommandDef } from "citty" +import consola from "consola" +import { isFault } from "faultier" + +export function defineTemplateCommand(definition: CommandDef) { + const run = definition.run + + return defineCommand({ + ...definition, + run: run + ? async (context: CommandContext) => { + try { + const unknownOption = getUnknownOption(context.rawArgs, definition.args as T) + if (unknownOption) { + consola.error(`Unknown option: --${unknownOption}`) + process.exitCode = 1 + return + } + + await run(context) + } catch (error) { + if (!isFault(error)) throw error + + consola.error(error.flatten()) + + const details = error.flatten({ field: "details" }) + if (details) consola.error(details) + process.exitCode = 1 + } + } + : undefined, + }) +} + +function getUnknownOption(rawArgs: string[], args: ArgsDef): string | undefined { + const knownNames = new Set() + + for (const [name, definition] of Object.entries(args)) { + knownNames.add(normalizeOptionName(name)) + const aliases = "alias" in definition ? getAliases(definition.alias) : [] + for (const alias of aliases) knownNames.add(normalizeOptionName(alias)) + } + + for (const argument of rawArgs) { + if (argument === "--") break + if (!argument.startsWith("--")) continue + + const name = argument.slice(2).split("=", 1)[0]?.replace(/^no-/, "") + if (name && !knownNames.has(normalizeOptionName(name))) return name + } + + return undefined +} + +function getAliases(alias: string | string[] | undefined) { + if (!alias) return [] + return Array.isArray(alias) ? alias : [alias] +} + +export function normalizeOptionName(name: string) { + return name.replaceAll(/-([a-z])/g, (_, letter: string) => letter.toUpperCase()) +} From ed187fcde9f452761f06b32556b515a74548c990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 11:10:42 -0400 Subject: [PATCH 3/8] fix: reject misplaced template options --- scripts/__tests__/utils.test.ts | 33 +++++++++++++++++++++++++++++++++ scripts/index.ts | 14 +++++++++++++- scripts/utils.ts | 26 ++++++++++++++++++++++---- 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 scripts/__tests__/utils.test.ts diff --git a/scripts/__tests__/utils.test.ts b/scripts/__tests__/utils.test.ts new file mode 100644 index 00000000..0a88fc2c --- /dev/null +++ b/scripts/__tests__/utils.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, test } from "bun:test" + +import { getOptionBeforeCommand, getUnknownOption } from "../utils" + +describe("getUnknownOption", () => { + const args = { + "keep-apps": { type: "string" as const }, + yes: { type: "boolean" as const }, + } + + test("accepts declared kebab-case and camel-case options", () => { + expect(getUnknownOption(["--keep-apps", "app", "--yes"], args)).toBeUndefined() + expect(getUnknownOption(["--keepApps=app", "--no-yes"], args)).toBeUndefined() + }) + + test("returns an unknown option", () => { + expect(getUnknownOption(["--keepApp", "app"], args)).toBe("keepApp") + }) +}) + +describe("getOptionBeforeCommand", () => { + const commandNames = new Set(["add", "rename", "setup"]) + + test("returns an option before a leaf command", () => { + expect(getOptionBeforeCommand(["template", "--yes", "setup"], commandNames)).toBe("yes") + expect(getOptionBeforeCommand(["--bogus", "template", "rename"], commandNames)).toBe("bogus") + }) + + test("accepts options after a leaf command and built-in help", () => { + expect(getOptionBeforeCommand(["template", "setup", "--yes"], commandNames)).toBeNull() + expect(getOptionBeforeCommand(["template", "--help"], commandNames)).toBeNull() + }) +}) diff --git a/scripts/index.ts b/scripts/index.ts index 783a5ea9..14a5d9a6 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -1,6 +1,10 @@ import { defineCommand, runMain } from "citty" +import consola from "consola" import template from "./template" +import { getOptionBeforeCommand } from "./utils" + +const templateCommandNames = new Set(["add", "rename", "setup"]) const main = defineCommand({ meta: { @@ -12,4 +16,12 @@ const main = defineCommand({ }, }) -await runMain(main) +const rawArgs = process.argv.slice(2) +const misplacedOption = getOptionBeforeCommand(rawArgs, templateCommandNames) + +if (misplacedOption) { + consola.error(`Place --${misplacedOption} after the template subcommand.`) + process.exitCode = 1 +} else { + await runMain(main, { rawArgs }) +} diff --git a/scripts/utils.ts b/scripts/utils.ts index 7cdc1e75..f4ee1f29 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -1,8 +1,14 @@ -import { defineCommand, type ArgsDef, type CommandContext, type CommandDef } from "citty" +import { defineCommand, showUsage, type ArgsDef, type CommandContext, type CommandDef } from "citty" import consola from "consola" import { isFault } from "faultier" -export function defineTemplateCommand(definition: CommandDef) { +type TemplateCommandDefinition = Omit, "args"> & { + args: T +} + +export function defineTemplateCommand( + definition: TemplateCommandDefinition +) { const run = definition.run return defineCommand({ @@ -10,8 +16,9 @@ export function defineTemplateCommand(definition: Comma run: run ? async (context: CommandContext) => { try { - const unknownOption = getUnknownOption(context.rawArgs, definition.args as T) + const unknownOption = getUnknownOption(context.rawArgs, definition.args) if (unknownOption) { + await showUsage(context.cmd) consola.error(`Unknown option: --${unknownOption}`) process.exitCode = 1 return @@ -32,7 +39,7 @@ export function defineTemplateCommand(definition: Comma }) } -function getUnknownOption(rawArgs: string[], args: ArgsDef): string | undefined { +export function getUnknownOption(rawArgs: string[], args: ArgsDef): string | undefined { const knownNames = new Set() for (const [name, definition] of Object.entries(args)) { @@ -52,6 +59,17 @@ function getUnknownOption(rawArgs: string[], args: ArgsDef): string | undefined return undefined } +export function getOptionBeforeCommand(rawArgs: string[], commandNames: ReadonlySet) { + for (const argument of rawArgs) { + if (commandNames.has(argument)) return null + if (!argument.startsWith("--") || argument === "--help" || argument === "--version") continue + + return argument.slice(2).split("=", 1)[0] + } + + return null +} + function getAliases(alias: string | string[] | undefined) { if (!alias) return [] return Array.isArray(alias) ? alias : [alias] From aa87a9f7b4a49e936ecc23529f64bf6172a95314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 11:40:35 -0400 Subject: [PATCH 4/8] fix: derive template option validation commands --- scripts/__tests__/utils.test.ts | 20 +++++++++++++++----- scripts/index.ts | 10 ++++++---- scripts/template/index.ts | 12 +++++++----- scripts/utils.ts | 18 +++++++++++------- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/scripts/__tests__/utils.test.ts b/scripts/__tests__/utils.test.ts index 0a88fc2c..6a2b7c08 100644 --- a/scripts/__tests__/utils.test.ts +++ b/scripts/__tests__/utils.test.ts @@ -19,15 +19,25 @@ describe("getUnknownOption", () => { }) describe("getOptionBeforeCommand", () => { - const commandNames = new Set(["add", "rename", "setup"]) + const commandNames = new Set(["setup"]) test("returns an option before a leaf command", () => { - expect(getOptionBeforeCommand(["template", "--yes", "setup"], commandNames)).toBe("yes") - expect(getOptionBeforeCommand(["--bogus", "template", "rename"], commandNames)).toBe("bogus") + expect(getOptionBeforeCommand(["template", "--yes", "setup"], "template", commandNames)).toBe( + "yes" + ) }) test("accepts options after a leaf command and built-in help", () => { - expect(getOptionBeforeCommand(["template", "setup", "--yes"], commandNames)).toBeNull() - expect(getOptionBeforeCommand(["template", "--help"], commandNames)).toBeNull() + expect( + getOptionBeforeCommand(["template", "setup", "--yes"], "template", commandNames) + ).toBeNull() + expect(getOptionBeforeCommand(["template", "--help"], "template", commandNames)).toBeNull() + }) + + test("leaves unknown and root commands to citty", () => { + expect( + getOptionBeforeCommand(["template", "nope", "--flag"], "template", commandNames) + ).toBeNull() + expect(getOptionBeforeCommand(["nope", "--flag"], "template", commandNames)).toBeNull() }) }) diff --git a/scripts/index.ts b/scripts/index.ts index 14a5d9a6..1cbd3c0b 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -1,11 +1,9 @@ import { defineCommand, runMain } from "citty" import consola from "consola" -import template from "./template" +import template, { templateSubCommands } from "./template" import { getOptionBeforeCommand } from "./utils" -const templateCommandNames = new Set(["add", "rename", "setup"]) - const main = defineCommand({ meta: { description: "Run project and template commands", @@ -17,7 +15,11 @@ const main = defineCommand({ }) const rawArgs = process.argv.slice(2) -const misplacedOption = getOptionBeforeCommand(rawArgs, templateCommandNames) +const misplacedOption = getOptionBeforeCommand( + rawArgs, + "template", + new Set(Object.keys(templateSubCommands)) +) if (misplacedOption) { consola.error(`Place --${misplacedOption} after the template subcommand.`) diff --git a/scripts/template/index.ts b/scripts/template/index.ts index 3e843daa..324f34de 100644 --- a/scripts/template/index.ts +++ b/scripts/template/index.ts @@ -4,14 +4,16 @@ import add from "./add" import rename from "./rename" import setup from "./setup" +export const templateSubCommands = { + add, + rename, + setup, +} + export default defineCommand({ meta: { description: "Configure and maintain this template project", name: "template", }, - subCommands: { - add, - rename, - setup, - }, + subCommands: templateSubCommands, }) diff --git a/scripts/utils.ts b/scripts/utils.ts index f4ee1f29..e97b1e8b 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -59,13 +59,17 @@ export function getUnknownOption(rawArgs: string[], args: ArgsDef): string | und return undefined } -export function getOptionBeforeCommand(rawArgs: string[], commandNames: ReadonlySet) { - for (const argument of rawArgs) { - if (commandNames.has(argument)) return null - if (!argument.startsWith("--") || argument === "--help" || argument === "--version") continue - - return argument.slice(2).split("=", 1)[0] - } +export function getOptionBeforeCommand( + rawArgs: string[], + parentCommandName: string, + commandNames: ReadonlySet +) { + if (rawArgs[0] !== parentCommandName) return null + const argument = rawArgs[1] + if (!argument || commandNames.has(argument)) return null + if (argument === "--" || argument === "--help" || argument === "-h") return null + if ((argument === "--version" || argument === "-v") && rawArgs.length === 2) return null + if (argument.startsWith("-")) return argument.replace(/^-+/, "").split("=", 1)[0] return null } From cbceb9b66c5af27509ea7e9e66d8f99aabf37433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 12:06:18 -0400 Subject: [PATCH 5/8] fix: reject leading template options --- scripts/__tests__/utils.test.ts | 6 +++++- scripts/index.ts | 2 +- scripts/utils.ts | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/scripts/__tests__/utils.test.ts b/scripts/__tests__/utils.test.ts index 6a2b7c08..5ee25bff 100644 --- a/scripts/__tests__/utils.test.ts +++ b/scripts/__tests__/utils.test.ts @@ -23,8 +23,12 @@ describe("getOptionBeforeCommand", () => { test("returns an option before a leaf command", () => { expect(getOptionBeforeCommand(["template", "--yes", "setup"], "template", commandNames)).toBe( - "yes" + "--yes" ) + expect(getOptionBeforeCommand(["--bogus", "template", "setup"], "template", commandNames)).toBe( + "--bogus" + ) + expect(getOptionBeforeCommand(["template", "-x", "setup"], "template", commandNames)).toBe("-x") }) test("accepts options after a leaf command and built-in help", () => { diff --git a/scripts/index.ts b/scripts/index.ts index 1cbd3c0b..30e51dd0 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -22,7 +22,7 @@ const misplacedOption = getOptionBeforeCommand( ) if (misplacedOption) { - consola.error(`Place --${misplacedOption} after the template subcommand.`) + consola.error(`Place ${misplacedOption} after the template subcommand.`) process.exitCode = 1 } else { await runMain(main, { rawArgs }) diff --git a/scripts/utils.ts b/scripts/utils.ts index e97b1e8b..68d56e01 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -64,12 +64,19 @@ export function getOptionBeforeCommand( parentCommandName: string, commandNames: ReadonlySet ) { - if (rawArgs[0] !== parentCommandName) return null - const argument = rawArgs[1] + if (rawArgs.includes("--help") || rawArgs.includes("-h")) return null + + const parentCommandIndex = rawArgs.findIndex((argument) => !argument.startsWith("-")) + if (parentCommandIndex === -1 || rawArgs[parentCommandIndex] !== parentCommandName) return null + + const leadingOption = rawArgs.slice(0, parentCommandIndex).find((argument) => argument !== "--") + if (leadingOption) return leadingOption + + const argument = rawArgs[parentCommandIndex + 1] if (!argument || commandNames.has(argument)) return null - if (argument === "--" || argument === "--help" || argument === "-h") return null - if ((argument === "--version" || argument === "-v") && rawArgs.length === 2) return null - if (argument.startsWith("-")) return argument.replace(/^-+/, "").split("=", 1)[0] + if (argument === "--") return null + if ((argument === "--version" || argument === "-v") && rawArgs.length === 1) return null + if (argument.startsWith("-")) return argument.split("=", 1)[0] return null } From 9b8f8c8efcc5253270a97704bce0c388a57558f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Tue, 18 Aug 2026 12:15:28 -0400 Subject: [PATCH 6/8] fix: remove dead template option branch --- scripts/__tests__/utils.test.ts | 3 +++ scripts/utils.ts | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/__tests__/utils.test.ts b/scripts/__tests__/utils.test.ts index 5ee25bff..8372f1ee 100644 --- a/scripts/__tests__/utils.test.ts +++ b/scripts/__tests__/utils.test.ts @@ -28,6 +28,9 @@ describe("getOptionBeforeCommand", () => { expect(getOptionBeforeCommand(["--bogus", "template", "setup"], "template", commandNames)).toBe( "--bogus" ) + expect( + getOptionBeforeCommand(["--bogus=value", "template", "setup"], "template", commandNames) + ).toBe("--bogus") expect(getOptionBeforeCommand(["template", "-x", "setup"], "template", commandNames)).toBe("-x") }) diff --git a/scripts/utils.ts b/scripts/utils.ts index 68d56e01..6c5c5cae 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -70,12 +70,11 @@ export function getOptionBeforeCommand( if (parentCommandIndex === -1 || rawArgs[parentCommandIndex] !== parentCommandName) return null const leadingOption = rawArgs.slice(0, parentCommandIndex).find((argument) => argument !== "--") - if (leadingOption) return leadingOption + if (leadingOption) return leadingOption.split("=", 1)[0] const argument = rawArgs[parentCommandIndex + 1] if (!argument || commandNames.has(argument)) return null if (argument === "--") return null - if ((argument === "--version" || argument === "-v") && rawArgs.length === 1) return null if (argument.startsWith("-")) return argument.split("=", 1)[0] return null From b43ee3ef19b8a33510a202d1a97bfd9f2a8091e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Wed, 19 Aug 2026 10:46:34 -0400 Subject: [PATCH 7/8] refactor(scripts): simplify citty commands --- bun.lock | 1 - package.json | 1 - scripts/__tests__/utils.test.ts | 50 ------------- scripts/index.ts | 18 +---- scripts/template/__tests__/setup.test.ts | 19 ----- scripts/template/add.ts | 23 ++---- scripts/template/index.ts | 4 +- scripts/template/rename.ts | 25 ++----- scripts/template/setup.ts | 67 ++++-------------- scripts/template/shared.ts | 52 ++------------ scripts/utils.ts | 90 ------------------------ 11 files changed, 34 insertions(+), 316 deletions(-) delete mode 100644 scripts/__tests__/utils.test.ts delete mode 100644 scripts/template/__tests__/setup.test.ts delete mode 100644 scripts/utils.ts diff --git a/bun.lock b/bun.lock index 48331e26..fe27ee91 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,6 @@ "adamantite": "0.35.0", "citty": "0.2.2", "consola": "3.4.2", - "faultier": "3.0.1", "knip": "6.32.2", "oxfmt": "0.63.0", "oxlint": "1.78.0", diff --git a/package.json b/package.json index 9f98897a..823ed0e2 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "adamantite": "0.35.0", "citty": "0.2.2", "consola": "3.4.2", - "faultier": "3.0.1", "knip": "6.32.2", "oxfmt": "0.63.0", "oxlint": "1.78.0", diff --git a/scripts/__tests__/utils.test.ts b/scripts/__tests__/utils.test.ts deleted file mode 100644 index 8372f1ee..00000000 --- a/scripts/__tests__/utils.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { describe, expect, test } from "bun:test" - -import { getOptionBeforeCommand, getUnknownOption } from "../utils" - -describe("getUnknownOption", () => { - const args = { - "keep-apps": { type: "string" as const }, - yes: { type: "boolean" as const }, - } - - test("accepts declared kebab-case and camel-case options", () => { - expect(getUnknownOption(["--keep-apps", "app", "--yes"], args)).toBeUndefined() - expect(getUnknownOption(["--keepApps=app", "--no-yes"], args)).toBeUndefined() - }) - - test("returns an unknown option", () => { - expect(getUnknownOption(["--keepApp", "app"], args)).toBe("keepApp") - }) -}) - -describe("getOptionBeforeCommand", () => { - const commandNames = new Set(["setup"]) - - test("returns an option before a leaf command", () => { - expect(getOptionBeforeCommand(["template", "--yes", "setup"], "template", commandNames)).toBe( - "--yes" - ) - expect(getOptionBeforeCommand(["--bogus", "template", "setup"], "template", commandNames)).toBe( - "--bogus" - ) - expect( - getOptionBeforeCommand(["--bogus=value", "template", "setup"], "template", commandNames) - ).toBe("--bogus") - expect(getOptionBeforeCommand(["template", "-x", "setup"], "template", commandNames)).toBe("-x") - }) - - test("accepts options after a leaf command and built-in help", () => { - expect( - getOptionBeforeCommand(["template", "setup", "--yes"], "template", commandNames) - ).toBeNull() - expect(getOptionBeforeCommand(["template", "--help"], "template", commandNames)).toBeNull() - }) - - test("leaves unknown and root commands to citty", () => { - expect( - getOptionBeforeCommand(["template", "nope", "--flag"], "template", commandNames) - ).toBeNull() - expect(getOptionBeforeCommand(["nope", "--flag"], "template", commandNames)).toBeNull() - }) -}) diff --git a/scripts/index.ts b/scripts/index.ts index 30e51dd0..783a5ea9 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -1,8 +1,6 @@ import { defineCommand, runMain } from "citty" -import consola from "consola" -import template, { templateSubCommands } from "./template" -import { getOptionBeforeCommand } from "./utils" +import template from "./template" const main = defineCommand({ meta: { @@ -14,16 +12,4 @@ const main = defineCommand({ }, }) -const rawArgs = process.argv.slice(2) -const misplacedOption = getOptionBeforeCommand( - rawArgs, - "template", - new Set(Object.keys(templateSubCommands)) -) - -if (misplacedOption) { - consola.error(`Place ${misplacedOption} after the template subcommand.`) - process.exitCode = 1 -} else { - await runMain(main, { rawArgs }) -} +await runMain(main) diff --git a/scripts/template/__tests__/setup.test.ts b/scripts/template/__tests__/setup.test.ts deleted file mode 100644 index dc749a94..00000000 --- a/scripts/template/__tests__/setup.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { describe, expect, test } from "bun:test" - -import { getOptionValues } from "../setup" - -describe("getOptionValues", () => { - test("reads kebab-case and camel-case options", () => { - expect(getOptionValues(["--keep-apps", "app,web"], "keep-apps")).toEqual(["app", "web"]) - expect(getOptionValues(["--keepApps", "app,web"], "keep-apps")).toEqual(["app", "web"]) - }) - - test("accumulates repeated and inline options", () => { - expect( - getOptionValues( - ["--keep-apps=app", "--keepApps", "web,docs", "--keep-apps=desktop"], - "keep-apps" - ) - ).toEqual(["app", "web", "docs", "desktop"]) - }) -}) diff --git a/scripts/template/add.ts b/scripts/template/add.ts index 9e89e275..616c189a 100644 --- a/scripts/template/add.ts +++ b/scripts/template/add.ts @@ -1,7 +1,7 @@ import { join } from "node:path" import consola from "consola" -import { defineTemplateCommand } from "../utils" +import { defineCommand } from "citty" import { restorePortlessWorkspaces } from "./portless" import { renameProject } from "./rename" import { @@ -11,7 +11,6 @@ import { readJson, runCommand, TEMPLATE_SCOPE, - TemplateFault, type WorkspaceKind, } from "./shared" @@ -55,12 +54,8 @@ async function copyTemplateWorkspace(rootDir: string, workspace: TemplateWorkspa const packageJsonPath = join(rootDir, workspacePath, "package.json") if (!(await Bun.file(packageJsonPath).exists())) { - throw TemplateFault.create("CommandFailedError", { - command: command.join(" "), - exitCode: 1, - }).withDescription( - `Command failed: ${command.join(" ")}.`, - `The generator did not create the ${workspacePath} workspace.` + throw new Error( + `Command failed: ${command.join(" ")}. The generator did not create the ${workspacePath} workspace.` ) } @@ -128,7 +123,7 @@ async function addWorkspaces( ] } -export default defineTemplateCommand({ +export default defineCommand({ args: { kind: { description: "Workspace type to add: app or package", @@ -147,10 +142,7 @@ export default defineTemplateCommand({ }, run: async ({ args }) => { if (args.kind !== "app" && args.kind !== "package") { - throw TemplateFault.create("InvalidArgumentsError").withDescription( - `Unknown workspace type: ${args.kind}.`, - "The workspace type must be app or package." - ) + throw new Error(`Unknown workspace type: ${args.kind}. Use app or package.`) } const rootDir = process.cwd() @@ -159,10 +151,7 @@ export default defineTemplateCommand({ const targetPath = getWorkspacePath(target) if (await Bun.file(join(rootDir, targetPath, "package.json")).exists()) { - throw TemplateFault.create("InvalidArgumentsError").withDescription( - `The ${targetPath} workspace already exists in this project.`, - "Remove it first if you want to copy it again from the template." - ) + throw new Error(`The ${targetPath} workspace already exists in this project.`) } const copiedPaths = await addWorkspaces(rootDir, scope, [target], new Set([targetPath])) diff --git a/scripts/template/index.ts b/scripts/template/index.ts index 324f34de..679143a4 100644 --- a/scripts/template/index.ts +++ b/scripts/template/index.ts @@ -4,7 +4,7 @@ import add from "./add" import rename from "./rename" import setup from "./setup" -export const templateSubCommands = { +const subCommands = { add, rename, setup, @@ -15,5 +15,5 @@ export default defineCommand({ description: "Configure and maintain this template project", name: "template", }, - subCommands: templateSubCommands, + subCommands, }) diff --git a/scripts/template/rename.ts b/scripts/template/rename.ts index f54dbc0e..669f0df6 100644 --- a/scripts/template/rename.ts +++ b/scripts/template/rename.ts @@ -1,7 +1,7 @@ import { join, resolve } from "node:path" +import { defineCommand } from "citty" import consola from "consola" -import { defineTemplateCommand } from "../utils" import { updatePortlessProjectName } from "./portless" import { checkIsPathWithinRoot, @@ -10,7 +10,6 @@ import { normalizeScope, readJson, replaceTextInFiles, - TemplateFault, writeJson, } from "./shared" @@ -64,7 +63,7 @@ export async function renameProject({ return { changedFiles: [...changedFiles] } } -export default defineTemplateCommand({ +export default defineCommand({ args: { name: { description: "New root package name", @@ -87,32 +86,20 @@ export default defineTemplateCommand({ const projectRoot = resolve(process.cwd()) const projectName = args.name if (!args.workspace && !projectName) { - throw TemplateFault.create("InvalidArgumentsError").withDescription( - "Provide --name when renaming a project.", - "A project rename requires --name when --workspace is not set." - ) + throw new Error("Provide --name when you rename a project.") } const scope = args.scope ?? projectName if (!scope) { - throw TemplateFault.create("InvalidArgumentsError").withDescription( - "Provide --scope when renaming a workspace.", - "A workspace rename requires --scope when --name is not set." - ) + throw new Error("Provide --scope when you rename a workspace.") } const rootDir = args.workspace ? resolve(projectRoot, args.workspace) : projectRoot if (args.workspace && !checkIsPathWithinRoot(projectRoot, rootDir)) { - throw TemplateFault.create("PathEscapeError", { path: args.workspace }).withDescription( - "Workspace path must be inside the project.", - `Resolved workspace path: ${rootDir}.` - ) + throw new Error(`Workspace path must be inside the project: ${rootDir}.`) } if (!(await Bun.file(join(rootDir, "package.json")).exists())) { - throw TemplateFault.create("InvalidArgumentsError").withDescription( - "Workspace path must contain a package.json file.", - `Resolved workspace path: ${rootDir}.` - ) + throw new Error(`Workspace path must contain a package.json file: ${rootDir}.`) } const result = await renameProject({ diff --git a/scripts/template/setup.ts b/scripts/template/setup.ts index 7f959dcb..61a99174 100644 --- a/scripts/template/setup.ts +++ b/scripts/template/setup.ts @@ -1,7 +1,7 @@ import { join, relative } from "node:path" +import { defineCommand } from "citty" import consola from "consola" -import { defineTemplateCommand, normalizeOptionName } from "../utils" import { renameProject } from "./rename" import { getDependencyNames, @@ -11,7 +11,6 @@ import { removePath, runCommand, TEMPLATE_SCOPE, - TemplateFault, type Workspace, type WorkspaceKind, writeJson, @@ -23,27 +22,6 @@ type TemplateStamp = { template: "metaideas/init" } -export function getOptionValues(rawArgs: string[], optionName: string) { - const values: string[] = [] - const normalizedOptionName = normalizeOptionName(optionName) - - for (const [index, argument] of rawArgs.entries()) { - if (!argument.startsWith("--")) continue - - const [name, inlineValue] = argument.slice(2).split("=", 2) - if (!name || normalizeOptionName(name) !== normalizedOptionName) continue - - if (inlineValue === undefined) { - const value = rawArgs[index + 1] - if (value && !value.startsWith("-")) values.push(value) - } else { - values.push(inlineValue) - } - } - - return values.length > 0 ? values.flatMap((value) => value.split(",")).filter(Boolean) : undefined -} - async function promptForWorkspaceNames(kind: "app" | "package", names: string[]) { const selected = (await consola.prompt(`Select ${kind}s to keep`, { cancel: "reject", @@ -75,27 +53,17 @@ async function getCommit() { try { const response = await fetch("https://api.github.com/repos/metaideas/init/commits/main") if (!response.ok) { - throw TemplateFault.create("TemplateFetchError").withDescription( - "Could not fetch the template commit.", - `GitHub returned ${response.status}.` - ) + throw new Error(`Could not fetch the template commit. GitHub returned ${response.status}.`) } const body = (await response.json()) as { sha?: unknown } if (typeof body.sha !== "string") { - throw TemplateFault.create("TemplateFetchError").withDescription( - "Could not fetch the template commit.", - "GitHub did not return a commit SHA." - ) + throw new Error("Could not fetch the template commit. GitHub did not return a commit SHA.") } return body.sha } catch (error) { - if (TemplateFault.is(error)) throw error - - throw TemplateFault.wrap(error) - .as("TemplateFetchError") - .withDescription("Could not fetch the template commit.", "GitHub request failed.") + throw new Error("Could not fetch the template commit.", { cause: error }) } } @@ -108,12 +76,7 @@ async function writeTemplateStamp(rootDir: string) { try { stamp.commit = await getCommit() } catch (error) { - const fault = TemplateFault.is(error) - ? error - : TemplateFault.wrap(error) - .as("TemplateFetchError") - .withDescription("Could not fetch the template commit.", "GitHub request failed.") - consola.warn(fault.flatten()) + consola.warn(error) } await writeJson(join(rootDir, ".template.json"), stamp) @@ -122,12 +85,8 @@ async function writeTemplateStamp(rootDir: string) { function validateSelection(kind: WorkspaceKind, selected: string[], available: string[]) { const unknown = selected.filter((name) => !available.includes(name)) if (unknown.length > 0) { - throw TemplateFault.create("UnknownWorkspaceError", { - kind, - names: unknown.join(", "), - }).withDescription( - `Unknown ${kind} workspace(s): ${unknown.join(", ")}`, - `Available ${kind} workspaces: ${available.join(", ") || "none"}.` + throw new Error( + `Unknown ${kind} workspace(s): ${unknown.join(", ")}. Available: ${available.join(", ") || "none"}.` ) } } @@ -225,7 +184,7 @@ async function cleanupTemplateFiles(rootDir: string) { await writeJson(packageJsonPath, packageJson) } -export default defineTemplateCommand({ +export default defineCommand({ args: { git: { description: "Initialize a git repository", @@ -238,11 +197,11 @@ export default defineTemplateCommand({ type: "boolean", }, "keep-apps": { - description: "Apps to keep (comma-separated or repeated)", + description: "Apps to keep (comma-separated)", type: "string", }, "keep-packages": { - description: "Packages to keep (comma-separated or repeated)", + description: "Packages to keep (comma-separated)", type: "string", }, name: { @@ -258,7 +217,7 @@ export default defineTemplateCommand({ description: "Select workspaces, rename the project, and remove template files", name: "setup", }, - run: async ({ args, rawArgs }) => { + run: async ({ args }) => { const rootDir = process.cwd() const yes = args.yes ?? false @@ -269,7 +228,7 @@ export default defineTemplateCommand({ const sourceScope = await getProjectScope(rootDir).catch(() => TEMPLATE_SCOPE) const keepApps = - getOptionValues(rawArgs, "keep-apps") ?? + args["keep-apps"]?.split(",").filter(Boolean) ?? (yes ? apps.map((workspace) => workspace.name) : await promptForWorkspaceNames( @@ -277,7 +236,7 @@ export default defineTemplateCommand({ apps.map((workspace) => workspace.name) )) const keepPackages = - getOptionValues(rawArgs, "keep-packages") ?? + args["keep-packages"]?.split(",").filter(Boolean) ?? (yes ? packages.map((workspace) => workspace.name) : await promptForWorkspaceNames( diff --git a/scripts/template/shared.ts b/scripts/template/shared.ts index d88fa58d..0579be52 100644 --- a/scripts/template/shared.ts +++ b/scripts/template/shared.ts @@ -1,36 +1,4 @@ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path" -import * as Faultier from "faultier" - -export class CommandFailedError extends Faultier.Tagged("CommandFailedError")<{ - command: string - exitCode: number -}>() {} - -export class InvalidArgumentsError extends Faultier.Tagged("InvalidArgumentsError")() {} - -export class InvalidScopeError extends Faultier.Tagged("InvalidScopeError")<{ - scope: string -}>() {} - -export class PathEscapeError extends Faultier.Tagged("PathEscapeError")<{ - path: string -}>() {} - -export class TemplateFetchError extends Faultier.Tagged("TemplateFetchError")() {} - -export class UnknownWorkspaceError extends Faultier.Tagged("UnknownWorkspaceError")<{ - kind: string - names: string -}>() {} - -export const TemplateFault = Faultier.registry({ - CommandFailedError, - InvalidArgumentsError, - InvalidScopeError, - PathEscapeError, - TemplateFetchError, - UnknownWorkspaceError, -}) export const TEMPLATE_SCOPE = "init" @@ -55,9 +23,8 @@ export function normalizeScope(scope: string) { const normalizedScope = scope.replace(/^@/, "").trim() if (!/^[a-z0-9][a-z0-9-]*$/i.test(normalizedScope)) { - throw TemplateFault.create("InvalidScopeError", { scope }).withDescription( - "The npm scope must contain only letters, numbers, and dashes.", - `Received scope: ${JSON.stringify(scope)}.` + throw new Error( + `The npm scope must contain only letters, numbers, and dashes. Received: ${JSON.stringify(scope)}.` ) } @@ -163,10 +130,7 @@ export async function getProjectScope(rootDir: string) { const scope = match?.[1] if (scope) return normalizeScope(scope) - throw TemplateFault.create("InvalidScopeError", { scope: "" }).withDescription( - "Could not determine the project npm scope from its workspaces.", - "No workspace package name contains an npm scope." - ) + throw new Error("Could not determine the project npm scope from its workspaces.") } export function checkIsPathWithinRoot(rootDir: string, path: string) { @@ -185,10 +149,7 @@ export async function removePath(rootDir: string, relativePath: string) { const path = resolve(resolvedRootDir, relativePath) if (!checkIsPathWithinRoot(resolvedRootDir, path)) { - throw TemplateFault.create("PathEscapeError", { path: relativePath }).withDescription( - `Cleanup path must be within the project: ${relativePath}`, - `Resolved cleanup path: ${path}.` - ) + throw new Error(`Cleanup path must be within the project: ${relativePath}.`) } await Bun.$`rm -rf ${path}`.quiet() @@ -203,9 +164,6 @@ export async function runCommand(command: string[], rootDir: string) { const exitCode = await process.exited if (exitCode !== 0) { - throw TemplateFault.create("CommandFailedError", { - command: command.join(" "), - exitCode, - }).withDescription(`Command failed: ${command.join(" ")}.`, `Exited with code ${exitCode}.`) + throw new Error(`Command failed: ${command.join(" ")}. Exited with code ${exitCode}.`) } } diff --git a/scripts/utils.ts b/scripts/utils.ts deleted file mode 100644 index 6c5c5cae..00000000 --- a/scripts/utils.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { defineCommand, showUsage, type ArgsDef, type CommandContext, type CommandDef } from "citty" -import consola from "consola" -import { isFault } from "faultier" - -type TemplateCommandDefinition = Omit, "args"> & { - args: T -} - -export function defineTemplateCommand( - definition: TemplateCommandDefinition -) { - const run = definition.run - - return defineCommand({ - ...definition, - run: run - ? async (context: CommandContext) => { - try { - const unknownOption = getUnknownOption(context.rawArgs, definition.args) - if (unknownOption) { - await showUsage(context.cmd) - consola.error(`Unknown option: --${unknownOption}`) - process.exitCode = 1 - return - } - - await run(context) - } catch (error) { - if (!isFault(error)) throw error - - consola.error(error.flatten()) - - const details = error.flatten({ field: "details" }) - if (details) consola.error(details) - process.exitCode = 1 - } - } - : undefined, - }) -} - -export function getUnknownOption(rawArgs: string[], args: ArgsDef): string | undefined { - const knownNames = new Set() - - for (const [name, definition] of Object.entries(args)) { - knownNames.add(normalizeOptionName(name)) - const aliases = "alias" in definition ? getAliases(definition.alias) : [] - for (const alias of aliases) knownNames.add(normalizeOptionName(alias)) - } - - for (const argument of rawArgs) { - if (argument === "--") break - if (!argument.startsWith("--")) continue - - const name = argument.slice(2).split("=", 1)[0]?.replace(/^no-/, "") - if (name && !knownNames.has(normalizeOptionName(name))) return name - } - - return undefined -} - -export function getOptionBeforeCommand( - rawArgs: string[], - parentCommandName: string, - commandNames: ReadonlySet -) { - if (rawArgs.includes("--help") || rawArgs.includes("-h")) return null - - const parentCommandIndex = rawArgs.findIndex((argument) => !argument.startsWith("-")) - if (parentCommandIndex === -1 || rawArgs[parentCommandIndex] !== parentCommandName) return null - - const leadingOption = rawArgs.slice(0, parentCommandIndex).find((argument) => argument !== "--") - if (leadingOption) return leadingOption.split("=", 1)[0] - - const argument = rawArgs[parentCommandIndex + 1] - if (!argument || commandNames.has(argument)) return null - if (argument === "--") return null - if (argument.startsWith("-")) return argument.split("=", 1)[0] - - return null -} - -function getAliases(alias: string | string[] | undefined) { - if (!alias) return [] - return Array.isArray(alias) ? alias : [alias] -} - -export function normalizeOptionName(name: string) { - return name.replaceAll(/-([a-z])/g, (_, letter: string) => letter.toUpperCase()) -} From f3549299461fca0f9c4b8d9a32e9f8d76fe11353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adel=20Rodr=C3=ADguez?= Date: Wed, 19 Aug 2026 11:11:26 -0400 Subject: [PATCH 8/8] fix(scripts): print concise validation errors --- scripts/template/add.ts | 8 +++- scripts/template/rename.ts | 23 ++++++++-- scripts/template/setup.ts | 86 ++++++++++++++++++++++++++++++-------- 3 files changed, 94 insertions(+), 23 deletions(-) diff --git a/scripts/template/add.ts b/scripts/template/add.ts index 616c189a..8584d206 100644 --- a/scripts/template/add.ts +++ b/scripts/template/add.ts @@ -142,7 +142,9 @@ export default defineCommand({ }, run: async ({ args }) => { if (args.kind !== "app" && args.kind !== "package") { - throw new Error(`Unknown workspace type: ${args.kind}. Use app or package.`) + consola.error(`Unknown workspace type: ${args.kind}. Use app or package.`) + process.exitCode = 1 + return } const rootDir = process.cwd() @@ -151,7 +153,9 @@ export default defineCommand({ const targetPath = getWorkspacePath(target) if (await Bun.file(join(rootDir, targetPath, "package.json")).exists()) { - throw new Error(`The ${targetPath} workspace already exists in this project.`) + consola.error(`The ${targetPath} workspace already exists in this project.`) + process.exitCode = 1 + return } const copiedPaths = await addWorkspaces(rootDir, scope, [target], new Set([targetPath])) diff --git a/scripts/template/rename.ts b/scripts/template/rename.ts index 669f0df6..27b61daf 100644 --- a/scripts/template/rename.ts +++ b/scripts/template/rename.ts @@ -86,20 +86,35 @@ export default defineCommand({ const projectRoot = resolve(process.cwd()) const projectName = args.name if (!args.workspace && !projectName) { - throw new Error("Provide --name when you rename a project.") + consola.error("Provide --name when you rename a project.") + process.exitCode = 1 + return } const scope = args.scope ?? projectName if (!scope) { - throw new Error("Provide --scope when you rename a workspace.") + consola.error("Provide --scope when you rename a workspace.") + process.exitCode = 1 + return + } + try { + normalizeScope(scope) + } catch (error) { + consola.error(error instanceof Error ? error.message : error) + process.exitCode = 1 + return } const rootDir = args.workspace ? resolve(projectRoot, args.workspace) : projectRoot if (args.workspace && !checkIsPathWithinRoot(projectRoot, rootDir)) { - throw new Error(`Workspace path must be inside the project: ${rootDir}.`) + consola.error(`Workspace path must be inside the project: ${rootDir}.`) + process.exitCode = 1 + return } if (!(await Bun.file(join(rootDir, "package.json")).exists())) { - throw new Error(`Workspace path must contain a package.json file: ${rootDir}.`) + consola.error(`Workspace path must contain a package.json file: ${rootDir}.`) + process.exitCode = 1 + return } const result = await renameProject({ diff --git a/scripts/template/setup.ts b/scripts/template/setup.ts index 61a99174..ddead0e7 100644 --- a/scripts/template/setup.ts +++ b/scripts/template/setup.ts @@ -7,6 +7,7 @@ import { getDependencyNames, getProjectScope, getWorkspaces, + normalizeScope, readJson, removePath, runCommand, @@ -82,13 +83,17 @@ async function writeTemplateStamp(rootDir: string) { await writeJson(join(rootDir, ".template.json"), stamp) } -function validateSelection(kind: WorkspaceKind, selected: string[], available: string[]) { +function getSelectionError( + kind: WorkspaceKind, + selected: string[], + available: string[] +): string | null { const unknown = selected.filter((name) => !available.includes(name)) if (unknown.length > 0) { - throw new Error( - `Unknown ${kind} workspace(s): ${unknown.join(", ")}. Available: ${available.join(", ") || "none"}.` - ) + return `Unknown ${kind} workspace(s): ${unknown.join(", ")}. Available: ${available.join(", ") || "none"}.` } + + return null } type WorkspaceWithDependencies = Workspace & { @@ -217,18 +222,52 @@ export default defineCommand({ description: "Select workspaces, rename the project, and remove template files", name: "setup", }, - run: async ({ args }) => { + run: async ({ args, rawArgs }) => { const rootDir = process.cwd() const yes = args.yes ?? false + const hasEmptyKeepAppsOption = rawArgs.some( + (argument, index) => + (argument === "--keep-apps" || argument === "--keepApps") && + rawArgs[index + 1]?.startsWith("-") !== false + ) + const hasEmptyKeepPackagesOption = rawArgs.some( + (argument, index) => + (argument === "--keep-packages" || argument === "--keepPackages") && + rawArgs[index + 1]?.startsWith("-") !== false + ) + + if (hasEmptyKeepAppsOption) { + consola.error("Provide at least one workspace name with --keep-apps.") + process.exitCode = 1 + return + } + if (hasEmptyKeepPackagesOption) { + consola.error("Provide at least one workspace name with --keep-packages.") + process.exitCode = 1 + return + } const apps = await getWorkspaces(rootDir, "app") const packages = await getWorkspaces(rootDir, "package") const rootPackage = await readJson(join(rootDir, "package.json")) const defaultName = typeof rootPackage.name === "string" ? rootPackage.name : "project" const sourceScope = await getProjectScope(rootDir).catch(() => TEMPLATE_SCOPE) + const selectedApps = args["keep-apps"]?.split(",").filter(Boolean) + const selectedPackages = args["keep-packages"]?.split(",").filter(Boolean) + + if (args["keep-apps"] !== undefined && selectedApps?.length === 0) { + consola.error("Provide at least one workspace name with --keep-apps.") + process.exitCode = 1 + return + } + if (args["keep-packages"] !== undefined && selectedPackages?.length === 0) { + consola.error("Provide at least one workspace name with --keep-packages.") + process.exitCode = 1 + return + } const keepApps = - args["keep-apps"]?.split(",").filter(Boolean) ?? + selectedApps ?? (yes ? apps.map((workspace) => workspace.name) : await promptForWorkspaceNames( @@ -236,7 +275,7 @@ export default defineCommand({ apps.map((workspace) => workspace.name) )) const keepPackages = - args["keep-packages"]?.split(",").filter(Boolean) ?? + selectedPackages ?? (yes ? packages.map((workspace) => workspace.name) : await promptForWorkspaceNames( @@ -250,16 +289,29 @@ export default defineCommand({ const shouldInstall = args.install ?? (yes ? true : await promptForConfirmation("Run bun install?")) - validateSelection( - "app", - keepApps, - apps.map((workspace) => workspace.name) - ) - validateSelection( - "package", - keepPackages, - packages.map((workspace) => workspace.name) - ) + const selectionError = + getSelectionError( + "app", + keepApps, + apps.map((workspace) => workspace.name) + ) ?? + getSelectionError( + "package", + keepPackages, + packages.map((workspace) => workspace.name) + ) + if (selectionError) { + consola.error(selectionError) + process.exitCode = 1 + return + } + try { + normalizeScope(projectName) + } catch (error) { + consola.error(error instanceof Error ? error.message : error) + process.exitCode = 1 + return + } const selection = await expandWorkspaceSelection(apps, packages, keepApps, keepPackages) if (selection.autoKept.length > 0) {