@take-out/cli 0.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/cli.mjs +3 -0
  4. package/dist/cjs/cli.cjs +71 -0
  5. package/dist/cjs/cli.js +70 -0
  6. package/dist/cjs/cli.js.map +6 -0
  7. package/dist/cjs/cli.native.js +79 -0
  8. package/dist/cjs/cli.native.js.map +6 -0
  9. package/dist/cjs/commands/changed.cjs +212 -0
  10. package/dist/cjs/commands/changed.js +214 -0
  11. package/dist/cjs/commands/changed.js.map +6 -0
  12. package/dist/cjs/commands/changed.native.js +289 -0
  13. package/dist/cjs/commands/changed.native.js.map +6 -0
  14. package/dist/cjs/commands/docs.cjs +388 -0
  15. package/dist/cjs/commands/docs.js +313 -0
  16. package/dist/cjs/commands/docs.js.map +6 -0
  17. package/dist/cjs/commands/docs.native.js +476 -0
  18. package/dist/cjs/commands/docs.native.js.map +6 -0
  19. package/dist/cjs/commands/env-setup.cjs +90 -0
  20. package/dist/cjs/commands/env-setup.js +78 -0
  21. package/dist/cjs/commands/env-setup.js.map +6 -0
  22. package/dist/cjs/commands/env-setup.native.js +85 -0
  23. package/dist/cjs/commands/env-setup.native.js.map +6 -0
  24. package/dist/cjs/commands/onboard.cjs +479 -0
  25. package/dist/cjs/commands/onboard.js +631 -0
  26. package/dist/cjs/commands/onboard.js.map +6 -0
  27. package/dist/cjs/commands/onboard.native.js +608 -0
  28. package/dist/cjs/commands/onboard.native.js.map +6 -0
  29. package/dist/cjs/commands/run.cjs +148 -0
  30. package/dist/cjs/commands/run.js +116 -0
  31. package/dist/cjs/commands/run.js.map +6 -0
  32. package/dist/cjs/commands/run.native.js +140 -0
  33. package/dist/cjs/commands/run.native.js.map +6 -0
  34. package/dist/cjs/commands/script.cjs +379 -0
  35. package/dist/cjs/commands/script.js +339 -0
  36. package/dist/cjs/commands/script.js.map +6 -0
  37. package/dist/cjs/commands/script.native.js +449 -0
  38. package/dist/cjs/commands/script.native.js.map +6 -0
  39. package/dist/cjs/commands/sync.cjs +190 -0
  40. package/dist/cjs/commands/sync.js +168 -0
  41. package/dist/cjs/commands/sync.js.map +6 -0
  42. package/dist/cjs/commands/sync.native.js +211 -0
  43. package/dist/cjs/commands/sync.native.js.map +6 -0
  44. package/dist/cjs/constants/ascii.cjs +36 -0
  45. package/dist/cjs/constants/ascii.js +30 -0
  46. package/dist/cjs/constants/ascii.js.map +6 -0
  47. package/dist/cjs/constants/ascii.native.js +36 -0
  48. package/dist/cjs/constants/ascii.native.js.map +6 -0
  49. package/dist/cjs/index.cjs +64 -0
  50. package/dist/cjs/index.js +55 -0
  51. package/dist/cjs/index.js.map +6 -0
  52. package/dist/cjs/index.native.js +94 -0
  53. package/dist/cjs/index.native.js.map +6 -0
  54. package/dist/cjs/types.cjs +16 -0
  55. package/dist/cjs/types.js +14 -0
  56. package/dist/cjs/types.js.map +6 -0
  57. package/dist/cjs/types.native.js +15 -0
  58. package/dist/cjs/types.native.js.map +6 -0
  59. package/dist/cjs/utils/env-categories.cjs +272 -0
  60. package/dist/cjs/utils/env-categories.js +296 -0
  61. package/dist/cjs/utils/env-categories.js.map +6 -0
  62. package/dist/cjs/utils/env-categories.native.js +317 -0
  63. package/dist/cjs/utils/env-categories.native.js.map +6 -0
  64. package/dist/cjs/utils/env-setup.cjs +181 -0
  65. package/dist/cjs/utils/env-setup.js +190 -0
  66. package/dist/cjs/utils/env-setup.js.map +6 -0
  67. package/dist/cjs/utils/env-setup.native.js +264 -0
  68. package/dist/cjs/utils/env-setup.native.js.map +6 -0
  69. package/dist/cjs/utils/env.cjs +118 -0
  70. package/dist/cjs/utils/env.js +97 -0
  71. package/dist/cjs/utils/env.js.map +6 -0
  72. package/dist/cjs/utils/env.native.js +128 -0
  73. package/dist/cjs/utils/env.native.js.map +6 -0
  74. package/dist/cjs/utils/files.cjs +215 -0
  75. package/dist/cjs/utils/files.js +164 -0
  76. package/dist/cjs/utils/files.js.map +6 -0
  77. package/dist/cjs/utils/files.native.js +266 -0
  78. package/dist/cjs/utils/files.native.js.map +6 -0
  79. package/dist/cjs/utils/parallel-runner.cjs +99 -0
  80. package/dist/cjs/utils/parallel-runner.js +84 -0
  81. package/dist/cjs/utils/parallel-runner.js.map +6 -0
  82. package/dist/cjs/utils/parallel-runner.native.js +123 -0
  83. package/dist/cjs/utils/parallel-runner.native.js.map +6 -0
  84. package/dist/cjs/utils/ports.cjs +101 -0
  85. package/dist/cjs/utils/ports.js +81 -0
  86. package/dist/cjs/utils/ports.js.map +6 -0
  87. package/dist/cjs/utils/ports.native.js +130 -0
  88. package/dist/cjs/utils/ports.native.js.map +6 -0
  89. package/dist/cjs/utils/prerequisites.cjs +119 -0
  90. package/dist/cjs/utils/prerequisites.js +107 -0
  91. package/dist/cjs/utils/prerequisites.js.map +6 -0
  92. package/dist/cjs/utils/prerequisites.native.js +127 -0
  93. package/dist/cjs/utils/prerequisites.native.js.map +6 -0
  94. package/dist/cjs/utils/prompts.cjs +161 -0
  95. package/dist/cjs/utils/prompts.js +162 -0
  96. package/dist/cjs/utils/prompts.js.map +6 -0
  97. package/dist/cjs/utils/prompts.native.js +179 -0
  98. package/dist/cjs/utils/prompts.native.js.map +6 -0
  99. package/dist/cjs/utils/script-listing.cjs +113 -0
  100. package/dist/cjs/utils/script-listing.js +108 -0
  101. package/dist/cjs/utils/script-listing.js.map +6 -0
  102. package/dist/cjs/utils/script-listing.native.js +174 -0
  103. package/dist/cjs/utils/script-listing.native.js.map +6 -0
  104. package/dist/cjs/utils/sync.cjs +85 -0
  105. package/dist/cjs/utils/sync.js +70 -0
  106. package/dist/cjs/utils/sync.js.map +6 -0
  107. package/dist/cjs/utils/sync.native.js +84 -0
  108. package/dist/cjs/utils/sync.native.js.map +6 -0
  109. package/dist/cjs/utils/welcome.cjs +50 -0
  110. package/dist/cjs/utils/welcome.js +42 -0
  111. package/dist/cjs/utils/welcome.js.map +6 -0
  112. package/dist/cjs/utils/welcome.native.js +47 -0
  113. package/dist/cjs/utils/welcome.native.js.map +6 -0
  114. package/dist/esm/cli.js +79 -0
  115. package/dist/esm/cli.js.map +6 -0
  116. package/dist/esm/cli.mjs +71 -0
  117. package/dist/esm/cli.mjs.map +1 -0
  118. package/dist/esm/cli.native.js +69 -0
  119. package/dist/esm/cli.native.js.map +1 -0
  120. package/dist/esm/commands/changed.js +194 -0
  121. package/dist/esm/commands/changed.js.map +6 -0
  122. package/dist/esm/commands/changed.mjs +178 -0
  123. package/dist/esm/commands/changed.mjs.map +1 -0
  124. package/dist/esm/commands/changed.native.js +273 -0
  125. package/dist/esm/commands/changed.native.js.map +1 -0
  126. package/dist/esm/commands/docs.js +306 -0
  127. package/dist/esm/commands/docs.js.map +6 -0
  128. package/dist/esm/commands/docs.mjs +353 -0
  129. package/dist/esm/commands/docs.mjs.map +1 -0
  130. package/dist/esm/commands/docs.native.js +516 -0
  131. package/dist/esm/commands/docs.native.js.map +1 -0
  132. package/dist/esm/commands/env-setup.js +56 -0
  133. package/dist/esm/commands/env-setup.js.map +6 -0
  134. package/dist/esm/commands/env-setup.mjs +56 -0
  135. package/dist/esm/commands/env-setup.mjs.map +1 -0
  136. package/dist/esm/commands/env-setup.native.js +59 -0
  137. package/dist/esm/commands/env-setup.native.js.map +1 -0
  138. package/dist/esm/commands/onboard.js +645 -0
  139. package/dist/esm/commands/onboard.js.map +6 -0
  140. package/dist/esm/commands/onboard.mjs +445 -0
  141. package/dist/esm/commands/onboard.mjs.map +1 -0
  142. package/dist/esm/commands/onboard.native.js +584 -0
  143. package/dist/esm/commands/onboard.native.js.map +1 -0
  144. package/dist/esm/commands/run.js +95 -0
  145. package/dist/esm/commands/run.js.map +6 -0
  146. package/dist/esm/commands/run.mjs +114 -0
  147. package/dist/esm/commands/run.mjs.map +1 -0
  148. package/dist/esm/commands/run.native.js +133 -0
  149. package/dist/esm/commands/run.native.js.map +1 -0
  150. package/dist/esm/commands/script.js +338 -0
  151. package/dist/esm/commands/script.js.map +6 -0
  152. package/dist/esm/commands/script.mjs +336 -0
  153. package/dist/esm/commands/script.mjs.map +1 -0
  154. package/dist/esm/commands/script.native.js +445 -0
  155. package/dist/esm/commands/script.native.js.map +1 -0
  156. package/dist/esm/commands/sync.js +158 -0
  157. package/dist/esm/commands/sync.js.map +6 -0
  158. package/dist/esm/commands/sync.mjs +155 -0
  159. package/dist/esm/commands/sync.mjs.map +1 -0
  160. package/dist/esm/commands/sync.native.js +173 -0
  161. package/dist/esm/commands/sync.native.js.map +1 -0
  162. package/dist/esm/constants/ascii.js +14 -0
  163. package/dist/esm/constants/ascii.js.map +6 -0
  164. package/dist/esm/constants/ascii.mjs +12 -0
  165. package/dist/esm/constants/ascii.mjs.map +1 -0
  166. package/dist/esm/constants/ascii.native.js +12 -0
  167. package/dist/esm/constants/ascii.native.js.map +1 -0
  168. package/dist/esm/index.js +83 -0
  169. package/dist/esm/index.js.map +6 -0
  170. package/dist/esm/index.mjs +7 -0
  171. package/dist/esm/index.mjs.map +1 -0
  172. package/dist/esm/index.native.js +7 -0
  173. package/dist/esm/index.native.js.map +1 -0
  174. package/dist/esm/types.js +1 -0
  175. package/dist/esm/types.js.map +6 -0
  176. package/dist/esm/types.mjs +2 -0
  177. package/dist/esm/types.mjs.map +1 -0
  178. package/dist/esm/types.native.js +2 -0
  179. package/dist/esm/types.native.js.map +1 -0
  180. package/dist/esm/utils/env-categories.js +272 -0
  181. package/dist/esm/utils/env-categories.js.map +6 -0
  182. package/dist/esm/utils/env-categories.mjs +233 -0
  183. package/dist/esm/utils/env-categories.mjs.map +1 -0
  184. package/dist/esm/utils/env-categories.native.js +246 -0
  185. package/dist/esm/utils/env-categories.native.js.map +1 -0
  186. package/dist/esm/utils/env-setup.js +173 -0
  187. package/dist/esm/utils/env-setup.js.map +6 -0
  188. package/dist/esm/utils/env-setup.mjs +146 -0
  189. package/dist/esm/utils/env-setup.mjs.map +1 -0
  190. package/dist/esm/utils/env-setup.native.js +243 -0
  191. package/dist/esm/utils/env-setup.native.js.map +1 -0
  192. package/dist/esm/utils/env.js +83 -0
  193. package/dist/esm/utils/env.js.map +6 -0
  194. package/dist/esm/utils/env.mjs +90 -0
  195. package/dist/esm/utils/env.mjs.map +1 -0
  196. package/dist/esm/utils/env.native.js +99 -0
  197. package/dist/esm/utils/env.native.js.map +1 -0
  198. package/dist/esm/utils/files.js +150 -0
  199. package/dist/esm/utils/files.js.map +6 -0
  200. package/dist/esm/utils/files.mjs +187 -0
  201. package/dist/esm/utils/files.mjs.map +1 -0
  202. package/dist/esm/utils/files.native.js +247 -0
  203. package/dist/esm/utils/files.native.js.map +1 -0
  204. package/dist/esm/utils/parallel-runner.js +69 -0
  205. package/dist/esm/utils/parallel-runner.js.map +6 -0
  206. package/dist/esm/utils/parallel-runner.mjs +76 -0
  207. package/dist/esm/utils/parallel-runner.mjs.map +1 -0
  208. package/dist/esm/utils/parallel-runner.native.js +109 -0
  209. package/dist/esm/utils/parallel-runner.native.js.map +1 -0
  210. package/dist/esm/utils/ports.js +65 -0
  211. package/dist/esm/utils/ports.js.map +6 -0
  212. package/dist/esm/utils/ports.mjs +74 -0
  213. package/dist/esm/utils/ports.mjs.map +1 -0
  214. package/dist/esm/utils/ports.native.js +93 -0
  215. package/dist/esm/utils/ports.native.js.map +1 -0
  216. package/dist/esm/utils/prerequisites.js +91 -0
  217. package/dist/esm/utils/prerequisites.js.map +6 -0
  218. package/dist/esm/utils/prerequisites.mjs +91 -0
  219. package/dist/esm/utils/prerequisites.mjs.map +1 -0
  220. package/dist/esm/utils/prerequisites.native.js +97 -0
  221. package/dist/esm/utils/prerequisites.native.js.map +1 -0
  222. package/dist/esm/utils/prompts.js +139 -0
  223. package/dist/esm/utils/prompts.js.map +6 -0
  224. package/dist/esm/utils/prompts.mjs +112 -0
  225. package/dist/esm/utils/prompts.mjs.map +1 -0
  226. package/dist/esm/utils/prompts.native.js +115 -0
  227. package/dist/esm/utils/prompts.native.js.map +1 -0
  228. package/dist/esm/utils/script-listing.js +91 -0
  229. package/dist/esm/utils/script-listing.js.map +6 -0
  230. package/dist/esm/utils/script-listing.mjs +76 -0
  231. package/dist/esm/utils/script-listing.mjs.map +1 -0
  232. package/dist/esm/utils/script-listing.native.js +151 -0
  233. package/dist/esm/utils/script-listing.native.js.map +1 -0
  234. package/dist/esm/utils/sync.js +50 -0
  235. package/dist/esm/utils/sync.js.map +6 -0
  236. package/dist/esm/utils/sync.mjs +48 -0
  237. package/dist/esm/utils/sync.mjs.map +1 -0
  238. package/dist/esm/utils/sync.native.js +53 -0
  239. package/dist/esm/utils/sync.native.js.map +1 -0
  240. package/dist/esm/utils/welcome.js +21 -0
  241. package/dist/esm/utils/welcome.js.map +6 -0
  242. package/dist/esm/utils/welcome.mjs +15 -0
  243. package/dist/esm/utils/welcome.mjs.map +1 -0
  244. package/dist/esm/utils/welcome.native.js +18 -0
  245. package/dist/esm/utils/welcome.native.js.map +1 -0
  246. package/docs/aggregates.md +579 -0
  247. package/docs/cloudflare-dev-tunnel.md +41 -0
  248. package/docs/database.md +203 -0
  249. package/docs/docs.md +8 -0
  250. package/docs/emitters.md +562 -0
  251. package/docs/hot-updater.md +223 -0
  252. package/docs/native-hot-update.md +252 -0
  253. package/docs/one-components.md +234 -0
  254. package/docs/one-hooks.md +570 -0
  255. package/docs/one-routes.md +660 -0
  256. package/docs/package-json.md +115 -0
  257. package/docs/react-native-navigation-flow.md +184 -0
  258. package/docs/scripts.md +147 -0
  259. package/docs/sync-prompt.md +208 -0
  260. package/docs/tamagui.md +478 -0
  261. package/docs/testing-integration.md +564 -0
  262. package/docs/triggers.md +450 -0
  263. package/docs/zero.md +719 -0
  264. package/package.json +76 -0
  265. package/scripts/seed.ts +209 -0
  266. package/src/cli.ts +147 -0
  267. package/src/commands/changed.ts +313 -0
  268. package/src/commands/docs.ts +582 -0
  269. package/src/commands/env-setup.ts +69 -0
  270. package/src/commands/onboard.ts +1391 -0
  271. package/src/commands/run.ts +173 -0
  272. package/src/commands/script.ts +587 -0
  273. package/src/commands/sync.ts +305 -0
  274. package/src/constants/ascii.ts +17 -0
  275. package/src/index.ts +63 -0
  276. package/src/types.ts +59 -0
  277. package/src/utils/env-categories.ts +245 -0
  278. package/src/utils/env-setup.ts +338 -0
  279. package/src/utils/env.ts +127 -0
  280. package/src/utils/files.ts +302 -0
  281. package/src/utils/parallel-runner.ts +129 -0
  282. package/src/utils/ports.ts +77 -0
  283. package/src/utils/prerequisites.ts +137 -0
  284. package/src/utils/prompts.ts +197 -0
  285. package/src/utils/script-listing.ts +214 -0
  286. package/src/utils/sync.ts +101 -0
  287. package/src/withOpSqliteStatic.cjs +51 -0
  288. package/types/cli.d.ts +7 -0
  289. package/types/cli.d.ts.map +1 -0
  290. package/types/commands/changed.d.ts +14 -0
  291. package/types/commands/changed.d.ts.map +1 -0
  292. package/types/commands/docs.d.ts +5 -0
  293. package/types/commands/docs.d.ts.map +1 -0
  294. package/types/commands/env-setup.d.ts +25 -0
  295. package/types/commands/env-setup.d.ts.map +1 -0
  296. package/types/commands/onboard.d.ts +16 -0
  297. package/types/commands/onboard.d.ts.map +1 -0
  298. package/types/commands/run.d.ts +8 -0
  299. package/types/commands/run.d.ts.map +1 -0
  300. package/types/commands/script.d.ts +28 -0
  301. package/types/commands/script.d.ts.map +1 -0
  302. package/types/commands/sync.d.ts +5 -0
  303. package/types/commands/sync.d.ts.map +1 -0
  304. package/types/constants/ascii.d.ts +6 -0
  305. package/types/constants/ascii.d.ts.map +1 -0
  306. package/types/index.d.ts +12 -0
  307. package/types/index.d.ts.map +1 -0
  308. package/types/types.d.ts +54 -0
  309. package/types/types.d.ts.map +1 -0
  310. package/types/utils/env-categories.d.ts +8 -0
  311. package/types/utils/env-categories.d.ts.map +1 -0
  312. package/types/utils/env-setup.d.ts +10 -0
  313. package/types/utils/env-setup.d.ts.map +1 -0
  314. package/types/utils/env.d.ts +19 -0
  315. package/types/utils/env.d.ts.map +1 -0
  316. package/types/utils/files.d.ts +47 -0
  317. package/types/utils/files.d.ts.map +1 -0
  318. package/types/utils/parallel-runner.d.ts +15 -0
  319. package/types/utils/parallel-runner.d.ts.map +1 -0
  320. package/types/utils/ports.d.ts +16 -0
  321. package/types/utils/ports.d.ts.map +1 -0
  322. package/types/utils/prerequisites.d.ts +11 -0
  323. package/types/utils/prerequisites.d.ts.map +1 -0
  324. package/types/utils/prompts.d.ts +30 -0
  325. package/types/utils/prompts.d.ts.map +1 -0
  326. package/types/utils/script-listing.d.ts +7 -0
  327. package/types/utils/script-listing.d.ts.map +1 -0
  328. package/types/utils/sync.d.ts +16 -0
  329. package/types/utils/sync.d.ts.map +1 -0
  330. package/types/utils/welcome.d.ts +6 -0
  331. package/types/utils/welcome.d.ts.map +1 -0
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Reusable prompt helpers using @clack/prompts
3
+ */
4
+
5
+ import * as p from '@clack/prompts'
6
+ import pc from 'picocolors'
7
+
8
+ import type { PortCheck, PrerequisiteCheck } from '../types'
9
+
10
+ export function displayWelcome(projectName = 'Takeout'): void {
11
+ console.info()
12
+ p.intro(pc.bgCyan(pc.black(` ${projectName} Starter Kit `)))
13
+ console.info()
14
+ p.note(
15
+ pc.dim(
16
+ "You can re-run 'bun onboard' anytime to reconfigure or skip to specific steps.\nNo need to decide everything upfront!"
17
+ ),
18
+ pc.cyan('Tip')
19
+ )
20
+ }
21
+
22
+ export function displayOutro(message: string): void {
23
+ p.outro(pc.green(message))
24
+ }
25
+
26
+ export function displayPrerequisites(checks: PrerequisiteCheck[]): void {
27
+ const items = checks.map((check) => {
28
+ const icon = check.installed ? pc.green('✓') : pc.red('✗')
29
+ const message = check.message || ''
30
+ const recommendation = check.recommendation
31
+ ? `\n ${pc.dim(check.recommendation)}`
32
+ : ''
33
+ return `${icon} ${pc.bold(check.name)}: ${message}${recommendation}`
34
+ })
35
+
36
+ p.note(items.join('\n'), 'Prerequisites')
37
+ }
38
+
39
+ export function displayPortConflicts(conflicts: PortCheck[]): void {
40
+ if (conflicts.length === 0) return
41
+
42
+ const items = conflicts.map((conflict) => {
43
+ const pid = conflict.pid ? ` (PID: ${conflict.pid})` : ''
44
+ return `${pc.yellow('⚠')} Port ${conflict.port} (${conflict.name})${pid}`
45
+ })
46
+
47
+ p.note(items.join('\n'), pc.yellow('Port Conflicts Detected'))
48
+ }
49
+
50
+ export async function confirmContinue(
51
+ message: string,
52
+ defaultValue = true
53
+ ): Promise<boolean> {
54
+ const result = await p.confirm({
55
+ message,
56
+ initialValue: defaultValue,
57
+ })
58
+
59
+ if (p.isCancel(result)) {
60
+ p.cancel('Operation cancelled.')
61
+ process.exit(0)
62
+ }
63
+
64
+ return result
65
+ }
66
+
67
+ export async function promptText(
68
+ message: string,
69
+ defaultValue?: string,
70
+ placeholder?: string
71
+ ): Promise<string> {
72
+ const result = await p.text({
73
+ message,
74
+ defaultValue,
75
+ placeholder,
76
+ })
77
+
78
+ if (p.isCancel(result)) {
79
+ p.cancel('Operation cancelled.')
80
+ process.exit(0)
81
+ }
82
+
83
+ return result
84
+ }
85
+
86
+ export async function promptPassword(message: string): Promise<string> {
87
+ const result = await p.password({
88
+ message,
89
+ })
90
+
91
+ if (p.isCancel(result)) {
92
+ p.cancel('Operation cancelled.')
93
+ process.exit(0)
94
+ }
95
+
96
+ return result
97
+ }
98
+
99
+ export async function promptSelect<T extends string>(
100
+ message: string,
101
+ options: { value: T; label: string; hint?: string }[]
102
+ ): Promise<T | 'cancel'> {
103
+ const result = await p.select({
104
+ message,
105
+ options: options as any,
106
+ })
107
+
108
+ if (p.isCancel(result)) {
109
+ return 'cancel' as const
110
+ }
111
+
112
+ return result as T
113
+ }
114
+
115
+ export async function promptStartStep(): Promise<
116
+ 'full' | 'prerequisites' | 'identity' | 'ports' | 'eject' | 'production' | 'cancel'
117
+ > {
118
+ console.info()
119
+ console.info(pc.gray('What would you like to do?'))
120
+ console.info()
121
+
122
+ return promptSelect('Select starting point:', [
123
+ {
124
+ value: 'full',
125
+ label: 'Complete setup',
126
+ hint: 'Run through all setup steps',
127
+ },
128
+ {
129
+ value: 'prerequisites',
130
+ label: 'Check prerequisites',
131
+ hint: 'Verify bun, docker, git, etc.',
132
+ },
133
+ {
134
+ value: 'identity',
135
+ label: 'Project identity',
136
+ hint: 'Customize app name and bundle ID',
137
+ },
138
+ {
139
+ value: 'ports',
140
+ label: 'Check ports',
141
+ hint: 'Verify required ports are available',
142
+ },
143
+ {
144
+ value: 'eject',
145
+ label: 'Eject from monorepo',
146
+ hint: 'Remove ./packages, use published versions',
147
+ },
148
+ {
149
+ value: 'production',
150
+ label: 'Production deployment',
151
+ hint: 'Configure production environment and deployment',
152
+ },
153
+ ])
154
+ }
155
+
156
+ export async function promptOldSelect<T extends string>(
157
+ message: string,
158
+ options: { value: T; label: string; hint?: string }[]
159
+ ): Promise<T> {
160
+ const result = await p.select<string>({
161
+ message,
162
+ options,
163
+ })
164
+
165
+ if (p.isCancel(result)) {
166
+ p.cancel('Operation cancelled.')
167
+ process.exit(0)
168
+ }
169
+
170
+ return result as T
171
+ }
172
+
173
+ export function showSpinner(message: string): ReturnType<typeof p.spinner> {
174
+ const s = p.spinner()
175
+ s.start(message)
176
+ return s
177
+ }
178
+
179
+ export function showError(message: string): void {
180
+ p.log.error(pc.red(message))
181
+ }
182
+
183
+ export function showWarning(message: string): void {
184
+ p.log.warning(pc.yellow(message))
185
+ }
186
+
187
+ export function showSuccess(message: string): void {
188
+ p.log.success(pc.green(message))
189
+ }
190
+
191
+ export function showInfo(message: string): void {
192
+ p.log.info(pc.blue(message))
193
+ }
194
+
195
+ export function showStep(message: string): void {
196
+ p.log.step(message)
197
+ }
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Utility functions for listing and discovering scripts
3
+ */
4
+
5
+ import { existsSync, statSync } from 'node:fs'
6
+ import { join, relative } from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+
9
+ import pc from 'picocolors'
10
+
11
+ // re-export needed functions from script command
12
+ import {
13
+ discoverScripts,
14
+ getLocalScriptsDir,
15
+ getScriptMetadata,
16
+ } from '../commands/script'
17
+
18
+ // find scripts package root using import.meta.resolve
19
+ function findScriptsPackageRoot(): string | null {
20
+ try {
21
+ const resolved = import.meta.resolve('@take-out/scripts/package.json')
22
+ // use fileURLToPath for proper cross-platform handling
23
+ const packageJsonPath = fileURLToPath(new URL(resolved))
24
+ const packageRoot = join(packageJsonPath, '..')
25
+ const srcPath = join(packageRoot, 'src')
26
+
27
+ if (existsSync(srcPath)) {
28
+ return srcPath
29
+ }
30
+ } catch (err) {
31
+ // scripts package not found, that's ok for hybrid mode
32
+ }
33
+
34
+ return null
35
+ }
36
+
37
+ // format script listing
38
+ export function formatScriptList(
39
+ title: string,
40
+ scripts: Map<string, string>,
41
+ showDescriptions: boolean = false
42
+ ): void {
43
+ if (scripts.size === 0) return
44
+
45
+ console.info()
46
+ console.info(pc.bold(pc.cyan(title)))
47
+ console.info()
48
+
49
+ // group by category
50
+ const categories = new Map<string, Array<[string, string]>>()
51
+ const rootScripts: Array<[string, string]> = []
52
+
53
+ for (const [name, path] of scripts) {
54
+ if (name.includes('/')) {
55
+ const parts = name.split('/')
56
+ if (parts.length > 0 && parts[0]) {
57
+ const category = parts[0]
58
+ if (!categories.has(category)) {
59
+ categories.set(category, [])
60
+ }
61
+ categories.get(category)!.push([name, path])
62
+ }
63
+ } else {
64
+ rootScripts.push([name, path])
65
+ }
66
+ }
67
+
68
+ // display root scripts
69
+ for (const [name, path] of rootScripts) {
70
+ let line = ` ${pc.green(name)}`
71
+
72
+ if (showDescriptions) {
73
+ const metadata = getScriptMetadata(path)
74
+ if (metadata.description) {
75
+ line += pc.dim(` - ${metadata.description}`)
76
+ }
77
+ }
78
+
79
+ console.info(line)
80
+ }
81
+
82
+ // display categorized scripts
83
+ for (const [category, categoryScripts] of categories) {
84
+ console.info()
85
+ console.info(` ${pc.yellow(category)}/`)
86
+
87
+ for (const [name, path] of categoryScripts) {
88
+ const shortName = name.startsWith(`${category}/`)
89
+ ? name.substring(category.length + 1)
90
+ : name
91
+ let line = ` ${pc.green(shortName)}`
92
+
93
+ if (showDescriptions) {
94
+ const metadata = getScriptMetadata(path)
95
+ if (metadata.description) {
96
+ line += pc.dim(` - ${metadata.description}`)
97
+ }
98
+ }
99
+
100
+ console.info(line)
101
+ }
102
+ }
103
+ }
104
+
105
+ // list all available scripts (local and built-in)
106
+ export function listAllScripts(includeCommands = true): void {
107
+ // show header with description
108
+ console.info()
109
+ console.info(pc.bold(pc.cyan('Takeout CLI - Project Scripts & Commands')))
110
+ console.info()
111
+ console.info(pc.dim(' Manage scripts, run tasks, and configure your project'))
112
+ console.info()
113
+
114
+ if (includeCommands) {
115
+ // Show built-in CLI commands
116
+ console.info(pc.bold(pc.cyan('🛠️ Built-in Commands')))
117
+ console.info()
118
+ console.info(` ${pc.green('onboard')} - Setup wizard for new projects`)
119
+ console.info(` ${pc.green('docs')} - View documentation`)
120
+ console.info(` ${pc.green('env:setup')} - Setup environment variables`)
121
+ console.info(` ${pc.green('run')} - Run scripts in parallel`)
122
+ console.info(` ${pc.green('script')} - Manage and run scripts`)
123
+ console.info(` ${pc.green('sync')} - Sync fork with upstream Takeout`)
124
+ console.info(` ${pc.green('changed')} - Show changes since last sync`)
125
+ console.info(` ${pc.green('completion')} - Shell completion setup`)
126
+ }
127
+
128
+ const localScripts = discoverScripts(getLocalScriptsDir())
129
+ const builtInDir = findScriptsPackageRoot()
130
+ const builtInScripts = builtInDir ? discoverScripts(builtInDir) : new Map()
131
+
132
+ if (localScripts.size > 0) {
133
+ formatScriptList('📁 Local Scripts', localScripts, true)
134
+ }
135
+
136
+ if (builtInScripts.size > 0) {
137
+ formatScriptList('📦 Built-in Scripts', builtInScripts, true)
138
+ }
139
+
140
+ if (localScripts.size === 0 && builtInScripts.size === 0) {
141
+ console.info()
142
+ console.info(pc.yellow('No scripts found'))
143
+ console.info()
144
+ console.info(
145
+ pc.dim(`Create scripts in ${relative(process.cwd(), getLocalScriptsDir())}/`)
146
+ )
147
+ console.info(pc.dim(`Or install @take-out/scripts package for built-in scripts`))
148
+ }
149
+
150
+ console.info()
151
+ console.info(pc.bold('Usage:'))
152
+ console.info(
153
+ ` ${pc.cyan('tko <command>')} ${pc.dim('Run a built-in command')}`
154
+ )
155
+ console.info(
156
+ ` ${pc.cyan('tko <script-name>')} ${pc.dim('Execute a script (use / for nested, e.g., tko web/build)')}`
157
+ )
158
+ console.info(` ${pc.cyan('tko script new <path>')} ${pc.dim('Create a new script')}`)
159
+ console.info()
160
+ console.info(pc.bold('Examples:'))
161
+ console.info(
162
+ ` ${pc.cyan('tko upgrade/tamagui')} ${pc.dim('Upgrade Tamagui packages')}`
163
+ )
164
+ console.info(` ${pc.cyan('tko web/build')} ${pc.dim('Build web platform')}`)
165
+ console.info(
166
+ ` ${pc.cyan('tko check/types')} ${pc.dim('Run TypeScript type checking')}`
167
+ )
168
+ console.info()
169
+ }
170
+
171
+ // check if a name is a category and list its scripts
172
+ export function listCategoryScripts(categoryName: string): boolean {
173
+ const localDir = getLocalScriptsDir()
174
+ const categoryPath = join(localDir, categoryName)
175
+
176
+ if (existsSync(categoryPath) && statSync(categoryPath).isDirectory()) {
177
+ // list scripts in this category
178
+ const categoryScripts = discoverScripts(categoryPath)
179
+
180
+ if (categoryScripts.size > 0) {
181
+ console.info()
182
+ console.info(pc.bold(pc.cyan(`📁 ${categoryName} Scripts`)))
183
+ console.info()
184
+
185
+ for (const [name, path] of categoryScripts) {
186
+ const shortName = name.replace(`${categoryName}/`, '')
187
+ const metadata = getScriptMetadata(path)
188
+ let line = ` ${pc.green(shortName)}`
189
+
190
+ if (metadata.description) {
191
+ line += pc.dim(` - ${metadata.description}`)
192
+ }
193
+
194
+ if (metadata.args && metadata.args.length > 0) {
195
+ line += pc.dim(` [${metadata.args.join(', ')}]`)
196
+ }
197
+
198
+ console.info(line)
199
+ }
200
+
201
+ console.info()
202
+ console.info(pc.dim(`Run: tko ${categoryName}/<name> [args...] to execute`))
203
+ console.info()
204
+ } else {
205
+ console.info()
206
+ console.info(pc.yellow(`No scripts found in ${categoryName}/`))
207
+ console.info()
208
+ }
209
+
210
+ return true
211
+ }
212
+
213
+ return false
214
+ }
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Sync utilities for updating docs and scripts between repositories
3
+ */
4
+
5
+ import { createHash } from 'node:crypto'
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync } from 'node:fs'
7
+ import { join, relative, dirname } from 'node:path'
8
+
9
+ import { confirm } from '@clack/prompts'
10
+ import pc from 'picocolors'
11
+
12
+ export interface FileToSync {
13
+ name: string
14
+ sourcePath: string
15
+ targetPath: string
16
+ status: 'new' | 'modified' | 'identical'
17
+ sourceSize?: number
18
+ targetSize?: number
19
+ }
20
+
21
+ export function getFileHash(filePath: string): string {
22
+ const content = readFileSync(filePath)
23
+ return createHash('md5').update(content).digest('hex')
24
+ }
25
+
26
+ export function compareFiles(
27
+ sourcePath: string,
28
+ targetPath: string
29
+ ): 'new' | 'modified' | 'identical' {
30
+ if (!existsSync(targetPath)) {
31
+ return 'new'
32
+ }
33
+
34
+ const sourceHash = getFileHash(sourcePath)
35
+ const targetHash = getFileHash(targetPath)
36
+
37
+ return sourceHash === targetHash ? 'identical' : 'modified'
38
+ }
39
+
40
+ export async function syncFileWithConfirmation(file: FileToSync): Promise<boolean> {
41
+ const relPath = relative(process.cwd(), file.targetPath)
42
+
43
+ if (file.status === 'identical') {
44
+ console.info(pc.dim(` ✓ ${file.name} (already up to date)`))
45
+ return false
46
+ }
47
+
48
+ const statusColor = file.status === 'new' ? pc.green : pc.yellow
49
+ const statusText = file.status === 'new' ? 'NEW' : 'MODIFIED'
50
+
51
+ console.info()
52
+ console.info(statusColor(` ${statusText}: ${file.name}`))
53
+
54
+ if (file.status === 'modified') {
55
+ const sourceSize = file.sourceSize || 0
56
+ const targetSize = file.targetSize || 0
57
+ const diff = sourceSize - targetSize
58
+
59
+ console.info(pc.dim(` Source: ${sourceSize} bytes`))
60
+ console.info(pc.dim(` Target: ${targetSize} bytes`))
61
+
62
+ if (diff > 0) {
63
+ console.info(pc.cyan(` Source is ${diff} bytes larger`))
64
+ } else if (diff < 0) {
65
+ console.info(pc.magenta(` Target is ${Math.abs(diff)} bytes larger`))
66
+ }
67
+ }
68
+
69
+ console.info(pc.dim(` → ${relPath}`))
70
+
71
+ const shouldSync = await confirm({
72
+ message: `Overwrite this file?`,
73
+ initialValue: true,
74
+ })
75
+
76
+ if (shouldSync === false || typeof shouldSync === 'symbol') {
77
+ console.info(pc.dim(` ⊘ Skipped`))
78
+ return false
79
+ }
80
+
81
+ // ensure target directory exists
82
+ const targetDir = dirname(file.targetPath)
83
+ if (!existsSync(targetDir)) {
84
+ mkdirSync(targetDir, { recursive: true })
85
+ }
86
+
87
+ // copy file
88
+ const content = readFileSync(file.sourcePath)
89
+ writeFileSync(file.targetPath, content)
90
+
91
+ console.info(pc.green(` ✓ Synced`))
92
+ return true
93
+ }
94
+
95
+ export function getFileSize(filePath: string): number {
96
+ try {
97
+ return statSync(filePath).size
98
+ } catch {
99
+ return 0
100
+ }
101
+ }
@@ -0,0 +1,51 @@
1
+ const { withDangerousMod } = require('@expo/config-plugins')
2
+ const { mergeContents } = require('@expo/config-plugins/build/utils/generateCode')
3
+ const fs = require('node:fs')
4
+ const path = require('node:path')
5
+
6
+ /**
7
+ * expo config plugin to add pre_install hook for op-sqlite static framework compilation
8
+ * required when using useFrameworks: 'static'
9
+ * based on: https://github.com/OP-Engineering/op-sqlite/issues/238
10
+ */
11
+ function withOpSqliteStatic(config) {
12
+ return withDangerousMod(config, [
13
+ 'ios',
14
+ async (config) => {
15
+ const podfilePath = path.join(config.modRequest.platformProjectRoot, 'Podfile')
16
+
17
+ if (!fs.existsSync(podfilePath)) {
18
+ return config
19
+ }
20
+
21
+ const podfileContent = fs.readFileSync(podfilePath, 'utf-8')
22
+
23
+ const setOpSqliteStatic = mergeContents({
24
+ tag: 'op-sqlite-static-library',
25
+ src: podfileContent,
26
+ newSrc: `pre_install do |installer|
27
+ installer.pod_targets.each do |pod|
28
+ if pod.name.eql?('op-sqlite')
29
+ def pod.build_type
30
+ Pod::BuildType.static_library
31
+ end
32
+ end
33
+ end
34
+ end`,
35
+ anchor: /platform :ios.*/,
36
+ offset: 1,
37
+ comment: '#',
38
+ })
39
+
40
+ if (!setOpSqliteStatic.didMerge) {
41
+ return config
42
+ }
43
+
44
+ fs.writeFileSync(podfilePath, setOpSqliteStatic.contents)
45
+
46
+ return config
47
+ },
48
+ ])
49
+ }
50
+
51
+ module.exports = withOpSqliteStatic
package/types/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Takeout CLI
4
+ * Interactive tools for Takeout starter kit setup and management
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Changed command - show what's changed in upstream Takeout since last sync
3
+ */
4
+ export declare const changedCommand: import("citty").CommandDef<{
5
+ from: {
6
+ type: "string";
7
+ description: string;
8
+ };
9
+ to: {
10
+ type: "string";
11
+ description: string;
12
+ };
13
+ }>;
14
+ //# sourceMappingURL=changed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changed.d.ts","sourceRoot":"","sources":["../../src/commands/changed.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2OH,eAAO,MAAM,cAAc;;;;;;;;;EA2EzB,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Docs command - list and retrieve documentation files from the package
3
+ */
4
+ export declare const docsCommand: import("citty").CommandDef<import("citty").ArgsDef>;
5
+ //# sourceMappingURL=docs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAujBH,eAAO,MAAM,WAAW,qDAYtB,CAAA"}
@@ -0,0 +1,25 @@
1
+ export declare const envSetupCommand: import("citty").CommandDef<{
2
+ category: {
3
+ type: "string";
4
+ description: string;
5
+ alias: string;
6
+ };
7
+ file: {
8
+ type: "string";
9
+ description: string;
10
+ default: string;
11
+ alias: string;
12
+ };
13
+ list: {
14
+ type: "boolean";
15
+ description: string;
16
+ alias: string;
17
+ default: false;
18
+ };
19
+ 'skip-optional': {
20
+ type: "boolean";
21
+ description: string;
22
+ default: false;
23
+ };
24
+ }>;
25
+ //# sourceMappingURL=env-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-setup.d.ts","sourceRoot":"","sources":["../../src/commands/env-setup.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;EA+D1B,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Onboard command - interactive setup for Takeout starter kit
3
+ */
4
+ export declare const onboardCommand: import("citty").CommandDef<{
5
+ skip: {
6
+ type: "boolean";
7
+ description: string;
8
+ default: false;
9
+ };
10
+ defaults: {
11
+ type: "boolean";
12
+ description: string;
13
+ default: false;
14
+ };
15
+ }>;
16
+ //# sourceMappingURL=onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH,eAAO,MAAM,cAAc;;;;;;;;;;;EA0czB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare const runCommand: import("citty").CommandDef<{
2
+ scripts: {
3
+ type: "positional";
4
+ description: string;
5
+ required: false;
6
+ };
7
+ }>;
8
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU;;;;;;EAsKrB,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Enhanced Script command - hybrid script runner with filesystem discovery
3
+ */
4
+ interface ScriptMetadata {
5
+ description?: string;
6
+ args?: string[];
7
+ mtime?: number;
8
+ }
9
+ export declare function getLocalScriptsDir(): string;
10
+ export declare function getScriptMetadata(filePath: string): ScriptMetadata;
11
+ export declare function discoverScripts(dir: string, baseDir?: string, depth?: number, maxDepth?: number): Map<string, string>;
12
+ export declare function findScript(name: string): string | null;
13
+ export { formatScriptList, listAllScripts, listCategoryScripts, } from '../utils/script-listing';
14
+ export declare const scriptCommand: import("citty").CommandDef<{
15
+ name: {
16
+ type: "positional";
17
+ description: string;
18
+ required: false;
19
+ };
20
+ }>;
21
+ export declare function createShorthandCommand(name: string): import("citty").CommandDef<{
22
+ args: {
23
+ type: "positional";
24
+ description: string;
25
+ required: false;
26
+ };
27
+ }>;
28
+ //# sourceMappingURL=script.d.ts.map