@payloadcms/figma 0.0.1-alpha.41 → 0.0.1-alpha.5

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 (269) hide show
  1. package/dist/api/control-plane.d.ts +1 -22
  2. package/dist/api/control-plane.d.ts.map +1 -1
  3. package/dist/api/control-plane.js +22 -55
  4. package/dist/api/control-plane.js.map +1 -1
  5. package/dist/api/figma-api.d.ts.map +1 -1
  6. package/dist/api/figma-api.js +21 -45
  7. package/dist/api/figma-api.js.map +1 -1
  8. package/dist/auth/callback-server.d.ts.map +1 -1
  9. package/dist/auth/callback-server.js +1 -2
  10. package/dist/auth/callback-server.js.map +1 -1
  11. package/dist/auth/crypto-utils.d.ts.map +1 -1
  12. package/dist/auth/crypto-utils.js +5 -5
  13. package/dist/auth/crypto-utils.js.map +1 -1
  14. package/dist/auth/jwt-validator.d.ts +1 -2
  15. package/dist/auth/jwt-validator.d.ts.map +1 -1
  16. package/dist/auth/jwt-validator.js +2 -2
  17. package/dist/auth/jwt-validator.js.map +1 -1
  18. package/dist/auth/oauth-flow.d.ts +1 -1
  19. package/dist/auth/oauth-flow.d.ts.map +1 -1
  20. package/dist/auth/oauth-flow.js +8 -9
  21. package/dist/auth/oauth-flow.js.map +1 -1
  22. package/dist/auth/project-token.d.ts.map +1 -1
  23. package/dist/auth/project-token.js +4 -9
  24. package/dist/auth/project-token.js.map +1 -1
  25. package/dist/auth/refresh.d.ts.map +1 -1
  26. package/dist/auth/refresh.js +9 -14
  27. package/dist/auth/refresh.js.map +1 -1
  28. package/dist/auth/token-store.d.ts +0 -10
  29. package/dist/auth/token-store.d.ts.map +1 -1
  30. package/dist/auth/token-store.js +0 -20
  31. package/dist/auth/token-store.js.map +1 -1
  32. package/dist/cli.d.ts.map +1 -1
  33. package/dist/cli.js +0 -31
  34. package/dist/cli.js.map +1 -1
  35. package/dist/commands/deploy.d.ts +0 -4
  36. package/dist/commands/deploy.d.ts.map +1 -1
  37. package/dist/commands/deploy.js +129 -71
  38. package/dist/commands/deploy.js.map +1 -1
  39. package/dist/commands/init.d.ts +5 -1
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +85 -94
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/list-tokens.d.ts.map +1 -1
  44. package/dist/commands/list-tokens.js +3 -6
  45. package/dist/commands/list-tokens.js.map +1 -1
  46. package/dist/commands/login.d.ts +1 -8
  47. package/dist/commands/login.d.ts.map +1 -1
  48. package/dist/commands/login.js +11 -21
  49. package/dist/commands/login.js.map +1 -1
  50. package/dist/commands/logout.js +2 -2
  51. package/dist/commands/logout.js.map +1 -1
  52. package/dist/config/oauth.d.ts +14 -4
  53. package/dist/config/oauth.d.ts.map +1 -1
  54. package/dist/config/oauth.js +40 -19
  55. package/dist/config/oauth.js.map +1 -1
  56. package/dist/constants.d.ts +18 -26
  57. package/dist/constants.d.ts.map +1 -1
  58. package/dist/constants.js +20 -34
  59. package/dist/constants.js.map +1 -1
  60. package/dist/exports/client.d.ts +0 -1
  61. package/dist/exports/client.d.ts.map +1 -1
  62. package/dist/exports/client.js +0 -1
  63. package/dist/exports/client.js.map +1 -1
  64. package/dist/index.d.ts +1 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/oauth/components/LoginButton/index.d.ts.map +1 -1
  69. package/dist/oauth/components/LoginButton/index.js +6 -50
  70. package/dist/oauth/components/LoginButton/index.js.map +1 -1
  71. package/dist/oauth/components/LoginButton/index.scss +3 -50
  72. package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
  73. package/dist/oauth/components/LogoutButton/index.js +1 -0
  74. package/dist/oauth/components/LogoutButton/index.js.map +1 -1
  75. package/dist/oauth/defaults.d.ts.map +1 -1
  76. package/dist/oauth/defaults.js +5 -29
  77. package/dist/oauth/defaults.js.map +1 -1
  78. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  79. package/dist/oauth/endpoints/getLoginEndpoint.js +4 -4
  80. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  81. package/dist/oauth/index.d.ts.map +1 -1
  82. package/dist/oauth/index.js +5 -40
  83. package/dist/oauth/index.js.map +1 -1
  84. package/dist/oauth/strategy/index.d.ts +2 -0
  85. package/dist/oauth/strategy/index.d.ts.map +1 -1
  86. package/dist/oauth/strategy/index.js +15 -38
  87. package/dist/oauth/strategy/index.js.map +1 -1
  88. package/dist/oauth/types.d.ts +6 -6
  89. package/dist/oauth/types.d.ts.map +1 -1
  90. package/dist/oauth/types.js.map +1 -1
  91. package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -1
  92. package/dist/oauth/utilities/createCookieOptions.js.map +1 -1
  93. package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -1
  94. package/dist/oauth/utilities/refreshTokens.js +1 -1
  95. package/dist/oauth/utilities/refreshTokens.js.map +1 -1
  96. package/dist/plugin/build-config.d.ts +4 -21
  97. package/dist/plugin/build-config.d.ts.map +1 -1
  98. package/dist/plugin/build-config.js +8 -114
  99. package/dist/plugin/build-config.js.map +1 -1
  100. package/dist/types.d.ts +0 -1
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/types.js.map +1 -1
  103. package/dist/utils/asset-collection.d.ts +6 -3
  104. package/dist/utils/asset-collection.d.ts.map +1 -1
  105. package/dist/utils/asset-collection.js +34 -10
  106. package/dist/utils/asset-collection.js.map +1 -1
  107. package/dist/utils/config.js +1 -1
  108. package/dist/utils/config.js.map +1 -1
  109. package/dist/utils/env-management.d.ts +8 -9
  110. package/dist/utils/env-management.d.ts.map +1 -1
  111. package/dist/utils/env-management.js +74 -73
  112. package/dist/utils/env-management.js.map +1 -1
  113. package/dist/utils/formatter.d.ts.map +1 -1
  114. package/dist/utils/formatter.js +5 -3
  115. package/dist/utils/formatter.js.map +1 -1
  116. package/dist/utils/lambda-config.d.ts +1 -3
  117. package/dist/utils/lambda-config.d.ts.map +1 -1
  118. package/dist/utils/lambda-config.js +21 -13
  119. package/dist/utils/lambda-config.js.map +1 -1
  120. package/dist/utils/messages.d.ts.map +1 -1
  121. package/dist/utils/messages.js +7 -8
  122. package/dist/utils/messages.js.map +1 -1
  123. package/dist/utils/payload-config-ast.d.ts +3 -22
  124. package/dist/utils/payload-config-ast.d.ts.map +1 -1
  125. package/dist/utils/payload-config-ast.js +31 -89
  126. package/dist/utils/payload-config-ast.js.map +1 -1
  127. package/dist/utils/payload-config-finder.d.ts +2 -2
  128. package/dist/utils/payload-config-finder.d.ts.map +1 -1
  129. package/dist/utils/payload-config-finder.js +9 -48
  130. package/dist/utils/payload-config-finder.js.map +1 -1
  131. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  132. package/dist/utils/payload-config-modifier.js +6 -54
  133. package/dist/utils/payload-config-modifier.js.map +1 -1
  134. package/dist/utils/payload-package-check.d.ts +1 -12
  135. package/dist/utils/payload-package-check.d.ts.map +1 -1
  136. package/dist/utils/payload-package-check.js +5 -63
  137. package/dist/utils/payload-package-check.js.map +1 -1
  138. package/dist/utils/project.d.ts.map +1 -1
  139. package/dist/utils/project.js +5 -8
  140. package/dist/utils/project.js.map +1 -1
  141. package/dist/utils/s3-upload.d.ts +1 -0
  142. package/dist/utils/s3-upload.d.ts.map +1 -1
  143. package/dist/utils/s3-upload.js +3 -10
  144. package/dist/utils/s3-upload.js.map +1 -1
  145. package/dist/utils/token-display.d.ts.map +1 -1
  146. package/dist/utils/token-display.js +5 -11
  147. package/dist/utils/token-display.js.map +1 -1
  148. package/dist/utils/typescript-validator.d.ts.map +1 -1
  149. package/dist/utils/typescript-validator.js +6 -4
  150. package/dist/utils/typescript-validator.js.map +1 -1
  151. package/package.json +9 -27
  152. package/dist/commands/build-lambda-zip.d.ts +0 -5
  153. package/dist/commands/build-lambda-zip.d.ts.map +0 -1
  154. package/dist/commands/build-lambda-zip.js +0 -19
  155. package/dist/commands/build-lambda-zip.js.map +0 -1
  156. package/dist/db-content-api/README.md +0 -98
  157. package/dist/db-content-api/generated/content-api-types.d.ts +0 -3854
  158. package/dist/db-content-api/generated/content-api-types.d.ts.map +0 -1
  159. package/dist/db-content-api/generated/content-api-types.js +0 -7
  160. package/dist/db-content-api/generated/content-api-types.js.map +0 -1
  161. package/dist/db-content-api/index.d.ts +0 -18
  162. package/dist/db-content-api/index.d.ts.map +0 -1
  163. package/dist/db-content-api/index.js +0 -578
  164. package/dist/db-content-api/index.js.map +0 -1
  165. package/dist/db-content-api/temp-utilities/pagination.d.ts +0 -13
  166. package/dist/db-content-api/temp-utilities/pagination.d.ts.map +0 -1
  167. package/dist/db-content-api/temp-utilities/pagination.js +0 -45
  168. package/dist/db-content-api/temp-utilities/pagination.js.map +0 -1
  169. package/dist/db-content-api/temp-utilities/slug.d.ts +0 -2
  170. package/dist/db-content-api/temp-utilities/slug.d.ts.map +0 -1
  171. package/dist/db-content-api/temp-utilities/slug.js +0 -3
  172. package/dist/db-content-api/temp-utilities/slug.js.map +0 -1
  173. package/dist/db-content-api/temp-utilities/sorting.d.ts +0 -3
  174. package/dist/db-content-api/temp-utilities/sorting.d.ts.map +0 -1
  175. package/dist/db-content-api/temp-utilities/sorting.js +0 -32
  176. package/dist/db-content-api/temp-utilities/sorting.js.map +0 -1
  177. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +0 -4
  178. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts.map +0 -1
  179. package/dist/db-content-api/temp-utilities/unwrapDocument.js +0 -53
  180. package/dist/db-content-api/temp-utilities/unwrapDocument.js.map +0 -1
  181. package/dist/db-content-api/utilities/auth.d.ts +0 -30
  182. package/dist/db-content-api/utilities/auth.d.ts.map +0 -1
  183. package/dist/db-content-api/utilities/auth.js +0 -81
  184. package/dist/db-content-api/utilities/auth.js.map +0 -1
  185. package/dist/db-content-api/utilities/data/applyDefaults.d.ts +0 -7
  186. package/dist/db-content-api/utilities/data/applyDefaults.d.ts.map +0 -1
  187. package/dist/db-content-api/utilities/data/applyDefaults.js +0 -59
  188. package/dist/db-content-api/utilities/data/applyDefaults.js.map +0 -1
  189. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +0 -11
  190. package/dist/db-content-api/utilities/data/castFieldValue.d.ts.map +0 -1
  191. package/dist/db-content-api/utilities/data/castFieldValue.js +0 -66
  192. package/dist/db-content-api/utilities/data/castFieldValue.js.map +0 -1
  193. package/dist/db-content-api/utilities/data/index.d.ts +0 -30
  194. package/dist/db-content-api/utilities/data/index.d.ts.map +0 -1
  195. package/dist/db-content-api/utilities/data/index.js +0 -182
  196. package/dist/db-content-api/utilities/data/index.js.map +0 -1
  197. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +0 -12
  198. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts.map +0 -1
  199. package/dist/db-content-api/utilities/data/removeVirtualFields.js +0 -54
  200. package/dist/db-content-api/utilities/data/removeVirtualFields.js.map +0 -1
  201. package/dist/db-content-api/utilities/data/stripFields.d.ts +0 -48
  202. package/dist/db-content-api/utilities/data/stripFields.d.ts.map +0 -1
  203. package/dist/db-content-api/utilities/data/stripFields.js +0 -195
  204. package/dist/db-content-api/utilities/data/stripFields.js.map +0 -1
  205. package/dist/db-content-api/utilities/joins.d.ts +0 -55
  206. package/dist/db-content-api/utilities/joins.d.ts.map +0 -1
  207. package/dist/db-content-api/utilities/joins.js +0 -136
  208. package/dist/db-content-api/utilities/joins.js.map +0 -1
  209. package/dist/db-content-api/utilities/where.d.ts +0 -12
  210. package/dist/db-content-api/utilities/where.d.ts.map +0 -1
  211. package/dist/db-content-api/utilities/where.js +0 -107
  212. package/dist/db-content-api/utilities/where.js.map +0 -1
  213. package/dist/endpoints/health.d.ts +0 -3
  214. package/dist/endpoints/health.d.ts.map +0 -1
  215. package/dist/endpoints/health.js +0 -11
  216. package/dist/endpoints/health.js.map +0 -1
  217. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +0 -7
  218. package/dist/oauth/utilities/isDuplicateKeyError.d.ts.map +0 -1
  219. package/dist/oauth/utilities/isDuplicateKeyError.js +0 -14
  220. package/dist/oauth/utilities/isDuplicateKeyError.js.map +0 -1
  221. package/dist/storage-content-api/api-types.d.ts +0 -161
  222. package/dist/storage-content-api/api-types.d.ts.map +0 -1
  223. package/dist/storage-content-api/api-types.js +0 -6
  224. package/dist/storage-content-api/api-types.js.map +0 -1
  225. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts +0 -9
  226. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts.map +0 -1
  227. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js +0 -42
  228. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js.map +0 -1
  229. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts +0 -13
  230. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts.map +0 -1
  231. package/dist/storage-content-api/client-uploads/generateSignedURL.js +0 -31
  232. package/dist/storage-content-api/client-uploads/generateSignedURL.js.map +0 -1
  233. package/dist/storage-content-api/client.d.ts +0 -6
  234. package/dist/storage-content-api/client.d.ts.map +0 -1
  235. package/dist/storage-content-api/client.js +0 -36
  236. package/dist/storage-content-api/client.js.map +0 -1
  237. package/dist/storage-content-api/generateURL.d.ts +0 -7
  238. package/dist/storage-content-api/generateURL.d.ts.map +0 -1
  239. package/dist/storage-content-api/generateURL.js +0 -7
  240. package/dist/storage-content-api/generateURL.js.map +0 -1
  241. package/dist/storage-content-api/handleDelete.d.ts +0 -8
  242. package/dist/storage-content-api/handleDelete.d.ts.map +0 -1
  243. package/dist/storage-content-api/handleDelete.js +0 -15
  244. package/dist/storage-content-api/handleDelete.js.map +0 -1
  245. package/dist/storage-content-api/handleUpload.d.ts +0 -11
  246. package/dist/storage-content-api/handleUpload.d.ts.map +0 -1
  247. package/dist/storage-content-api/handleUpload.js +0 -136
  248. package/dist/storage-content-api/handleUpload.js.map +0 -1
  249. package/dist/storage-content-api/index.d.ts +0 -5
  250. package/dist/storage-content-api/index.d.ts.map +0 -1
  251. package/dist/storage-content-api/index.js +0 -31
  252. package/dist/storage-content-api/index.js.map +0 -1
  253. package/dist/storage-content-api/staticHandler.d.ts +0 -10
  254. package/dist/storage-content-api/staticHandler.d.ts.map +0 -1
  255. package/dist/storage-content-api/staticHandler.js +0 -55
  256. package/dist/storage-content-api/staticHandler.js.map +0 -1
  257. package/dist/storage-content-api/types.d.ts +0 -10
  258. package/dist/storage-content-api/types.d.ts.map +0 -1
  259. package/dist/storage-content-api/types.js +0 -3
  260. package/dist/storage-content-api/types.js.map +0 -1
  261. package/dist/templates/README.md +0 -19
  262. package/dist/utils/build-lambda-zip.d.ts +0 -14
  263. package/dist/utils/build-lambda-zip.d.ts.map +0 -1
  264. package/dist/utils/build-lambda-zip.js +0 -81
  265. package/dist/utils/build-lambda-zip.js.map +0 -1
  266. package/dist/utils/version-check.d.ts +0 -3
  267. package/dist/utils/version-check.d.ts.map +0 -1
  268. package/dist/utils/version-check.js +0 -38
  269. package/dist/utils/version-check.js.map +0 -1
@@ -2,35 +2,30 @@ 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 { getDatasetInfo } from '../api/control-plane.js';
5
+ import { ControlPlaneError, getTenantDetails } from '../api/control-plane.js';
6
6
  import { FigmaApiError } from '../api/figma-api.js';
7
7
  import { getValidAccessToken } from '../auth/oauth-flow.js';
8
8
  import { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js';
9
- import { getTokenStore } from '../auth/token-store.js';
10
- import { ensureGitignore } from '../utils/config.js';
11
- import { addOrUpdateEnvVar } from '../utils/env-management.js';
9
+ import { TokenStore } from '../auth/token-store.js';
12
10
  import { isDebug } from '../utils/is-debug.js';
13
- import { applyLambdaModifications } from '../utils/lambda-config.js';
14
11
  import * as log from '../utils/log.js';
15
12
  import { displayManualInstructions, ensurePayloadFigmaConfig } from '../utils/payload-config-modifier.js';
16
- import { runScript } from '../utils/payload-package-check.js';
17
13
  import { detectPayloadProject, hasRequiredDependencies, initializeGitRepo, installDependencies, isInProjectDirectory, scaffoldProject, validatePayloadVersion } from '../utils/project.js';
18
- import { checkForUpdates, getOwnVersion } from '../utils/version-check.js';
19
14
  import { loginCommand } from './login.js';
20
15
  /**
21
- * Generate and store project token for a content system
16
+ * Generate and store project token for a tenant
22
17
  * Non-blocking - will show warning but not exit on failure
23
18
  * Only shows feedback if DEBUG mode is enabled, otherwise runs silently
24
19
  *
25
20
  * @param tokenStore - Token store instance
26
- * @param contentSystemId - Content System ID to generate token for
21
+ * @param tenantId - Tenant ID to generate token for
27
22
  * @param spinner - Clack spinner instance for status updates (only used in debug mode)
28
- */ async function generateProjectTokenWithFeedback(tokenStore, contentSystemId, spinner) {
23
+ */ async function generateProjectTokenWithFeedback(tokenStore, tenantId, spinner) {
29
24
  if (isDebug()) {
30
25
  spinner.start('Generating project token...');
31
26
  }
32
27
  try {
33
- const projectToken = await getValidProjectToken(tokenStore, contentSystemId);
28
+ const projectToken = await getValidProjectToken(tokenStore, tenantId);
34
29
  if (isDebug()) {
35
30
  if (projectToken) {
36
31
  spinner.stop(pc.green('✓ Project token generated'));
@@ -52,19 +47,6 @@ import { loginCommand } from './login.js';
52
47
  // Don't exit - token generation failure shouldn't block initialization
53
48
  }
54
49
  }
55
- /**
56
- * Fetch dataset info from the API
57
- * Throws on error - caller must handle
58
- */ async function fetchDatasetInfo(accessToken, datasetId) {
59
- log.debug('Fetching dataset info...');
60
- const datasetInfo = await getDatasetInfo(accessToken, datasetId);
61
- log.debug('Dataset info retrieved successfully');
62
- return {
63
- oauthClientId: datasetInfo.oauthClientId,
64
- oauthClientSecret: datasetInfo.oauthClientSecret,
65
- tenantId: datasetInfo.tenantId
66
- };
67
- }
68
50
  /**
69
51
  * Handle the `init` command
70
52
  *
@@ -76,35 +58,48 @@ import { loginCommand } from './login.js';
76
58
  *
77
59
  * @param options - Command options
78
60
  */ export async function initCommand(options) {
79
- // Check for outdated version (non-blocking)
80
- const currentVersion = await getOwnVersion();
81
- await checkForUpdates(currentVersion);
82
61
  // Check authentication
83
- const tokenStore = getTokenStore();
62
+ const tokenStore = new TokenStore();
84
63
  const s = p.spinner();
64
+ let accessToken;
85
65
  if (options.skipAuth) {
86
66
  // Skip authentication for testing/development
87
67
  p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'));
68
+ accessToken = 'mock-access-token';
88
69
  } else {
89
70
  try {
90
71
  // Check for valid cached tokens first (no API call needed)
91
- if (!tokenStore.hasValidTokens()) {
72
+ if (tokenStore.hasValidTokens()) {
73
+ // Use cached token silently - no spinner needed
74
+ accessToken = tokenStore.getAccessToken();
75
+ } else {
92
76
  // Need to refresh or authenticate - show spinner for API call
93
77
  s.start('Checking authentication...');
94
78
  const token = await getValidAccessToken(tokenStore);
95
79
  if (!token) {
96
- s.stop('Authentication required to continue');
97
- // Run login command
98
- await loginCommand({
99
- showNextSteps: false
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?'
100
86
  });
87
+ if (p.isCancel(shouldAuth) || !shouldAuth) {
88
+ p.cancel('Operation cancelled');
89
+ process.exit(0);
90
+ }
91
+ // Run login command
92
+ await loginCommand();
101
93
  // Get token after auth
102
94
  const newToken = await getValidAccessToken(tokenStore);
103
95
  if (!newToken) {
104
96
  p.log.error('Authentication failed');
105
97
  process.exit(1);
106
98
  }
99
+ accessToken = newToken;
100
+ p.log.success(pc.green('✓ Authenticated'));
107
101
  } else {
102
+ accessToken = token;
108
103
  s.stop(pc.green('✓ Authenticated'));
109
104
  }
110
105
  }
@@ -118,25 +113,53 @@ import { loginCommand } from './login.js';
118
113
  // Note: We no longer check for figma.config.json here
119
114
  // Instead, the AST detection will check if figma object already exists in payload.config.ts
120
115
  // and skip modification if it does (unless --force is used)
121
- // Step 3: Get Content System ID (required argument)
116
+ // Step 3: Get CMS ID with retry loop
122
117
  log.debug('Configuring Project...');
123
- if (!options.id) {
124
- p.log.error('Content System ID is required. Use --id <content_system_id>');
125
- process.exit(1);
126
- }
127
- const contentSystemId = options.id;
128
- // Fetch dataset info (required - will fail if feature not enabled)
129
- let datasetInfo = null;
130
- if (!options.skipAuth) {
131
- const accessToken = await getValidAccessToken(tokenStore);
132
- if (accessToken) {
133
- try {
134
- datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId);
135
- } catch (error) {
136
- const message = error instanceof Error ? error.message : 'Unknown error';
137
- p.log.error(pc.red(`✗ Unable to fetch dataset info for content system "${contentSystemId}"`));
138
- p.log.error(pc.dim(`Details: ${message}`));
139
- p.note('This may indicate the CMS feature is not enabled for your account.\n' + 'Contact support if you believe this is an error.', 'Error');
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;
131
+ }
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');
153
+ }
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');
140
163
  process.exit(1);
141
164
  }
142
165
  }
@@ -173,7 +196,9 @@ import { loginCommand } from './login.js';
173
196
  }
174
197
  s.start('Checking Payload configuration...');
175
198
  const modResult = await ensurePayloadFigmaConfig(process.cwd(), projectInfo.packageManager || 'pnpm', {
176
- contentSystemId
199
+ region: options.region || 'us-east-1',
200
+ tenantId: selectedTenant.id,
201
+ useContentSystem: !options.noContentSystem
177
202
  });
178
203
  if (!modResult.success) {
179
204
  s.stop(pc.red('✗ Configuration check failed'));
@@ -194,19 +219,6 @@ import { loginCommand } from './login.js';
194
219
  p.log.warn(pc.yellow(`⚠ ${warning}`));
195
220
  });
196
221
  }
197
- // Write environment variables to .env file
198
- try {
199
- await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
200
- log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
201
- if (datasetInfo) {
202
- await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId);
203
- await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId);
204
- await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_SECRET', datasetInfo.oauthClientSecret);
205
- log.debug(`Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`);
206
- }
207
- } catch (error) {
208
- p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
209
- }
210
222
  } else {
211
223
  // Has package.json but no Payload - offer to add Payload
212
224
  p.log.warn(pc.yellow('⚠ No Payload detected in this project'));
@@ -227,24 +239,16 @@ import { loginCommand } from './login.js';
227
239
  p.note('Create a new project or manually add Payload dependencies', 'Action Required');
228
240
  process.exit(1);
229
241
  }
230
- // Generate import map to prevent errors on first pnpm dev
231
- await runScript(process.cwd(), 'generate:importmap', projectInfo.packageManager || 'pnpm');
232
- // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)
233
- await applyLambdaModifications(process.cwd(), projectInfo.packageManager || 'pnpm');
234
- // Ensure .gitignore has required entries
235
- await ensureGitignore(process.cwd(), [
236
- '.env',
237
- '.env.local',
238
- 'lambda.zip'
239
- ]);
240
242
  // Generate project token (unless skipping auth)
241
243
  if (!options.skipAuth) {
242
- await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s);
244
+ await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s);
243
245
  }
244
246
  // Success message for existing project
245
247
  p.outro(pc.green('✓ Project initialized successfully!'));
246
248
  const nextSteps = [
247
- 'Start development server: `pnpm dev`'
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}`)}`
248
252
  ].filter(Boolean);
249
253
  p.note(nextSteps.join('\n'), 'Next Steps');
250
254
  } else {
@@ -296,7 +300,9 @@ import { loginCommand } from './login.js';
296
300
  // Modify Payload configuration
297
301
  s.start('Checking Payload configuration...');
298
302
  const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {
299
- contentSystemId
303
+ region: options.region || 'us-east-1',
304
+ tenantId: selectedTenant.id,
305
+ useContentSystem: !options.noContentSystem
300
306
  });
301
307
  if (!modResult.success) {
302
308
  s.stop(pc.red('✗ Configuration check failed'));
@@ -317,24 +323,9 @@ import { loginCommand } from './login.js';
317
323
  p.log.warn(pc.yellow(`⚠ ${warning}`));
318
324
  });
319
325
  }
320
- // Write environment variables to .env file
321
- try {
322
- await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
323
- log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
324
- if (datasetInfo) {
325
- await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId);
326
- await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId);
327
- await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_SECRET', datasetInfo.oauthClientSecret);
328
- log.debug(`Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`);
329
- }
330
- } catch (error) {
331
- p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
332
- }
333
- // Generate import map to prevent errors on first pnpm dev
334
- await runScript(fullPath, 'generate:importmap', 'pnpm');
335
326
  // Generate project token (unless skipping auth)
336
327
  if (!options.skipAuth) {
337
- await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s);
328
+ await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s);
338
329
  }
339
330
  // Initialize git repository (after all files including lock file are ready)
340
331
  initializeGitRepo(fullPath);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { getDatasetInfo } from '../api/control-plane.js'\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { ensureGitignore } from '../utils/config.js'\nimport { addOrUpdateEnvVar } from '../utils/env-management.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { applyLambdaModifications } from '../utils/lambda-config.js'\nimport * as log from '../utils/log.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport { runScript } from '../utils/payload-package-check.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.js'\nimport { checkForUpdates, getOwnVersion } from '../utils/version-check.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for init command\n */\nexport interface InitCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Force reconfiguration of existing project */\n force?: boolean\n /** Content System ID to use */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Skip authentication check (for testing/development) */\n skipAuth?: boolean\n /** Skip prompts and use defaults where possible */\n yes?: boolean\n}\n\n/**\n * Generate and store project token for a content system\n * Non-blocking - will show warning but not exit on failure\n * Only shows feedback if DEBUG mode is enabled, otherwise runs silently\n *\n * @param tokenStore - Token store instance\n * @param contentSystemId - Content System ID to generate token for\n * @param spinner - Clack spinner instance for status updates (only used in debug mode)\n */\nasync function generateProjectTokenWithFeedback(\n tokenStore: TokenStore,\n contentSystemId: string,\n spinner: ReturnType<typeof p.spinner>,\n): Promise<void> {\n if (isDebug()) {\n spinner.start('Generating project token...')\n }\n\n try {\n const projectToken = await getValidProjectToken(tokenStore, contentSystemId)\n if (isDebug()) {\n if (projectToken) {\n spinner.stop(pc.green('✓ Project token generated'))\n } else {\n spinner.stop(pc.yellow('⚠ Project token not generated (authentication required)'))\n }\n }\n } catch (error) {\n if (isDebug()) {\n spinner.stop(pc.yellow('⚠ Project token generation failed'))\n }\n // Always show failures, even without debug\n if (error instanceof ProjectTokenError || error instanceof FigmaApiError) {\n log.warning(error.message)\n p.note(\n 'Project token is used for authenticating to the Content API.\\nYou can continue without it, but may need to regenerate later.',\n 'Note',\n )\n } else {\n log.warning(\n `Unable to retrieve project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n // Don't exit - token generation failure shouldn't block initialization\n }\n}\n\n/**\n * Fetch dataset info from the API\n * Throws on error - caller must handle\n */\nasync function fetchDatasetInfo(\n accessToken: string,\n datasetId: string,\n): Promise<{ oauthClientId: string; oauthClientSecret: string; tenantId: string }> {\n log.debug('Fetching dataset info...')\n\n const datasetInfo = await getDatasetInfo(accessToken, datasetId)\n log.debug('Dataset info retrieved successfully')\n return {\n oauthClientId: datasetInfo.oauthClientId,\n oauthClientSecret: datasetInfo.oauthClientSecret,\n tenantId: datasetInfo.tenantId,\n }\n}\n\n/**\n * Handle the `init` command\n *\n * Sets up a project by:\n * 1. Checking authentication\n * 2. Detecting/scaffolding Payload project\n * 3. Fetching tenant details\n * 4. Storing configuration\n *\n * @param options - Command options\n */\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n // Check for outdated version (non-blocking)\n const currentVersion = await getOwnVersion()\n await checkForUpdates(currentVersion)\n\n // Check authentication\n const tokenStore = getTokenStore()\n const s = p.spinner()\n\n if (options.skipAuth) {\n // Skip authentication for testing/development\n p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'))\n } else {\n try {\n // Check for valid cached tokens first (no API call needed)\n if (!tokenStore.hasValidTokens()) {\n // Need to refresh or authenticate - show spinner for API call\n s.start('Checking authentication...')\n const token = await getValidAccessToken(tokenStore)\n if (!token) {\n s.stop('Authentication required to continue')\n\n // Run login command\n await loginCommand({ showNextSteps: false })\n\n // Get token after auth\n const newToken = await getValidAccessToken(tokenStore)\n if (!newToken) {\n p.log.error('Authentication failed')\n process.exit(1)\n }\n } else {\n s.stop(pc.green('✓ Authenticated'))\n }\n }\n } catch (error) {\n s.stop(pc.red('✗ Authentication failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n p.note('Run `figma auth` to authenticate', 'Tip')\n process.exit(1)\n }\n }\n\n // Note: We no longer check for figma.config.json here\n // Instead, the AST detection will check if figma object already exists in payload.config.ts\n // and skip modification if it does (unless --force is used)\n\n // Step 3: Get Content System ID (required argument)\n log.debug('Configuring Project...')\n\n if (!options.id) {\n p.log.error('Content System ID is required. Use --id <content_system_id>')\n process.exit(1)\n }\n\n const contentSystemId = options.id\n\n // Fetch dataset info (required - will fail if feature not enabled)\n let datasetInfo: { oauthClientId: string; oauthClientSecret: string; tenantId: string } | null =\n null\n if (!options.skipAuth) {\n const accessToken = await getValidAccessToken(tokenStore)\n if (accessToken) {\n try {\n datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId)\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n p.log.error(\n pc.red(`✗ Unable to fetch dataset info for content system \"${contentSystemId}\"`),\n )\n p.log.error(pc.dim(`Details: ${message}`))\n p.note(\n 'This may indicate the CMS feature is not enabled for your account.\\n' +\n 'Contact support if you believe this is an error.',\n 'Error',\n )\n process.exit(1)\n }\n }\n }\n\n // Step 4: Detect or scaffold Payload project\n const isInProject = await isInProjectDirectory()\n\n if (isInProject) {\n // ===== EXISTING PROJECT FLOW =====\n log.debug('Project directory detected')\n\n // Detect Payload\n const projectInfo = await detectPayloadProject()\n\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), projectInfo.packageManager || 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(\n process.cwd(),\n projectInfo.packageManager || 'pnpm',\n {\n contentSystemId,\n },\n )\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n } else {\n // Has package.json but no Payload - offer to add Payload\n p.log.warn(pc.yellow('⚠ No Payload detected in this project'))\n\n const shouldAddPayload = await p.confirm({\n initialValue: true,\n message: 'Would you like to add Payload to this project?',\n })\n\n if (p.isCancel(shouldAddPayload)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (!shouldAddPayload) {\n p.log.error('Payload is required to use Figma CMS')\n process.exit(1)\n }\n\n // TODO: Add Payload to existing project (future enhancement)\n p.log.error('Adding Payload to existing projects is not yet supported')\n p.note('Create a new project or manually add Payload dependencies', 'Action Required')\n process.exit(1)\n }\n\n // Generate import map to prevent errors on first pnpm dev\n await runScript(process.cwd(), 'generate:importmap', projectInfo.packageManager || 'pnpm')\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), projectInfo.packageManager || 'pnpm')\n\n // Ensure .gitignore has required entries\n await ensureGitignore(process.cwd(), ['.env', '.env.local', 'lambda.zip'])\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = ['Start development server: `pnpm dev`'].filter(Boolean)\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n fullPath,\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n\n // Generate import map to prevent errors on first pnpm dev\n await runScript(fullPath, 'generate:importmap', 'pnpm')\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n 'pnpm dev or follow directions in README.md',\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","getDatasetInfo","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","displayManualInstructions","ensurePayloadFigmaConfig","runScript","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","checkForUpdates","getOwnVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","fetchDatasetInfo","accessToken","datasetId","debug","datasetInfo","oauthClientId","oauthClientSecret","tenantId","initCommand","options","currentVersion","s","skipAuth","warn","hasValidTokens","token","showNextSteps","newToken","process","exit","red","id","dim","isInProject","projectInfo","hasPayload","payloadVersion","success","hasDeps","cwd","shouldInstall","confirm","initialValue","isCancel","packageManager","modResult","modified","changes","length","forEach","change","warnings","shouldAddPayload","cancel","outro","nextSteps","filter","Boolean","join","projectPathInput","text","placeholder","validate","value","undefined","projectPath","fullPath","resolve","projectName","name","basename","mkdir","recursive","step","bgGreen","black","relativePath","relative","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { Tenant } from '../types/config.js'\n\nimport { ControlPlaneError, getTenantDetails } from '../api/control-plane.js'\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { TokenStore } from '../auth/token-store.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport * as log from '../utils/log.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for init command\n */\nexport interface InitCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Force reconfiguration of existing project */\n force?: boolean\n /** Tenant ID to use (optional - will prompt if not provided) */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Disable Content System (defaults to enabled) */\n noContentSystem?: boolean\n /** AWS region for deployment (defaults to us-east-1) */\n region?: string\n /** Skip authentication check (for testing/development) */\n skipAuth?: boolean\n /** Skip prompts and use defaults where possible */\n yes?: boolean\n}\n\n/**\n * Generate and store project token for a tenant\n * Non-blocking - will show warning but not exit on failure\n * Only shows feedback if DEBUG mode is enabled, otherwise runs silently\n *\n * @param tokenStore - Token store instance\n * @param tenantId - Tenant ID to generate token for\n * @param spinner - Clack spinner instance for status updates (only used in debug mode)\n */\nasync function generateProjectTokenWithFeedback(\n tokenStore: TokenStore,\n tenantId: string,\n spinner: ReturnType<typeof p.spinner>,\n): Promise<void> {\n if (isDebug()) {\n spinner.start('Generating project token...')\n }\n\n try {\n const projectToken = await getValidProjectToken(tokenStore, tenantId)\n if (isDebug()) {\n if (projectToken) {\n spinner.stop(pc.green('✓ Project token generated'))\n } else {\n spinner.stop(pc.yellow('⚠ Project token not generated (authentication required)'))\n }\n }\n } catch (error) {\n if (isDebug()) {\n spinner.stop(pc.yellow('⚠ Project token generation failed'))\n }\n // Always show failures, even without debug\n if (error instanceof ProjectTokenError || error instanceof FigmaApiError) {\n log.warning(error.message)\n p.note(\n 'Project token is used for authenticating to the Content API.\\nYou can continue without it, but may need to regenerate later.',\n 'Note',\n )\n } else {\n log.warning(\n `Unable to retrieve project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n // Don't exit - token generation failure shouldn't block initialization\n }\n}\n\n/**\n * Handle the `init` command\n *\n * Sets up a project by:\n * 1. Checking authentication\n * 2. Detecting/scaffolding Payload project\n * 3. Fetching tenant details\n * 4. Storing configuration\n *\n * @param options - Command options\n */\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n // Check authentication\n const tokenStore = new TokenStore()\n const s = p.spinner()\n\n let accessToken: string\n\n if (options.skipAuth) {\n // Skip authentication for testing/development\n p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'))\n accessToken = 'mock-access-token'\n } else {\n try {\n // Check for valid cached tokens first (no API call needed)\n if (tokenStore.hasValidTokens()) {\n // Use cached token silently - no spinner needed\n accessToken = tokenStore.getAccessToken()!\n } else {\n // Need to refresh or authenticate - show spinner for API call\n s.start('Checking authentication...')\n const token = await getValidAccessToken(tokenStore)\n if (!token) {\n s.stop(pc.yellow('⚠ Not authenticated'))\n p.log.info('Authentication required to continue')\n\n // Prompt user to authenticate now\n const shouldAuth = await p.confirm({\n initialValue: true,\n message: 'Would you like to authenticate now?',\n })\n\n if (p.isCancel(shouldAuth) || !shouldAuth) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n // Run login command\n await loginCommand()\n\n // Get token after auth\n const newToken = await getValidAccessToken(tokenStore)\n if (!newToken) {\n p.log.error('Authentication failed')\n process.exit(1)\n }\n accessToken = newToken\n p.log.success(pc.green('✓ Authenticated'))\n } else {\n accessToken = token\n s.stop(pc.green('✓ Authenticated'))\n }\n }\n } catch (error) {\n s.stop(pc.red('✗ Authentication failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n p.note('Run `figma auth` to authenticate', 'Tip')\n process.exit(1)\n }\n }\n\n // Note: We no longer check for figma.config.json here\n // Instead, the AST detection will check if figma object already exists in payload.config.ts\n // and skip modification if it does (unless --force is used)\n\n // Step 3: Get CMS ID with retry loop\n log.debug('Configuring Project...')\n\n let tenantId = options.id\n let selectedTenant: Tenant | undefined\n\n while (!selectedTenant) {\n // Prompt for ID if not provided\n if (!tenantId) {\n const input = await p.text({\n message: 'Enter your CMS ID:',\n placeholder: 'tenant_abc123',\n validate: (value) => {\n if (!value || typeof value !== 'string') {\n return 'CMS ID is required'\n }\n return undefined\n },\n })\n\n if (p.isCancel(input)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n tenantId = input\n }\n\n // Try to fetch tenant details\n try {\n log.debug('Using mock Control Plane API (no real network calls)')\n selectedTenant = await getTenantDetails(accessToken, tenantId)\n log.debug(`Using: ${selectedTenant.domain}`)\n } catch (error) {\n p.log.error(pc.red('✗ Failed to fetch CMS details'))\n\n // Check if permission error (403)\n if (error instanceof ControlPlaneError && error.statusCode === 403) {\n p.log.error('You do not have permission to access the provided CMS ID. Please try again.')\n } else if (error instanceof ControlPlaneError && error.statusCode === 404) {\n p.log.error('Tenant ID not found. Verify the ID is correct.')\n } else {\n p.log.error(error instanceof Error ? error.message : 'Unknown error')\n }\n\n // Clear tenantId to prompt again\n tenantId = undefined\n\n // Ask if they want to retry\n const shouldRetry = await p.confirm({\n initialValue: true,\n message: 'Would you like to try a different CMS ID?',\n })\n\n if (p.isCancel(shouldRetry) || !shouldRetry) {\n p.cancel('Operation cancelled')\n process.exit(1)\n }\n }\n }\n\n // Step 4: Detect or scaffold Payload project\n const isInProject = await isInProjectDirectory()\n\n if (isInProject) {\n // ===== EXISTING PROJECT FLOW =====\n log.debug('Project directory detected')\n\n // Detect Payload\n const projectInfo = await detectPayloadProject()\n\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), projectInfo.packageManager || 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(\n process.cwd(),\n projectInfo.packageManager || 'pnpm',\n {\n region: options.region || 'us-east-1',\n tenantId: selectedTenant.id,\n useContentSystem: !options.noContentSystem,\n },\n )\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n } else {\n // Has package.json but no Payload - offer to add Payload\n p.log.warn(pc.yellow('⚠ No Payload detected in this project'))\n\n const shouldAddPayload = await p.confirm({\n initialValue: true,\n message: 'Would you like to add Payload to this project?',\n })\n\n if (p.isCancel(shouldAddPayload)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (!shouldAddPayload) {\n p.log.error('Payload is required to use Figma CMS')\n process.exit(1)\n }\n\n // TODO: Add Payload to existing project (future enhancement)\n p.log.error('Adding Payload to existing projects is not yet supported')\n p.note('Create a new project or manually add Payload dependencies', 'Action Required')\n process.exit(1)\n }\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = [\n selectedTenant.status === 'provisioning'\n ? 'Wait for CMS provisioning to complete (check status with `@payloadcms/figma list`)'\n : undefined,\n 'Start development server: `pnpm dev`',\n `Access your CMS at: ${pc.cyan(`https://${selectedTenant.domain}`)}`,\n ].filter(Boolean)\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {\n region: options.region || 'us-east-1',\n tenantId: selectedTenant.id,\n useContentSystem: !options.noContentSystem,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, selectedTenant.id, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n 'pnpm dev or follow directions in README.md',\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","ControlPlaneError","getTenantDetails","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","TokenStore","isDebug","log","displayManualInstructions","ensurePayloadFigmaConfig","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","tenantId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","initCommand","options","s","accessToken","skipAuth","warn","hasValidTokens","getAccessToken","token","info","shouldAuth","confirm","initialValue","isCancel","cancel","process","exit","newToken","success","red","debug","id","selectedTenant","input","text","placeholder","validate","value","undefined","domain","statusCode","shouldRetry","isInProject","projectInfo","hasPayload","payloadVersion","hasDeps","cwd","shouldInstall","packageManager","modResult","region","useContentSystem","noContentSystem","modified","changes","length","forEach","change","dim","warnings","shouldAddPayload","outro","nextSteps","status","cyan","filter","Boolean","join","projectPathInput","projectPath","fullPath","resolve","projectName","name","basename","mkdir","recursive","step","bgGreen","black","relativePath","relative","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,wBAA6B,GAAG,IAAI,CA+C/E"}
1
+ {"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,wBAA6B,GAAG,IAAI,CA6C/E"}
@@ -1,7 +1,6 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import pc from 'picocolors';
3
- import { getTokenStore } from '../auth/token-store.js';
4
- import { getEnvironment } from '../constants.js';
3
+ import { TokenStore } from '../auth/token-store.js';
5
4
  import { isDebug } from '../utils/is-debug.js';
6
5
  import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js';
7
6
  /**
@@ -11,7 +10,7 @@ import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-di
11
10
  *
12
11
  * @param _options - Command options (unused)
13
12
  */ export function listTokensCommand(_options = {}) {
14
- const tokenStore = getTokenStore();
13
+ const tokenStore = new TokenStore();
15
14
  const tokens = tokenStore.getTokens();
16
15
  if (!tokens) {
17
16
  p.log.warn(pc.yellow('No tokens found. Not authenticated.'));
@@ -20,9 +19,7 @@ import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-di
20
19
  }
21
20
  const isValid = tokenStore.hasValidTokens();
22
21
  const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired');
23
- const env = getEnvironment();
24
- const envSuffix = env === 'staging' ? ` (${env})` : '';
25
- p.log.step(pc.bold(`Token Status${envSuffix}`));
22
+ p.log.step(pc.bold('Stored Tokens'));
26
23
  // Build OAuth token info display
27
24
  const lines = [
28
25
  `Status: ${status}`,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/list-tokens.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js'\n\n/**\n * Options for list-tokens command\n */\nexport interface ListTokensCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma list-tokens` command\n *\n * Displays stored token information including OAuth and project tokens.\n *\n * @param _options - Command options (unused)\n */\nexport function listTokensCommand(_options: ListTokensCommandOptions = {}): void {\n const tokenStore = getTokenStore()\n\n const tokens = tokenStore.getTokens()\n\n if (!tokens) {\n p.log.warn(pc.yellow('No tokens found. Not authenticated.'))\n p.note(`Run ${pc.cyan('@payloadcms/figma login')} to authenticate`, 'Tip')\n return\n }\n\n const isValid = tokenStore.hasValidTokens()\n const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired')\n\n const env = getEnvironment()\n const envSuffix = env === 'staging' ? ` (${env})` : ''\n p.log.step(pc.bold(`Token Status${envSuffix}`))\n\n // Build OAuth token info display\n const lines = [\n `Status: ${status}`,\n `Access Token: ${isDebug() ? tokens.accessToken : maskToken(tokens.accessToken)}`,\n `Refresh Token: ${isDebug() ? tokens.refreshToken : maskToken(tokens.refreshToken)}`,\n `Expires: ${formatTimestamp(tokens.expiresAt)}`,\n ]\n\n if (tokens.userId) {\n lines.push(`User ID: ${tokens.userId}`)\n }\n\n if (tokens.scopes && tokens.scopes.length > 0) {\n lines.push(`Scopes: ${tokens.scopes.join(', ')}`)\n }\n\n lines.push(`Storage Path: ${pc.dim(tokenStore.getStoragePath())}`)\n\n p.note(lines.join('\\n'), 'OAuth Tokens')\n\n if (!isValid) {\n p.note(\n `Tokens have expired. Run ${pc.cyan('@payloadcms/figma login')} to re-authenticate`,\n 'Action Required',\n )\n }\n\n // Show project tokens if any exist\n showProjectTokens(tokenStore)\n}\n"],"names":["p","pc","getTokenStore","getEnvironment","isDebug","formatTimestamp","maskToken","showProjectTokens","listTokensCommand","_options","tokenStore","tokens","getTokens","log","warn","yellow","note","cyan","isValid","hasValidTokens","status","green","red","env","envSuffix","step","bold","lines","accessToken","refreshToken","expiresAt","userId","push","scopes","length","join","dim","getStoragePath"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAE3B,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,cAAc,QAAQ,kBAAiB;AAChD,SAASC,OAAO,QAAQ,uBAAsB;AAC9C,SAASC,eAAe,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,4BAA2B;AAUzF;;;;;;CAMC,GACD,OAAO,SAASC,kBAAkBC,WAAqC,CAAC,CAAC;IACvE,MAAMC,aAAaR;IAEnB,MAAMS,SAASD,WAAWE,SAAS;IAEnC,IAAI,CAACD,QAAQ;QACXX,EAAEa,GAAG,CAACC,IAAI,CAACb,GAAGc,MAAM,CAAC;QACrBf,EAAEgB,IAAI,CAAC,CAAC,IAAI,EAAEf,GAAGgB,IAAI,CAAC,2BAA2B,gBAAgB,CAAC,EAAE;QACpE;IACF;IAEA,MAAMC,UAAUR,WAAWS,cAAc;IACzC,MAAMC,SAASF,UAAUjB,GAAGoB,KAAK,CAAC,aAAapB,GAAGqB,GAAG,CAAC;IAEtD,MAAMC,MAAMpB;IACZ,MAAMqB,YAAYD,QAAQ,YAAY,CAAC,EAAE,EAAEA,IAAI,CAAC,CAAC,GAAG;IACpDvB,EAAEa,GAAG,CAACY,IAAI,CAACxB,GAAGyB,IAAI,CAAC,CAAC,YAAY,EAAEF,WAAW;IAE7C,iCAAiC;IACjC,MAAMG,QAAQ;QACZ,CAAC,gBAAgB,EAAEP,QAAQ;QAC3B,CAAC,gBAAgB,EAAEhB,YAAYO,OAAOiB,WAAW,GAAGtB,UAAUK,OAAOiB,WAAW,GAAG;QACnF,CAAC,gBAAgB,EAAExB,YAAYO,OAAOkB,YAAY,GAAGvB,UAAUK,OAAOkB,YAAY,GAAG;QACrF,CAAC,gBAAgB,EAAExB,gBAAgBM,OAAOmB,SAAS,GAAG;KACvD;IAED,IAAInB,OAAOoB,MAAM,EAAE;QACjBJ,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAErB,OAAOoB,MAAM,EAAE;IAC/C;IAEA,IAAIpB,OAAOsB,MAAM,IAAItB,OAAOsB,MAAM,CAACC,MAAM,GAAG,GAAG;QAC7CP,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAErB,OAAOsB,MAAM,CAACE,IAAI,CAAC,OAAO;IAC1D;IAEAR,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAE/B,GAAGmC,GAAG,CAAC1B,WAAW2B,cAAc,KAAK;IAEnErC,EAAEgB,IAAI,CAACW,MAAMQ,IAAI,CAAC,OAAO;IAEzB,IAAI,CAACjB,SAAS;QACZlB,EAAEgB,IAAI,CACJ,CAAC,yBAAyB,EAAEf,GAAGgB,IAAI,CAAC,2BAA2B,mBAAmB,CAAC,EACnF;IAEJ;IAEA,mCAAmC;IACnCV,kBAAkBG;AACpB"}
1
+ {"version":3,"sources":["../../src/commands/list-tokens.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { TokenStore } from '../auth/token-store.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js'\n\n/**\n * Options for list-tokens command\n */\nexport interface ListTokensCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma list-tokens` command\n *\n * Displays stored token information including OAuth and project tokens.\n *\n * @param _options - Command options (unused)\n */\nexport function listTokensCommand(_options: ListTokensCommandOptions = {}): void {\n const tokenStore = new TokenStore()\n\n const tokens = tokenStore.getTokens()\n\n if (!tokens) {\n p.log.warn(pc.yellow('No tokens found. Not authenticated.'))\n p.note(`Run ${pc.cyan('@payloadcms/figma login')} to authenticate`, 'Tip')\n return\n }\n\n const isValid = tokenStore.hasValidTokens()\n const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired')\n\n p.log.step(pc.bold('Stored Tokens'))\n\n // Build OAuth token info display\n const lines = [\n `Status: ${status}`,\n `Access Token: ${isDebug() ? tokens.accessToken : maskToken(tokens.accessToken)}`,\n `Refresh Token: ${isDebug() ? tokens.refreshToken : maskToken(tokens.refreshToken)}`,\n `Expires: ${formatTimestamp(tokens.expiresAt)}`,\n ]\n\n if (tokens.userId) {\n lines.push(`User ID: ${tokens.userId}`)\n }\n\n if (tokens.scopes && tokens.scopes.length > 0) {\n lines.push(`Scopes: ${tokens.scopes.join(', ')}`)\n }\n\n lines.push(`Storage Path: ${pc.dim(tokenStore.getStoragePath())}`)\n\n p.note(lines.join('\\n'), 'OAuth Tokens')\n\n if (!isValid) {\n p.note(\n `Tokens have expired. Run ${pc.cyan('@payloadcms/figma login')} to re-authenticate`,\n 'Action Required',\n )\n }\n\n // Show project tokens if any exist\n showProjectTokens(tokenStore)\n}\n"],"names":["p","pc","TokenStore","isDebug","formatTimestamp","maskToken","showProjectTokens","listTokensCommand","_options","tokenStore","tokens","getTokens","log","warn","yellow","note","cyan","isValid","hasValidTokens","status","green","red","step","bold","lines","accessToken","refreshToken","expiresAt","userId","push","scopes","length","join","dim","getStoragePath"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAE3B,SAASC,UAAU,QAAQ,yBAAwB;AACnD,SAASC,OAAO,QAAQ,uBAAsB;AAC9C,SAASC,eAAe,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,4BAA2B;AAUzF;;;;;;CAMC,GACD,OAAO,SAASC,kBAAkBC,WAAqC,CAAC,CAAC;IACvE,MAAMC,aAAa,IAAIP;IAEvB,MAAMQ,SAASD,WAAWE,SAAS;IAEnC,IAAI,CAACD,QAAQ;QACXV,EAAEY,GAAG,CAACC,IAAI,CAACZ,GAAGa,MAAM,CAAC;QACrBd,EAAEe,IAAI,CAAC,CAAC,IAAI,EAAEd,GAAGe,IAAI,CAAC,2BAA2B,gBAAgB,CAAC,EAAE;QACpE;IACF;IAEA,MAAMC,UAAUR,WAAWS,cAAc;IACzC,MAAMC,SAASF,UAAUhB,GAAGmB,KAAK,CAAC,aAAanB,GAAGoB,GAAG,CAAC;IAEtDrB,EAAEY,GAAG,CAACU,IAAI,CAACrB,GAAGsB,IAAI,CAAC;IAEnB,iCAAiC;IACjC,MAAMC,QAAQ;QACZ,CAAC,gBAAgB,EAAEL,QAAQ;QAC3B,CAAC,gBAAgB,EAAEhB,YAAYO,OAAOe,WAAW,GAAGpB,UAAUK,OAAOe,WAAW,GAAG;QACnF,CAAC,gBAAgB,EAAEtB,YAAYO,OAAOgB,YAAY,GAAGrB,UAAUK,OAAOgB,YAAY,GAAG;QACrF,CAAC,gBAAgB,EAAEtB,gBAAgBM,OAAOiB,SAAS,GAAG;KACvD;IAED,IAAIjB,OAAOkB,MAAM,EAAE;QACjBJ,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAEnB,OAAOkB,MAAM,EAAE;IAC/C;IAEA,IAAIlB,OAAOoB,MAAM,IAAIpB,OAAOoB,MAAM,CAACC,MAAM,GAAG,GAAG;QAC7CP,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAEnB,OAAOoB,MAAM,CAACE,IAAI,CAAC,OAAO;IAC1D;IAEAR,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAE5B,GAAGgC,GAAG,CAACxB,WAAWyB,cAAc,KAAK;IAEnElC,EAAEe,IAAI,CAACS,MAAMQ,IAAI,CAAC,OAAO;IAEzB,IAAI,CAACf,SAAS;QACZjB,EAAEe,IAAI,CACJ,CAAC,yBAAyB,EAAEd,GAAGe,IAAI,CAAC,2BAA2B,mBAAmB,CAAC,EACnF;IAEJ;IAEA,mCAAmC;IACnCV,kBAAkBG;AACpB"}
@@ -1,15 +1,8 @@
1
- type LoginArgs = {
2
- /** Set this to show next steps after login
3
- * @default true
4
- */
5
- showNextSteps: boolean;
6
- };
7
1
  /**
8
2
  * Handle the `@payloadcms/figma login` command
9
3
  *
10
4
  * Authenticates the user with Figma OAuth2 and stores tokens locally.
11
5
  * If valid tokens already exist, shows an error message.
12
6
  */
13
- export declare function loginCommand(args?: LoginArgs): Promise<void>;
14
- export {};
7
+ export declare function loginCommand(): Promise<void>;
15
8
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAWA,KAAK,SAAS,GAAG;IACf;;OAEG;IACH,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BlE"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBlD"}
@@ -1,20 +1,16 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import pc from 'picocolors';
3
3
  import { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js';
4
- import { getTokenStore } from '../auth/token-store.js';
5
- import { getOAuthConfig } from '../config/oauth.js';
6
- import { getEnvironment } from '../constants.js';
4
+ import { TokenStore } from '../auth/token-store.js';
5
+ import { OAUTH_CONFIG } from '../config/oauth.js';
7
6
  import * as log from '../utils/log.js';
8
7
  /**
9
8
  * Handle the `@payloadcms/figma login` command
10
9
  *
11
10
  * Authenticates the user with Figma OAuth2 and stores tokens locally.
12
11
  * If valid tokens already exist, shows an error message.
13
- */ export async function loginCommand(args) {
14
- const { showNextSteps } = args || {
15
- showNextSteps: false
16
- };
17
- const tokenStore = getTokenStore();
12
+ */ export async function loginCommand() {
13
+ const tokenStore = new TokenStore();
18
14
  // Check for existing valid tokens
19
15
  try {
20
16
  const existingToken = await getValidAccessToken(tokenStore);
@@ -34,32 +30,26 @@ import * as log from '../utils/log.js';
34
30
  }
35
31
  // Start OAuth flow
36
32
  await handleAuthentication({
37
- showNextSteps,
38
33
  tokenStore
39
34
  });
40
35
  }
41
36
  /**
42
37
  * Handle authentication flow
43
- */ async function handleAuthentication({ showNextSteps, tokenStore }) {
38
+ */ async function handleAuthentication({ tokenStore }) {
44
39
  try {
45
40
  // Execute OAuth flow
46
- const oauthConfig = getOAuthConfig();
47
41
  const result = await executeOAuthFlow(tokenStore, {
48
- clientId: oauthConfig.clientId,
49
- redirectUri: oauthConfig.redirectUri,
50
- scopes: oauthConfig.scopes
42
+ clientId: OAUTH_CONFIG.clientId,
43
+ redirectUri: OAUTH_CONFIG.redirectUri,
44
+ scopes: OAUTH_CONFIG.scopes
51
45
  });
52
- const env = getEnvironment();
53
- const envSuffix = env === 'staging' ? ` (${env})` : '';
54
- p.log.success(pc.green(`✓ Logged in to Figma${envSuffix}`));
46
+ p.log.success(pc.green('✓ You are now authenticated with Figma'));
55
47
  if (result.userId) {
56
48
  log.debug(`User ID: ${result.userId}`);
57
49
  }
58
50
  log.debug(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`);
59
- // Show next steps unless disabled
60
- if (showNextSteps !== false) {
61
- p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps');
62
- }
51
+ // Show next steps
52
+ p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps');
63
53
  } catch (error) {
64
54
  if (error instanceof OAuthFlowError) {
65
55
  log.error(error.message);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getOAuthConfig } from '../config/oauth.js'\nimport { getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\ntype LoginArgs = {\n /** Set this to show next steps after login\n * @default true\n */\n showNextSteps: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma login` command\n *\n * Authenticates the user with Figma OAuth2 and stores tokens locally.\n * If valid tokens already exist, shows an error message.\n */\nexport async function loginCommand(args?: LoginArgs): Promise<void> {\n const { showNextSteps } = args || { showNextSteps: false }\n const tokenStore = getTokenStore()\n\n // Check for existing valid tokens\n try {\n const existingToken = await getValidAccessToken(tokenStore)\n if (existingToken) {\n const tokens = tokenStore.getTokens()\n p.log.warn(pc.yellow('Already logged in'))\n if (tokens?.userId) {\n log.info(`User ID: ${tokens.userId}`)\n }\n log.info(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n p.note(`To re-authenticate, first run ${pc.cyan('@payloadcms/figma logout')}`, 'Tip')\n return\n }\n } catch {\n // Token refresh failed - continue with new auth flow\n log.warning('Existing tokens are invalid. Starting new authentication...')\n }\n\n // Start OAuth flow\n await handleAuthentication({\n showNextSteps,\n tokenStore,\n })\n}\n\n/**\n * Handle authentication flow\n */\nasync function handleAuthentication({\n showNextSteps,\n tokenStore,\n}: {\n showNextSteps: boolean\n tokenStore: TokenStore\n}): Promise<void> {\n try {\n // Execute OAuth flow\n const oauthConfig = getOAuthConfig()\n const result = await executeOAuthFlow(tokenStore, {\n clientId: oauthConfig.clientId,\n redirectUri: oauthConfig.redirectUri,\n scopes: oauthConfig.scopes,\n })\n\n const env = getEnvironment()\n const envSuffix = env === 'staging' ? ` (${env})` : ''\n p.log.success(pc.green(`✓ Logged in to Figma${envSuffix}`))\n\n if (result.userId) {\n log.debug(`User ID: ${result.userId}`)\n }\n\n log.debug(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n\n // Show next steps unless disabled\n if (showNextSteps !== false) {\n p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps')\n }\n } catch (error) {\n if (error instanceof OAuthFlowError) {\n log.error(error.message)\n\n if (error.cause) {\n log.debug(`Cause: ${error.cause.message}`)\n }\n } else {\n log.error(error instanceof Error ? error.message : 'Unknown error')\n }\n\n process.exit(1)\n }\n}\n"],"names":["p","pc","executeOAuthFlow","getValidAccessToken","OAuthFlowError","getTokenStore","getOAuthConfig","getEnvironment","log","loginCommand","args","showNextSteps","tokenStore","existingToken","tokens","getTokens","warn","yellow","userId","info","dim","getStoragePath","note","cyan","warning","handleAuthentication","oauthConfig","result","clientId","redirectUri","scopes","env","envSuffix","success","green","debug","error","message","cause","Error","process","exit"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAI3B,SAASC,gBAAgB,EAAEC,mBAAmB,EAAEC,cAAc,QAAQ,wBAAuB;AAC7F,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,cAAc,QAAQ,qBAAoB;AACnD,SAASC,cAAc,QAAQ,kBAAiB;AAChD,YAAYC,SAAS,kBAAiB;AAStC;;;;;CAKC,GACD,OAAO,eAAeC,aAAaC,IAAgB;IACjD,MAAM,EAAEC,aAAa,EAAE,GAAGD,QAAQ;QAAEC,eAAe;IAAM;IACzD,MAAMC,aAAaP;IAEnB,kCAAkC;IAClC,IAAI;QACF,MAAMQ,gBAAgB,MAAMV,oBAAoBS;QAChD,IAAIC,eAAe;YACjB,MAAMC,SAASF,WAAWG,SAAS;YACnCf,EAAEQ,GAAG,CAACQ,IAAI,CAACf,GAAGgB,MAAM,CAAC;YACrB,IAAIH,QAAQI,QAAQ;gBAClBV,IAAIW,IAAI,CAAC,CAAC,SAAS,EAAEL,OAAOI,MAAM,EAAE;YACtC;YACAV,IAAIW,IAAI,CAAC,CAAC,eAAe,EAAElB,GAAGmB,GAAG,CAACR,WAAWS,cAAc,KAAK;YAChErB,EAAEsB,IAAI,CAAC,CAAC,8BAA8B,EAAErB,GAAGsB,IAAI,CAAC,6BAA6B,EAAE;YAC/E;QACF;IACF,EAAE,OAAM;QACN,qDAAqD;QACrDf,IAAIgB,OAAO,CAAC;IACd;IAEA,mBAAmB;IACnB,MAAMC,qBAAqB;QACzBd;QACAC;IACF;AACF;AAEA;;CAEC,GACD,eAAea,qBAAqB,EAClCd,aAAa,EACbC,UAAU,EAIX;IACC,IAAI;QACF,qBAAqB;QACrB,MAAMc,cAAcpB;QACpB,MAAMqB,SAAS,MAAMzB,iBAAiBU,YAAY;YAChDgB,UAAUF,YAAYE,QAAQ;YAC9BC,aAAaH,YAAYG,WAAW;YACpCC,QAAQJ,YAAYI,MAAM;QAC5B;QAEA,MAAMC,MAAMxB;QACZ,MAAMyB,YAAYD,QAAQ,YAAY,CAAC,EAAE,EAAEA,IAAI,CAAC,CAAC,GAAG;QACpD/B,EAAEQ,GAAG,CAACyB,OAAO,CAAChC,GAAGiC,KAAK,CAAC,CAAC,oBAAoB,EAAEF,WAAW;QAEzD,IAAIL,OAAOT,MAAM,EAAE;YACjBV,IAAI2B,KAAK,CAAC,CAAC,SAAS,EAAER,OAAOT,MAAM,EAAE;QACvC;QAEAV,IAAI2B,KAAK,CAAC,CAAC,eAAe,EAAElC,GAAGmB,GAAG,CAACR,WAAWS,cAAc,KAAK;QAEjE,kCAAkC;QAClC,IAAIV,kBAAkB,OAAO;YAC3BX,EAAEsB,IAAI,CAAC,CAAC,EAAE,EAAErB,GAAGsB,IAAI,CAAC,0BAA0B,2BAA2B,CAAC,EAAE;QAC9E;IACF,EAAE,OAAOa,OAAO;QACd,IAAIA,iBAAiBhC,gBAAgB;YACnCI,IAAI4B,KAAK,CAACA,MAAMC,OAAO;YAEvB,IAAID,MAAME,KAAK,EAAE;gBACf9B,IAAI2B,KAAK,CAAC,CAAC,OAAO,EAAEC,MAAME,KAAK,CAACD,OAAO,EAAE;YAC3C;QACF,OAAO;YACL7B,IAAI4B,KAAK,CAACA,iBAAiBG,QAAQH,MAAMC,OAAO,GAAG;QACrD;QAEAG,QAAQC,IAAI,CAAC;IACf;AACF"}
1
+ {"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js'\nimport { TokenStore } from '../auth/token-store.js'\nimport { OAUTH_CONFIG } from '../config/oauth.js'\nimport * as log from '../utils/log.js'\n\n/**\n * Handle the `@payloadcms/figma login` command\n *\n * Authenticates the user with Figma OAuth2 and stores tokens locally.\n * If valid tokens already exist, shows an error message.\n */\nexport async function loginCommand(): Promise<void> {\n const tokenStore = new TokenStore()\n\n // Check for existing valid tokens\n try {\n const existingToken = await getValidAccessToken(tokenStore)\n if (existingToken) {\n const tokens = tokenStore.getTokens()\n p.log.warn(pc.yellow('Already logged in'))\n if (tokens?.userId) {\n log.info(`User ID: ${tokens.userId}`)\n }\n log.info(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n p.note(`To re-authenticate, first run ${pc.cyan('@payloadcms/figma logout')}`, 'Tip')\n return\n }\n } catch {\n // Token refresh failed - continue with new auth flow\n log.warning('Existing tokens are invalid. Starting new authentication...')\n }\n\n // Start OAuth flow\n await handleAuthentication({\n tokenStore,\n })\n}\n\n/**\n * Handle authentication flow\n */\nasync function handleAuthentication({ tokenStore }: { tokenStore: TokenStore }): Promise<void> {\n try {\n // Execute OAuth flow\n const result = await executeOAuthFlow(tokenStore, {\n clientId: OAUTH_CONFIG.clientId,\n redirectUri: OAUTH_CONFIG.redirectUri,\n scopes: OAUTH_CONFIG.scopes,\n })\n\n p.log.success(pc.green('✓ You are now authenticated with Figma'))\n\n if (result.userId) {\n log.debug(`User ID: ${result.userId}`)\n }\n\n log.debug(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n\n // Show next steps\n p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps')\n } catch (error) {\n if (error instanceof OAuthFlowError) {\n log.error(error.message)\n\n if (error.cause) {\n log.debug(`Cause: ${error.cause.message}`)\n }\n } else {\n log.error(error instanceof Error ? error.message : 'Unknown error')\n }\n\n process.exit(1)\n }\n}\n"],"names":["p","pc","executeOAuthFlow","getValidAccessToken","OAuthFlowError","TokenStore","OAUTH_CONFIG","log","loginCommand","tokenStore","existingToken","tokens","getTokens","warn","yellow","userId","info","dim","getStoragePath","note","cyan","warning","handleAuthentication","result","clientId","redirectUri","scopes","success","green","debug","error","message","cause","Error","process","exit"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAE3B,SAASC,gBAAgB,EAAEC,mBAAmB,EAAEC,cAAc,QAAQ,wBAAuB;AAC7F,SAASC,UAAU,QAAQ,yBAAwB;AACnD,SAASC,YAAY,QAAQ,qBAAoB;AACjD,YAAYC,SAAS,kBAAiB;AAEtC;;;;;CAKC,GACD,OAAO,eAAeC;IACpB,MAAMC,aAAa,IAAIJ;IAEvB,kCAAkC;IAClC,IAAI;QACF,MAAMK,gBAAgB,MAAMP,oBAAoBM;QAChD,IAAIC,eAAe;YACjB,MAAMC,SAASF,WAAWG,SAAS;YACnCZ,EAAEO,GAAG,CAACM,IAAI,CAACZ,GAAGa,MAAM,CAAC;YACrB,IAAIH,QAAQI,QAAQ;gBAClBR,IAAIS,IAAI,CAAC,CAAC,SAAS,EAAEL,OAAOI,MAAM,EAAE;YACtC;YACAR,IAAIS,IAAI,CAAC,CAAC,eAAe,EAAEf,GAAGgB,GAAG,CAACR,WAAWS,cAAc,KAAK;YAChElB,EAAEmB,IAAI,CAAC,CAAC,8BAA8B,EAAElB,GAAGmB,IAAI,CAAC,6BAA6B,EAAE;YAC/E;QACF;IACF,EAAE,OAAM;QACN,qDAAqD;QACrDb,IAAIc,OAAO,CAAC;IACd;IAEA,mBAAmB;IACnB,MAAMC,qBAAqB;QACzBb;IACF;AACF;AAEA;;CAEC,GACD,eAAea,qBAAqB,EAAEb,UAAU,EAA8B;IAC5E,IAAI;QACF,qBAAqB;QACrB,MAAMc,SAAS,MAAMrB,iBAAiBO,YAAY;YAChDe,UAAUlB,aAAakB,QAAQ;YAC/BC,aAAanB,aAAamB,WAAW;YACrCC,QAAQpB,aAAaoB,MAAM;QAC7B;QAEA1B,EAAEO,GAAG,CAACoB,OAAO,CAAC1B,GAAG2B,KAAK,CAAC;QAEvB,IAAIL,OAAOR,MAAM,EAAE;YACjBR,IAAIsB,KAAK,CAAC,CAAC,SAAS,EAAEN,OAAOR,MAAM,EAAE;QACvC;QAEAR,IAAIsB,KAAK,CAAC,CAAC,eAAe,EAAE5B,GAAGgB,GAAG,CAACR,WAAWS,cAAc,KAAK;QAEjE,kBAAkB;QAClBlB,EAAEmB,IAAI,CAAC,CAAC,EAAE,EAAElB,GAAGmB,IAAI,CAAC,0BAA0B,2BAA2B,CAAC,EAAE;IAC9E,EAAE,OAAOU,OAAO;QACd,IAAIA,iBAAiB1B,gBAAgB;YACnCG,IAAIuB,KAAK,CAACA,MAAMC,OAAO;YAEvB,IAAID,MAAME,KAAK,EAAE;gBACfzB,IAAIsB,KAAK,CAAC,CAAC,OAAO,EAAEC,MAAME,KAAK,CAACD,OAAO,EAAE;YAC3C;QACF,OAAO;YACLxB,IAAIuB,KAAK,CAACA,iBAAiBG,QAAQH,MAAMC,OAAO,GAAG;QACrD;QAEAG,QAAQC,IAAI,CAAC;IACf;AACF"}
@@ -1,6 +1,6 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import pc from 'picocolors';
3
- import { getTokenStore } from '../auth/token-store.js';
3
+ import { TokenStore } from '../auth/token-store.js';
4
4
  import * as log from '../utils/log.js';
5
5
  /**
6
6
  * Handle the `@payloadcms/figma logout` command
@@ -9,7 +9,7 @@ import * as log from '../utils/log.js';
9
9
  *
10
10
  * @param _options - Command options (unused)
11
11
  */ export async function logoutCommand(_options = {}) {
12
- const tokenStore = getTokenStore();
12
+ const tokenStore = new TokenStore();
13
13
  const hasTokens = tokenStore.getTokens() !== null;
14
14
  if (!hasTokens) {
15
15
  p.log.warn(pc.yellow('No tokens found. Already logged out.'));