@payloadcms/figma 0.0.1-alpha.45 → 0.0.1-alpha.47

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 (66) hide show
  1. package/dist/api/figma-api.d.ts +20 -0
  2. package/dist/api/figma-api.d.ts.map +1 -1
  3. package/dist/api/figma-api.js +35 -1
  4. package/dist/api/figma-api.js.map +1 -1
  5. package/dist/commands/debug.js +1 -1
  6. package/dist/commands/debug.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +4 -4
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/db-content-api/index.js +1 -1
  11. package/dist/db-content-api/index.js.map +1 -1
  12. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +2 -17
  13. package/dist/db-content-api/utilities/meta/buildMeta.d.ts.map +1 -1
  14. package/dist/db-content-api/utilities/meta/buildMeta.js +1 -4
  15. package/dist/db-content-api/utilities/meta/buildMeta.js.map +1 -1
  16. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +2 -8
  17. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts.map +1 -1
  18. package/dist/db-content-api/utilities/meta/buildPathTypes.js +11 -41
  19. package/dist/db-content-api/utilities/meta/buildPathTypes.js.map +1 -1
  20. package/dist/db-content-api/utilities/meta/index.d.ts +5 -0
  21. package/dist/db-content-api/utilities/meta/index.d.ts.map +1 -0
  22. package/dist/db-content-api/utilities/meta/index.js +5 -0
  23. package/dist/db-content-api/utilities/meta/index.js.map +1 -0
  24. package/dist/endpoints/schema.d.ts +3 -0
  25. package/dist/endpoints/schema.d.ts.map +1 -0
  26. package/dist/endpoints/schema.js +29 -0
  27. package/dist/endpoints/schema.js.map +1 -0
  28. package/dist/exports/client.d.ts +2 -0
  29. package/dist/exports/client.d.ts.map +1 -1
  30. package/dist/exports/client.js +2 -0
  31. package/dist/exports/client.js.map +1 -1
  32. package/dist/oauth/components/FigmaAvatar/index.d.ts +4 -0
  33. package/dist/oauth/components/FigmaAvatar/index.d.ts.map +1 -0
  34. package/dist/oauth/components/FigmaAvatar/index.js +27 -0
  35. package/dist/oauth/components/FigmaAvatar/index.js.map +1 -0
  36. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  37. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +5 -0
  38. package/dist/oauth/components/FigmaAvatarCell/index.d.ts.map +1 -0
  39. package/dist/oauth/components/FigmaAvatarCell/index.js +25 -0
  40. package/dist/oauth/components/FigmaAvatarCell/index.js.map +1 -0
  41. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  42. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +9 -0
  43. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts.map +1 -0
  44. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +37 -0
  45. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js.map +1 -0
  46. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  47. package/dist/oauth/defaults.d.ts.map +1 -1
  48. package/dist/oauth/defaults.js +38 -5
  49. package/dist/oauth/defaults.js.map +1 -1
  50. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  51. package/dist/oauth/endpoints/getLoginEndpoint.js +31 -1
  52. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  53. package/dist/plugin/build-config.d.ts +3 -3
  54. package/dist/plugin/build-config.d.ts.map +1 -1
  55. package/dist/plugin/build-config.js +48 -4
  56. package/dist/plugin/build-config.js.map +1 -1
  57. package/dist/templates/.env.example +1 -1
  58. package/dist/utils/payload-config-ast.js +5 -5
  59. package/dist/utils/payload-config-ast.js.map +1 -1
  60. package/dist/utils/project.js +1 -1
  61. package/dist/utils/project.js.map +1 -1
  62. package/package.json +1 -1
  63. package/dist/db-content-api/temp-utilities/types.d.ts +0 -22
  64. package/dist/db-content-api/temp-utilities/types.d.ts.map +0 -1
  65. package/dist/db-content-api/temp-utilities/types.js +0 -15
  66. package/dist/db-content-api/temp-utilities/types.js.map +0 -1
@@ -5,6 +5,15 @@
5
5
  * Handles project token generation and other CMS-related API calls
6
6
  */
7
7
  import type { ProjectToken } from '../auth/types.js';
8
+ /**
9
+ * User info from Figma API /v1/me endpoint
10
+ */
11
+ export type FigmaUserInfo = {
12
+ email: string;
13
+ handle: string;
14
+ id: string;
15
+ img_url: string;
16
+ };
8
17
  /**
9
18
  * Error thrown when Figma API calls fail
10
19
  */
@@ -28,4 +37,15 @@ export declare class FigmaApiError extends Error {
28
37
  * @throws {FigmaApiError} If the API call fails
29
38
  */
30
39
  export declare function getProjectToken(accessToken: string, tenantId: string): Promise<ProjectToken>;
40
+ /**
41
+ * Get user info from Figma API
42
+ *
43
+ * Endpoint: GET https://api.figma.com/v1/me
44
+ * Requires OAuth access_token (not project token)
45
+ *
46
+ * @param accessToken - OAuth access token for authentication
47
+ * @returns FigmaUserInfo with user profile data
48
+ * @throws {FigmaApiError} If the API call fails
49
+ */
50
+ export declare function getUserInfo(accessToken: string): Promise<FigmaUserInfo>;
31
51
  //# sourceMappingURL=figma-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"figma-api.d.ts","sourceRoot":"","sources":["../../src/api/figma-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,kBAAkB,CAAA;AAK1E;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAG7B,UAAU,CAAC,EAAE,MAAM;IACnB,KAAK,CAAC,EAAE,KAAK;gBAFpB,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAwIvB"}
1
+ {"version":3,"file":"figma-api.d.ts","sourceRoot":"","sources":["../../src/api/figma-api.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAwB,MAAM,kBAAkB,CAAA;AAK1E;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAG7B,UAAU,CAAC,EAAE,MAAM;IACnB,KAAK,CAAC,EAAE,KAAK;gBAFpB,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAwIvB;AAgFD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqC7E"}
@@ -109,7 +109,7 @@ import * as log from '../utils/log.js';
109
109
  }
110
110
  // Provide actionable error for common cases
111
111
  if (response.status === 404) {
112
- errorMessage = `Content System ID "${tenantId}" not found. Ensure FIGMA_CONTENT_SYSTEM_ID is set to a valid content system ID in your .env file.`;
112
+ errorMessage = `Content System ID "${tenantId}" not found. Ensure FIGMA_CONTENT_API_CONTENT_SYSTEM_ID is set to a valid content system ID in your .env file.`;
113
113
  }
114
114
  throw new FigmaApiError(errorMessage, response.status);
115
115
  }
@@ -189,5 +189,39 @@ import * as log from '../utils/log.js';
189
189
  throw new FigmaApiError(`Failed to parse JWT expiry: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, error instanceof Error ? error : undefined);
190
190
  }
191
191
  }
192
+ /**
193
+ * Get user info from Figma API
194
+ *
195
+ * Endpoint: GET https://api.figma.com/v1/me
196
+ * Requires OAuth access_token (not project token)
197
+ *
198
+ * @param accessToken - OAuth access token for authentication
199
+ * @returns FigmaUserInfo with user profile data
200
+ * @throws {FigmaApiError} If the API call fails
201
+ */ export async function getUserInfo(accessToken) {
202
+ const env = getEnvironment();
203
+ const baseUrl = process.env.FIGMA_API_BASE_URL || ENV_CONFIG[env].apiBaseUrl;
204
+ const url = `${baseUrl}/v1/me`;
205
+ try {
206
+ const response = await fetch(url, {
207
+ headers: {
208
+ Authorization: `Bearer ${accessToken}`
209
+ }
210
+ });
211
+ if (!response.ok) {
212
+ throw new FigmaApiError(`Failed to get user info: ${response.status} ${response.statusText}`, response.status);
213
+ }
214
+ const data = await response.json();
215
+ if (!data.id || !data.email || typeof data.handle !== 'string') {
216
+ throw new FigmaApiError('Invalid user info response: missing required fields');
217
+ }
218
+ return data;
219
+ } catch (error) {
220
+ if (error instanceof FigmaApiError) {
221
+ throw error;
222
+ }
223
+ throw new FigmaApiError(`Failed to get user info: ${error instanceof Error ? error.message : 'Unknown error'}`, undefined, error instanceof Error ? error : undefined);
224
+ }
225
+ }
192
226
 
193
227
  //# sourceMappingURL=figma-api.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/figma-api.ts"],"sourcesContent":["/**\n * Figma API Client\n *\n * Client for Figma REST API (Pixie) endpoints\n * Handles project token generation and other CMS-related API calls\n */\n\nimport type { ProjectToken, ProjectTokenResponse } from '../auth/types.js'\n\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\n/**\n * Error thrown when Figma API calls fail\n */\nexport class FigmaApiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public cause?: Error,\n ) {\n super(message)\n this.name = 'FigmaApiError'\n }\n}\n\n/**\n * Get a project token (JWT) for a specific tenant/CMS\n *\n * This token is used by local Payload instances to authenticate\n * requests to the Content API. The token contains the CMS ID and\n * user identifying information in its claims.\n *\n * Endpoint: GET https://api.figma.com/v1/cms/:id/token/\n *\n * @param accessToken - OAuth access token for authentication\n * @param tenantId - The tenant/CMS ID\n * @returns ProjectToken with JWT and expiry information\n * @throws {FigmaApiError} If the API call fails\n */\nexport async function getProjectToken(\n accessToken: string,\n tenantId: string,\n): Promise<ProjectToken> {\n // Priority 1: Check for direct token value from environment\n const envTokenValue = process.env.FIGMA_MOCK_PROJECT_TOKEN_VALUE\n if (envTokenValue) {\n log.debug('Using direct project token from FIGMA_MOCK_PROJECT_TOKEN_VALUE')\n try {\n // Parse JWT payload to extract claims\n const parts = envTokenValue.split('.')\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format: must have 3 parts (header.payload.signature)')\n }\n\n const payload = parts[1]\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const paddedBase64 = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n const decodedPayload = JSON.parse(Buffer.from(paddedBase64, 'base64').toString('utf-8')) as {\n aud?: string\n exp?: number\n }\n\n if (!decodedPayload.exp || typeof decodedPayload.exp !== 'number') {\n throw new Error('JWT payload missing exp claim')\n }\n\n // Extract tenant ID from aud claim (use parameter as fallback)\n const extractedTenantId = decodedPayload.aud || tenantId\n\n return {\n expiresAt: decodedPayload.exp * 1000, // Convert from seconds to milliseconds\n tenantId: extractedTenantId,\n token: envTokenValue,\n }\n } catch (error) {\n throw new FigmaApiError(\n `Invalid JWT token in FIGMA_MOCK_PROJECT_TOKEN_VALUE: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n // Priority 2: Check if project token API should be mocked\n // Default to false (use real API)\n const shouldMock = process.env.FIGMA_MOCK_PROJECT_TOKEN === 'true'\n\n try {\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate a mock JWT token for testing\n log.debug(\n 'Using mock project token API for getProjectToken (FIGMA_MOCK_PROJECT_TOKEN = \"true\")',\n )\n const mockToken = createMockJWT(tenantId, 25) // 25 minutes expiry\n\n // Mock response data\n const data: ProjectTokenResponse = {\n meta: {\n token: mockToken,\n },\n }\n\n if (!data.meta?.token) {\n throw new FigmaApiError('Invalid response: missing token in meta')\n }\n\n // Parse the JWT to extract expiry (it's in the payload)\n const expiresAt = parseJwtExpiry(data.meta.token)\n\n return {\n expiresAt,\n tenantId,\n token: data.meta.token,\n }\n }\n\n // REAL API IMPLEMENTATION\n const env = getEnvironment()\n const baseUrl = process.env.FIGMA_API_BASE_URL || ENV_CONFIG[env].apiBaseUrl\n const url = `${baseUrl}/v1/cms/${tenantId}/token/`\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n // Handle error responses\n let errorMessage = `Failed to get project token: ${response.status} ${response.statusText}`\n\n try {\n const errorBody = await response.json()\n // Only use string error messages (API may return { error: true })\n if (typeof errorBody.message === 'string') {\n errorMessage = errorBody.message\n } else if (typeof errorBody.error === 'string') {\n errorMessage = errorBody.error\n }\n } catch {\n // Ignore JSON parse errors for error body\n }\n\n // Provide actionable error for common cases\n if (response.status === 404) {\n errorMessage = `Content System ID \"${tenantId}\" not found. Ensure FIGMA_CONTENT_SYSTEM_ID is set to a valid content system ID in your .env file.`\n }\n\n throw new FigmaApiError(errorMessage, response.status)\n }\n\n const data: ProjectTokenResponse = await response.json()\n\n if (!data.meta?.token) {\n throw new FigmaApiError('Invalid response: missing token in meta')\n }\n\n // Parse the JWT to extract expiry (it's in the payload)\n const expiresAt = parseJwtExpiry(data.meta.token)\n\n return {\n expiresAt,\n tenantId,\n token: data.meta.token,\n }\n } catch (error) {\n if (error instanceof FigmaApiError) {\n throw error\n }\n\n // Handle network errors and other unexpected errors\n throw new FigmaApiError(\n `Failed to get project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n}\n\n/**\n * Create a mock JWT token for testing\n * TODO: Remove this when real API is available\n */\nfunction createMockJWT(tenantId: string, expiresInMinutes: number): string {\n const header = {\n alg: 'RS256',\n typ: 'JWT',\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const exp = now + expiresInMinutes * 60 // Expiry in seconds\n\n const payload = {\n aud: tenantId, // Audience claim contains the CMS ID\n email: 'developer@example.com',\n exp,\n iat: now,\n sub: 'user123',\n }\n\n // Base64url encode\n const encodeBase64Url = (obj: object): string => {\n return Buffer.from(JSON.stringify(obj))\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n }\n\n const headerEncoded = encodeBase64Url(header)\n const payloadEncoded = encodeBase64Url(payload)\n const signature = 'mock_signature_' + Math.random().toString(36).substring(2, 15)\n\n return `${headerEncoded}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse JWT expiry from token\n * JWTs contain an 'exp' claim in the payload (second part)\n *\n * @param token - JWT token string\n * @returns Unix timestamp in milliseconds when token expires\n * @throws {FigmaApiError} If JWT cannot be parsed\n */\nfunction parseJwtExpiry(token: string): number {\n try {\n // JWT format: header.payload.signature\n const parts = token.split('.')\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format')\n }\n\n // Decode the payload (second part)\n const payload = parts[1]\n // Use atob for base64url decoding (handle padding and URL-safe characters)\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const paddedBase64 = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n\n const decodedPayload = JSON.parse(Buffer.from(paddedBase64, 'base64').toString('utf-8')) as {\n exp?: number\n }\n\n if (!decodedPayload.exp || typeof decodedPayload.exp !== 'number') {\n throw new Error('JWT payload missing exp claim')\n }\n\n // JWT exp claim is in seconds, convert to milliseconds\n return decodedPayload.exp * 1000\n } catch (error) {\n throw new FigmaApiError(\n `Failed to parse JWT expiry: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n}\n"],"names":["ENV_CONFIG","getEnvironment","log","FigmaApiError","Error","message","statusCode","cause","name","getProjectToken","accessToken","tenantId","envTokenValue","process","env","FIGMA_MOCK_PROJECT_TOKEN_VALUE","debug","parts","split","length","payload","base64","replace","paddedBase64","padEnd","decodedPayload","JSON","parse","Buffer","from","toString","exp","extractedTenantId","aud","expiresAt","token","error","undefined","shouldMock","FIGMA_MOCK_PROJECT_TOKEN","mockToken","createMockJWT","data","meta","parseJwtExpiry","baseUrl","FIGMA_API_BASE_URL","apiBaseUrl","url","response","fetch","headers","Authorization","method","ok","errorMessage","status","statusText","errorBody","json","expiresInMinutes","header","alg","typ","now","Math","floor","Date","email","iat","sub","encodeBase64Url","obj","stringify","headerEncoded","payloadEncoded","signature","random","substring"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/api/figma-api.ts"],"sourcesContent":["/**\n * Figma API Client\n *\n * Client for Figma REST API (Pixie) endpoints\n * Handles project token generation and other CMS-related API calls\n */\n\nimport type { ProjectToken, ProjectTokenResponse } from '../auth/types.js'\n\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\n/**\n * User info from Figma API /v1/me endpoint\n */\nexport type FigmaUserInfo = {\n email: string\n handle: string\n id: string\n img_url: string\n}\n\n/**\n * Error thrown when Figma API calls fail\n */\nexport class FigmaApiError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public cause?: Error,\n ) {\n super(message)\n this.name = 'FigmaApiError'\n }\n}\n\n/**\n * Get a project token (JWT) for a specific tenant/CMS\n *\n * This token is used by local Payload instances to authenticate\n * requests to the Content API. The token contains the CMS ID and\n * user identifying information in its claims.\n *\n * Endpoint: GET https://api.figma.com/v1/cms/:id/token/\n *\n * @param accessToken - OAuth access token for authentication\n * @param tenantId - The tenant/CMS ID\n * @returns ProjectToken with JWT and expiry information\n * @throws {FigmaApiError} If the API call fails\n */\nexport async function getProjectToken(\n accessToken: string,\n tenantId: string,\n): Promise<ProjectToken> {\n // Priority 1: Check for direct token value from environment\n const envTokenValue = process.env.FIGMA_MOCK_PROJECT_TOKEN_VALUE\n if (envTokenValue) {\n log.debug('Using direct project token from FIGMA_MOCK_PROJECT_TOKEN_VALUE')\n try {\n // Parse JWT payload to extract claims\n const parts = envTokenValue.split('.')\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format: must have 3 parts (header.payload.signature)')\n }\n\n const payload = parts[1]\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const paddedBase64 = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n const decodedPayload = JSON.parse(Buffer.from(paddedBase64, 'base64').toString('utf-8')) as {\n aud?: string\n exp?: number\n }\n\n if (!decodedPayload.exp || typeof decodedPayload.exp !== 'number') {\n throw new Error('JWT payload missing exp claim')\n }\n\n // Extract tenant ID from aud claim (use parameter as fallback)\n const extractedTenantId = decodedPayload.aud || tenantId\n\n return {\n expiresAt: decodedPayload.exp * 1000, // Convert from seconds to milliseconds\n tenantId: extractedTenantId,\n token: envTokenValue,\n }\n } catch (error) {\n throw new FigmaApiError(\n `Invalid JWT token in FIGMA_MOCK_PROJECT_TOKEN_VALUE: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n // Priority 2: Check if project token API should be mocked\n // Default to false (use real API)\n const shouldMock = process.env.FIGMA_MOCK_PROJECT_TOKEN === 'true'\n\n try {\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate a mock JWT token for testing\n log.debug(\n 'Using mock project token API for getProjectToken (FIGMA_MOCK_PROJECT_TOKEN = \"true\")',\n )\n const mockToken = createMockJWT(tenantId, 25) // 25 minutes expiry\n\n // Mock response data\n const data: ProjectTokenResponse = {\n meta: {\n token: mockToken,\n },\n }\n\n if (!data.meta?.token) {\n throw new FigmaApiError('Invalid response: missing token in meta')\n }\n\n // Parse the JWT to extract expiry (it's in the payload)\n const expiresAt = parseJwtExpiry(data.meta.token)\n\n return {\n expiresAt,\n tenantId,\n token: data.meta.token,\n }\n }\n\n // REAL API IMPLEMENTATION\n const env = getEnvironment()\n const baseUrl = process.env.FIGMA_API_BASE_URL || ENV_CONFIG[env].apiBaseUrl\n const url = `${baseUrl}/v1/cms/${tenantId}/token/`\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n // Handle error responses\n let errorMessage = `Failed to get project token: ${response.status} ${response.statusText}`\n\n try {\n const errorBody = await response.json()\n // Only use string error messages (API may return { error: true })\n if (typeof errorBody.message === 'string') {\n errorMessage = errorBody.message\n } else if (typeof errorBody.error === 'string') {\n errorMessage = errorBody.error\n }\n } catch {\n // Ignore JSON parse errors for error body\n }\n\n // Provide actionable error for common cases\n if (response.status === 404) {\n errorMessage = `Content System ID \"${tenantId}\" not found. Ensure FIGMA_CONTENT_API_CONTENT_SYSTEM_ID is set to a valid content system ID in your .env file.`\n }\n\n throw new FigmaApiError(errorMessage, response.status)\n }\n\n const data: ProjectTokenResponse = await response.json()\n\n if (!data.meta?.token) {\n throw new FigmaApiError('Invalid response: missing token in meta')\n }\n\n // Parse the JWT to extract expiry (it's in the payload)\n const expiresAt = parseJwtExpiry(data.meta.token)\n\n return {\n expiresAt,\n tenantId,\n token: data.meta.token,\n }\n } catch (error) {\n if (error instanceof FigmaApiError) {\n throw error\n }\n\n // Handle network errors and other unexpected errors\n throw new FigmaApiError(\n `Failed to get project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n}\n\n/**\n * Create a mock JWT token for testing\n * TODO: Remove this when real API is available\n */\nfunction createMockJWT(tenantId: string, expiresInMinutes: number): string {\n const header = {\n alg: 'RS256',\n typ: 'JWT',\n }\n\n const now = Math.floor(Date.now() / 1000) // Current time in seconds\n const exp = now + expiresInMinutes * 60 // Expiry in seconds\n\n const payload = {\n aud: tenantId, // Audience claim contains the CMS ID\n email: 'developer@example.com',\n exp,\n iat: now,\n sub: 'user123',\n }\n\n // Base64url encode\n const encodeBase64Url = (obj: object): string => {\n return Buffer.from(JSON.stringify(obj))\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '')\n }\n\n const headerEncoded = encodeBase64Url(header)\n const payloadEncoded = encodeBase64Url(payload)\n const signature = 'mock_signature_' + Math.random().toString(36).substring(2, 15)\n\n return `${headerEncoded}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse JWT expiry from token\n * JWTs contain an 'exp' claim in the payload (second part)\n *\n * @param token - JWT token string\n * @returns Unix timestamp in milliseconds when token expires\n * @throws {FigmaApiError} If JWT cannot be parsed\n */\nfunction parseJwtExpiry(token: string): number {\n try {\n // JWT format: header.payload.signature\n const parts = token.split('.')\n if (parts.length !== 3) {\n throw new Error('Invalid JWT format')\n }\n\n // Decode the payload (second part)\n const payload = parts[1]\n // Use atob for base64url decoding (handle padding and URL-safe characters)\n const base64 = payload.replace(/-/g, '+').replace(/_/g, '/')\n const paddedBase64 = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n\n const decodedPayload = JSON.parse(Buffer.from(paddedBase64, 'base64').toString('utf-8')) as {\n exp?: number\n }\n\n if (!decodedPayload.exp || typeof decodedPayload.exp !== 'number') {\n throw new Error('JWT payload missing exp claim')\n }\n\n // JWT exp claim is in seconds, convert to milliseconds\n return decodedPayload.exp * 1000\n } catch (error) {\n throw new FigmaApiError(\n `Failed to parse JWT expiry: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n}\n\n/**\n * Get user info from Figma API\n *\n * Endpoint: GET https://api.figma.com/v1/me\n * Requires OAuth access_token (not project token)\n *\n * @param accessToken - OAuth access token for authentication\n * @returns FigmaUserInfo with user profile data\n * @throws {FigmaApiError} If the API call fails\n */\nexport async function getUserInfo(accessToken: string): Promise<FigmaUserInfo> {\n const env = getEnvironment()\n const baseUrl = process.env.FIGMA_API_BASE_URL || ENV_CONFIG[env].apiBaseUrl\n const url = `${baseUrl}/v1/me`\n\n try {\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n })\n\n if (!response.ok) {\n throw new FigmaApiError(\n `Failed to get user info: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n const data = await response.json()\n\n if (!data.id || !data.email || typeof data.handle !== 'string') {\n throw new FigmaApiError('Invalid user info response: missing required fields')\n }\n\n return data as FigmaUserInfo\n } catch (error) {\n if (error instanceof FigmaApiError) {\n throw error\n }\n\n throw new FigmaApiError(\n `Failed to get user info: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n error instanceof Error ? error : undefined,\n )\n }\n}\n"],"names":["ENV_CONFIG","getEnvironment","log","FigmaApiError","Error","message","statusCode","cause","name","getProjectToken","accessToken","tenantId","envTokenValue","process","env","FIGMA_MOCK_PROJECT_TOKEN_VALUE","debug","parts","split","length","payload","base64","replace","paddedBase64","padEnd","decodedPayload","JSON","parse","Buffer","from","toString","exp","extractedTenantId","aud","expiresAt","token","error","undefined","shouldMock","FIGMA_MOCK_PROJECT_TOKEN","mockToken","createMockJWT","data","meta","parseJwtExpiry","baseUrl","FIGMA_API_BASE_URL","apiBaseUrl","url","response","fetch","headers","Authorization","method","ok","errorMessage","status","statusText","errorBody","json","expiresInMinutes","header","alg","typ","now","Math","floor","Date","email","iat","sub","encodeBase64Url","obj","stringify","headerEncoded","payloadEncoded","signature","random","substring","getUserInfo","id","handle"],"mappings":"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"}
@@ -53,7 +53,7 @@ function appendAuthSection(lines, tokenStore, cwd) {
53
53
  lines.push('');
54
54
  }
55
55
  function appendProjectSection(lines, tokenStore, cwd) {
56
- const contentSystemId = getEnvVarSync(cwd, 'FIGMA_CONTENT_SYSTEM_ID');
56
+ const contentSystemId = getEnvVarSync(cwd, 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID');
57
57
  const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID');
58
58
  const oauthClientId = getEnvVarSync(cwd, 'FIGMA_OAUTH_CLIENT_ID');
59
59
  lines.push('Project:');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import fsSync from 'node:fs'\nimport { createRequire } from 'node:module'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport type { TokenStore } from '../auth/token-store.js'\nimport type { Environment } from '../constants.js'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { getEnvVarSync } from '../utils/env-management.js'\nimport { maskToken } from '../utils/token-display.js'\nimport { getOwnVersion } from '../utils/version-check.js'\n\n/**\n * Handle the `@payloadcms/figma debug` command\n *\n * Outputs environment, auth, project, and package info for debugging.\n * All data is local — no network calls are made.\n */\nexport async function debugCommand(): Promise<void> {\n const env = getEnvironment()\n const tokenStore = getTokenStore(env)\n const cwd = process.cwd()\n\n const lines: string[] = ['Debug Info:', '']\n\n appendSystemSection(lines, env)\n appendAuthSection(lines, tokenStore, cwd)\n appendProjectSection(lines, tokenStore, cwd)\n await appendPackagesSection(lines)\n\n // eslint-disable-next-line no-console\n console.log(lines.join('\\n'))\n}\n\nfunction appendSystemSection(lines: string[], env: Environment): void {\n lines.push(`Environment: ${env}`)\n lines.push(`Node: ${process.version}`)\n lines.push(`OS: ${os.platform()} ${os.arch()}`)\n lines.push('')\n}\n\nfunction appendAuthSection(lines: string[], tokenStore: TokenStore, cwd: string): void {\n const tokens = tokenStore.getTokens()\n\n lines.push('Auth:')\n\n if (!tokens) {\n lines.push(' Status: Not authenticated')\n lines.push('')\n return\n }\n\n const isValid = tokenStore.hasValidTokens()\n lines.push(` Status: ${isValid ? 'Authenticated' : 'Token expired'}`)\n\n const email = getEmailFromClaims(tokenStore, cwd)\n if (email) {\n lines.push(` Email: ${email}`)\n } else if (tokens.userId) {\n lines.push(` User ID: ${tokens.userId}`)\n }\n\n lines.push(` Token Expires: ${formatExpiryTime(tokens.expiresAt)}`)\n lines.push('')\n}\n\nfunction appendProjectSection(lines: string[], tokenStore: TokenStore, cwd: string): void {\n const contentSystemId = getEnvVarSync(cwd, 'FIGMA_CONTENT_SYSTEM_ID')\n const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID')\n const oauthClientId = getEnvVarSync(cwd, 'FIGMA_OAUTH_CLIENT_ID')\n\n lines.push('Project:')\n\n if (!contentSystemId && !tenantId && !oauthClientId) {\n lines.push(\" Not initialized (run 'init' first)\")\n lines.push('')\n return\n }\n\n if (contentSystemId) {\n lines.push(` Content System ID: ${contentSystemId}`)\n }\n if (tenantId) {\n lines.push(` Tenant ID: ${tenantId}`)\n }\n if (oauthClientId) {\n lines.push(` OAuth Client ID: ${maskToken(oauthClientId)}`)\n }\n if (contentSystemId) {\n const projectToken = tokenStore.getProjectToken(contentSystemId)\n if (projectToken) {\n lines.push(` Project Token: ${formatExpiryTime(projectToken.expiresAt)}`)\n }\n }\n lines.push('')\n}\n\nasync function appendPackagesSection(lines: string[]): Promise<void> {\n lines.push('Packages:')\n\n const cliVersion = await getOwnVersion()\n lines.push(` @payloadcms/figma: ${cliVersion}`)\n\n const payloadVersion = getPayloadVersion()\n lines.push(` payload: ${payloadVersion}`)\n}\n\n/**\n * Try env-based tenant ID first, then iterate all stored project tokens.\n */\nfunction getEmailFromClaims(tokenStore: TokenStore, cwd: string): null | string {\n const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID')\n if (tenantId) {\n const email = tokenStore.getProjectTokenClaims(tenantId)?.email\n if (email) {\n return email\n }\n }\n\n for (const id of tokenStore.getAllProjectTokenTenantIds()) {\n const email = tokenStore.getProjectTokenClaims(id)?.email\n if (email) {\n return email\n }\n }\n\n return null\n}\n\nfunction getPayloadVersion(): string {\n try {\n const require = createRequire(path.join(process.cwd(), 'noop.js'))\n const resolved = require.resolve('payload')\n const packageJsonPath = findPackageJson(path.dirname(resolved))\n if (!packageJsonPath) {\n return 'not found'\n }\n const content = fsSync.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(content).version\n } catch {\n return 'not found'\n }\n}\n\nfunction findPackageJson(dir: string): null | string {\n const { root } = path.parse(dir)\n while (dir !== root) {\n const candidate = path.join(dir, 'package.json')\n if (fsSync.existsSync(candidate)) {\n return candidate\n }\n dir = path.dirname(dir)\n }\n return null\n}\n\n/**\n * Format expiry timestamp as ISO string with relative time\n * e.g. \"2026-02-11T10:30:00.000Z (in 23h 15m)\" or \"2026-02-10T08:00:00.000Z (expired 2h ago)\"\n */\nfunction formatExpiryTime(expiresAt: number): string {\n const iso = new Date(expiresAt).toISOString()\n const diff = expiresAt - Date.now()\n\n if (diff < 0) {\n return `${iso} (expired ${formatDuration(Math.abs(diff))} ago)`\n }\n return `${iso} (in ${formatDuration(diff)})`\n}\n\nfunction formatDuration(ms: number): string {\n const minutes = Math.floor(ms / 60000)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`\n }\n return `${minutes}m`\n}\n"],"names":["fsSync","createRequire","os","path","getTokenStore","getEnvironment","getEnvVarSync","maskToken","getOwnVersion","debugCommand","env","tokenStore","cwd","process","lines","appendSystemSection","appendAuthSection","appendProjectSection","appendPackagesSection","console","log","join","push","version","platform","arch","tokens","getTokens","isValid","hasValidTokens","email","getEmailFromClaims","userId","formatExpiryTime","expiresAt","contentSystemId","tenantId","oauthClientId","projectToken","getProjectToken","cliVersion","payloadVersion","getPayloadVersion","getProjectTokenClaims","id","getAllProjectTokenTenantIds","require","resolved","resolve","packageJsonPath","findPackageJson","dirname","content","readFileSync","JSON","parse","dir","root","candidate","existsSync","iso","Date","toISOString","diff","now","formatDuration","Math","abs","ms","minutes","floor","hours","days"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/commands/debug.ts"],"sourcesContent":["import fsSync from 'node:fs'\nimport { createRequire } from 'node:module'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport type { TokenStore } from '../auth/token-store.js'\nimport type { Environment } from '../constants.js'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { getEnvVarSync } from '../utils/env-management.js'\nimport { maskToken } from '../utils/token-display.js'\nimport { getOwnVersion } from '../utils/version-check.js'\n\n/**\n * Handle the `@payloadcms/figma debug` command\n *\n * Outputs environment, auth, project, and package info for debugging.\n * All data is local — no network calls are made.\n */\nexport async function debugCommand(): Promise<void> {\n const env = getEnvironment()\n const tokenStore = getTokenStore(env)\n const cwd = process.cwd()\n\n const lines: string[] = ['Debug Info:', '']\n\n appendSystemSection(lines, env)\n appendAuthSection(lines, tokenStore, cwd)\n appendProjectSection(lines, tokenStore, cwd)\n await appendPackagesSection(lines)\n\n // eslint-disable-next-line no-console\n console.log(lines.join('\\n'))\n}\n\nfunction appendSystemSection(lines: string[], env: Environment): void {\n lines.push(`Environment: ${env}`)\n lines.push(`Node: ${process.version}`)\n lines.push(`OS: ${os.platform()} ${os.arch()}`)\n lines.push('')\n}\n\nfunction appendAuthSection(lines: string[], tokenStore: TokenStore, cwd: string): void {\n const tokens = tokenStore.getTokens()\n\n lines.push('Auth:')\n\n if (!tokens) {\n lines.push(' Status: Not authenticated')\n lines.push('')\n return\n }\n\n const isValid = tokenStore.hasValidTokens()\n lines.push(` Status: ${isValid ? 'Authenticated' : 'Token expired'}`)\n\n const email = getEmailFromClaims(tokenStore, cwd)\n if (email) {\n lines.push(` Email: ${email}`)\n } else if (tokens.userId) {\n lines.push(` User ID: ${tokens.userId}`)\n }\n\n lines.push(` Token Expires: ${formatExpiryTime(tokens.expiresAt)}`)\n lines.push('')\n}\n\nfunction appendProjectSection(lines: string[], tokenStore: TokenStore, cwd: string): void {\n const contentSystemId = getEnvVarSync(cwd, 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID')\n const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID')\n const oauthClientId = getEnvVarSync(cwd, 'FIGMA_OAUTH_CLIENT_ID')\n\n lines.push('Project:')\n\n if (!contentSystemId && !tenantId && !oauthClientId) {\n lines.push(\" Not initialized (run 'init' first)\")\n lines.push('')\n return\n }\n\n if (contentSystemId) {\n lines.push(` Content System ID: ${contentSystemId}`)\n }\n if (tenantId) {\n lines.push(` Tenant ID: ${tenantId}`)\n }\n if (oauthClientId) {\n lines.push(` OAuth Client ID: ${maskToken(oauthClientId)}`)\n }\n if (contentSystemId) {\n const projectToken = tokenStore.getProjectToken(contentSystemId)\n if (projectToken) {\n lines.push(` Project Token: ${formatExpiryTime(projectToken.expiresAt)}`)\n }\n }\n lines.push('')\n}\n\nasync function appendPackagesSection(lines: string[]): Promise<void> {\n lines.push('Packages:')\n\n const cliVersion = await getOwnVersion()\n lines.push(` @payloadcms/figma: ${cliVersion}`)\n\n const payloadVersion = getPayloadVersion()\n lines.push(` payload: ${payloadVersion}`)\n}\n\n/**\n * Try env-based tenant ID first, then iterate all stored project tokens.\n */\nfunction getEmailFromClaims(tokenStore: TokenStore, cwd: string): null | string {\n const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID')\n if (tenantId) {\n const email = tokenStore.getProjectTokenClaims(tenantId)?.email\n if (email) {\n return email\n }\n }\n\n for (const id of tokenStore.getAllProjectTokenTenantIds()) {\n const email = tokenStore.getProjectTokenClaims(id)?.email\n if (email) {\n return email\n }\n }\n\n return null\n}\n\nfunction getPayloadVersion(): string {\n try {\n const require = createRequire(path.join(process.cwd(), 'noop.js'))\n const resolved = require.resolve('payload')\n const packageJsonPath = findPackageJson(path.dirname(resolved))\n if (!packageJsonPath) {\n return 'not found'\n }\n const content = fsSync.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(content).version\n } catch {\n return 'not found'\n }\n}\n\nfunction findPackageJson(dir: string): null | string {\n const { root } = path.parse(dir)\n while (dir !== root) {\n const candidate = path.join(dir, 'package.json')\n if (fsSync.existsSync(candidate)) {\n return candidate\n }\n dir = path.dirname(dir)\n }\n return null\n}\n\n/**\n * Format expiry timestamp as ISO string with relative time\n * e.g. \"2026-02-11T10:30:00.000Z (in 23h 15m)\" or \"2026-02-10T08:00:00.000Z (expired 2h ago)\"\n */\nfunction formatExpiryTime(expiresAt: number): string {\n const iso = new Date(expiresAt).toISOString()\n const diff = expiresAt - Date.now()\n\n if (diff < 0) {\n return `${iso} (expired ${formatDuration(Math.abs(diff))} ago)`\n }\n return `${iso} (in ${formatDuration(diff)})`\n}\n\nfunction formatDuration(ms: number): string {\n const minutes = Math.floor(ms / 60000)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n if (days > 0) {\n return `${days}d ${hours % 24}h`\n }\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`\n }\n return `${minutes}m`\n}\n"],"names":["fsSync","createRequire","os","path","getTokenStore","getEnvironment","getEnvVarSync","maskToken","getOwnVersion","debugCommand","env","tokenStore","cwd","process","lines","appendSystemSection","appendAuthSection","appendProjectSection","appendPackagesSection","console","log","join","push","version","platform","arch","tokens","getTokens","isValid","hasValidTokens","email","getEmailFromClaims","userId","formatExpiryTime","expiresAt","contentSystemId","tenantId","oauthClientId","projectToken","getProjectToken","cliVersion","payloadVersion","getPayloadVersion","getProjectTokenClaims","id","getAllProjectTokenTenantIds","require","resolved","resolve","packageJsonPath","findPackageJson","dirname","content","readFileSync","JSON","parse","dir","root","candidate","existsSync","iso","Date","toISOString","diff","now","formatDuration","Math","abs","ms","minutes","floor","hours","days"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwCA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAoED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuX5E"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwCA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAoED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2X5E"}
@@ -199,8 +199,8 @@ import { loginCommand } from './login.js';
199
199
  }
200
200
  // Write environment variables to .env file
201
201
  try {
202
- await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
203
- log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
202
+ await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID', contentSystemId);
203
+ log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`);
204
204
  const env = getEnvironment();
205
205
  if (env !== 'production') {
206
206
  await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env);
@@ -328,8 +328,8 @@ import { loginCommand } from './login.js';
328
328
  }
329
329
  // Write environment variables to .env file
330
330
  try {
331
- await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
332
- log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
331
+ await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID', contentSystemId);
332
+ log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`);
333
333
  const env = getEnvironment();
334
334
  if (env !== 'production') {
335
335
  await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env);
@@ -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 { getEnvironment } from '../constants.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 detectPackageManagerFromEnvironment,\n getRunCommand,\n resolvePackageManager,\n} from '../utils/package-manager.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(getEnvironment())\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 const packageManager = await resolvePackageManager(process.cwd())\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(), packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(process.cwd(), packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\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 const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\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 dev run\n await runScript(process.cwd(), 'generate:importmap', packageManager)\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), packageManager)\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: \\`${getRunCommand(packageManager)} dev\\``].filter(\n Boolean,\n )\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 const packageManager = detectPackageManagerFromEnvironment()\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, packageManager)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, packageManager)\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, packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\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 const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\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 dev run\n await runScript(fullPath, 'generate:importmap', packageManager)\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 `${getRunCommand(packageManager)} 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","getEnvironment","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","detectPackageManagerFromEnvironment","getRunCommand","resolvePackageManager","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","packageManager","cwd","hasPayload","payloadVersion","success","hasDeps","shouldInstall","confirm","initialValue","isCancel","modResult","modified","changes","length","forEach","change","warnings","env","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 { 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 { getEnvironment } from '../constants.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 detectPackageManagerFromEnvironment,\n getRunCommand,\n resolvePackageManager,\n} from '../utils/package-manager.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(getEnvironment())\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 const packageManager = await resolvePackageManager(process.cwd())\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(), packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(process.cwd(), packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\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(\n process.cwd(),\n 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID',\n contentSystemId,\n )\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\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 dev run\n await runScript(process.cwd(), 'generate:importmap', packageManager)\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), packageManager)\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: \\`${getRunCommand(packageManager)} dev\\``].filter(\n Boolean,\n )\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 const packageManager = detectPackageManagerFromEnvironment()\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, packageManager)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, packageManager)\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, packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\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_API_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\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 dev run\n await runScript(fullPath, 'generate:importmap', packageManager)\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 `${getRunCommand(packageManager)} 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","getEnvironment","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","detectPackageManagerFromEnvironment","getRunCommand","resolvePackageManager","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","packageManager","cwd","hasPayload","payloadVersion","success","hasDeps","shouldInstall","confirm","initialValue","isCancel","modResult","modified","changes","length","forEach","change","warnings","env","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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"}
@@ -8,7 +8,7 @@ import { createAuthMiddleware, createErrorMiddleware } from './utilities/auth.js
8
8
  import { dataToContentAPI } from './utilities/data/index.js';
9
9
  import { convertPayloadJoinsToContentAPI } from './utilities/joins.js';
10
10
  import { addFallbackLocale } from './utilities/locale/index.js';
11
- import { buildMeta } from './utilities/meta/buildMeta.js';
11
+ import { buildMeta } from './utilities/meta/index.js';
12
12
  import { convertPayloadWhereToContentAPI } from './utilities/where.js';
13
13
  async function syncCollections() {
14
14
  let existingIds;