workos 0.17.1 → 0.19.0

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 (366) hide show
  1. package/README.md +11 -149
  2. package/dist/bin.js +155 -23
  3. package/dist/bin.js.map +1 -1
  4. package/dist/cli.config.d.ts +0 -2
  5. package/dist/cli.config.js +3 -3
  6. package/dist/cli.config.js.map +1 -1
  7. package/dist/commands/api/index.js +18 -10
  8. package/dist/commands/api/index.js.map +1 -1
  9. package/dist/commands/api/interactive.js +11 -11
  10. package/dist/commands/api/interactive.js.map +1 -1
  11. package/dist/commands/claim.js +28 -16
  12. package/dist/commands/claim.js.map +1 -1
  13. package/dist/commands/connection.js +3 -3
  14. package/dist/commands/connection.js.map +1 -1
  15. package/dist/commands/debug.d.ts +11 -0
  16. package/dist/commands/debug.js +30 -14
  17. package/dist/commands/debug.js.map +1 -1
  18. package/dist/commands/dev.d.ts +7 -8
  19. package/dist/commands/dev.js +14 -14
  20. package/dist/commands/dev.js.map +1 -1
  21. package/dist/commands/directory.js +3 -3
  22. package/dist/commands/directory.js.map +1 -1
  23. package/dist/commands/doctor.js +2 -2
  24. package/dist/commands/doctor.js.map +1 -1
  25. package/dist/commands/emulate.d.ts +1 -0
  26. package/dist/commands/emulate.js +3 -2
  27. package/dist/commands/emulate.js.map +1 -1
  28. package/dist/commands/env.d.ts +10 -0
  29. package/dist/commands/env.js +94 -18
  30. package/dist/commands/env.js.map +1 -1
  31. package/dist/commands/install.js +9 -10
  32. package/dist/commands/install.js.map +1 -1
  33. package/dist/commands/login.d.ts +25 -15
  34. package/dist/commands/login.js +126 -71
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logout.js +4 -4
  37. package/dist/commands/logout.js.map +1 -1
  38. package/dist/commands/mcp.d.ts +14 -0
  39. package/dist/commands/mcp.js +99 -0
  40. package/dist/commands/mcp.js.map +1 -0
  41. package/dist/commands/migrations.js +2 -1
  42. package/dist/commands/migrations.js.map +1 -1
  43. package/dist/commands/seed.js +5 -4
  44. package/dist/commands/seed.js.map +1 -1
  45. package/dist/commands/setup.d.ts +50 -0
  46. package/dist/commands/setup.js +237 -0
  47. package/dist/commands/setup.js.map +1 -0
  48. package/dist/commands/vault-run.js +3 -2
  49. package/dist/commands/vault-run.js.map +1 -1
  50. package/dist/commands/verify-login.d.ts +25 -0
  51. package/dist/commands/verify-login.js +158 -0
  52. package/dist/commands/verify-login.js.map +1 -0
  53. package/dist/doctor/checks/ai-analysis.js +2 -1
  54. package/dist/doctor/checks/ai-analysis.js.map +1 -1
  55. package/dist/doctor/checks/mcp.d.ts +15 -0
  56. package/dist/doctor/checks/mcp.js +34 -0
  57. package/dist/doctor/checks/mcp.js.map +1 -0
  58. package/dist/doctor/index.js +7 -1
  59. package/dist/doctor/index.js.map +1 -1
  60. package/dist/doctor/issues.js +18 -1
  61. package/dist/doctor/issues.js.map +1 -1
  62. package/dist/doctor/output.js +18 -3
  63. package/dist/doctor/output.js.map +1 -1
  64. package/dist/doctor/types.d.ts +17 -0
  65. package/dist/doctor/types.js.map +1 -1
  66. package/dist/integrations/dotnet/index.js +1 -1
  67. package/dist/integrations/dotnet/index.js.map +1 -1
  68. package/dist/integrations/elixir/index.js +1 -1
  69. package/dist/integrations/elixir/index.js.map +1 -1
  70. package/dist/integrations/go/index.js +1 -1
  71. package/dist/integrations/go/index.js.map +1 -1
  72. package/dist/integrations/nextjs/index.js +8 -5
  73. package/dist/integrations/nextjs/index.js.map +1 -1
  74. package/dist/integrations/nextjs/utils.d.ts +1 -1
  75. package/dist/integrations/nextjs/utils.js +21 -6
  76. package/dist/integrations/nextjs/utils.js.map +1 -1
  77. package/dist/integrations/react-router/index.js +5 -5
  78. package/dist/integrations/react-router/index.js.map +1 -1
  79. package/dist/integrations/react-router/utils.js +28 -12
  80. package/dist/integrations/react-router/utils.js.map +1 -1
  81. package/dist/integrations/ruby/index.js +1 -1
  82. package/dist/integrations/ruby/index.js.map +1 -1
  83. package/dist/lib/adapters/cli-adapter.d.ts +33 -4
  84. package/dist/lib/adapters/cli-adapter.js +251 -135
  85. package/dist/lib/adapters/cli-adapter.js.map +1 -1
  86. package/dist/lib/adapters/dashboard-adapter.js +3 -3
  87. package/dist/lib/adapters/dashboard-adapter.js.map +1 -1
  88. package/dist/lib/adapters/headless-adapter.d.ts +7 -0
  89. package/dist/lib/adapters/headless-adapter.js +42 -5
  90. package/dist/lib/adapters/headless-adapter.js.map +1 -1
  91. package/dist/lib/agent-interface.js +19 -5
  92. package/dist/lib/agent-interface.js.map +1 -1
  93. package/dist/lib/agent-runner.js +1 -1
  94. package/dist/lib/agent-runner.js.map +1 -1
  95. package/dist/lib/ai-content.js +2 -1
  96. package/dist/lib/ai-content.js.map +1 -1
  97. package/dist/lib/api-key.js +2 -1
  98. package/dist/lib/api-key.js.map +1 -1
  99. package/dist/lib/completion-data.d.ts +33 -0
  100. package/dist/lib/completion-data.js +33 -0
  101. package/dist/lib/completion-data.js.map +1 -0
  102. package/dist/lib/config-store.d.ts +13 -0
  103. package/dist/lib/config-store.js +24 -0
  104. package/dist/lib/config-store.js.map +1 -1
  105. package/dist/lib/config.d.ts +1 -1
  106. package/dist/lib/config.js +1 -1
  107. package/dist/lib/config.js.map +1 -1
  108. package/dist/lib/constants.d.ts +17 -0
  109. package/dist/lib/constants.js +17 -0
  110. package/dist/lib/constants.js.map +1 -1
  111. package/dist/lib/events.d.ts +34 -1
  112. package/dist/lib/events.js.map +1 -1
  113. package/dist/lib/framework-config.d.ts +6 -0
  114. package/dist/lib/framework-config.js.map +1 -1
  115. package/dist/lib/installer-core.d.ts +34 -21
  116. package/dist/lib/installer-core.js +24 -5
  117. package/dist/lib/installer-core.js.map +1 -1
  118. package/dist/lib/installer-core.types.d.ts +3 -1
  119. package/dist/lib/installer-core.types.js.map +1 -1
  120. package/dist/lib/mcp-clients.d.ts +45 -0
  121. package/dist/lib/mcp-clients.js +297 -0
  122. package/dist/lib/mcp-clients.js.map +1 -0
  123. package/dist/lib/port-detection.js +19 -13
  124. package/dist/lib/port-detection.js.map +1 -1
  125. package/dist/lib/preferences.d.ts +42 -0
  126. package/dist/lib/preferences.js +34 -5
  127. package/dist/lib/preferences.js.map +1 -1
  128. package/dist/lib/run-with-core.js +42 -4
  129. package/dist/lib/run-with-core.js.map +1 -1
  130. package/dist/lib/settings.d.ts +5 -14
  131. package/dist/lib/settings.js +5 -16
  132. package/dist/lib/settings.js.map +1 -1
  133. package/dist/lib/startup-notice-gate.d.ts +21 -0
  134. package/dist/lib/startup-notice-gate.js +29 -0
  135. package/dist/lib/startup-notice-gate.js.map +1 -0
  136. package/dist/lib/telemetry-notice.d.ts +5 -5
  137. package/dist/lib/telemetry-notice.js +10 -8
  138. package/dist/lib/telemetry-notice.js.map +1 -1
  139. package/dist/lib/unclaimed-env-provision.js +15 -12
  140. package/dist/lib/unclaimed-env-provision.js.map +1 -1
  141. package/dist/lib/unclaimed-warning.js +7 -3
  142. package/dist/lib/unclaimed-warning.js.map +1 -1
  143. package/dist/lib/validation/security-checks.js +2 -1
  144. package/dist/lib/validation/security-checks.js.map +1 -1
  145. package/dist/lib/validation/validator.js +30 -3
  146. package/dist/lib/validation/validator.js.map +1 -1
  147. package/dist/lib/workos-management.js +26 -19
  148. package/dist/lib/workos-management.js.map +1 -1
  149. package/dist/run.d.ts +1 -0
  150. package/dist/run.js +5 -1
  151. package/dist/run.js.map +1 -1
  152. package/dist/steps/add-or-update-environment-variables.js +10 -10
  153. package/dist/steps/add-or-update-environment-variables.js.map +1 -1
  154. package/dist/steps/run-prettier.js +3 -3
  155. package/dist/steps/run-prettier.js.map +1 -1
  156. package/dist/steps/upload-environment-variables/index.js +15 -3
  157. package/dist/steps/upload-environment-variables/index.js.map +1 -1
  158. package/dist/steps/upload-environment-variables/providers/vercel.js +2 -2
  159. package/dist/steps/upload-environment-variables/providers/vercel.js.map +1 -1
  160. package/dist/utils/analytics.d.ts +1 -0
  161. package/dist/utils/analytics.js +5 -1
  162. package/dist/utils/analytics.js.map +1 -1
  163. package/dist/utils/box.d.ts +6 -30
  164. package/dist/utils/box.js +8 -95
  165. package/dist/utils/box.js.map +1 -1
  166. package/dist/utils/cli-symbols.d.ts +14 -2
  167. package/dist/utils/cli-symbols.js +12 -0
  168. package/dist/utils/cli-symbols.js.map +1 -1
  169. package/dist/utils/debug.js +3 -3
  170. package/dist/utils/debug.js.map +1 -1
  171. package/dist/utils/environment.js +1 -1
  172. package/dist/utils/environment.js.map +1 -1
  173. package/dist/utils/help-json.js +153 -4
  174. package/dist/utils/help-json.js.map +1 -1
  175. package/dist/utils/interaction-mode.d.ts +1 -1
  176. package/dist/utils/interaction-mode.js +0 -3
  177. package/dist/utils/interaction-mode.js.map +1 -1
  178. package/dist/utils/output.d.ts +5 -3
  179. package/dist/utils/output.js +5 -5
  180. package/dist/utils/output.js.map +1 -1
  181. package/dist/utils/package-manager.js +1 -1
  182. package/dist/utils/package-manager.js.map +1 -1
  183. package/dist/utils/recovery-hints.d.ts +5 -0
  184. package/dist/utils/recovery-hints.js +12 -0
  185. package/dist/utils/recovery-hints.js.map +1 -1
  186. package/dist/utils/summary-box.d.ts +8 -1
  187. package/dist/utils/summary-box.js +67 -4
  188. package/dist/utils/summary-box.js.map +1 -1
  189. package/dist/utils/telemetry-types.d.ts +1 -1
  190. package/dist/utils/telemetry-types.js.map +1 -1
  191. package/dist/utils/types.d.ts +10 -0
  192. package/dist/utils/types.js.map +1 -1
  193. package/dist/utils/{clack-utils.d.ts → ui-utils.d.ts} +1 -1
  194. package/dist/utils/{clack-utils.js → ui-utils.js} +64 -37
  195. package/dist/utils/ui-utils.js.map +1 -0
  196. package/dist/utils/ui.d.ts +148 -0
  197. package/dist/utils/ui.js +368 -0
  198. package/dist/utils/ui.js.map +1 -0
  199. package/dist/utils/urls.d.ts +9 -3
  200. package/dist/utils/urls.js +10 -4
  201. package/dist/utils/urls.js.map +1 -1
  202. package/package.json +13 -20
  203. package/dist/check-coverage.ts +0 -237
  204. package/dist/emulate/core/id.d.ts +0 -48
  205. package/dist/emulate/core/id.js +0 -73
  206. package/dist/emulate/core/id.js.map +0 -1
  207. package/dist/emulate/core/index.d.ts +0 -8
  208. package/dist/emulate/core/index.js +0 -8
  209. package/dist/emulate/core/index.js.map +0 -1
  210. package/dist/emulate/core/jwt.d.ts +0 -28
  211. package/dist/emulate/core/jwt.js +0 -78
  212. package/dist/emulate/core/jwt.js.map +0 -1
  213. package/dist/emulate/core/middleware/auth.d.ts +0 -15
  214. package/dist/emulate/core/middleware/auth.js +0 -17
  215. package/dist/emulate/core/middleware/auth.js.map +0 -1
  216. package/dist/emulate/core/middleware/error-handler.d.ts +0 -22
  217. package/dist/emulate/core/middleware/error-handler.js +0 -72
  218. package/dist/emulate/core/middleware/error-handler.js.map +0 -1
  219. package/dist/emulate/core/pagination.d.ts +0 -27
  220. package/dist/emulate/core/pagination.js +0 -43
  221. package/dist/emulate/core/pagination.js.map +0 -1
  222. package/dist/emulate/core/plugin.d.ts +0 -15
  223. package/dist/emulate/core/plugin.js +0 -2
  224. package/dist/emulate/core/plugin.js.map +0 -1
  225. package/dist/emulate/core/server.d.ts +0 -17
  226. package/dist/emulate/core/server.js +0 -90
  227. package/dist/emulate/core/server.js.map +0 -1
  228. package/dist/emulate/core/store.d.ts +0 -44
  229. package/dist/emulate/core/store.js +0 -169
  230. package/dist/emulate/core/store.js.map +0 -1
  231. package/dist/emulate/index.d.ts +0 -25
  232. package/dist/emulate/index.js +0 -47
  233. package/dist/emulate/index.js.map +0 -1
  234. package/dist/emulate/workos/constants.d.ts +0 -56
  235. package/dist/emulate/workos/constants.js +0 -56
  236. package/dist/emulate/workos/constants.js.map +0 -1
  237. package/dist/emulate/workos/entities.d.ts +0 -360
  238. package/dist/emulate/workos/entities.js +0 -2
  239. package/dist/emulate/workos/entities.js.map +0 -1
  240. package/dist/emulate/workos/event-bus.d.ts +0 -17
  241. package/dist/emulate/workos/event-bus.js +0 -70
  242. package/dist/emulate/workos/event-bus.js.map +0 -1
  243. package/dist/emulate/workos/helpers.d.ts +0 -72
  244. package/dist/emulate/workos/helpers.js +0 -211
  245. package/dist/emulate/workos/helpers.js.map +0 -1
  246. package/dist/emulate/workos/index.d.ts +0 -93
  247. package/dist/emulate/workos/index.js +0 -326
  248. package/dist/emulate/workos/index.js.map +0 -1
  249. package/dist/emulate/workos/role-helpers.d.ts +0 -21
  250. package/dist/emulate/workos/role-helpers.js +0 -130
  251. package/dist/emulate/workos/role-helpers.js.map +0 -1
  252. package/dist/emulate/workos/routes/api-keys.d.ts +0 -2
  253. package/dist/emulate/workos/routes/api-keys.js +0 -32
  254. package/dist/emulate/workos/routes/api-keys.js.map +0 -1
  255. package/dist/emulate/workos/routes/audit-logs.d.ts +0 -2
  256. package/dist/emulate/workos/routes/audit-logs.js +0 -104
  257. package/dist/emulate/workos/routes/audit-logs.js.map +0 -1
  258. package/dist/emulate/workos/routes/auth-challenges.d.ts +0 -2
  259. package/dist/emulate/workos/routes/auth-challenges.js +0 -51
  260. package/dist/emulate/workos/routes/auth-challenges.js.map +0 -1
  261. package/dist/emulate/workos/routes/auth-factors.d.ts +0 -2
  262. package/dist/emulate/workos/routes/auth-factors.js +0 -51
  263. package/dist/emulate/workos/routes/auth-factors.js.map +0 -1
  264. package/dist/emulate/workos/routes/auth.d.ts +0 -2
  265. package/dist/emulate/workos/routes/auth.js +0 -350
  266. package/dist/emulate/workos/routes/auth.js.map +0 -1
  267. package/dist/emulate/workos/routes/authorization-checks.d.ts +0 -10
  268. package/dist/emulate/workos/routes/authorization-checks.js +0 -123
  269. package/dist/emulate/workos/routes/authorization-checks.js.map +0 -1
  270. package/dist/emulate/workos/routes/authorization-org-roles.d.ts +0 -2
  271. package/dist/emulate/workos/routes/authorization-org-roles.js +0 -64
  272. package/dist/emulate/workos/routes/authorization-org-roles.js.map +0 -1
  273. package/dist/emulate/workos/routes/authorization-permissions.d.ts +0 -2
  274. package/dist/emulate/workos/routes/authorization-permissions.js +0 -67
  275. package/dist/emulate/workos/routes/authorization-permissions.js.map +0 -1
  276. package/dist/emulate/workos/routes/authorization-resources.d.ts +0 -2
  277. package/dist/emulate/workos/routes/authorization-resources.js +0 -117
  278. package/dist/emulate/workos/routes/authorization-resources.js.map +0 -1
  279. package/dist/emulate/workos/routes/authorization-roles.d.ts +0 -2
  280. package/dist/emulate/workos/routes/authorization-roles.js +0 -13
  281. package/dist/emulate/workos/routes/authorization-roles.js.map +0 -1
  282. package/dist/emulate/workos/routes/config.d.ts +0 -2
  283. package/dist/emulate/workos/routes/config.js +0 -57
  284. package/dist/emulate/workos/routes/config.js.map +0 -1
  285. package/dist/emulate/workos/routes/connect.d.ts +0 -2
  286. package/dist/emulate/workos/routes/connect.js +0 -65
  287. package/dist/emulate/workos/routes/connect.js.map +0 -1
  288. package/dist/emulate/workos/routes/connections.d.ts +0 -2
  289. package/dist/emulate/workos/routes/connections.js +0 -73
  290. package/dist/emulate/workos/routes/connections.js.map +0 -1
  291. package/dist/emulate/workos/routes/data-integrations.d.ts +0 -2
  292. package/dist/emulate/workos/routes/data-integrations.js +0 -55
  293. package/dist/emulate/workos/routes/data-integrations.js.map +0 -1
  294. package/dist/emulate/workos/routes/directories.d.ts +0 -2
  295. package/dist/emulate/workos/routes/directories.js +0 -90
  296. package/dist/emulate/workos/routes/directories.js.map +0 -1
  297. package/dist/emulate/workos/routes/email-verification.d.ts +0 -2
  298. package/dist/emulate/workos/routes/email-verification.js +0 -49
  299. package/dist/emulate/workos/routes/email-verification.js.map +0 -1
  300. package/dist/emulate/workos/routes/events.d.ts +0 -2
  301. package/dist/emulate/workos/routes/events.js +0 -18
  302. package/dist/emulate/workos/routes/events.js.map +0 -1
  303. package/dist/emulate/workos/routes/feature-flags.d.ts +0 -2
  304. package/dist/emulate/workos/routes/feature-flags.js +0 -103
  305. package/dist/emulate/workos/routes/feature-flags.js.map +0 -1
  306. package/dist/emulate/workos/routes/invitations.d.ts +0 -2
  307. package/dist/emulate/workos/routes/invitations.js +0 -122
  308. package/dist/emulate/workos/routes/invitations.js.map +0 -1
  309. package/dist/emulate/workos/routes/legacy-mfa.d.ts +0 -2
  310. package/dist/emulate/workos/routes/legacy-mfa.js +0 -75
  311. package/dist/emulate/workos/routes/legacy-mfa.js.map +0 -1
  312. package/dist/emulate/workos/routes/magic-auth.d.ts +0 -2
  313. package/dist/emulate/workos/routes/magic-auth.js +0 -32
  314. package/dist/emulate/workos/routes/magic-auth.js.map +0 -1
  315. package/dist/emulate/workos/routes/memberships.d.ts +0 -2
  316. package/dist/emulate/workos/routes/memberships.js +0 -114
  317. package/dist/emulate/workos/routes/memberships.js.map +0 -1
  318. package/dist/emulate/workos/routes/organization-domains.d.ts +0 -2
  319. package/dist/emulate/workos/routes/organization-domains.js +0 -58
  320. package/dist/emulate/workos/routes/organization-domains.js.map +0 -1
  321. package/dist/emulate/workos/routes/organizations.d.ts +0 -2
  322. package/dist/emulate/workos/routes/organizations.js +0 -131
  323. package/dist/emulate/workos/routes/organizations.js.map +0 -1
  324. package/dist/emulate/workos/routes/password-reset.d.ts +0 -2
  325. package/dist/emulate/workos/routes/password-reset.js +0 -61
  326. package/dist/emulate/workos/routes/password-reset.js.map +0 -1
  327. package/dist/emulate/workos/routes/pipes.d.ts +0 -2
  328. package/dist/emulate/workos/routes/pipes.js +0 -82
  329. package/dist/emulate/workos/routes/pipes.js.map +0 -1
  330. package/dist/emulate/workos/routes/portal.d.ts +0 -2
  331. package/dist/emulate/workos/routes/portal.js +0 -18
  332. package/dist/emulate/workos/routes/portal.js.map +0 -1
  333. package/dist/emulate/workos/routes/radar.d.ts +0 -2
  334. package/dist/emulate/workos/routes/radar.js +0 -41
  335. package/dist/emulate/workos/routes/radar.js.map +0 -1
  336. package/dist/emulate/workos/routes/sessions.d.ts +0 -2
  337. package/dist/emulate/workos/routes/sessions.js +0 -51
  338. package/dist/emulate/workos/routes/sessions.js.map +0 -1
  339. package/dist/emulate/workos/routes/sso.d.ts +0 -2
  340. package/dist/emulate/workos/routes/sso.js +0 -161
  341. package/dist/emulate/workos/routes/sso.js.map +0 -1
  342. package/dist/emulate/workos/routes/user-features.d.ts +0 -2
  343. package/dist/emulate/workos/routes/user-features.js +0 -50
  344. package/dist/emulate/workos/routes/user-features.js.map +0 -1
  345. package/dist/emulate/workos/routes/users.d.ts +0 -2
  346. package/dist/emulate/workos/routes/users.js +0 -129
  347. package/dist/emulate/workos/routes/users.js.map +0 -1
  348. package/dist/emulate/workos/routes/webhook-endpoints.d.ts +0 -2
  349. package/dist/emulate/workos/routes/webhook-endpoints.js +0 -67
  350. package/dist/emulate/workos/routes/webhook-endpoints.js.map +0 -1
  351. package/dist/emulate/workos/routes/widgets.d.ts +0 -2
  352. package/dist/emulate/workos/routes/widgets.js +0 -27
  353. package/dist/emulate/workos/routes/widgets.js.map +0 -1
  354. package/dist/emulate/workos/store.d.ts +0 -48
  355. package/dist/emulate/workos/store.js +0 -102
  356. package/dist/emulate/workos/store.js.map +0 -1
  357. package/dist/emulate/workos/webhook-signer.d.ts +0 -1
  358. package/dist/emulate/workos/webhook-signer.js +0 -8
  359. package/dist/emulate/workos/webhook-signer.js.map +0 -1
  360. package/dist/gen-routes-lib.spec.ts +0 -659
  361. package/dist/gen-routes-lib.ts +0 -647
  362. package/dist/gen-routes.ts +0 -96
  363. package/dist/utils/clack-utils.js.map +0 -1
  364. package/dist/utils/clack.d.ts +0 -5
  365. package/dist/utils/clack.js +0 -34
  366. package/dist/utils/clack.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';
2
2
  import { analytics } from '../utils/analytics.js';
3
- import clack from '../utils/clack.js';
3
+ import ui from '../utils/ui.js';
4
4
  import { getCallbackPath } from './port-detection.js';
5
5
  const WORKOS_API_BASE = 'https://api.workos.com';
6
6
  async function workosRequest(method, endpoint, apiKey, body) {
@@ -86,10 +86,7 @@ export async function autoConfigureWorkOSEnvironment(apiKey, integration, port,
86
86
  const callbackPath = getCallbackPath(integration);
87
87
  const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;
88
88
  const homepageUrlValue = options.homepageUrl || baseUrl;
89
- clack.log.step('Configuring WorkOS dashboard settings via API...');
90
- clack.log.info(` Redirect URI: ${callbackUrl}`);
91
- clack.log.info(` CORS origin: ${baseUrl}`);
92
- clack.log.info(` Homepage URL: ${homepageUrlValue}`);
89
+ ui.log.step('Configuring WorkOS dashboard settings...');
93
90
  try {
94
91
  const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([
95
92
  createRedirectUri(apiKey, callbackUrl),
@@ -104,33 +101,43 @@ export async function autoConfigureWorkOSEnvironment(apiKey, integration, port,
104
101
  redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',
105
102
  corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',
106
103
  });
107
- // Build user feedback
108
- const messages = [];
109
- messages.push(redirectUri.alreadyExists
110
- ? `Redirect URI: ${callbackUrl} (already existed)`
111
- : `Redirect URI: ${callbackUrl} (created)`);
112
- messages.push(corsOrigin.alreadyExists ? `CORS origin: ${baseUrl} (already existed)` : `CORS origin: ${baseUrl} (created)`);
113
- messages.push(`Homepage URL: ${homepageUrlValue} (updated)`);
114
- clack.log.success('WorkOS dashboard configured:\n ' + messages.join('\n '));
104
+ // Aligned key/value feedback: value in accent, a dim status for "already
105
+ // existed" vs. a green status for a fresh create/update.
106
+ ui.log.success('WorkOS dashboard configured');
107
+ ui.rows([
108
+ {
109
+ key: 'Redirect URI',
110
+ value: callbackUrl,
111
+ status: redirectUri.alreadyExists ? 'already set' : 'created',
112
+ statusKind: redirectUri.alreadyExists ? 'muted' : 'ok',
113
+ },
114
+ {
115
+ key: 'CORS origin',
116
+ value: baseUrl,
117
+ status: corsOrigin.alreadyExists ? 'already set' : 'created',
118
+ statusKind: corsOrigin.alreadyExists ? 'muted' : 'ok',
119
+ },
120
+ { key: 'Homepage URL', value: homepageUrlValue, status: 'updated', statusKind: 'ok' },
121
+ ]);
115
122
  return results;
116
123
  }
117
124
  catch (error) {
118
125
  const message = error instanceof Error ? error.message : 'Unknown error';
119
126
  // Provide specific guidance for common errors
120
127
  if (message.includes('401') || message.includes('Invalid API key')) {
121
- clack.log.warn('Could not configure WorkOS dashboard: Invalid API key');
128
+ ui.log.warn('Could not configure WorkOS dashboard: Invalid API key');
122
129
  }
123
130
  else if (message.includes('403') || message.includes('permission')) {
124
- clack.log.warn('Could not configure WorkOS dashboard: API key lacks permission');
131
+ ui.log.warn('Could not configure WorkOS dashboard: API key lacks permission');
125
132
  }
126
133
  else if (message.includes('422') || message.includes('Validation')) {
127
- clack.log.warn(`Could not configure WorkOS dashboard: Validation error`);
128
- clack.log.info(` Error: ${message}`);
134
+ ui.log.warn(`Could not configure WorkOS dashboard: Validation error`);
135
+ ui.log.info(` Error: ${message}`);
129
136
  }
130
137
  else {
131
- clack.log.warn(`Could not configure WorkOS dashboard: ${message}`);
138
+ ui.log.warn(`Could not configure WorkOS dashboard: ${message}`);
132
139
  }
133
- clack.log.info('You can configure these settings manually in the WorkOS dashboard.');
140
+ ui.log.info('You can configure these settings manually in the WorkOS dashboard.');
134
141
  analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {
135
142
  action: 'workos environment auto-config failed',
136
143
  integration,
@@ -1 +1 @@
1
- {"version":3,"file":"workos-management.js","sourceRoot":"","sources":["../../src/lib/workos-management.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAcjD,KAAK,UAAU,aAAa,CAC1B,MAAsB,EACtB,QAAgB,EAChB,MAAc,EACd,IAA4B;IAE5B,OAAO,KAAK,CAAC,GAAG,eAAe,GAAG,QAAQ,EAAE,EAAE;QAC5C,MAAM;QACN,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,EAAE;YACjC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAkB;IAC/C,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IACD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,IAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QACnH,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,GAAW;IAC1D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,gCAAgC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEhG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,uDAAuD;IACvD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,MAAc;IAC5D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,+BAA+B,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAElG,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC9C,0DAA0D;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,cAAc,CAAC,MAAc,EAAE,GAAW;IACvD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,mCAAmC,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAElG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AASD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAc,EACd,WAAwB,EACxB,IAAY,EACZ,UAA6B,EAAE;IAE/B,MAAM,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,OAAO,GAAG,YAAY,EAAE,CAAC;IACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC;IAExD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,WAAW,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,gBAAgB,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/D,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC;YACtC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;YACjC,cAAc,CAAC,MAAM,EAAE,gBAAgB,CAAC;SACzC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAqB,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAE3E,SAAS,CAAC,OAAO,CAAC,gCAAgC,EAAE;YAClD,MAAM,EAAE,oCAAoC;YAC5C,WAAW;YACX,IAAI;YACJ,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC9D,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;QAEH,sBAAsB;QACtB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CACX,WAAW,CAAC,aAAa;YACvB,CAAC,CAAC,iBAAiB,WAAW,oBAAoB;YAClD,CAAC,CAAC,iBAAiB,WAAW,YAAY,CAC7C,CAAC;QACF,QAAQ,CAAC,IAAI,CACX,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,OAAO,oBAAoB,CAAC,CAAC,CAAC,gBAAgB,OAAO,YAAY,CAC7G,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,iBAAiB,gBAAgB,YAAY,CAAC,CAAC;QAE7D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kCAAkC,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAE9E,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAEzE,8CAA8C;QAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACzE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QAErF,SAAS,CAAC,OAAO,CAAC,gCAAgC,EAAE;YAClD,MAAM,EAAE,uCAAuC;YAC/C,WAAW;YACX,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["import type { Integration } from './constants.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport { getCallbackPath } from './port-detection.js';\n\nconst WORKOS_API_BASE = 'https://api.workos.com';\n\nexport interface AutoConfigResult {\n redirectUri: { success: boolean; alreadyExists: boolean };\n corsOrigin: { success: boolean; alreadyExists: boolean };\n homepageUrl: { success: boolean };\n}\n\ninterface FetchError {\n status: number;\n message: string;\n data?: unknown;\n}\n\nasync function workosRequest(\n method: 'POST' | 'PUT',\n endpoint: string,\n apiKey: string,\n body: Record<string, string>,\n): Promise<Response> {\n return fetch(`${WORKOS_API_BASE}${endpoint}`, {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n}\n\nasync function parseFetchError(response: Response): Promise<FetchError> {\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n // Response wasn't JSON\n }\n return {\n status: response.status,\n message: typeof data === 'object' && data && 'message' in data ? String((data as { message: string }).message) : '',\n data,\n };\n}\n\n/**\n * Create a redirect URI in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createRedirectUri(apiKey: string, uri: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when URI already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Create a CORS origin in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createCorsOrigin(apiKey: string, origin: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when origin already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Set the app homepage URL in WorkOS.\n */\nasync function setHomepageUrl(apiKey: string, url: string): Promise<{ success: boolean }> {\n const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });\n\n if (!response.ok) {\n const error = await parseFetchError(response);\n throw new Error(error.message || `HTTP ${error.status}`);\n }\n\n return { success: true };\n}\n\nexport interface AutoConfigOptions {\n /** Custom homepage URL (defaults to http://localhost:{port}) */\n homepageUrl?: string;\n /** Custom redirect URI (defaults to framework convention) */\n redirectUri?: string;\n}\n\n/**\n * Auto-configure WorkOS dashboard settings for local development.\n * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.\n *\n * @param apiKey - WorkOS API key (sk_xxx)\n * @param integration - Framework integration type\n * @param port - Detected or default dev server port\n * @param options - Optional overrides for homepage URL and redirect URI\n *\n * Non-blocking: failures are logged but don't stop the wizard.\n */\nexport async function autoConfigureWorkOSEnvironment(\n apiKey: string,\n integration: Integration,\n port: number,\n options: AutoConfigOptions = {},\n): Promise<AutoConfigResult | null> {\n const baseUrl = `http://localhost:${port}`;\n const callbackPath = getCallbackPath(integration);\n const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;\n const homepageUrlValue = options.homepageUrl || baseUrl;\n\n clack.log.step('Configuring WorkOS dashboard settings via API...');\n clack.log.info(` Redirect URI: ${callbackUrl}`);\n clack.log.info(` CORS origin: ${baseUrl}`);\n clack.log.info(` Homepage URL: ${homepageUrlValue}`);\n\n try {\n const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([\n createRedirectUri(apiKey, callbackUrl),\n createCorsOrigin(apiKey, baseUrl),\n setHomepageUrl(apiKey, homepageUrlValue),\n ]);\n\n const results: AutoConfigResult = { redirectUri, corsOrigin, homepageUrl };\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-configured',\n integration,\n port,\n redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',\n corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',\n });\n\n // Build user feedback\n const messages: string[] = [];\n messages.push(\n redirectUri.alreadyExists\n ? `Redirect URI: ${callbackUrl} (already existed)`\n : `Redirect URI: ${callbackUrl} (created)`,\n );\n messages.push(\n corsOrigin.alreadyExists ? `CORS origin: ${baseUrl} (already existed)` : `CORS origin: ${baseUrl} (created)`,\n );\n messages.push(`Homepage URL: ${homepageUrlValue} (updated)`);\n\n clack.log.success('WorkOS dashboard configured:\\n ' + messages.join('\\n '));\n\n return results;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide specific guidance for common errors\n if (message.includes('401') || message.includes('Invalid API key')) {\n clack.log.warn('Could not configure WorkOS dashboard: Invalid API key');\n } else if (message.includes('403') || message.includes('permission')) {\n clack.log.warn('Could not configure WorkOS dashboard: API key lacks permission');\n } else if (message.includes('422') || message.includes('Validation')) {\n clack.log.warn(`Could not configure WorkOS dashboard: Validation error`);\n clack.log.info(` Error: ${message}`);\n } else {\n clack.log.warn(`Could not configure WorkOS dashboard: ${message}`);\n }\n\n clack.log.info('You can configure these settings manually in the WorkOS dashboard.');\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-config failed',\n integration,\n error: message,\n });\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"workos-management.js","sourceRoot":"","sources":["../../src/lib/workos-management.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from './constants.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport { getCallbackPath } from './port-detection.js';\n\nconst WORKOS_API_BASE = 'https://api.workos.com';\n\nexport interface AutoConfigResult {\n redirectUri: { success: boolean; alreadyExists: boolean };\n corsOrigin: { success: boolean; alreadyExists: boolean };\n homepageUrl: { success: boolean };\n}\n\ninterface FetchError {\n status: number;\n message: string;\n data?: unknown;\n}\n\nasync function workosRequest(\n method: 'POST' | 'PUT',\n endpoint: string,\n apiKey: string,\n body: Record<string, string>,\n): Promise<Response> {\n return fetch(`${WORKOS_API_BASE}${endpoint}`, {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n}\n\nasync function parseFetchError(response: Response): Promise<FetchError> {\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n // Response wasn't JSON\n }\n return {\n status: response.status,\n message: typeof data === 'object' && data && 'message' in data ? String((data as { message: string }).message) : '',\n data,\n };\n}\n\n/**\n * Create a redirect URI in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createRedirectUri(apiKey: string, uri: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when URI already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Create a CORS origin in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createCorsOrigin(apiKey: string, origin: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when origin already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Set the app homepage URL in WorkOS.\n */\nasync function setHomepageUrl(apiKey: string, url: string): Promise<{ success: boolean }> {\n const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });\n\n if (!response.ok) {\n const error = await parseFetchError(response);\n throw new Error(error.message || `HTTP ${error.status}`);\n }\n\n return { success: true };\n}\n\nexport interface AutoConfigOptions {\n /** Custom homepage URL (defaults to http://localhost:{port}) */\n homepageUrl?: string;\n /** Custom redirect URI (defaults to framework convention) */\n redirectUri?: string;\n}\n\n/**\n * Auto-configure WorkOS dashboard settings for local development.\n * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.\n *\n * @param apiKey - WorkOS API key (sk_xxx)\n * @param integration - Framework integration type\n * @param port - Detected or default dev server port\n * @param options - Optional overrides for homepage URL and redirect URI\n *\n * Non-blocking: failures are logged but don't stop the wizard.\n */\nexport async function autoConfigureWorkOSEnvironment(\n apiKey: string,\n integration: Integration,\n port: number,\n options: AutoConfigOptions = {},\n): Promise<AutoConfigResult | null> {\n const baseUrl = `http://localhost:${port}`;\n const callbackPath = getCallbackPath(integration);\n const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;\n const homepageUrlValue = options.homepageUrl || baseUrl;\n\n ui.log.step('Configuring WorkOS dashboard settings...');\n\n try {\n const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([\n createRedirectUri(apiKey, callbackUrl),\n createCorsOrigin(apiKey, baseUrl),\n setHomepageUrl(apiKey, homepageUrlValue),\n ]);\n\n const results: AutoConfigResult = { redirectUri, corsOrigin, homepageUrl };\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-configured',\n integration,\n port,\n redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',\n corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',\n });\n\n // Aligned key/value feedback: value in accent, a dim status for \"already\n // existed\" vs. a green status for a fresh create/update.\n ui.log.success('WorkOS dashboard configured');\n ui.rows([\n {\n key: 'Redirect URI',\n value: callbackUrl,\n status: redirectUri.alreadyExists ? 'already set' : 'created',\n statusKind: redirectUri.alreadyExists ? 'muted' : 'ok',\n },\n {\n key: 'CORS origin',\n value: baseUrl,\n status: corsOrigin.alreadyExists ? 'already set' : 'created',\n statusKind: corsOrigin.alreadyExists ? 'muted' : 'ok',\n },\n { key: 'Homepage URL', value: homepageUrlValue, status: 'updated', statusKind: 'ok' },\n ]);\n\n return results;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide specific guidance for common errors\n if (message.includes('401') || message.includes('Invalid API key')) {\n ui.log.warn('Could not configure WorkOS dashboard: Invalid API key');\n } else if (message.includes('403') || message.includes('permission')) {\n ui.log.warn('Could not configure WorkOS dashboard: API key lacks permission');\n } else if (message.includes('422') || message.includes('Validation')) {\n ui.log.warn(`Could not configure WorkOS dashboard: Validation error`);\n ui.log.info(` Error: ${message}`);\n } else {\n ui.log.warn(`Could not configure WorkOS dashboard: ${message}`);\n }\n\n ui.log.info('You can configure these settings manually in the WorkOS dashboard.');\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-config failed',\n integration,\n error: message,\n });\n\n return null;\n }\n}\n"]}
package/dist/run.d.ts CHANGED
@@ -24,6 +24,7 @@ export type InstallerArgs = {
24
24
  direct?: boolean;
25
25
  scaffold?: boolean;
26
26
  pm?: string;
27
+ router?: 'app' | 'pages';
27
28
  };
28
29
  /**
29
30
  * Main entry point for the wizard CLI.
package/dist/run.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { readEnvironment } from './utils/environment.js';
2
2
  import { runWithCore } from './lib/run-with-core.js';
3
3
  import { createInstallerEventEmitter } from './lib/events.js';
4
+ import { isCiMode } from './utils/interaction-mode.js';
4
5
  import path from 'path';
5
6
  import { EventEmitter } from 'events';
6
7
  EventEmitter.defaultMaxListeners = 50;
@@ -24,7 +25,9 @@ function buildOptions(argv) {
24
25
  forceInstall: merged.forceInstall ?? false,
25
26
  installDir,
26
27
  local: merged.local ?? false,
27
- ci: merged.ci ?? false,
28
+ // Bridge WORKOS_MODE=ci to the downstream `options.ci` paths (git checks,
29
+ // package-manager select) so it fully behaves like the hidden --ci flag.
30
+ ci: (merged.ci ?? false) || isCiMode(),
28
31
  skipAuth: merged.skipAuth ?? false,
29
32
  apiKey: merged.apiKey,
30
33
  clientId: merged.clientId,
@@ -40,6 +43,7 @@ function buildOptions(argv) {
40
43
  direct: merged.direct ?? false,
41
44
  scaffold: merged.scaffold ?? false,
42
45
  pm: merged.pm,
46
+ router: merged.router,
43
47
  emitter: createInstallerEventEmitter(), // Will be replaced in runWithCore
44
48
  };
45
49
  }
package/dist/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;AA8BtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAmB;IACvC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;QAC1C,UAAU;QACV,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK;QACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;QAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;QAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,2BAA2B,EAAE,EAAE,kCAAkC;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import { readEnvironment } from './utils/environment.js';\nimport { runWithCore } from './lib/run-with-core.js';\nimport type { InstallerOptions } from './utils/types.js';\nimport { createInstallerEventEmitter } from './lib/events.js';\nimport path from 'path';\nimport { EventEmitter } from 'events';\n\nEventEmitter.defaultMaxListeners = 50;\n\nexport type InstallerArgs = {\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n default?: boolean;\n local?: boolean;\n ci?: boolean;\n skipAuth?: boolean;\n apiKey?: string;\n clientId?: string;\n homepageUrl?: string;\n redirectUri?: string;\n dashboard?: boolean;\n inspect?: boolean;\n noValidate?: boolean;\n validate?: boolean;\n noCommit?: boolean;\n commit?: boolean;\n noBranch?: boolean;\n branch?: boolean;\n createPr?: boolean;\n noGitCheck?: boolean;\n gitCheck?: boolean;\n direct?: boolean;\n scaffold?: boolean;\n pm?: string;\n};\n\n/**\n * Main entry point for the wizard CLI.\n * Builds options from args and delegates to the core.\n */\nexport async function runInstaller(argv: InstallerArgs): Promise<void> {\n const options = buildOptions(argv);\n await runWithCore(options);\n}\n\n/**\n * Build InstallerOptions from CLI args and environment.\n */\nfunction buildOptions(argv: InstallerArgs): InstallerOptions {\n const envArgs = readEnvironment();\n const merged = { ...argv, ...envArgs };\n\n const installDir = resolveInstallDir(merged.installDir);\n\n return {\n debug: merged.debug ?? false,\n forceInstall: merged.forceInstall ?? false,\n installDir,\n local: merged.local ?? false,\n ci: merged.ci ?? false,\n skipAuth: merged.skipAuth ?? false,\n apiKey: merged.apiKey,\n clientId: merged.clientId,\n homepageUrl: merged.homepageUrl,\n redirectUri: merged.redirectUri,\n dashboard: merged.dashboard ?? false,\n inspect: merged.inspect ?? false,\n noValidate: merged.noValidate ?? merged.validate === false,\n noCommit: merged.noCommit ?? merged.commit === false,\n noBranch: merged.noBranch ?? merged.branch === false,\n createPr: merged.createPr ?? false,\n noGitCheck: merged.noGitCheck ?? merged.gitCheck === false,\n direct: merged.direct ?? false,\n scaffold: merged.scaffold ?? false,\n pm: merged.pm,\n emitter: createInstallerEventEmitter(), // Will be replaced in runWithCore\n };\n}\n\n/**\n * Resolve install directory to absolute path.\n */\nfunction resolveInstallDir(dir?: string): string {\n if (!dir) return process.cwd();\n return path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir);\n}\n"]}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;AA+BtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAmB;IACvC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;QAC1C,UAAU;QACV,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,0EAA0E;QAC1E,yEAAyE;QACzE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,QAAQ,EAAE;QACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;QAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;QAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,2BAA2B,EAAE,EAAE,kCAAkC;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import { readEnvironment } from './utils/environment.js';\nimport { runWithCore } from './lib/run-with-core.js';\nimport type { InstallerOptions } from './utils/types.js';\nimport { createInstallerEventEmitter } from './lib/events.js';\nimport { isCiMode } from './utils/interaction-mode.js';\nimport path from 'path';\nimport { EventEmitter } from 'events';\n\nEventEmitter.defaultMaxListeners = 50;\n\nexport type InstallerArgs = {\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n default?: boolean;\n local?: boolean;\n ci?: boolean;\n skipAuth?: boolean;\n apiKey?: string;\n clientId?: string;\n homepageUrl?: string;\n redirectUri?: string;\n dashboard?: boolean;\n inspect?: boolean;\n noValidate?: boolean;\n validate?: boolean;\n noCommit?: boolean;\n commit?: boolean;\n noBranch?: boolean;\n branch?: boolean;\n createPr?: boolean;\n noGitCheck?: boolean;\n gitCheck?: boolean;\n direct?: boolean;\n scaffold?: boolean;\n pm?: string;\n router?: 'app' | 'pages';\n};\n\n/**\n * Main entry point for the wizard CLI.\n * Builds options from args and delegates to the core.\n */\nexport async function runInstaller(argv: InstallerArgs): Promise<void> {\n const options = buildOptions(argv);\n await runWithCore(options);\n}\n\n/**\n * Build InstallerOptions from CLI args and environment.\n */\nfunction buildOptions(argv: InstallerArgs): InstallerOptions {\n const envArgs = readEnvironment();\n const merged = { ...argv, ...envArgs };\n\n const installDir = resolveInstallDir(merged.installDir);\n\n return {\n debug: merged.debug ?? false,\n forceInstall: merged.forceInstall ?? false,\n installDir,\n local: merged.local ?? false,\n // Bridge WORKOS_MODE=ci to the downstream `options.ci` paths (git checks,\n // package-manager select) so it fully behaves like the hidden --ci flag.\n ci: (merged.ci ?? false) || isCiMode(),\n skipAuth: merged.skipAuth ?? false,\n apiKey: merged.apiKey,\n clientId: merged.clientId,\n homepageUrl: merged.homepageUrl,\n redirectUri: merged.redirectUri,\n dashboard: merged.dashboard ?? false,\n inspect: merged.inspect ?? false,\n noValidate: merged.noValidate ?? merged.validate === false,\n noCommit: merged.noCommit ?? merged.commit === false,\n noBranch: merged.noBranch ?? merged.branch === false,\n createPr: merged.createPr ?? false,\n noGitCheck: merged.noGitCheck ?? merged.gitCheck === false,\n direct: merged.direct ?? false,\n scaffold: merged.scaffold ?? false,\n pm: merged.pm,\n router: merged.router,\n emitter: createInstallerEventEmitter(), // Will be replaced in runWithCore\n };\n}\n\n/**\n * Resolve install directory to absolute path.\n */\nfunction resolveInstallDir(dir?: string): string {\n if (!dir) return process.cwd();\n return path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir);\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import chalk from 'chalk';
2
2
  import { traceStep } from '../telemetry.js';
3
3
  import { analytics } from '../utils/analytics.js';
4
- import clack from '../utils/clack.js';
4
+ import ui from '../utils/ui.js';
5
5
  import * as fs from 'fs';
6
6
  import path from 'path';
7
7
  function getDotGitignore(options) {
@@ -42,15 +42,15 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
42
42
  encoding: 'utf8',
43
43
  flag: 'w',
44
44
  });
45
- clack.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);
45
+ ui.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);
46
46
  }
47
47
  else {
48
- clack.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);
48
+ ui.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);
49
49
  }
50
50
  addedEnvVariables = true;
51
51
  }
52
52
  catch (error) {
53
- clack.log.warning(`Failed to update environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}. Please update them manually.`);
53
+ ui.log.warning(`Failed to update environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}. Please update them manually.`);
54
54
  analytics.capture('installer interaction', {
55
55
  action: 'failed to update environment variables',
56
56
  integration,
@@ -69,11 +69,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
69
69
  encoding: 'utf8',
70
70
  flag: 'w',
71
71
  });
72
- clack.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);
72
+ ui.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);
73
73
  addedEnvVariables = true;
74
74
  }
75
75
  catch (error) {
76
- clack.log.warning(`Failed to create ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables. Please add them manually.`);
76
+ ui.log.warning(`Failed to create ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables. Please add them manually.`);
77
77
  analytics.capture('installer interaction', {
78
78
  action: 'failed to create environment variables',
79
79
  integration,
@@ -99,11 +99,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
99
99
  encoding: 'utf8',
100
100
  flag: 'w',
101
101
  });
102
- clack.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
102
+ ui.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
103
103
  addedGitignore = true;
104
104
  }
105
105
  catch (error) {
106
- clack.log.warning(`Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
106
+ ui.log.warning(`Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
107
107
  analytics.capture('installer interaction', {
108
108
  action: 'failed to update gitignore',
109
109
  integration,
@@ -124,11 +124,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
124
124
  encoding: 'utf8',
125
125
  flag: 'w',
126
126
  });
127
- clack.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);
127
+ ui.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);
128
128
  addedGitignore = true;
129
129
  }
130
130
  catch (error) {
131
- clack.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);
131
+ ui.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);
132
132
  analytics.capture('installer interaction', {
133
133
  action: 'failed to create gitignore',
134
134
  integration,
@@ -1 +1 @@
1
- {"version":3,"file":"add-or-update-environment-variables.js","sourceRoot":"","sources":["../../src/steps/add-or-update-environment-variables.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport * as fs from 'fs';\nimport path from 'path';\n\nfunction getDotGitignore(options: { installDir: string }): string {\n return path.join(options.installDir, '.gitignore');\n}\n\nexport async function addOrUpdateEnvironmentVariablesStep({\n installDir,\n variables,\n integration,\n}: {\n installDir: string;\n variables: Record<string, string>;\n integration: Integration;\n}): Promise<{\n relativeEnvFilePath: string;\n addedEnvVariables: boolean;\n addedGitignore: boolean;\n}> {\n return traceStep('add-or-update-environment-variables', async () => {\n const envVarContent = Object.entries(variables)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n const dotEnvLocalFilePath = path.join(installDir, '.env.local');\n const dotEnvFilePath = path.join(installDir, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath) ? dotEnvLocalFilePath : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(installDir, targetEnvFilePath);\n\n let addedGitignore = false;\n let addedEnvVariables = false;\n\n if (dotEnvFileExists) {\n try {\n let dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n let updated = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`^${key}=.*$`, 'm');\n\n if (dotEnvFileContent.match(regex)) {\n dotEnvFileContent = dotEnvFileContent.replace(regex, `${key}=${value}`);\n updated = true;\n } else {\n if (!dotEnvFileContent.endsWith('\\n')) {\n dotEnvFileContent += '\\n';\n }\n dotEnvFileContent += `${key}=${value}\\n`;\n updated = true;\n }\n }\n\n if (updated) {\n await fs.promises.writeFile(targetEnvFilePath, dotEnvFileContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);\n } else {\n clack.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);\n }\n\n addedEnvVariables = true;\n } catch (error) {\n clack.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);\n\n addedEnvVariables = true;\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables. Please add them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to create environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n const gitignorePath = getDotGitignore({ installDir });\n\n const envFileName = path.basename(targetEnvFilePath);\n\n const envFiles = [envFileName];\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const missingEnvFiles = envFiles.filter((file) => !gitignoreContent.includes(file));\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join('\\n')}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);\n addedGitignore = true;\n } catch (error) {\n clack.log.warning(\n `Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n } else {\n try {\n const newGitignoreContent = `${envFiles.join('\\n')}\\n`;\n await fs.promises.writeFile(path.join(installDir, '.gitignore'), newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);\n addedGitignore = true;\n } catch (error) {\n clack.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);\n\n analytics.capture('installer interaction', {\n action: 'failed to create gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n analytics.capture('installer interaction', {\n action: 'added environment variables',\n integration,\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n });\n}\n"]}
1
+ {"version":3,"file":"add-or-update-environment-variables.js","sourceRoot":"","sources":["../../src/steps/add-or-update-environment-variables.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport * as fs from 'fs';\nimport path from 'path';\n\nfunction getDotGitignore(options: { installDir: string }): string {\n return path.join(options.installDir, '.gitignore');\n}\n\nexport async function addOrUpdateEnvironmentVariablesStep({\n installDir,\n variables,\n integration,\n}: {\n installDir: string;\n variables: Record<string, string>;\n integration: Integration;\n}): Promise<{\n relativeEnvFilePath: string;\n addedEnvVariables: boolean;\n addedGitignore: boolean;\n}> {\n return traceStep('add-or-update-environment-variables', async () => {\n const envVarContent = Object.entries(variables)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n const dotEnvLocalFilePath = path.join(installDir, '.env.local');\n const dotEnvFilePath = path.join(installDir, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath) ? dotEnvLocalFilePath : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(installDir, targetEnvFilePath);\n\n let addedGitignore = false;\n let addedEnvVariables = false;\n\n if (dotEnvFileExists) {\n try {\n let dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n let updated = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`^${key}=.*$`, 'm');\n\n if (dotEnvFileContent.match(regex)) {\n dotEnvFileContent = dotEnvFileContent.replace(regex, `${key}=${value}`);\n updated = true;\n } else {\n if (!dotEnvFileContent.endsWith('\\n')) {\n dotEnvFileContent += '\\n';\n }\n dotEnvFileContent += `${key}=${value}\\n`;\n updated = true;\n }\n }\n\n if (updated) {\n await fs.promises.writeFile(targetEnvFilePath, dotEnvFileContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);\n } else {\n ui.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);\n }\n\n addedEnvVariables = true;\n } catch (error) {\n ui.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);\n\n addedEnvVariables = true;\n } catch (error) {\n ui.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables. Please add them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to create environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n const gitignorePath = getDotGitignore({ installDir });\n\n const envFileName = path.basename(targetEnvFilePath);\n\n const envFiles = [envFileName];\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const missingEnvFiles = envFiles.filter((file) => !gitignoreContent.includes(file));\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join('\\n')}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);\n addedGitignore = true;\n } catch (error) {\n ui.log.warning(\n `Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n } else {\n try {\n const newGitignoreContent = `${envFiles.join('\\n')}\\n`;\n await fs.promises.writeFile(path.join(installDir, '.gitignore'), newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);\n addedGitignore = true;\n } catch (error) {\n ui.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);\n\n analytics.capture('installer interaction', {\n action: 'failed to create gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n analytics.capture('installer interaction', {\n action: 'added environment variables',\n integration,\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n });\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { traceStep } from '../telemetry.js';
2
2
  import { analytics } from '../utils/analytics.js';
3
- import clack from '../utils/clack.js';
4
- import { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/clack-utils.js';
3
+ import ui from '../utils/ui.js';
4
+ import { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/ui-utils.js';
5
5
  import { hasPackageInstalled } from '../utils/package-json.js';
6
6
  import { spawn } from 'node:child_process';
7
7
  import { SPAWN_OPTS } from '../utils/platform.js';
@@ -24,7 +24,7 @@ export async function runPrettierStep({ installDir, integration, }) {
24
24
  if (!prettierInstalled) {
25
25
  return;
26
26
  }
27
- const prettierSpinner = clack.spinner();
27
+ const prettierSpinner = ui.spinner();
28
28
  prettierSpinner.start('Running Prettier on your files.');
29
29
  try {
30
30
  await new Promise((resolve, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"run-prettier.js","sourceRoot":"","sources":["../../src/steps/run-prettier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,EACV,WAAW,GAGZ;IACC,OAAO,SAAS,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACnB,qFAAqF;YACrF,wFAAwF;YACxF,OAAO;QACT,CAAC;QAED,MAAM,uBAAuB,GAAG,8BAA8B,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChF,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEvE,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;QAE1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QACxC,eAAe,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC,EAAE;oBACjG,KAAK,EAAE,QAAQ;oBACf,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAE3D,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,cAAc;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/clack-utils.js';\nimport { hasPackageInstalled } from '../utils/package-json.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { spawn } from 'node:child_process';\nimport { SPAWN_OPTS } from '../utils/platform.js';\n\nexport async function runPrettierStep({\n installDir,\n integration,\n}: Pick<InstallerOptions, 'installDir'> & {\n integration: Integration;\n}): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles().map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n });\n\n if (!changedOrUntrackedFiles.length) {\n return;\n }\n\n const packageJson = await getPackageDotJson({ installDir });\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = clack.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('npx', ['prettier', '--ignore-unknown', '--write', ...changedOrUntrackedFiles], {\n stdio: 'ignore',\n ...SPAWN_OPTS,\n });\n proc.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`prettier exited ${code}`))));\n proc.on('error', reject);\n });\n } catch {\n prettierSpinner.stop('Prettier failed to run. You may want to format the changes manually.');\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n\n analytics.capture('installer interaction', {\n action: 'ran prettier',\n integration,\n });\n });\n}\n"]}
1
+ {"version":3,"file":"run-prettier.js","sourceRoot":"","sources":["../../src/steps/run-prettier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,EACV,WAAW,GAGZ;IACC,OAAO,SAAS,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACnB,qFAAqF;YACrF,wFAAwF;YACxF,OAAO;QACT,CAAC;QAED,MAAM,uBAAuB,GAAG,8BAA8B,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChF,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEvE,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;QAE1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACrC,eAAe,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC,EAAE;oBACjG,KAAK,EAAE,QAAQ;oBACf,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAE3D,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,cAAc;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/ui-utils.js';\nimport { hasPackageInstalled } from '../utils/package-json.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { spawn } from 'node:child_process';\nimport { SPAWN_OPTS } from '../utils/platform.js';\n\nexport async function runPrettierStep({\n installDir,\n integration,\n}: Pick<InstallerOptions, 'installDir'> & {\n integration: Integration;\n}): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles().map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n });\n\n if (!changedOrUntrackedFiles.length) {\n return;\n }\n\n const packageJson = await getPackageDotJson({ installDir });\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = ui.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('npx', ['prettier', '--ignore-unknown', '--write', ...changedOrUntrackedFiles], {\n stdio: 'ignore',\n ...SPAWN_OPTS,\n });\n proc.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`prettier exited ${code}`))));\n proc.on('error', reject);\n });\n } catch {\n prettierSpinner.stop('Prettier failed to run. You may want to format the changes manually.');\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n\n analytics.capture('installer interaction', {\n action: 'ran prettier',\n integration,\n });\n });\n}\n"]}
@@ -1,7 +1,8 @@
1
1
  import { traceStep } from '../../telemetry.js';
2
2
  import { analytics } from '../../utils/analytics.js';
3
- import clack from '../../utils/clack.js';
4
- import { abortIfCancelled } from '../../utils/clack-utils.js';
3
+ import ui from '../../utils/ui.js';
4
+ import { abortIfCancelled } from '../../utils/ui-utils.js';
5
+ import { isPromptAllowed } from '../../utils/interaction-mode.js';
5
6
  import { VercelEnvironmentProvider } from './providers/vercel.js';
6
7
  export const uploadEnvironmentVariablesStep = async (envVars, { integration, options, }) => {
7
8
  const providers = [new VercelEnvironmentProvider(options)];
@@ -20,7 +21,18 @@ export const uploadEnvironmentVariablesStep = async (envVars, { integration, opt
20
21
  });
21
22
  return [];
22
23
  }
23
- const upload = await abortIfCancelled(clack.select({
24
+ // Non-interactive mode: default to skipping the upload rather than prompting
25
+ // (or failing fast via the abortIfCancelled guard below).
26
+ if (!isPromptAllowed()) {
27
+ analytics.capture('installer interaction', {
28
+ action: 'not uploading environment variables',
29
+ reason: 'non-interactive mode',
30
+ provider: provider.name,
31
+ integration,
32
+ });
33
+ return [];
34
+ }
35
+ const upload = await abortIfCancelled(ui.select({
24
36
  message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,
25
37
  options: [
26
38
  {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EACjD,OAA+B,EAC/B,EACE,WAAW,EACX,OAAO,GAIR,EACkB,EAAE;IACrB,MAAM,SAAS,GAA0B,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;IAElF,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,gBAAgB,CAC5C,KAAK,CAAC,MAAM,CAAC;QACX,OAAO,EAAE,+BAA+B,QAAQ,CAAC,IAAI,uDAAuD;QAC5G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,uCAAuC,QAAQ,CAAC,IAAI,EAAE;aAC7D;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,2CAA2C,QAAQ,CAAC,IAAI,0BAA0B;aACzF;SACF;KACF,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;QACzC,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import type { Integration } from '../../lib/constants.js';\nimport { traceStep } from '../../telemetry.js';\nimport { analytics } from '../../utils/analytics.js';\nimport clack from '../../utils/clack.js';\nimport { abortIfCancelled } from '../../utils/clack-utils.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { EnvironmentProvider } from './EnvironmentProvider.js';\nimport { VercelEnvironmentProvider } from './providers/vercel.js';\n\nexport const uploadEnvironmentVariablesStep = async (\n envVars: Record<string, string>,\n {\n integration,\n options,\n }: {\n integration: Integration;\n options: InstallerOptions;\n },\n): Promise<string[]> => {\n const providers: EnvironmentProvider[] = [new VercelEnvironmentProvider(options)];\n\n let provider: EnvironmentProvider | null = null;\n\n for (const p of providers) {\n if (await p.detect()) {\n provider = p;\n break;\n }\n }\n\n if (!provider) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n clack.select({\n message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Upload the environment variables to ${provider.name}`,\n },\n {\n value: false,\n label: 'No',\n hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,\n },\n ],\n }),\n integration,\n );\n\n if (!upload) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'user declined to upload',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const results = await traceStep('uploading environment variables', async () => {\n return await provider.uploadEnvVars(envVars);\n });\n\n analytics.capture('installer interaction', {\n action: 'uploaded environment variables',\n provider: provider.name,\n integration,\n });\n\n return Object.keys(results).filter((key) => results[key]);\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EACjD,OAA+B,EAC/B,EACE,WAAW,EACX,OAAO,GAIR,EACkB,EAAE;IACrB,MAAM,SAAS,GAA0B,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;IAElF,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,gBAAgB,CAC5C,EAAE,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,+BAA+B,QAAQ,CAAC,IAAI,uDAAuD;QAC5G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,uCAAuC,QAAQ,CAAC,IAAI,EAAE;aAC7D;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,2CAA2C,QAAQ,CAAC,IAAI,0BAA0B;aACzF;SACF;KACF,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;QACzC,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import type { Integration } from '../../lib/constants.js';\nimport { traceStep } from '../../telemetry.js';\nimport { analytics } from '../../utils/analytics.js';\nimport ui from '../../utils/ui.js';\nimport { abortIfCancelled } from '../../utils/ui-utils.js';\nimport { isPromptAllowed } from '../../utils/interaction-mode.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { EnvironmentProvider } from './EnvironmentProvider.js';\nimport { VercelEnvironmentProvider } from './providers/vercel.js';\n\nexport const uploadEnvironmentVariablesStep = async (\n envVars: Record<string, string>,\n {\n integration,\n options,\n }: {\n integration: Integration;\n options: InstallerOptions;\n },\n): Promise<string[]> => {\n const providers: EnvironmentProvider[] = [new VercelEnvironmentProvider(options)];\n\n let provider: EnvironmentProvider | null = null;\n\n for (const p of providers) {\n if (await p.detect()) {\n provider = p;\n break;\n }\n }\n\n if (!provider) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n // Non-interactive mode: default to skipping the upload rather than prompting\n // (or failing fast via the abortIfCancelled guard below).\n if (!isPromptAllowed()) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'non-interactive mode',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n ui.select({\n message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Upload the environment variables to ${provider.name}`,\n },\n {\n value: false,\n label: 'No',\n hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,\n },\n ],\n }),\n integration,\n );\n\n if (!upload) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'user declined to upload',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const results = await traceStep('uploading environment variables', async () => {\n return await provider.uploadEnvVars(envVars);\n });\n\n analytics.capture('installer interaction', {\n action: 'uploaded environment variables',\n provider: provider.name,\n integration,\n });\n\n return Object.keys(results).filter((key) => results[key]);\n};\n"]}
@@ -2,7 +2,7 @@ import { execSync, spawn, spawnSync } from 'child_process';
2
2
  import { EnvironmentProvider } from '../EnvironmentProvider.js';
3
3
  import * as fs from 'fs';
4
4
  import * as path from 'path';
5
- import clack from '../../../utils/clack.js';
5
+ import ui from '../../../utils/ui.js';
6
6
  import chalk from 'chalk';
7
7
  import { analytics } from '../../../utils/analytics.js';
8
8
  import { SPAWN_OPTS } from '../../../utils/platform.js';
@@ -87,7 +87,7 @@ export class VercelEnvironmentProvider extends EnvironmentProvider {
87
87
  async uploadEnvVars(vars) {
88
88
  const results = {};
89
89
  for (const [key, value] of Object.entries(vars)) {
90
- const spinner = clack.spinner();
90
+ const spinner = ui.spinner();
91
91
  spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);
92
92
  await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))
93
93
  .then(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync, spawn, spawnSync } from 'child_process';\nimport { EnvironmentProvider } from '../EnvironmentProvider.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { InstallerOptions } from '../../../utils/types.js';\nimport clack from '../../../utils/clack.js';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics.js';\nimport { SPAWN_OPTS } from '../../../utils/platform.js';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: InstallerOptions) {\n super(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async detect(): Promise<boolean> {\n const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();\n\n analytics.setTag('vercel-detected', vercelDetected);\n\n return vercelDetected;\n }\n\n hasDotVercelDir(): boolean {\n const dotVercelDir = path.join(this.options.installDir, '.vercel');\n return fs.existsSync(dotVercelDir);\n }\n\n hasVercelCli(): boolean {\n try {\n execSync('vercel --version', { stdio: 'ignore' });\n analytics.setTag('vercel-cli-installed', true);\n return true;\n } catch {\n analytics.setTag('vercel-cli-installed', false);\n return false;\n }\n }\n\n isProjectLinked(): boolean {\n const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));\n\n analytics.setTag('vercel-project-linked', isProjectLinked);\n\n return isProjectLinked;\n }\n\n isAuthenticated(): boolean {\n const result = spawnSync('vercel', ['whoami'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n FORCE_COLOR: '0',\n CI: '1',\n },\n ...SPAWN_OPTS,\n });\n\n const output = (String(result.stdout) + String(result.stderr)).toLowerCase();\n\n if (output.includes('log in to vercel') || output.includes('vercel login') || result.status !== 0) {\n analytics.setTag('vercel-authenticated', false);\n return false;\n }\n\n analytics.setTag('vercel-authenticated', true);\n\n return true;\n }\n\n async uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('vercel', ['env', 'add', key, environment], {\n stdio: ['pipe', 'pipe', 'pipe'],\n ...SPAWN_OPTS,\n });\n\n let stderr = '';\n proc.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.stdin.write(value);\n proc.stdin.end();\n\n proc.on('close', (code) => {\n if (\n stderr.includes('already exists') ||\n stderr.includes('already been added') ||\n stderr.includes('vercel env rm')\n ) {\n reject(\n new Error(\n `❌ Environment variable ${chalk.cyan(key)} already exists in ${this.name}. Please upload it manually.`,\n ),\n );\n } else if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `❌ Failed to upload environment variable ${chalk.cyan(key)} to ${this.name}. Please upload it manually.`,\n ),\n );\n }\n });\n });\n }\n\n async uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(vars)) {\n const spinner = clack.spinner();\n\n spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);\n await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))\n .then(() => {\n spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);\n results[key] = true;\n })\n .catch((err) => {\n spinner.stop(\n err instanceof Error\n ? err.message\n : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`,\n );\n results[key] = false;\n });\n }\n\n return results;\n }\n}\n"]}
1
+ {"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync, spawn, spawnSync } from 'child_process';\nimport { EnvironmentProvider } from '../EnvironmentProvider.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { InstallerOptions } from '../../../utils/types.js';\nimport ui from '../../../utils/ui.js';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics.js';\nimport { SPAWN_OPTS } from '../../../utils/platform.js';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: InstallerOptions) {\n super(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async detect(): Promise<boolean> {\n const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();\n\n analytics.setTag('vercel-detected', vercelDetected);\n\n return vercelDetected;\n }\n\n hasDotVercelDir(): boolean {\n const dotVercelDir = path.join(this.options.installDir, '.vercel');\n return fs.existsSync(dotVercelDir);\n }\n\n hasVercelCli(): boolean {\n try {\n execSync('vercel --version', { stdio: 'ignore' });\n analytics.setTag('vercel-cli-installed', true);\n return true;\n } catch {\n analytics.setTag('vercel-cli-installed', false);\n return false;\n }\n }\n\n isProjectLinked(): boolean {\n const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));\n\n analytics.setTag('vercel-project-linked', isProjectLinked);\n\n return isProjectLinked;\n }\n\n isAuthenticated(): boolean {\n const result = spawnSync('vercel', ['whoami'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n FORCE_COLOR: '0',\n CI: '1',\n },\n ...SPAWN_OPTS,\n });\n\n const output = (String(result.stdout) + String(result.stderr)).toLowerCase();\n\n if (output.includes('log in to vercel') || output.includes('vercel login') || result.status !== 0) {\n analytics.setTag('vercel-authenticated', false);\n return false;\n }\n\n analytics.setTag('vercel-authenticated', true);\n\n return true;\n }\n\n async uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('vercel', ['env', 'add', key, environment], {\n stdio: ['pipe', 'pipe', 'pipe'],\n ...SPAWN_OPTS,\n });\n\n let stderr = '';\n proc.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.stdin.write(value);\n proc.stdin.end();\n\n proc.on('close', (code) => {\n if (\n stderr.includes('already exists') ||\n stderr.includes('already been added') ||\n stderr.includes('vercel env rm')\n ) {\n reject(\n new Error(\n `❌ Environment variable ${chalk.cyan(key)} already exists in ${this.name}. Please upload it manually.`,\n ),\n );\n } else if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `❌ Failed to upload environment variable ${chalk.cyan(key)} to ${this.name}. Please upload it manually.`,\n ),\n );\n }\n });\n });\n }\n\n async uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(vars)) {\n const spinner = ui.spinner();\n\n spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);\n await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))\n .then(() => {\n spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);\n results[key] = true;\n })\n .catch((err) => {\n spinner.stop(\n err instanceof Error\n ? err.message\n : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`,\n );\n results[key] = false;\n });\n }\n\n return results;\n }\n}\n"]}
@@ -55,6 +55,7 @@ export declare class Analytics {
55
55
  code?: string;
56
56
  resource?: string;
57
57
  };
58
+ extraAttributes?: Record<string, string | number | boolean>;
58
59
  }): void;
59
60
  captureUnhandledCrash(error: Error, options?: {
60
61
  command?: string;
@@ -4,7 +4,8 @@ import { v4 as uuidv4 } from 'uuid';
4
4
  import { debug } from './debug.js';
5
5
  import { telemetryClient } from './telemetry-client.js';
6
6
  import { isTelemetryEnabled } from '../lib/preferences.js';
7
- import { getTelemetryUrl, getVersion } from '../lib/settings.js';
7
+ import { getVersion } from '../lib/settings.js';
8
+ import { getTelemetryUrl } from './urls.js';
8
9
  import { getCredentials, isTokenExpired } from '../lib/credentials.js';
9
10
  import { getActiveEnvironment, isUnclaimedEnvironment } from '../lib/config-store.js';
10
11
  import { getDeviceId } from '../lib/device-id.js';
@@ -254,6 +255,9 @@ export class Analytics {
254
255
  sessionId: this.sessionId,
255
256
  timestamp: new Date().toISOString(),
256
257
  attributes: {
258
+ // Extras first: standard fields below win on key collision, so callers
259
+ // can never override command.name, error fields, or the fingerprint.
260
+ ...options?.extraAttributes,
257
261
  'command.name': name,
258
262
  'command.duration_ms': durationMs,
259
263
  'command.success': success,