@payloadcms/figma 0.0.1-alpha.6 → 0.0.1-alpha.60

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 (352) hide show
  1. package/dist/api/control-plane.d.ts +52 -6
  2. package/dist/api/control-plane.js +174 -72
  3. package/dist/api/figma-api.d.ts +22 -1
  4. package/dist/api/figma-api.js +78 -25
  5. package/dist/auth/callback-server.js +2 -1
  6. package/dist/auth/credentials.d.ts +21 -0
  7. package/dist/auth/credentials.js +21 -0
  8. package/dist/auth/crypto-utils.d.ts +6 -0
  9. package/dist/auth/crypto-utils.js +16 -14
  10. package/dist/auth/jwt-validator.d.ts +2 -1
  11. package/dist/auth/jwt-validator.js +2 -2
  12. package/dist/auth/oauth-flow.d.ts +17 -3
  13. package/dist/auth/oauth-flow.js +63 -16
  14. package/dist/auth/project-token.js +16 -11
  15. package/dist/auth/refresh.d.ts +2 -1
  16. package/dist/auth/refresh.js +25 -12
  17. package/dist/auth/token-store.d.ts +42 -1
  18. package/dist/auth/token-store.js +118 -14
  19. package/dist/auth/types.d.ts +17 -4
  20. package/dist/cli.js +68 -5
  21. package/dist/commands/build-lambda-zip.d.ts +5 -0
  22. package/dist/commands/build-lambda-zip.js +19 -0
  23. package/dist/commands/debug.d.ts +8 -0
  24. package/dist/commands/debug.js +176 -0
  25. package/dist/commands/deploy.d.ts +9 -0
  26. package/dist/commands/deploy.js +178 -151
  27. package/dist/commands/env.d.ts +13 -0
  28. package/dist/commands/env.js +88 -0
  29. package/dist/commands/init.d.ts +3 -5
  30. package/dist/commands/init.js +165 -148
  31. package/dist/commands/list-tokens.d.ts +3 -3
  32. package/dist/commands/list-tokens.js +22 -7
  33. package/dist/commands/login.d.ts +8 -1
  34. package/dist/commands/login.js +33 -15
  35. package/dist/commands/logout.d.ts +5 -4
  36. package/dist/commands/logout.js +56 -13
  37. package/dist/commands/upgrade.d.ts +5 -0
  38. package/dist/commands/upgrade.js +331 -0
  39. package/dist/config/oauth.d.ts +4 -14
  40. package/dist/config/oauth.js +18 -40
  41. package/dist/constants.d.ts +44 -19
  42. package/dist/constants.js +73 -20
  43. package/dist/db-content-api/README.md +98 -0
  44. package/dist/db-content-api/generated/content-api-types.d.ts +3972 -0
  45. package/dist/db-content-api/generated/content-api-types.js +7 -0
  46. package/dist/db-content-api/index.d.ts +21 -0
  47. package/dist/db-content-api/index.js +787 -0
  48. package/dist/db-content-api/temp-utilities/slug.d.ts +2 -0
  49. package/dist/db-content-api/temp-utilities/slug.js +3 -0
  50. package/dist/db-content-api/temp-utilities/sorting.d.ts +3 -0
  51. package/dist/db-content-api/temp-utilities/sorting.js +39 -0
  52. package/dist/db-content-api/temp-utilities/types.d.ts +22 -0
  53. package/dist/db-content-api/temp-utilities/types.js +15 -0
  54. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +39 -0
  55. package/dist/db-content-api/temp-utilities/unwrapDocument.js +59 -0
  56. package/dist/db-content-api/utilities/auth.d.ts +30 -0
  57. package/dist/db-content-api/utilities/auth.js +81 -0
  58. package/dist/db-content-api/utilities/data/applyDefaults.d.ts +7 -0
  59. package/dist/db-content-api/utilities/data/applyDefaults.js +59 -0
  60. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +11 -0
  61. package/dist/db-content-api/utilities/data/castFieldValue.js +68 -0
  62. package/dist/db-content-api/utilities/data/index.d.ts +49 -0
  63. package/dist/db-content-api/utilities/data/index.js +284 -0
  64. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +12 -0
  65. package/dist/db-content-api/utilities/data/removeVirtualFields.js +54 -0
  66. package/dist/db-content-api/utilities/data/stripFields.d.ts +48 -0
  67. package/dist/db-content-api/utilities/data/stripFields.js +195 -0
  68. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +23 -0
  69. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +42 -0
  70. package/dist/db-content-api/utilities/joins.d.ts +55 -0
  71. package/dist/db-content-api/utilities/joins.js +135 -0
  72. package/dist/db-content-api/utilities/locale/index.d.ts +10 -0
  73. package/dist/db-content-api/utilities/locale/index.js +21 -0
  74. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts +11 -0
  75. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +74 -0
  76. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +42 -0
  77. package/dist/db-content-api/utilities/meta/buildMeta.js +41 -0
  78. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +17 -0
  79. package/dist/db-content-api/utilities/meta/buildPathTypes.js +244 -0
  80. package/dist/db-content-api/utilities/meta/buildUniquePaths.d.ts +13 -0
  81. package/dist/db-content-api/utilities/meta/buildUniquePaths.js +62 -0
  82. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.d.ts +10 -0
  83. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.js +102 -0
  84. package/dist/db-content-api/utilities/where.d.ts +20 -0
  85. package/dist/db-content-api/utilities/where.js +104 -0
  86. package/dist/deploy/schedule-extract-plugin.d.ts +11 -0
  87. package/dist/deploy/schedule-extract-plugin.js +34 -0
  88. package/dist/endpoints/health.d.ts +3 -0
  89. package/dist/endpoints/health.js +11 -0
  90. package/dist/endpoints/schema.d.ts +3 -0
  91. package/dist/endpoints/schema.js +29 -0
  92. package/dist/exports/client.d.ts +3 -0
  93. package/dist/exports/client.js +3 -0
  94. package/dist/index.d.ts +2 -1
  95. package/dist/index.js +3 -1
  96. package/dist/oauth/components/FigmaAvatar/index.d.ts +4 -0
  97. package/dist/oauth/components/FigmaAvatar/index.js +27 -0
  98. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  99. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +5 -0
  100. package/dist/oauth/components/FigmaAvatarCell/index.js +25 -0
  101. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  102. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +9 -0
  103. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +37 -0
  104. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  105. package/dist/oauth/components/LoginButton/index.js +50 -6
  106. package/dist/oauth/components/LoginButton/index.scss +50 -3
  107. package/dist/oauth/components/LogoutButton/index.js +5 -4
  108. package/dist/oauth/defaults.js +67 -10
  109. package/dist/oauth/endpoints/getLoginEndpoint.js +77 -24
  110. package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -4
  111. package/dist/oauth/index.js +40 -13
  112. package/dist/oauth/strategy/index.d.ts +0 -2
  113. package/dist/oauth/strategy/index.js +40 -17
  114. package/dist/oauth/types.d.ts +6 -6
  115. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +7 -0
  116. package/dist/oauth/utilities/isDuplicateKeyError.js +14 -0
  117. package/dist/oauth/utilities/refreshTokens.js +6 -3
  118. package/dist/plugin/build-config.d.ts +18 -15
  119. package/dist/plugin/build-config.js +213 -18
  120. package/dist/storage-content-api/api-types.d.ts +168 -0
  121. package/dist/storage-content-api/api-types.js +6 -0
  122. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts +9 -0
  123. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js +42 -0
  124. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts +13 -0
  125. package/dist/storage-content-api/client-uploads/generateSignedURL.js +39 -0
  126. package/dist/storage-content-api/client.d.ts +6 -0
  127. package/dist/storage-content-api/client.js +36 -0
  128. package/dist/storage-content-api/generateURL.d.ts +7 -0
  129. package/dist/storage-content-api/generateURL.js +8 -0
  130. package/dist/storage-content-api/handleDelete.d.ts +8 -0
  131. package/dist/storage-content-api/handleDelete.js +17 -0
  132. package/dist/storage-content-api/handleUpload.d.ts +11 -0
  133. package/dist/storage-content-api/handleUpload.js +144 -0
  134. package/dist/storage-content-api/index.d.ts +5 -0
  135. package/dist/storage-content-api/index.js +31 -0
  136. package/dist/storage-content-api/staticHandler.d.ts +10 -0
  137. package/dist/storage-content-api/staticHandler.js +56 -0
  138. package/dist/storage-content-api/types.d.ts +10 -0
  139. package/dist/storage-content-api/types.js +3 -0
  140. package/dist/storage-content-api/utilities/getSafeFilename.d.ts +12 -0
  141. package/dist/storage-content-api/utilities/getSafeFilename.js +61 -0
  142. package/dist/storage-content-api/utilities/index.d.ts +2 -0
  143. package/dist/storage-content-api/utilities/index.js +3 -0
  144. package/dist/templates/.env.example +5 -0
  145. package/dist/templates/README.md +19 -0
  146. package/dist/types/config.d.ts +2 -1
  147. package/dist/types/config.js +0 -2
  148. package/dist/types.d.ts +8 -1
  149. package/dist/utils/adapters/nextjs.d.ts +9 -0
  150. package/dist/utils/adapters/nextjs.js +64 -0
  151. package/dist/utils/adapters/nitro.d.ts +9 -0
  152. package/dist/utils/adapters/nitro.js +169 -0
  153. package/dist/utils/adapters/vite.d.ts +10 -0
  154. package/dist/utils/adapters/vite.js +33 -0
  155. package/dist/utils/asset-collection.d.ts +27 -6
  156. package/dist/utils/asset-collection.js +59 -30
  157. package/dist/utils/build-detection.d.ts +5 -11
  158. package/dist/utils/build-detection.js +74 -11
  159. package/dist/utils/build-lambda-zip.d.ts +14 -0
  160. package/dist/utils/build-lambda-zip.js +81 -0
  161. package/dist/utils/cache-bootstrap.d.ts +8 -0
  162. package/dist/utils/cache-bootstrap.js +18 -0
  163. package/dist/utils/config.js +1 -1
  164. package/dist/utils/deploy-adapter.d.ts +40 -0
  165. package/dist/utils/deploy-adapter.js +58 -0
  166. package/dist/utils/download-template.js +3 -2
  167. package/dist/utils/env-management.d.ts +24 -7
  168. package/dist/utils/env-management.js +119 -64
  169. package/dist/utils/format-env-suffix.d.ts +12 -0
  170. package/dist/utils/format-env-suffix.js +13 -0
  171. package/dist/utils/formatter.js +23 -11
  172. package/dist/utils/fs-utils.d.ts +6 -0
  173. package/dist/utils/fs-utils.js +27 -0
  174. package/dist/utils/handle-upgrade.d.ts +9 -0
  175. package/dist/utils/handle-upgrade.js +41 -0
  176. package/dist/utils/lambda-config.d.ts +3 -1
  177. package/dist/utils/lambda-config.js +87 -79
  178. package/dist/utils/messages.d.ts +1 -2
  179. package/dist/utils/messages.js +29 -11
  180. package/dist/utils/package-manager.d.ts +24 -0
  181. package/dist/utils/package-manager.js +53 -0
  182. package/dist/utils/payload-config-ast.d.ts +27 -6
  183. package/dist/utils/payload-config-ast.js +84 -54
  184. package/dist/utils/payload-config-finder.d.ts +2 -2
  185. package/dist/utils/payload-config-finder.js +48 -9
  186. package/dist/utils/payload-config-modifier.d.ts +1 -1
  187. package/dist/utils/payload-config-modifier.js +70 -11
  188. package/dist/utils/payload-package-check.d.ts +12 -1
  189. package/dist/utils/payload-package-check.js +63 -5
  190. package/dist/utils/project.d.ts +3 -2
  191. package/dist/utils/project.js +29 -15
  192. package/dist/utils/resolve-environment.d.ts +14 -0
  193. package/dist/utils/resolve-environment.js +31 -0
  194. package/dist/utils/s3-upload.d.ts +7 -2
  195. package/dist/utils/s3-upload.js +39 -6
  196. package/dist/utils/token-display.js +11 -5
  197. package/dist/utils/typescript-validator.js +4 -6
  198. package/dist/utils/version-check.d.ts +3 -0
  199. package/dist/utils/version-check.js +38 -0
  200. package/package.json +29 -11
  201. package/dist/api/control-plane.d.ts.map +0 -1
  202. package/dist/api/control-plane.js.map +0 -1
  203. package/dist/api/figma-api.d.ts.map +0 -1
  204. package/dist/api/figma-api.js.map +0 -1
  205. package/dist/auth/browser.d.ts.map +0 -1
  206. package/dist/auth/browser.js.map +0 -1
  207. package/dist/auth/callback-server.d.ts.map +0 -1
  208. package/dist/auth/callback-server.js.map +0 -1
  209. package/dist/auth/crypto-utils.d.ts.map +0 -1
  210. package/dist/auth/crypto-utils.js.map +0 -1
  211. package/dist/auth/jwt-validator.d.ts.map +0 -1
  212. package/dist/auth/jwt-validator.js.map +0 -1
  213. package/dist/auth/oauth-flow.d.ts.map +0 -1
  214. package/dist/auth/oauth-flow.js.map +0 -1
  215. package/dist/auth/pkce.d.ts.map +0 -1
  216. package/dist/auth/pkce.js.map +0 -1
  217. package/dist/auth/project-token.d.ts.map +0 -1
  218. package/dist/auth/project-token.js.map +0 -1
  219. package/dist/auth/refresh.d.ts.map +0 -1
  220. package/dist/auth/refresh.js.map +0 -1
  221. package/dist/auth/token-store.d.ts.map +0 -1
  222. package/dist/auth/token-store.js.map +0 -1
  223. package/dist/auth/types.d.ts.map +0 -1
  224. package/dist/auth/types.js.map +0 -1
  225. package/dist/cli.d.ts.map +0 -1
  226. package/dist/cli.js.map +0 -1
  227. package/dist/commands/deploy.d.ts.map +0 -1
  228. package/dist/commands/deploy.js.map +0 -1
  229. package/dist/commands/init.d.ts.map +0 -1
  230. package/dist/commands/init.js.map +0 -1
  231. package/dist/commands/list-tokens.d.ts.map +0 -1
  232. package/dist/commands/list-tokens.js.map +0 -1
  233. package/dist/commands/login.d.ts.map +0 -1
  234. package/dist/commands/login.js.map +0 -1
  235. package/dist/commands/logout.d.ts.map +0 -1
  236. package/dist/commands/logout.js.map +0 -1
  237. package/dist/config/oauth.d.ts.map +0 -1
  238. package/dist/config/oauth.js.map +0 -1
  239. package/dist/constants.d.ts.map +0 -1
  240. package/dist/constants.js.map +0 -1
  241. package/dist/exports/client.d.ts.map +0 -1
  242. package/dist/exports/client.js.map +0 -1
  243. package/dist/index.d.ts.map +0 -1
  244. package/dist/index.js.map +0 -1
  245. package/dist/oauth/components/LoginButton/index.d.ts.map +0 -1
  246. package/dist/oauth/components/LoginButton/index.js.map +0 -1
  247. package/dist/oauth/components/LogoutButton/index.d.ts.map +0 -1
  248. package/dist/oauth/components/LogoutButton/index.js.map +0 -1
  249. package/dist/oauth/defaults.d.ts.map +0 -1
  250. package/dist/oauth/defaults.js.map +0 -1
  251. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +0 -1
  252. package/dist/oauth/endpoints/getLoginEndpoint.js.map +0 -1
  253. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +0 -1
  254. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +0 -1
  255. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +0 -1
  256. package/dist/oauth/endpoints/getMetaEndpoint.js.map +0 -1
  257. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +0 -1
  258. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +0 -1
  259. package/dist/oauth/exports/client.d.ts.map +0 -1
  260. package/dist/oauth/exports/client.js.map +0 -1
  261. package/dist/oauth/hooks/afterLogout.d.ts.map +0 -1
  262. package/dist/oauth/hooks/afterLogout.js.map +0 -1
  263. package/dist/oauth/hooks/me.d.ts.map +0 -1
  264. package/dist/oauth/hooks/me.js.map +0 -1
  265. package/dist/oauth/hooks/refresh.d.ts.map +0 -1
  266. package/dist/oauth/hooks/refresh.js.map +0 -1
  267. package/dist/oauth/index.d.ts.map +0 -1
  268. package/dist/oauth/index.js.map +0 -1
  269. package/dist/oauth/strategy/index.d.ts.map +0 -1
  270. package/dist/oauth/strategy/index.js.map +0 -1
  271. package/dist/oauth/types.d.ts.map +0 -1
  272. package/dist/oauth/types.js.map +0 -1
  273. package/dist/oauth/utilities/clearCookie.d.ts.map +0 -1
  274. package/dist/oauth/utilities/clearCookie.js.map +0 -1
  275. package/dist/oauth/utilities/createCookieOptions.d.ts.map +0 -1
  276. package/dist/oauth/utilities/createCookieOptions.js.map +0 -1
  277. package/dist/oauth/utilities/createDebugLogger.d.ts.map +0 -1
  278. package/dist/oauth/utilities/createDebugLogger.js.map +0 -1
  279. package/dist/oauth/utilities/extractOrigin.d.ts.map +0 -1
  280. package/dist/oauth/utilities/extractOrigin.js.map +0 -1
  281. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +0 -1
  282. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +0 -1
  283. package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
  284. package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
  285. package/dist/oauth/utilities/getAdminPath.js +0 -9
  286. package/dist/oauth/utilities/getAdminPath.js.map +0 -1
  287. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +0 -1
  288. package/dist/oauth/utilities/getAuthorizeURL.js.map +0 -1
  289. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +0 -1
  290. package/dist/oauth/utilities/getCookieExpiration.js.map +0 -1
  291. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +0 -1
  292. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +0 -1
  293. package/dist/oauth/utilities/getTokenExp.d.ts.map +0 -1
  294. package/dist/oauth/utilities/getTokenExp.js.map +0 -1
  295. package/dist/oauth/utilities/getUsernameField.d.ts.map +0 -1
  296. package/dist/oauth/utilities/getUsernameField.js.map +0 -1
  297. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +0 -1
  298. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +0 -1
  299. package/dist/oauth/utilities/mergeHeaders.d.ts.map +0 -1
  300. package/dist/oauth/utilities/mergeHeaders.js.map +0 -1
  301. package/dist/oauth/utilities/refreshTokens.d.ts.map +0 -1
  302. package/dist/oauth/utilities/refreshTokens.js.map +0 -1
  303. package/dist/plugin/adapter.d.ts.map +0 -1
  304. package/dist/plugin/adapter.js.map +0 -1
  305. package/dist/plugin/build-config.d.ts.map +0 -1
  306. package/dist/plugin/build-config.js.map +0 -1
  307. package/dist/types/config.d.ts.map +0 -1
  308. package/dist/types/config.js.map +0 -1
  309. package/dist/types.d.ts.map +0 -1
  310. package/dist/types.js.map +0 -1
  311. package/dist/utils/asset-collection.d.ts.map +0 -1
  312. package/dist/utils/asset-collection.js.map +0 -1
  313. package/dist/utils/build-detection.d.ts.map +0 -1
  314. package/dist/utils/build-detection.js.map +0 -1
  315. package/dist/utils/config.d.ts.map +0 -1
  316. package/dist/utils/config.js.map +0 -1
  317. package/dist/utils/download-template.d.ts.map +0 -1
  318. package/dist/utils/download-template.js.map +0 -1
  319. package/dist/utils/env-management.d.ts.map +0 -1
  320. package/dist/utils/env-management.js.map +0 -1
  321. package/dist/utils/format.d.ts.map +0 -1
  322. package/dist/utils/format.js.map +0 -1
  323. package/dist/utils/formatter.d.ts.map +0 -1
  324. package/dist/utils/formatter.js.map +0 -1
  325. package/dist/utils/git.d.ts.map +0 -1
  326. package/dist/utils/git.js.map +0 -1
  327. package/dist/utils/is-debug.d.ts.map +0 -1
  328. package/dist/utils/is-debug.js.map +0 -1
  329. package/dist/utils/lambda-config.d.ts.map +0 -1
  330. package/dist/utils/lambda-config.js.map +0 -1
  331. package/dist/utils/log.d.ts.map +0 -1
  332. package/dist/utils/log.js.map +0 -1
  333. package/dist/utils/messages.d.ts.map +0 -1
  334. package/dist/utils/messages.js.map +0 -1
  335. package/dist/utils/package-manager.d.ts.map +0 -1
  336. package/dist/utils/package-manager.js.map +0 -1
  337. package/dist/utils/payload-config-ast.d.ts.map +0 -1
  338. package/dist/utils/payload-config-ast.js.map +0 -1
  339. package/dist/utils/payload-config-finder.d.ts.map +0 -1
  340. package/dist/utils/payload-config-finder.js.map +0 -1
  341. package/dist/utils/payload-config-modifier.d.ts.map +0 -1
  342. package/dist/utils/payload-config-modifier.js.map +0 -1
  343. package/dist/utils/payload-package-check.d.ts.map +0 -1
  344. package/dist/utils/payload-package-check.js.map +0 -1
  345. package/dist/utils/project.d.ts.map +0 -1
  346. package/dist/utils/project.js.map +0 -1
  347. package/dist/utils/s3-upload.d.ts.map +0 -1
  348. package/dist/utils/s3-upload.js.map +0 -1
  349. package/dist/utils/token-display.d.ts.map +0 -1
  350. package/dist/utils/token-display.js.map +0 -1
  351. package/dist/utils/typescript-validator.d.ts.map +0 -1
  352. package/dist/utils/typescript-validator.js.map +0 -1
@@ -2,30 +2,39 @@ import * as p from '@clack/prompts';
2
2
  import fs from 'fs/promises';
3
3
  import path from 'path';
4
4
  import pc from 'picocolors';
5
- import { ControlPlaneError, getTenantDetails } from '../api/control-plane.js';
5
+ import { ControlPlaneError, getBootstrapInfo } from '../api/control-plane.js';
6
6
  import { FigmaApiError } from '../api/figma-api.js';
7
- import { getValidAccessToken } from '../auth/oauth-flow.js';
7
+ import { tryGetCredential } from '../auth/oauth-flow.js';
8
8
  import { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js';
9
- import { TokenStore } from '../auth/token-store.js';
9
+ import { getTokenStore } from '../auth/token-store.js';
10
+ import { getInfraEnvironment, getProjectNotFoundMessage } from '../constants.js';
11
+ import { ensureGitignore } from '../utils/config.js';
12
+ import { addOrUpdateEnvVar } from '../utils/env-management.js';
10
13
  import { isDebug } from '../utils/is-debug.js';
14
+ import { applyLambdaModifications } from '../utils/lambda-config.js';
11
15
  import * as log from '../utils/log.js';
16
+ import { detectPackageManagerFromEnvironment, getRunCommand, resolvePackageManager } from '../utils/package-manager.js';
12
17
  import { displayManualInstructions, ensurePayloadFigmaConfig } from '../utils/payload-config-modifier.js';
18
+ import { runScript } from '../utils/payload-package-check.js';
13
19
  import { detectPayloadProject, hasRequiredDependencies, initializeGitRepo, installDependencies, isInProjectDirectory, scaffoldProject, validatePayloadVersion } from '../utils/project.js';
20
+ import { resolveEnvironment } from '../utils/resolve-environment.js';
21
+ import { checkForUpdates, getOwnVersion } from '../utils/version-check.js';
14
22
  import { loginCommand } from './login.js';
23
+ import { cacheAllEnvironments } from '../utils/cache-bootstrap.js';
15
24
  /**
16
- * Generate and store project token for a tenant
25
+ * Generate and store project token for a content system
17
26
  * Non-blocking - will show warning but not exit on failure
18
27
  * Only shows feedback if DEBUG mode is enabled, otherwise runs silently
19
28
  *
20
29
  * @param tokenStore - Token store instance
21
- * @param tenantId - Tenant ID to generate token for
30
+ * @param contentSystemId - Content System ID to generate token for
22
31
  * @param spinner - Clack spinner instance for status updates (only used in debug mode)
23
- */ async function generateProjectTokenWithFeedback(tokenStore, tenantId, spinner) {
32
+ */ async function generateProjectTokenWithFeedback(tokenStore, contentSystemId, spinner) {
24
33
  if (isDebug()) {
25
34
  spinner.start('Generating project token...');
26
35
  }
27
36
  try {
28
- const projectToken = await getValidProjectToken(tokenStore, tenantId);
37
+ const projectToken = await getValidProjectToken(tokenStore, contentSystemId);
29
38
  if (isDebug()) {
30
39
  if (projectToken) {
31
40
  spinner.stop(pc.green('✓ Project token generated'));
@@ -58,108 +67,80 @@ import { loginCommand } from './login.js';
58
67
  *
59
68
  * @param options - Command options
60
69
  */ export async function initCommand(options) {
70
+ // Check for outdated version (non-blocking)
71
+ const currentVersion = await getOwnVersion();
72
+ await checkForUpdates(currentVersion);
61
73
  // Check authentication
62
- const tokenStore = new TokenStore();
74
+ const tokenStore = getTokenStore();
63
75
  const s = p.spinner();
64
- let accessToken;
65
76
  if (options.skipAuth) {
66
77
  // Skip authentication for testing/development
67
78
  p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'));
68
- accessToken = 'mock-access-token';
69
79
  } else {
70
- try {
71
- // Check for valid cached tokens first (no API call needed)
72
- if (tokenStore.hasValidTokens()) {
73
- // Use cached token silently - no spinner needed
74
- accessToken = tokenStore.getAccessToken();
75
- } else {
76
- // Need to refresh or authenticate - show spinner for API call
77
- s.start('Checking authentication...');
78
- const token = await getValidAccessToken(tokenStore);
79
- if (!token) {
80
- s.stop(pc.yellow('⚠ Not authenticated'));
81
- p.log.info('Authentication required to continue');
82
- // Prompt user to authenticate now
83
- const shouldAuth = await p.confirm({
84
- initialValue: true,
85
- message: 'Would you like to authenticate now?'
86
- });
87
- if (p.isCancel(shouldAuth) || !shouldAuth) {
88
- p.cancel('Operation cancelled');
89
- process.exit(0);
90
- }
91
- // Run login command
92
- await loginCommand();
93
- // Get token after auth
94
- const newToken = await getValidAccessToken(tokenStore);
95
- if (!newToken) {
96
- p.log.error('Authentication failed');
97
- process.exit(1);
98
- }
99
- accessToken = newToken;
100
- p.log.success(pc.green('✓ Authenticated'));
101
- } else {
102
- accessToken = token;
103
- s.stop(pc.green('✓ Authenticated'));
80
+ // Check for valid cached tokens first (no API call needed)
81
+ if (!tokenStore.hasValidTokens()) {
82
+ // Need to refresh or authenticate - show spinner for API call
83
+ s.start('Checking authentication...');
84
+ const credential = await tryGetCredential(tokenStore);
85
+ if (!credential) {
86
+ s.stop('Authentication required to continue');
87
+ await loginCommand({
88
+ showNextSteps: false
89
+ });
90
+ const newCredential = await tryGetCredential(tokenStore);
91
+ if (!newCredential) {
92
+ p.log.error('Authentication failed');
93
+ process.exit(1);
104
94
  }
95
+ } else {
96
+ s.stop(pc.green('✓ Authenticated'));
105
97
  }
106
- } catch (error) {
107
- s.stop(pc.red('✗ Authentication failed'));
108
- log.error(error instanceof Error ? error.message : 'Unknown error');
109
- p.note('Run `figma auth` to authenticate', 'Tip');
110
- process.exit(1);
111
98
  }
112
99
  }
113
100
  // Note: We no longer check for figma.config.json here
114
101
  // Instead, the AST detection will check if figma object already exists in payload.config.ts
115
102
  // and skip modification if it does (unless --force is used)
116
- // Step 3: Get CMS ID with retry loop
103
+ // Step 3: Get CMS Resource ID (required argument)
117
104
  log.debug('Configuring Project...');
118
- let tenantId = options.id;
119
- let selectedTenant;
120
- while(!selectedTenant){
121
- // Prompt for ID if not provided
122
- if (!tenantId) {
123
- const input = await p.text({
124
- message: 'Enter your CMS ID:',
125
- placeholder: 'tenant_abc123',
126
- validate: (value)=>{
127
- if (!value || typeof value !== 'string') {
128
- return 'CMS ID is required';
129
- }
130
- return undefined;
105
+ if (!options.id) {
106
+ p.log.error('CMS Resource ID is required. Use --id <cms-resource-id>');
107
+ process.exit(1);
108
+ }
109
+ const cmsResourceId = options.id;
110
+ // Fetch bootstrap info (oauth creds + environments)
111
+ let bootstrapInfo = null;
112
+ let resolvedEnv = null;
113
+ let oauthClientId = null;
114
+ let oauthClientSecret = null;
115
+ if (!options.skipAuth) {
116
+ const credential = await tryGetCredential(tokenStore);
117
+ if (credential) {
118
+ try {
119
+ bootstrapInfo = await getBootstrapInfo(credential, cmsResourceId);
120
+ } catch (error) {
121
+ log.debug(`Control Plane Error: ${error.statusCode} - ${error.message}`);
122
+ if (error instanceof ControlPlaneError && (error.statusCode === 404 || error.statusCode === 410)) {
123
+ p.log.error(pc.red(getProjectNotFoundMessage({
124
+ environment: getInfraEnvironment(),
125
+ projectId: cmsResourceId
126
+ })));
127
+ process.exit(1);
131
128
  }
132
- });
133
- if (p.isCancel(input)) {
134
- p.cancel('Operation cancelled');
135
- process.exit(0);
136
- }
137
- tenantId = input;
138
- }
139
- // Try to fetch tenant details
140
- try {
141
- log.debug('Using mock Control Plane API (no real network calls)');
142
- selectedTenant = await getTenantDetails(accessToken, tenantId);
143
- log.debug(`Using: ${selectedTenant.domain}`);
144
- } catch (error) {
145
- p.log.error(pc.red('✗ Failed to fetch CMS details'));
146
- // Check if permission error (403)
147
- if (error instanceof ControlPlaneError && error.statusCode === 403) {
148
- p.log.error('You do not have permission to access the provided CMS ID. Please try again.');
149
- } else if (error instanceof ControlPlaneError && error.statusCode === 404) {
150
- p.log.error('Tenant ID not found. Verify the ID is correct.');
151
- } else {
152
- p.log.error(error instanceof Error ? error.message : 'Unknown error');
129
+ const message = error instanceof Error ? error.message : 'Unknown error';
130
+ p.log.error(pc.red(`✗ Unable to fetch project info for "${cmsResourceId}"`));
131
+ p.log.error(pc.dim(`Details: ${message}`));
132
+ process.exit(1);
153
133
  }
154
- // Clear tenantId to prompt again
155
- tenantId = undefined;
156
- // Ask if they want to retry
157
- const shouldRetry = await p.confirm({
158
- initialValue: true,
159
- message: 'Would you like to try a different CMS ID?'
160
- });
161
- if (p.isCancel(shouldRetry) || !shouldRetry) {
162
- p.cancel('Operation cancelled');
134
+ try {
135
+ const envName = options.env ?? process.env.FIGMA_ENVIRONMENT_NAME ?? undefined;
136
+ resolvedEnv = resolveEnvironment({
137
+ environmentName: envName,
138
+ environments: bootstrapInfo.environments
139
+ });
140
+ oauthClientId = bootstrapInfo.oauthCredentials.oauthClientId;
141
+ oauthClientSecret = bootstrapInfo.oauthCredentials.oauthClientSecret;
142
+ } catch (error) {
143
+ p.log.error(pc.red(error instanceof Error ? error.message : 'Unknown error'));
163
144
  process.exit(1);
164
145
  }
165
146
  }
@@ -171,6 +152,7 @@ import { loginCommand } from './login.js';
171
152
  log.debug('Project directory detected');
172
153
  // Detect Payload
173
154
  const projectInfo = await detectPayloadProject();
155
+ const packageManager = await resolvePackageManager(process.cwd());
174
156
  if (projectInfo.hasPayload) {
175
157
  // Validate existing Payload version
176
158
  if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {
@@ -190,19 +172,17 @@ import { loginCommand } from './login.js';
190
172
  });
191
173
  if (!p.isCancel(shouldInstall) && shouldInstall) {
192
174
  s.start('Installing dependencies...');
193
- await installDependencies(process.cwd(), projectInfo.packageManager || 'pnpm');
175
+ await installDependencies(process.cwd(), packageManager);
194
176
  s.stop(pc.green('✓ Dependencies installed'));
195
177
  }
196
178
  }
197
179
  s.start('Checking Payload configuration...');
198
- const modResult = await ensurePayloadFigmaConfig(process.cwd(), projectInfo.packageManager || 'pnpm', {
199
- region: options.region || 'us-east-1',
200
- tenantId: selectedTenant.id,
201
- useContentSystem: !options.noContentSystem
180
+ const modResult = await ensurePayloadFigmaConfig(process.cwd(), packageManager, {
181
+ contentSystemId: resolvedEnv?.contentSystemId ?? cmsResourceId
202
182
  });
203
183
  if (!modResult.success) {
204
184
  s.stop(pc.red('✗ Configuration check failed'));
205
- displayManualInstructions(modResult.error || 'Unknown error');
185
+ displayManualInstructions(modResult.error || 'Unknown error', packageManager);
206
186
  process.exit(1);
207
187
  }
208
188
  if (modResult.modified) {
@@ -219,62 +199,79 @@ import { loginCommand } from './login.js';
219
199
  p.log.warn(pc.yellow(`⚠ ${warning}`));
220
200
  });
221
201
  }
222
- } else {
223
- // Has package.json but no Payload - offer to add Payload
224
- p.log.warn(pc.yellow(' No Payload detected in this project'));
225
- const shouldAddPayload = await p.confirm({
226
- initialValue: true,
227
- message: 'Would you like to add Payload to this project?'
228
- });
229
- if (p.isCancel(shouldAddPayload)) {
230
- p.cancel('Operation cancelled');
231
- process.exit(0);
232
- }
233
- if (!shouldAddPayload) {
234
- p.log.error('Payload is required to use Figma CMS');
235
- process.exit(1);
202
+ // Write environment variables to .env file
203
+ try {
204
+ await addOrUpdateEnvVar(process.cwd(), 'FIGMA_PROJECT_ID', cmsResourceId);
205
+ await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENVIRONMENT_NAME', resolvedEnv?.name ?? 'production');
206
+ log.debug('Added FIGMA_PROJECT_ID and FIGMA_ENVIRONMENT_NAME to .env file');
207
+ const infraEnv = getInfraEnvironment();
208
+ if (infraEnv !== 'production') {
209
+ await addOrUpdateEnvVar(process.cwd(), 'FIGMA_INFRA_ENV', infraEnv);
210
+ log.debug(`Added FIGMA_INFRA_ENV=${infraEnv} to .env file`);
211
+ }
212
+ // Cache all environments in local encrypted store
213
+ if (bootstrapInfo && oauthClientId && oauthClientSecret) {
214
+ cacheAllEnvironments(tokenStore, cmsResourceId, bootstrapInfo);
215
+ }
216
+ } catch (error) {
217
+ p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
236
218
  }
237
- // TODO: Add Payload to existing project (future enhancement)
238
- p.log.error('Adding Payload to existing projects is not yet supported');
239
- p.note('Create a new project or manually add Payload dependencies', 'Action Required');
219
+ } else {
220
+ p.log.warn(pc.yellow(' Payload was not detected in this project'));
221
+ p.note('Run this command in a directory without an existing project or in an existing Payload project.', 'Action Required');
240
222
  process.exit(1);
241
223
  }
224
+ // Generate import map to prevent errors on first dev run
225
+ const importMapResult = await runScript(process.cwd(), 'generate:importmap', packageManager);
226
+ if (!importMapResult) {
227
+ p.log.warn(pc.yellow('⚠ Import map generation failed — it will be generated on first dev run'));
228
+ }
229
+ // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)
230
+ await applyLambdaModifications(process.cwd(), packageManager);
231
+ // Ensure .gitignore has required entries
232
+ await ensureGitignore(process.cwd(), [
233
+ '.env',
234
+ '.env.local',
235
+ 'lambda.zip'
236
+ ]);
242
237
  // Generate project token (unless skipping auth)
243
- if (!options.skipAuth) {
244
- await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s);
238
+ if (!options.skipAuth && resolvedEnv) {
239
+ await generateProjectTokenWithFeedback(tokenStore, resolvedEnv.contentSystemId, s);
245
240
  }
246
241
  // Success message for existing project
247
242
  p.outro(pc.green('✓ Project initialized successfully!'));
248
243
  const nextSteps = [
249
- selectedTenant.status === 'provisioning' ? 'Wait for CMS provisioning to complete (check status with `@payloadcms/figma list`)' : undefined,
250
- 'Start development server: `pnpm dev`',
251
- `Access your CMS at: ${pc.cyan(`https://${selectedTenant.domain}`)}`
244
+ `Start development server: \`${getRunCommand(packageManager)} dev\``
252
245
  ].filter(Boolean);
253
246
  p.note(nextSteps.join('\n'), 'Next Steps');
254
247
  } else {
255
248
  // ===== NEW PROJECT FLOW =====
256
249
  // p.log.info('No project detected - Creating New Project')
257
- // Prompt for path
258
- const projectPathInput = await p.text({
259
- initialValue: './',
260
- message: 'Enter path to create project:',
261
- placeholder: './my-cms-project',
262
- validate: (value)=>{
263
- if (!value) {
264
- return 'Path is required';
250
+ let projectPath;
251
+ if (options.name) {
252
+ projectPath = options.name;
253
+ } else {
254
+ const projectPathInput = await p.text({
255
+ initialValue: './',
256
+ message: 'Enter path to create project:',
257
+ placeholder: './my-cms-project',
258
+ validate: (value)=>{
259
+ if (!value) {
260
+ return 'Path is required';
261
+ }
262
+ // Allow relative or absolute paths
263
+ return undefined;
265
264
  }
266
- // Allow relative or absolute paths
267
- return undefined;
265
+ });
266
+ if (p.isCancel(projectPathInput)) {
267
+ p.cancel('Operation cancelled');
268
+ process.exit(0);
268
269
  }
269
- });
270
- if (p.isCancel(projectPathInput)) {
271
- p.cancel('Operation cancelled');
272
- process.exit(0);
270
+ projectPath = projectPathInput;
273
271
  }
274
- const projectPath = projectPathInput;
275
272
  const fullPath = path.resolve(process.cwd(), projectPath);
276
- // Get project name from path or prompt
277
- const projectName = options.name || path.basename(fullPath);
273
+ const projectName = path.basename(fullPath);
274
+ const packageManager = detectPackageManagerFromEnvironment();
278
275
  // Create directory
279
276
  try {
280
277
  await fs.mkdir(fullPath, {
@@ -287,10 +284,10 @@ import { loginCommand } from './login.js';
287
284
  // Scaffold project
288
285
  s.start('Downloading template from GitHub...');
289
286
  try {
290
- await scaffoldProject(fullPath, projectName);
287
+ await scaffoldProject(fullPath, projectName, packageManager);
291
288
  s.stop(pc.green('✓ Template downloaded'));
292
289
  s.start('Installing dependencies...');
293
- await installDependencies(fullPath, 'pnpm');
290
+ await installDependencies(fullPath, packageManager);
294
291
  s.stop(pc.green('✓ Dependencies installed'));
295
292
  } catch (error) {
296
293
  s.stop(pc.red('✗ Failed'));
@@ -299,14 +296,12 @@ import { loginCommand } from './login.js';
299
296
  }
300
297
  // Modify Payload configuration
301
298
  s.start('Checking Payload configuration...');
302
- const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {
303
- region: options.region || 'us-east-1',
304
- tenantId: selectedTenant.id,
305
- useContentSystem: !options.noContentSystem
299
+ const modResult = await ensurePayloadFigmaConfig(fullPath, packageManager, {
300
+ contentSystemId: resolvedEnv?.contentSystemId ?? cmsResourceId
306
301
  });
307
302
  if (!modResult.success) {
308
303
  s.stop(pc.red('✗ Configuration check failed'));
309
- displayManualInstructions(modResult.error || 'Unknown error');
304
+ displayManualInstructions(modResult.error || 'Unknown error', packageManager);
310
305
  process.exit(1);
311
306
  }
312
307
  if (modResult.modified) {
@@ -323,9 +318,31 @@ import { loginCommand } from './login.js';
323
318
  p.log.warn(pc.yellow(`⚠ ${warning}`));
324
319
  });
325
320
  }
321
+ // Write environment variables to .env file
322
+ try {
323
+ await addOrUpdateEnvVar(fullPath, 'FIGMA_PROJECT_ID', cmsResourceId);
324
+ await addOrUpdateEnvVar(fullPath, 'FIGMA_ENVIRONMENT_NAME', resolvedEnv?.name ?? 'production');
325
+ log.debug('Added FIGMA_PROJECT_ID and FIGMA_ENVIRONMENT_NAME to .env file');
326
+ const infraEnv = getInfraEnvironment();
327
+ if (infraEnv !== 'production') {
328
+ await addOrUpdateEnvVar(fullPath, 'FIGMA_INFRA_ENV', infraEnv);
329
+ log.debug(`Added FIGMA_INFRA_ENV=${infraEnv} to .env file`);
330
+ }
331
+ // Cache all environments in local encrypted store
332
+ if (bootstrapInfo && oauthClientId && oauthClientSecret) {
333
+ cacheAllEnvironments(tokenStore, cmsResourceId, bootstrapInfo);
334
+ }
335
+ } catch (error) {
336
+ p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
337
+ }
338
+ // Generate import map to prevent errors on first dev run
339
+ const importMapResult = await runScript(fullPath, 'generate:importmap', packageManager);
340
+ if (!importMapResult) {
341
+ p.log.warn(pc.yellow('⚠ Import map generation failed — it will be generated on first dev run'));
342
+ }
326
343
  // Generate project token (unless skipping auth)
327
- if (!options.skipAuth) {
328
- await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s);
344
+ if (!options.skipAuth && resolvedEnv) {
345
+ await generateProjectTokenWithFeedback(tokenStore, resolvedEnv.contentSystemId, s);
329
346
  }
330
347
  // Initialize git repository (after all files including lock file are ready)
331
348
  initializeGitRepo(fullPath);
@@ -337,7 +354,7 @@ import { loginCommand } from './login.js';
337
354
  if (relativePath && relativePath !== '.') {
338
355
  nextSteps.push(`cd ${relativePath}`);
339
356
  }
340
- nextSteps.push('pnpm dev or follow directions in README.md', '', 'Documentation:', '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload', '- Configuration: https://payloadcms.com/docs/configuration/overview');
357
+ nextSteps.push(`${getRunCommand(packageManager)} dev or follow directions in README.md`, '', 'Documentation:', '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload', '- Configuration: https://payloadcms.com/docs/configuration/overview');
341
358
  p.note(nextSteps.join('\n'), 'Next Steps');
342
359
  p.outro(pc.green('✓ Done'));
343
360
  }
@@ -2,6 +2,8 @@
2
2
  * Options for list-tokens command
3
3
  */
4
4
  export interface ListTokensCommandOptions {
5
+ /** Show all environments */
6
+ all?: boolean;
5
7
  /** Enable debug mode */
6
8
  debug?: boolean;
7
9
  }
@@ -9,8 +11,6 @@ export interface ListTokensCommandOptions {
9
11
  * Handle the `@payloadcms/figma list-tokens` command
10
12
  *
11
13
  * Displays stored token information including OAuth and project tokens.
12
- *
13
- * @param _options - Command options (unused)
14
14
  */
15
- export declare function listTokensCommand(_options?: ListTokensCommandOptions): void;
15
+ export declare function listTokensCommand(options?: ListTokensCommandOptions): void;
16
16
  //# sourceMappingURL=list-tokens.d.ts.map
@@ -1,25 +1,40 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import pc from 'picocolors';
3
- import { TokenStore } from '../auth/token-store.js';
3
+ import { getTokenStore } from '../auth/token-store.js';
4
+ import { getInfraEnvironment } from '../constants.js';
5
+ import { formatEnvSuffix } from '../utils/format-env-suffix.js';
4
6
  import { isDebug } from '../utils/is-debug.js';
5
7
  import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js';
8
+ const ALL_ENVIRONMENTS = [
9
+ 'production',
10
+ 'staging'
11
+ ];
6
12
  /**
7
13
  * Handle the `@payloadcms/figma list-tokens` command
8
14
  *
9
15
  * Displays stored token information including OAuth and project tokens.
10
- *
11
- * @param _options - Command options (unused)
12
- */ export function listTokensCommand(_options = {}) {
13
- const tokenStore = new TokenStore();
16
+ */ export function listTokensCommand(options = {}) {
17
+ if (options.all) {
18
+ // Show detailed info for all environments
19
+ for (const env of ALL_ENVIRONMENTS){
20
+ showTokenDetails(env);
21
+ }
22
+ } else {
23
+ // Show detailed info for current environment only
24
+ showTokenDetails(getInfraEnvironment());
25
+ }
26
+ }
27
+ function showTokenDetails(env) {
28
+ const tokenStore = getTokenStore(env);
14
29
  const tokens = tokenStore.getTokens();
15
30
  if (!tokens) {
16
- p.log.warn(pc.yellow('No tokens found. Not authenticated.'));
31
+ p.log.warn(pc.yellow(`No tokens found${formatEnvSuffix(env, ' for ')}. Not authenticated.`));
17
32
  p.note(`Run ${pc.cyan('@payloadcms/figma login')} to authenticate`, 'Tip');
18
33
  return;
19
34
  }
20
35
  const isValid = tokenStore.hasValidTokens();
21
36
  const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired');
22
- p.log.step(pc.bold('Stored Tokens'));
37
+ p.log.step(pc.bold(`Token Status${formatEnvSuffix(env, ' (', ')')}`));
23
38
  // Build OAuth token info display
24
39
  const lines = [
25
40
  `Status: ${status}`,
@@ -1,8 +1,15 @@
1
+ type LoginArgs = {
2
+ /** Set this to show next steps after login
3
+ * @default true
4
+ */
5
+ showNextSteps: boolean;
6
+ };
1
7
  /**
2
8
  * Handle the `@payloadcms/figma login` command
3
9
  *
4
10
  * Authenticates the user with Figma OAuth2 and stores tokens locally.
5
11
  * If valid tokens already exist, shows an error message.
6
12
  */
7
- export declare function loginCommand(): Promise<void>;
13
+ export declare function loginCommand(args?: LoginArgs): Promise<void>;
14
+ export {};
8
15
  //# sourceMappingURL=login.d.ts.map
@@ -1,22 +1,29 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import pc from 'picocolors';
3
- import { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js';
4
- import { TokenStore } from '../auth/token-store.js';
5
- import { OAUTH_CONFIG } from '../config/oauth.js';
3
+ import { CallbackError } from '../auth/callback-server.js';
4
+ import { executeOAuthFlow, getValidCredential, OAuthFlowError } from '../auth/oauth-flow.js';
5
+ import { getTokenStore } from '../auth/token-store.js';
6
+ import { getOAuthConfig } from '../config/oauth.js';
7
+ import { getInfraEnvironment } from '../constants.js';
8
+ import { formatEnvSuffix } from '../utils/format-env-suffix.js';
6
9
  import * as log from '../utils/log.js';
7
10
  /**
8
11
  * Handle the `@payloadcms/figma login` command
9
12
  *
10
13
  * Authenticates the user with Figma OAuth2 and stores tokens locally.
11
14
  * If valid tokens already exist, shows an error message.
12
- */ export async function loginCommand() {
13
- const tokenStore = new TokenStore();
15
+ */ export async function loginCommand(args) {
16
+ const { showNextSteps } = args || {
17
+ showNextSteps: false
18
+ };
19
+ const env = getInfraEnvironment();
20
+ const tokenStore = getTokenStore(env);
14
21
  // Check for existing valid tokens
15
22
  try {
16
- const existingToken = await getValidAccessToken(tokenStore);
17
- if (existingToken) {
23
+ const existingCredential = await getValidCredential(tokenStore);
24
+ if (existingCredential) {
18
25
  const tokens = tokenStore.getTokens();
19
- p.log.warn(pc.yellow('Already logged in'));
26
+ p.log.warn(pc.yellow(`Already logged in${formatEnvSuffix(env)}`));
20
27
  if (tokens?.userId) {
21
28
  log.info(`User ID: ${tokens.userId}`);
22
29
  }
@@ -30,28 +37,39 @@ import * as log from '../utils/log.js';
30
37
  }
31
38
  // Start OAuth flow
32
39
  await handleAuthentication({
40
+ showNextSteps,
33
41
  tokenStore
34
42
  });
35
43
  }
36
44
  /**
37
45
  * Handle authentication flow
38
- */ async function handleAuthentication({ tokenStore }) {
46
+ */ async function handleAuthentication({ showNextSteps, tokenStore }) {
39
47
  try {
40
48
  // Execute OAuth flow
49
+ const oauthConfig = getOAuthConfig();
41
50
  const result = await executeOAuthFlow(tokenStore, {
42
- clientId: OAUTH_CONFIG.clientId,
43
- redirectUri: OAUTH_CONFIG.redirectUri,
44
- scopes: OAUTH_CONFIG.scopes
51
+ clientId: oauthConfig.clientId,
52
+ redirectUri: oauthConfig.redirectUri,
53
+ scopes: oauthConfig.scopes
45
54
  });
46
- p.log.success(pc.green('✓ You are now authenticated with Figma'));
55
+ const env = getInfraEnvironment();
56
+ p.log.success(pc.green(`✓ Logged in${formatEnvSuffix(env)}`));
47
57
  if (result.userId) {
48
58
  log.debug(`User ID: ${result.userId}`);
49
59
  }
50
60
  log.debug(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`);
51
- // Show next steps
52
- p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps');
61
+ // Show next steps unless disabled
62
+ if (showNextSteps !== false) {
63
+ p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps');
64
+ }
53
65
  } catch (error) {
54
66
  if (error instanceof OAuthFlowError) {
67
+ const isTimeout = error.cause instanceof CallbackError && error.cause.code === 'timeout';
68
+ if (isTimeout) {
69
+ p.log.error(pc.red('✗ Authentication timed out.'));
70
+ p.note(`Run ${pc.cyan('@payloadcms/figma login')} to try again.`, 'Tip');
71
+ process.exit(1);
72
+ }
55
73
  log.error(error.message);
56
74
  if (error.cause) {
57
75
  log.debug(`Cause: ${error.cause.message}`);
@@ -2,15 +2,16 @@
2
2
  * Options for logout command
3
3
  */
4
4
  export interface LogoutCommandOptions {
5
+ /** Logout from all environments */
6
+ all?: boolean;
5
7
  /** Enable debug mode */
6
8
  debug?: boolean;
7
9
  }
8
10
  /**
9
11
  * Handle the `@payloadcms/figma logout` command
10
12
  *
11
- * Clears all stored tokens (OAuth and project tokens) after confirmation.
12
- *
13
- * @param _options - Command options (unused)
13
+ * Clears stored tokens (OAuth and project tokens) after confirmation.
14
+ * By default clears only current environment. Use --all for all environments.
14
15
  */
15
- export declare function logoutCommand(_options?: LogoutCommandOptions): Promise<void>;
16
+ export declare function logoutCommand(options?: LogoutCommandOptions): Promise<void>;
16
17
  //# sourceMappingURL=logout.d.ts.map