Replace ora with yoctoSpinner, fixed somed type warnings. 63d92ff1
Pedro Santana · 2025-07-11 22:15 8 file(s) · +40 −81
bun.lock +5 −51
10 10
        "execa": "^7.2.0",
11 11
        "figlet": "^1.8.1",
12 12
        "fs-extra": "^11.3.0",
13 -
        "ora": "^6.3.1",
14 13
        "picocolors": "^1.1.1",
14 +
        "yocto-spinner": "^1.0.0",
15 15
      },
16 16
      "devDependencies": {
17 17
        "@types/degit": "^2.8.6",
62 62
63 63
    "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="],
64 64
65 -
    "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
66 -
67 65
    "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="],
68 66
69 -
    "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
70 -
71 -
    "bl": ["bl@5.1.0", "", { "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="],
72 -
73 -
    "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
74 -
75 -
    "chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="],
76 -
77 -
    "cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="],
78 -
79 -
    "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
80 -
81 -
    "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="],
82 -
83 67
    "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
84 68
85 69
    "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
87 71
    "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
88 72
89 73
    "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
90 -
91 -
    "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="],
92 74
93 75
    "degit": ["degit@2.8.4", "", { "bin": { "degit": "degit" } }, "sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng=="],
94 76
106 88
107 89
    "human-signals": ["human-signals@4.3.1", "", {}, "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="],
108 90
109 -
    "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
110 -
111 -
    "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
112 -
113 -
    "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
114 -
115 91
    "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
116 -
117 -
    "is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
118 92
119 93
    "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
120 94
122 96
123 97
    "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
124 98
125 -
    "log-symbols": ["log-symbols@5.1.0", "", { "dependencies": { "chalk": "^5.0.0", "is-unicode-supported": "^1.1.0" } }, "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="],
126 -
127 99
    "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="],
128 100
129 101
    "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
133 105
    "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
134 106
135 107
    "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
136 -
137 -
    "ora": ["ora@6.3.1", "", { "dependencies": { "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } }, "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ=="],
138 108
139 109
    "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
140 110
141 111
    "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
142 112
143 -
    "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
144 -
145 -
    "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="],
146 -
147 113
    "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
148 -
149 -
    "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
150 114
151 115
    "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
152 116
154 118
155 119
    "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
156 120
157 -
    "stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="],
158 -
159 -
    "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
160 -
161 -
    "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
162 -
163 121
    "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
164 122
165 123
    "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="],
172 130
173 131
    "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
174 132
175 -
    "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
176 -
177 133
    "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="],
178 -
179 -
    "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="],
180 134
181 135
    "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
182 136
183 137
    "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="],
184 138
139 +
    "yocto-spinner": ["yocto-spinner@1.0.0", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-VPX8P/+Z2Fnpx8PC/JELbxp3QRrBxjAekio6yulGtA5gKt9YyRc5ycCb+NHgZCbZ0kx9KxwZp7gC6UlrCcCdSQ=="],
140 +
141 +
    "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="],
142 +
185 143
    "@types/fs-extra/@types/node": ["@types/node@20.17.47", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ=="],
186 144
187 145
    "@types/jsonfile/@types/node": ["@types/node@20.17.47", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-3dLX0Upo1v7RvUimvxLeXqwrfyKxUINk0EAM83swP2mlSUcwV73sZy8XhNz8bcZ3VbsfQyC/y6jRdL5tgCNpDQ=="],
192 150
193 151
    "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
194 152
195 -
    "restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
196 -
197 153
    "@types/fs-extra/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
198 154
199 155
    "@types/jsonfile/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
201 157
    "@types/prompts/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
202 158
203 159
    "@types/through/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
204 -
205 -
    "restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
206 160
  }
207 161
}
package.json +2 −2
44 44
    "execa": "^7.2.0",
45 45
    "figlet": "^1.8.1",
46 46
    "fs-extra": "^11.3.0",
47 -
    "ora": "^6.3.1",
48 -
    "picocolors": "^1.1.1"
47 +
    "picocolors": "^1.1.1",
48 +
    "yocto-spinner": "^1.0.0"
49 49
  },
50 50
  "engines": {
51 51
    "node": ">=18"
src/lib/initialize-git.ts +7 −4
1 1
import { consola } from "consola";
2 2
import { execa } from "execa";
3 -
import ora from "ora";
4 3
import pc from "picocolors";
4 +
import yoctoSpinner from "yocto-spinner";
5 5
import { tryCatch } from "@/utils/try-catch";
6 6
7 7
export async function initializeGit(
27 27
    }
28 28
  }
29 29
30 -
  const spinner = ora("Initializing git repository...").start();
30 +
  const spinner = yoctoSpinner({
31 +
    text: "Initializing git repository...",
32 +
  }).start();
33 +
31 34
  try {
32 35
    await execa("git", ["init"], { cwd: projectPath });
33 -
    spinner.succeed("Git repository initialized");
36 +
    spinner.success("Git repository initialized");
34 37
    return true;
35 38
  } catch (err: unknown) {
36 -
    spinner.fail("Failed to initialize git repository. Is git installed?");
39 +
    spinner.error("Failed to initialize git repository. Is git installed?");
37 40
    if (err instanceof Error) {
38 41
      consola.error(pc.red("Git error:"), err.message);
39 42
    } else {
src/lib/install-dependencies.ts +7 −6
1 1
import { consola } from "consola";
2 2
import { execa } from "execa";
3 -
import ora from "ora";
4 3
import pc from "picocolors";
4 +
import yoctoSpinner from "yocto-spinner";
5 5
import { tryCatch } from "@/utils/try-catch";
6 6
7 7
async function getPackageManager(): Promise<"bun"> {
40 40
  }
41 41
42 42
  const packageManager = await getPackageManager();
43 -
  const spinner = ora(
44 -
    `Installing dependencies with ${packageManager}...`,
45 -
  ).start();
43 +
44 +
  const spinner = yoctoSpinner({
45 +
    text: `Installing dependencies with ${packageManager}...`,
46 +
  }).start();
46 47
47 48
  try {
48 49
    await execa(packageManager, ["install"], { cwd: projectPath });
49 -
    spinner.succeed(`Dependencies installed with ${packageManager}`);
50 +
    spinner.success(`Dependencies installed with ${packageManager}`);
50 51
    return true;
51 52
  } catch (_err) {
52 -
    spinner.fail("Failed to install dependencies.");
53 +
    spinner.error("Failed to install dependencies.");
53 54
    console.log(
54 55
      pc.yellow(
55 56
        "You can install them manually after navigating to the project directory.",
src/lib/patch-files-rpc.ts +4 −4
2 2
import { consola } from "consola";
3 3
import { execa } from "execa";
4 4
import fs from "fs-extra";
5 -
import ora from "ora";
6 5
import pc from "picocolors";
6 +
import yoctoSpinner from "yocto-spinner";
7 7
import {
8 8
  defaultTemplate,
9 9
  honoClientTemplate,
16 16
  projectPath: string,
17 17
  templateChoice: string,
18 18
): Promise<boolean> {
19 -
  const spinner = ora("Setting up RPC client...").start();
19 +
  const spinner = yoctoSpinner({ text: "Setting up RPC client..." }).start();
20 20
21 21
  try {
22 22
    // 1. Update client package.json to ensure hono client is installed
71 71
    }
72 72
73 73
    await fs.writeFile(appTsxPath, updatedAppContent, "utf8");
74 -
    spinner.succeed("RPC client setup completed");
74 +
    spinner.success("RPC client setup completed");
75 75
    return true;
76 76
  } catch (err: unknown) {
77 -
    spinner.fail("Failed to set up RPC client");
77 +
    spinner.error("Failed to set up RPC client");
78 78
    if (err instanceof Error) {
79 79
      consola.error(pc.red("Error:"), err.message);
80 80
    } else {
src/lib/prompt-for-options.ts +5 −5
6 6
7 7
export async function promptForOptions(
8 8
  options: ProjectOptions,
9 -
): Promise<ProjectOptions | null> {
9 +
): Promise<ProjectOptions> {
10 10
  let projectName = options.projectName;
11 11
12 12
  if (!projectName && !options.yes) {
21 21
22 22
    if (!data || error) {
23 23
      consola.error(pc.red("Project creation cancelled."));
24 -
      return null;
24 +
      process.exit(1);
25 25
    }
26 26
27 27
    projectName = data;
46 46
47 47
    if (!data || error) {
48 48
      consola.error("Project creation cancelled.");
49 -
      return null;
49 +
      process.exit(1);
50 50
    }
51 51
52 52
    templateChoice = data;
64 64
65 65
    if (error) {
66 66
      consola.error("Project creation cancelled.");
67 -
      return null;
67 +
      process.exit(1);
68 68
    }
69 69
70 70
    useRpc = rpcResponse;
87 87
88 88
    if (error) {
89 89
      console.log(pc.yellow("Project creation cancelled."));
90 -
      return null;
90 +
      process.exit(1);
91 91
    }
92 92
93 93
    linter = linterResponse as "eslint" | "biome";
src/lib/scaffold-template.ts +6 −5
1 1
import path from "node:path";
2 2
import degit from "degit";
3 3
import fs from "fs-extra";
4 -
import ora from "ora";
5 4
import pc from "picocolors";
5 +
import yoctoSpinner from "yocto-spinner";
6 6
import type { ProjectOptions } from "@/types";
7 7
import { DEFAULT_REPO } from "@/utils/constants";
8 8
import { TEMPLATES } from "@/utils/templates";
10 10
import { setupBiome } from "./setup-biome";
11 11
12 12
export async function scaffoldTemplate(
13 -
  options: ProjectOptions,
13 +
  options: Required<ProjectOptions>,
14 14
): Promise<boolean> {
15 15
  const { projectName, template, repo, branch, rpc, linter } = options;
16 +
16 17
  const projectPath = path.resolve(process.cwd(), projectName);
17 18
18 19
  if (fs.existsSync(projectPath)) {
29 30
    TEMPLATES[template as keyof typeof TEMPLATES] || TEMPLATES.default;
30 31
  const repoBranch = branch || (templateConfig?.branch ?? "main");
31 32
  const repoUrl = `${repoPath}#${repoBranch}`;
32 -
  const spinner = ora("Downloading template...").start();
33 +
  const spinner = yoctoSpinner({ text: "Downloading template..." }).start();
33 34
34 35
  try {
35 36
    const emitter = degit(repoUrl, {
39 40
    });
40 41
41 42
    await emitter.clone(projectPath);
42 -
    spinner.succeed(`Template downloaded successfully (${template} template)`);
43 +
    spinner.success(`Template downloaded successfully (${template} template)`);
43 44
44 45
    const pkgJsonPath = path.join(projectPath, "package.json");
45 46
    if (fs.existsSync(pkgJsonPath)) {
64 65
65 66
    return true;
66 67
  } catch (err) {
67 -
    spinner.fail("Failed to download template");
68 +
    spinner.error("Failed to download template");
68 69
    throw err;
69 70
  }
70 71
}
src/lib/setup-biome.ts +4 −4
1 1
import path from "node:path";
2 2
import { execa } from "execa";
3 3
import fs from "fs-extra";
4 -
import ora from "ora";
5 4
import pc from "picocolors";
5 +
import yoctoSpinner from "yocto-spinner";
6 6
7 7
export async function setupBiome(projectPath: string): Promise<void> {
8 -
  const spinner = ora("Setting up Biome...").start();
8 +
  const spinner = yoctoSpinner({ text: "Setting up Biome..." }).start();
9 9
  try {
10 10
    const clientPath = path.join(projectPath, "client");
11 11
    const clientPkgJsonPath = path.join(clientPath, "package.json");
73 73
      await fs.writeJson(rootPkgJsonPath, rootPkgJson, { spaces: 2 });
74 74
    }
75 75
76 -
    spinner.succeed("Biome setup complete.");
76 +
    spinner.success("Biome setup complete.");
77 77
  } catch (error) {
78 -
    spinner.fail("Biome setup failed.");
78 +
    spinner.error("Biome setup failed.");
79 79
    if (error instanceof Error) {
80 80
      console.error(pc.red("\nError:"), error.message);
81 81
    } else {