@payloadcms/figma 0.0.1-alpha.44 → 0.0.1-alpha.46

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 (108) hide show
  1. package/dist/api/control-plane.d.ts.map +1 -1
  2. package/dist/api/control-plane.js +90 -54
  3. package/dist/api/control-plane.js.map +1 -1
  4. package/dist/api/figma-api.d.ts +20 -0
  5. package/dist/api/figma-api.d.ts.map +1 -1
  6. package/dist/api/figma-api.js +34 -0
  7. package/dist/api/figma-api.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +6 -0
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/debug.d.ts +8 -0
  12. package/dist/commands/debug.d.ts.map +1 -0
  13. package/dist/commands/debug.js +156 -0
  14. package/dist/commands/debug.js.map +1 -0
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +17 -14
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/db-content-api/index.d.ts.map +1 -1
  19. package/dist/db-content-api/index.js +26 -7
  20. package/dist/db-content-api/index.js.map +1 -1
  21. package/dist/db-content-api/temp-utilities/types.d.ts +22 -0
  22. package/dist/db-content-api/temp-utilities/types.d.ts.map +1 -0
  23. package/dist/db-content-api/temp-utilities/types.js +15 -0
  24. package/dist/db-content-api/temp-utilities/types.js.map +1 -0
  25. package/dist/db-content-api/utilities/data/index.d.ts +14 -4
  26. package/dist/db-content-api/utilities/data/index.d.ts.map +1 -1
  27. package/dist/db-content-api/utilities/data/index.js +15 -8
  28. package/dist/db-content-api/utilities/data/index.js.map +1 -1
  29. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +23 -0
  30. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts.map +1 -0
  31. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +42 -0
  32. package/dist/db-content-api/utilities/data/transformPublishedLocale.js.map +1 -0
  33. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts.map +1 -1
  34. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +11 -0
  35. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js.map +1 -1
  36. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +17 -2
  37. package/dist/db-content-api/utilities/meta/buildMeta.d.ts.map +1 -1
  38. package/dist/db-content-api/utilities/meta/buildMeta.js +4 -1
  39. package/dist/db-content-api/utilities/meta/buildMeta.js.map +1 -1
  40. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +8 -2
  41. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts.map +1 -1
  42. package/dist/db-content-api/utilities/meta/buildPathTypes.js +41 -11
  43. package/dist/db-content-api/utilities/meta/buildPathTypes.js.map +1 -1
  44. package/dist/db-content-api/utilities/where.d.ts +8 -0
  45. package/dist/db-content-api/utilities/where.d.ts.map +1 -1
  46. package/dist/db-content-api/utilities/where.js +6 -0
  47. package/dist/db-content-api/utilities/where.js.map +1 -1
  48. package/dist/exports/client.d.ts +2 -0
  49. package/dist/exports/client.d.ts.map +1 -1
  50. package/dist/exports/client.js +2 -0
  51. package/dist/exports/client.js.map +1 -1
  52. package/dist/oauth/components/FigmaAvatar/index.d.ts +4 -0
  53. package/dist/oauth/components/FigmaAvatar/index.d.ts.map +1 -0
  54. package/dist/oauth/components/FigmaAvatar/index.js +27 -0
  55. package/dist/oauth/components/FigmaAvatar/index.js.map +1 -0
  56. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  57. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +5 -0
  58. package/dist/oauth/components/FigmaAvatarCell/index.d.ts.map +1 -0
  59. package/dist/oauth/components/FigmaAvatarCell/index.js +25 -0
  60. package/dist/oauth/components/FigmaAvatarCell/index.js.map +1 -0
  61. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  62. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +9 -0
  63. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts.map +1 -0
  64. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +37 -0
  65. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js.map +1 -0
  66. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  67. package/dist/oauth/defaults.d.ts.map +1 -1
  68. package/dist/oauth/defaults.js +38 -5
  69. package/dist/oauth/defaults.js.map +1 -1
  70. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  71. package/dist/oauth/endpoints/getLoginEndpoint.js +49 -14
  72. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  73. package/dist/plugin/build-config.d.ts.map +1 -1
  74. package/dist/plugin/build-config.js +44 -2
  75. package/dist/plugin/build-config.js.map +1 -1
  76. package/dist/templates/README.md +1 -1
  77. package/dist/types/config.d.ts +2 -1
  78. package/dist/types/config.d.ts.map +1 -1
  79. package/dist/types/config.js +0 -2
  80. package/dist/types/config.js.map +1 -1
  81. package/dist/types.d.ts +0 -1
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/types.js.map +1 -1
  84. package/dist/utils/lambda-config.d.ts +1 -1
  85. package/dist/utils/lambda-config.d.ts.map +1 -1
  86. package/dist/utils/lambda-config.js +2 -2
  87. package/dist/utils/lambda-config.js.map +1 -1
  88. package/dist/utils/messages.d.ts +1 -1
  89. package/dist/utils/messages.d.ts.map +1 -1
  90. package/dist/utils/messages.js +1 -0
  91. package/dist/utils/messages.js.map +1 -1
  92. package/dist/utils/package-manager.d.ts +24 -0
  93. package/dist/utils/package-manager.d.ts.map +1 -1
  94. package/dist/utils/package-manager.js +53 -0
  95. package/dist/utils/package-manager.js.map +1 -1
  96. package/dist/utils/payload-config-modifier.d.ts +1 -1
  97. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  98. package/dist/utils/payload-config-modifier.js +4 -3
  99. package/dist/utils/payload-config-modifier.js.map +1 -1
  100. package/dist/utils/project.d.ts +3 -2
  101. package/dist/utils/project.d.ts.map +1 -1
  102. package/dist/utils/project.js +4 -2
  103. package/dist/utils/project.js.map +1 -1
  104. package/package.json +1 -1
  105. package/dist/db-content-api/utilities/meta/index.d.ts +0 -5
  106. package/dist/db-content-api/utilities/meta/index.d.ts.map +0 -1
  107. package/dist/db-content-api/utilities/meta/index.js +0 -5
  108. package/dist/db-content-api/utilities/meta/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../src/api/control-plane.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../src/api/control-plane.ts"],"names":[],"mappings":"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"}
@@ -50,14 +50,15 @@ import * as log from '../utils/log.js';
50
50
  ];
51
51
  }
52
52
  // REAL API IMPLEMENTATION
53
- const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant`, {
54
- headers: {
55
- Authorization: `Bearer ${accessToken}`
56
- }
53
+ const response = await controlPlaneFetch({
54
+ context: 'list tenants',
55
+ options: {
56
+ headers: {
57
+ Authorization: `Bearer ${accessToken}`
58
+ }
59
+ },
60
+ url: `${getControlPlaneBaseUrl()}/v1/tenant`
57
61
  });
58
- if (!response.ok) {
59
- throw new ControlPlaneError(`Failed to list tenants: ${response.status} ${response.statusText}`, response.status);
60
- }
61
62
  return response.json();
62
63
  }
63
64
  /**
@@ -86,19 +87,20 @@ import * as log from '../utils/log.js';
86
87
  };
87
88
  }
88
89
  // REAL API IMPLEMENTATION
89
- const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant`, {
90
- body: JSON.stringify({
91
- name: options.name
92
- }),
93
- headers: {
94
- Authorization: `Bearer ${accessToken}`,
95
- 'Content-Type': 'application/json'
90
+ const response = await controlPlaneFetch({
91
+ context: 'create tenant',
92
+ options: {
93
+ body: JSON.stringify({
94
+ name: options.name
95
+ }),
96
+ headers: {
97
+ Authorization: `Bearer ${accessToken}`,
98
+ 'Content-Type': 'application/json'
99
+ },
100
+ method: 'POST'
96
101
  },
97
- method: 'POST'
102
+ url: `${getControlPlaneBaseUrl()}/v1/tenant`
98
103
  });
99
- if (!response.ok) {
100
- throw new ControlPlaneError(`Failed to create tenant: ${response.status} ${response.statusText}`, response.status);
101
- }
102
104
  return response.json();
103
105
  }
104
106
  /**
@@ -124,14 +126,15 @@ import * as log from '../utils/log.js';
124
126
  };
125
127
  }
126
128
  // REAL API IMPLEMENTATION
127
- const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant/${tenantId}`, {
128
- headers: {
129
- Authorization: `Bearer ${accessToken}`
130
- }
129
+ const response = await controlPlaneFetch({
130
+ context: 'get tenant details',
131
+ options: {
132
+ headers: {
133
+ Authorization: `Bearer ${accessToken}`
134
+ }
135
+ },
136
+ url: `${getControlPlaneBaseUrl()}/v1/tenant/${tenantId}`
131
137
  });
132
- if (!response.ok) {
133
- throw new ControlPlaneError(`Failed to get tenant details: ${response.status} ${response.statusText}`, response.status);
134
- }
135
138
  return response.json();
136
139
  }
137
140
  /**
@@ -169,19 +172,20 @@ import * as log from '../utils/log.js';
169
172
  const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/create`;
170
173
  log.debug(`Calling createDeployment API at ${url}`);
171
174
  // REAL API IMPLEMENTATION
172
- const response = await fetch(url, {
173
- body: JSON.stringify({
174
- static_assets: options.staticAssets
175
- }),
176
- headers: {
177
- Authorization: `Bearer ${accessToken}`,
178
- 'Content-Type': 'application/json'
175
+ const response = await controlPlaneFetch({
176
+ context: 'create deployment',
177
+ options: {
178
+ body: JSON.stringify({
179
+ static_assets: options.staticAssets
180
+ }),
181
+ headers: {
182
+ Authorization: `Bearer ${accessToken}`,
183
+ 'Content-Type': 'application/json'
184
+ },
185
+ method: 'POST'
179
186
  },
180
- method: 'POST'
187
+ url
181
188
  });
182
- if (!response.ok) {
183
- throw new ControlPlaneError(`Failed to create deployment: ${response.status} ${response.statusText}`, response.status);
184
- }
185
189
  const data = await response.json();
186
190
  // Map API response format to our interface
187
191
  return {
@@ -214,19 +218,20 @@ import * as log from '../utils/log.js';
214
218
  const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/perform`;
215
219
  log.debug(`Calling performDeployment API at ${url}`);
216
220
  // REAL API IMPLEMENTATION
217
- const response = await fetch(url, {
218
- body: JSON.stringify({
219
- deployment_id: options.deploymentId
220
- }),
221
- headers: {
222
- Authorization: `Bearer ${accessToken}`,
223
- 'Content-Type': 'application/json'
221
+ const response = await controlPlaneFetch({
222
+ context: 'perform deployment',
223
+ options: {
224
+ body: JSON.stringify({
225
+ deployment_id: options.deploymentId
226
+ }),
227
+ headers: {
228
+ Authorization: `Bearer ${accessToken}`,
229
+ 'Content-Type': 'application/json'
230
+ },
231
+ method: 'POST'
224
232
  },
225
- method: 'POST'
233
+ url
226
234
  });
227
- if (!response.ok) {
228
- throw new ControlPlaneError(`Failed to perform deployment: ${response.status} ${response.statusText}`, response.status);
229
- }
230
235
  const data = await response.json();
231
236
  // Map API response to our interface
232
237
  return {
@@ -245,14 +250,15 @@ import * as log from '../utils/log.js';
245
250
  */ export async function getDatasetInfo(accessToken, datasetId) {
246
251
  const url = `${getControlPlaneBaseUrl()}/v1/cms/dataset/${datasetId}`;
247
252
  log.debug(`Calling getDatasetInfo API at ${url}`);
248
- const response = await fetch(url, {
249
- headers: {
250
- Authorization: `Bearer ${accessToken}`
251
- }
253
+ const response = await controlPlaneFetch({
254
+ context: 'get dataset info',
255
+ options: {
256
+ headers: {
257
+ Authorization: `Bearer ${accessToken}`
258
+ }
259
+ },
260
+ url
252
261
  });
253
- if (!response.ok) {
254
- throw new ControlPlaneError(`Failed to get dataset info: ${response.status} ${response.statusText}`, response.status);
255
- }
256
262
  const data = await response.json();
257
263
  const sanitizedData = {
258
264
  ...data,
@@ -269,5 +275,35 @@ import * as log from '../utils/log.js';
269
275
  tenantId: data.meta.tenant_instance_id
270
276
  };
271
277
  }
278
+ const MAX_RETRIES = 3;
279
+ const INITIAL_RETRY_DELAY = 1000;
280
+ function sleep(ms) {
281
+ return new Promise((resolve)=>setTimeout(resolve, ms));
282
+ }
283
+ async function controlPlaneFetch(params) {
284
+ const { context, options, url } = params;
285
+ let lastError;
286
+ for(let attempt = 0; attempt < MAX_RETRIES; attempt++){
287
+ try {
288
+ const response = await fetch(url, options);
289
+ if (response.ok) {
290
+ return response;
291
+ }
292
+ if (response.status < 500) {
293
+ throw new ControlPlaneError(`Failed to ${context}: ${response.status} ${response.statusText}`, response.status);
294
+ }
295
+ lastError = new ControlPlaneError(`Failed to ${context}: ${response.status} ${response.statusText}`, response.status);
296
+ } catch (error) {
297
+ if (error instanceof ControlPlaneError) {
298
+ throw error;
299
+ }
300
+ lastError = error instanceof Error ? error : new Error('Unknown error');
301
+ }
302
+ if (attempt < MAX_RETRIES - 1) {
303
+ await sleep(INITIAL_RETRY_DELAY * Math.pow(2, attempt));
304
+ }
305
+ }
306
+ throw new ControlPlaneError(`Network error while ${context}: ${lastError?.message || 'Unknown error'}`, undefined, lastError);
307
+ }
272
308
 
273
309
  //# sourceMappingURL=control-plane.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/control-plane.ts"],"sourcesContent":["/**\n * Control Plane API Client\n *\n * TODO: Replace with real API calls when Control Plane is available\n */\n\nimport type { Tenant } from '../types/config.js'\n\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\n/**\n * Get the Control Plane API base URL based on environment\n */\nfunction getControlPlaneBaseUrl(): string {\n return process.env.FIGMA_API_BASE_URL || ENV_CONFIG[getEnvironment()].apiBaseUrl\n}\n\n/**\n * Error thrown when Control Plane API calls fail\n */\nexport class ControlPlaneError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public cause?: Error,\n ) {\n super(message)\n this.name = 'ControlPlaneError'\n }\n}\n\n/**\n * Options for creating a new tenant\n */\nexport interface CreateTenantOptions {\n /** Name for the new CMS instance */\n name: string\n /** Optional parent ID */\n parentId?: string\n /** Optional parent type */\n parentType?: 'org' | 'team' | 'workspace'\n}\n\n/**\n * Options for creating a new deployment\n */\nexport interface CreateDeploymentOptions {\n /** List of static asset paths that need upload URLs */\n staticAssets: string[]\n}\n\n/**\n * Response from creating a new deployment\n */\nexport interface CreateDeploymentResponse {\n /** Upload URL for the Lambda function code zip */\n codeUploadUrl: string\n /** Unique deployment ID */\n deploymentId: string\n /** Map of static asset paths to their signed S3 upload URLs */\n staticAssetUploadUrls: Record<string, string>\n}\n\nexport interface CreateDeploymentApiResponse {\n error: boolean\n meta: {\n deployment_id: string\n lambda_zip_upload_url: string\n static_asset_upload_urls: Record<string, string>\n }\n status: number\n}\n\n/**\n * Options for performing a deployment\n */\nexport interface PerformDeploymentOptions {\n /** Deployment ID from createDeployment */\n deploymentId: string\n}\n\n/**\n * Response from performing a deployment\n */\nexport interface PerformDeploymentResponse {\n /** Deployment ID that was deployed */\n deploymentId: string\n /** Status message */\n message: string\n\n /** List of tenant domains */\n tenantDomains: string[]\n}\n\nexport interface PerformDeploymentApiResponse {\n error: boolean\n meta: {\n deployment_id: string\n message: string\n status: string\n tenant_domains: string[]\n }\n status: number\n}\n\n/**\n * Response from getDatasetInfo endpoint\n */\nexport type DatasetInfo = {\n cmsId: string\n oauthClientId: string\n oauthClientSecret: string\n tenantId: string\n}\n\n/**\n * Raw API response from /v1/cms/dataset/:datasetId\n */\ntype DatasetInfoApiResponse = {\n error: boolean\n meta: {\n cms_resource_id: string\n oauth_client_id: string\n oauth_client_secret: string\n tenant_instance_id: string\n }\n status: number\n}\n\n/**\n * List all tenant instances for the authenticated user\n * Maps to: GET /v1/tenant\n *\n * @param accessToken - OAuth access token\n * @returns Array of tenant instances\n */\nexport async function listTenants(accessToken: string): Promise<Tenant[]> {\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return sample tenants for testing\n log.debug('Using mock Control Plane API for listTenants (FIGMA_MOCK_CONTROL_PLANE != \"false\")')\n return [\n {\n id: 'tenant_abc123',\n createdAt: '2025-01-15T10:00:00Z',\n domain: 'my-blog.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n },\n {\n id: 'tenant_def456',\n createdAt: '2025-01-10T14:30:00Z',\n domain: 'my-store.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n },\n ]\n }\n\n // REAL API IMPLEMENTATION\n const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to list tenants: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n return response.json()\n}\n\n/**\n * Create a new tenant instance\n * Maps to: POST /v1/tenant\n *\n * @param accessToken - OAuth access token\n * @param options - Tenant creation options\n * @returns Newly created tenant\n */\nexport async function createTenant(\n accessToken: string,\n options: CreateTenantOptions,\n): Promise<Tenant> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate mock tenant for testing\n log.debug('Using mock Control Plane API for createTenant (FIGMA_MOCK_CONTROL_PLANE != \"false\")')\n const tenantId = `tenant_${Math.random().toString(36).substring(2, 11)}`\n const slug = options.name.toLowerCase().replace(/[^a-z0-9]+/g, '-')\n const domain = `${slug}.figmacms.com`\n\n return {\n id: tenantId,\n createdAt: new Date().toISOString(),\n domain,\n parentId: options.parentId || 'team_456',\n parentType: options.parentType || 'team',\n status: 'provisioning',\n }\n }\n\n // REAL API IMPLEMENTATION\n const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant`, {\n body: JSON.stringify({ name: options.name }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to create tenant: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n return response.json()\n}\n\n/**\n * Get details for a specific tenant\n * Maps to: GET /v1/tenant/{tenant_id}\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @returns Tenant details\n */\nexport async function getTenantDetails(accessToken: string, tenantId: string): Promise<Tenant> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return mock tenant details for testing\n log.debug(\n 'Using mock Control Plane API for getTenantDetails (FIGMA_MOCK_CONTROL_PLANE != \"false\")',\n )\n return {\n id: tenantId,\n createdAt: '2025-01-15T10:00:00Z',\n domain: 'example.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n }\n }\n\n // REAL API IMPLEMENTATION\n const response = await fetch(`${getControlPlaneBaseUrl()}/v1/tenant/${tenantId}`, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to get tenant details: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n return response.json()\n}\n\n/**\n * Create a new deployment and get signed upload URLs\n * Maps to: POST /v1/tenant/{tenant_id}/deploy/create\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @param options - Deployment creation options\n * @returns Deployment ID and upload URLs\n */\nexport async function createDeployment(\n accessToken: string,\n tenantId: string,\n options: CreateDeploymentOptions,\n): Promise<CreateDeploymentResponse> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate mock deployment and signed URLs\n log.debug(\n 'Using mock Control Plane API for createDeployment (FIGMA_MOCK_CONTROL_PLANE === \"true\")',\n )\n\n const deploymentId = `deploy_${Math.random().toString(36).substring(2, 11)}`\n const mockBucket = 'figma-cms-deployments-mock'\n const mockRegion = 'us-west-2'\n const mockBaseUrl = `https://${mockBucket}.s3.${mockRegion}.amazonaws.com`\n\n // Generate mock signed URLs for static assets\n const staticAssetUploadUrls: Record<string, string> = {}\n for (const assetPath of options.staticAssets) {\n const encodedPath = encodeURIComponent(assetPath)\n staticAssetUploadUrls[assetPath] =\n `${mockBaseUrl}/${tenantId}/${deploymentId}/static/${encodedPath}?X-Amz-Signature=mock`\n }\n\n // Generate mock signed URL for code zip\n const codeUploadUrl = `${mockBaseUrl}/${tenantId}/${deploymentId}/lambda.zip?X-Amz-Signature=mock`\n\n return {\n codeUploadUrl,\n deploymentId,\n staticAssetUploadUrls,\n }\n }\n\n const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/create`\n\n log.debug(`Calling createDeployment API at ${url}`)\n\n // REAL API IMPLEMENTATION\n const response = await fetch(url, {\n body: JSON.stringify({ static_assets: options.staticAssets }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to create deployment: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n const data = (await response.json()) as CreateDeploymentApiResponse\n\n // Map API response format to our interface\n return {\n codeUploadUrl: data.meta.lambda_zip_upload_url,\n deploymentId: data.meta.deployment_id,\n staticAssetUploadUrls: data.meta.static_asset_upload_urls,\n }\n}\n\n/**\n * Perform deployment for a created deployment ID\n * Maps to: POST /v1/tenant/{tenant_id}/deploy/perform\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @param options - Deployment perform options\n * @returns Deployment status and message\n */\nexport async function performDeployment(\n accessToken: string,\n tenantId: string,\n options: PerformDeploymentOptions,\n): Promise<PerformDeploymentResponse> {\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return mock deployment status\n log.debug(\n 'Using mock Control Plane API for performDeployment (FIGMA_MOCK_CONTROL_PLANE != \"false\")',\n )\n\n return {\n deploymentId: options.deploymentId,\n message: 'Deployment initiated successfully',\n tenantDomains: ['example.figmasource.site'],\n }\n }\n\n const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/perform`\n log.debug(`Calling performDeployment API at ${url}`)\n\n // REAL API IMPLEMENTATION\n const response = await fetch(url, {\n body: JSON.stringify({ deployment_id: options.deploymentId }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to perform deployment: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n const data = (await response.json()) as PerformDeploymentApiResponse\n\n // Map API response to our interface\n return {\n deploymentId: data.meta.deployment_id,\n message: data.meta.message || 'Deployment initiated',\n tenantDomains: data.meta.tenant_domains,\n }\n}\n\n/**\n * Get dataset info including tenant ID and OAuth credentials\n * Maps to: GET /v1/cms/dataset/:datasetId\n *\n * @param accessToken - OAuth access token\n * @param datasetId - Content System ID (dataset ID)\n * @returns Dataset info with tenant ID and OAuth credentials\n */\nexport async function getDatasetInfo(accessToken: string, datasetId: string): Promise<DatasetInfo> {\n const url = `${getControlPlaneBaseUrl()}/v1/cms/dataset/${datasetId}`\n log.debug(`Calling getDatasetInfo API at ${url}`)\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${accessToken}` },\n })\n\n if (!response.ok) {\n throw new ControlPlaneError(\n `Failed to get dataset info: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n const data = (await response.json()) as DatasetInfoApiResponse\n const sanitizedData = {\n ...data,\n meta: { ...data.meta, oauth_client_secret: '[REDACTED]' },\n }\n log.debug(`Dataset API response: ${JSON.stringify(sanitizedData, null, 2)}`)\n\n return {\n cmsId: data.meta.cms_resource_id,\n oauthClientId: data.meta.oauth_client_id,\n oauthClientSecret: data.meta.oauth_client_secret,\n tenantId: data.meta.tenant_instance_id,\n }\n}\n"],"names":["ENV_CONFIG","getEnvironment","log","getControlPlaneBaseUrl","process","env","FIGMA_API_BASE_URL","apiBaseUrl","ControlPlaneError","Error","message","statusCode","cause","name","listTenants","accessToken","shouldMock","FIGMA_MOCK_CONTROL_PLANE","debug","id","createdAt","domain","parentId","parentType","status","response","fetch","headers","Authorization","ok","statusText","json","createTenant","options","tenantId","Math","random","toString","substring","slug","toLowerCase","replace","Date","toISOString","body","JSON","stringify","method","getTenantDetails","createDeployment","deploymentId","mockBucket","mockRegion","mockBaseUrl","staticAssetUploadUrls","assetPath","staticAssets","encodedPath","encodeURIComponent","codeUploadUrl","url","static_assets","data","meta","lambda_zip_upload_url","deployment_id","static_asset_upload_urls","performDeployment","tenantDomains","tenant_domains","getDatasetInfo","datasetId","sanitizedData","oauth_client_secret","cmsId","cms_resource_id","oauthClientId","oauth_client_id","oauthClientSecret","tenant_instance_id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/api/control-plane.ts"],"sourcesContent":["/**\n * Control Plane API Client\n *\n * TODO: Replace with real API calls when Control Plane is available\n */\n\nimport type { Tenant } from '../types/config.js'\n\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\n/**\n * Get the Control Plane API base URL based on environment\n */\nfunction getControlPlaneBaseUrl(): string {\n return process.env.FIGMA_API_BASE_URL || ENV_CONFIG[getEnvironment()].apiBaseUrl\n}\n\n/**\n * Error thrown when Control Plane API calls fail\n */\nexport class ControlPlaneError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public cause?: Error,\n ) {\n super(message)\n this.name = 'ControlPlaneError'\n }\n}\n\n/**\n * Options for creating a new tenant\n */\nexport interface CreateTenantOptions {\n /** Name for the new CMS instance */\n name: string\n /** Optional parent ID */\n parentId?: string\n /** Optional parent type */\n parentType?: 'org' | 'team' | 'workspace'\n}\n\n/**\n * Options for creating a new deployment\n */\nexport interface CreateDeploymentOptions {\n /** List of static asset paths that need upload URLs */\n staticAssets: string[]\n}\n\n/**\n * Response from creating a new deployment\n */\nexport interface CreateDeploymentResponse {\n /** Upload URL for the Lambda function code zip */\n codeUploadUrl: string\n /** Unique deployment ID */\n deploymentId: string\n /** Map of static asset paths to their signed S3 upload URLs */\n staticAssetUploadUrls: Record<string, string>\n}\n\nexport interface CreateDeploymentApiResponse {\n error: boolean\n meta: {\n deployment_id: string\n lambda_zip_upload_url: string\n static_asset_upload_urls: Record<string, string>\n }\n status: number\n}\n\n/**\n * Options for performing a deployment\n */\nexport interface PerformDeploymentOptions {\n /** Deployment ID from createDeployment */\n deploymentId: string\n}\n\n/**\n * Response from performing a deployment\n */\nexport interface PerformDeploymentResponse {\n /** Deployment ID that was deployed */\n deploymentId: string\n /** Status message */\n message: string\n\n /** List of tenant domains */\n tenantDomains: string[]\n}\n\nexport interface PerformDeploymentApiResponse {\n error: boolean\n meta: {\n deployment_id: string\n message: string\n status: string\n tenant_domains: string[]\n }\n status: number\n}\n\n/**\n * Response from getDatasetInfo endpoint\n */\nexport type DatasetInfo = {\n cmsId: string\n oauthClientId: string\n oauthClientSecret: string\n tenantId: string\n}\n\n/**\n * Raw API response from /v1/cms/dataset/:datasetId\n */\ntype DatasetInfoApiResponse = {\n error: boolean\n meta: {\n cms_resource_id: string\n oauth_client_id: string\n oauth_client_secret: string\n tenant_instance_id: string\n }\n status: number\n}\n\n/**\n * List all tenant instances for the authenticated user\n * Maps to: GET /v1/tenant\n *\n * @param accessToken - OAuth access token\n * @returns Array of tenant instances\n */\nexport async function listTenants(accessToken: string): Promise<Tenant[]> {\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return sample tenants for testing\n log.debug('Using mock Control Plane API for listTenants (FIGMA_MOCK_CONTROL_PLANE != \"false\")')\n return [\n {\n id: 'tenant_abc123',\n createdAt: '2025-01-15T10:00:00Z',\n domain: 'my-blog.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n },\n {\n id: 'tenant_def456',\n createdAt: '2025-01-10T14:30:00Z',\n domain: 'my-store.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n },\n ]\n }\n\n // REAL API IMPLEMENTATION\n const response = await controlPlaneFetch({\n context: 'list tenants',\n options: { headers: { Authorization: `Bearer ${accessToken}` } },\n url: `${getControlPlaneBaseUrl()}/v1/tenant`,\n })\n\n return response.json()\n}\n\n/**\n * Create a new tenant instance\n * Maps to: POST /v1/tenant\n *\n * @param accessToken - OAuth access token\n * @param options - Tenant creation options\n * @returns Newly created tenant\n */\nexport async function createTenant(\n accessToken: string,\n options: CreateTenantOptions,\n): Promise<Tenant> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate mock tenant for testing\n log.debug('Using mock Control Plane API for createTenant (FIGMA_MOCK_CONTROL_PLANE != \"false\")')\n const tenantId = `tenant_${Math.random().toString(36).substring(2, 11)}`\n const slug = options.name.toLowerCase().replace(/[^a-z0-9]+/g, '-')\n const domain = `${slug}.figmacms.com`\n\n return {\n id: tenantId,\n createdAt: new Date().toISOString(),\n domain,\n parentId: options.parentId || 'team_456',\n parentType: options.parentType || 'team',\n status: 'provisioning',\n }\n }\n\n // REAL API IMPLEMENTATION\n const response = await controlPlaneFetch({\n context: 'create tenant',\n options: {\n body: JSON.stringify({ name: options.name }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n url: `${getControlPlaneBaseUrl()}/v1/tenant`,\n })\n\n return response.json()\n}\n\n/**\n * Get details for a specific tenant\n * Maps to: GET /v1/tenant/{tenant_id}\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @returns Tenant details\n */\nexport async function getTenantDetails(accessToken: string, tenantId: string): Promise<Tenant> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return mock tenant details for testing\n log.debug(\n 'Using mock Control Plane API for getTenantDetails (FIGMA_MOCK_CONTROL_PLANE != \"false\")',\n )\n return {\n id: tenantId,\n createdAt: '2025-01-15T10:00:00Z',\n domain: 'example.figmacms.com',\n parentId: 'team_456',\n parentType: 'team',\n status: 'active',\n }\n }\n\n // REAL API IMPLEMENTATION\n const response = await controlPlaneFetch({\n context: 'get tenant details',\n options: { headers: { Authorization: `Bearer ${accessToken}` } },\n url: `${getControlPlaneBaseUrl()}/v1/tenant/${tenantId}`,\n })\n\n return response.json()\n}\n\n/**\n * Create a new deployment and get signed upload URLs\n * Maps to: POST /v1/tenant/{tenant_id}/deploy/create\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @param options - Deployment creation options\n * @returns Deployment ID and upload URLs\n */\nexport async function createDeployment(\n accessToken: string,\n tenantId: string,\n options: CreateDeploymentOptions,\n): Promise<CreateDeploymentResponse> {\n // Check if control plane API should be mocked\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Generate mock deployment and signed URLs\n log.debug(\n 'Using mock Control Plane API for createDeployment (FIGMA_MOCK_CONTROL_PLANE === \"true\")',\n )\n\n const deploymentId = `deploy_${Math.random().toString(36).substring(2, 11)}`\n const mockBucket = 'figma-cms-deployments-mock'\n const mockRegion = 'us-west-2'\n const mockBaseUrl = `https://${mockBucket}.s3.${mockRegion}.amazonaws.com`\n\n // Generate mock signed URLs for static assets\n const staticAssetUploadUrls: Record<string, string> = {}\n for (const assetPath of options.staticAssets) {\n const encodedPath = encodeURIComponent(assetPath)\n staticAssetUploadUrls[assetPath] =\n `${mockBaseUrl}/${tenantId}/${deploymentId}/static/${encodedPath}?X-Amz-Signature=mock`\n }\n\n // Generate mock signed URL for code zip\n const codeUploadUrl = `${mockBaseUrl}/${tenantId}/${deploymentId}/lambda.zip?X-Amz-Signature=mock`\n\n return {\n codeUploadUrl,\n deploymentId,\n staticAssetUploadUrls,\n }\n }\n\n const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/create`\n\n log.debug(`Calling createDeployment API at ${url}`)\n\n // REAL API IMPLEMENTATION\n const response = await controlPlaneFetch({\n context: 'create deployment',\n options: {\n body: JSON.stringify({ static_assets: options.staticAssets }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n url,\n })\n\n const data = (await response.json()) as CreateDeploymentApiResponse\n\n // Map API response format to our interface\n return {\n codeUploadUrl: data.meta.lambda_zip_upload_url,\n deploymentId: data.meta.deployment_id,\n staticAssetUploadUrls: data.meta.static_asset_upload_urls,\n }\n}\n\n/**\n * Perform deployment for a created deployment ID\n * Maps to: POST /v1/tenant/{tenant_id}/deploy/perform\n *\n * @param accessToken - OAuth access token\n * @param tenantId - Tenant ID\n * @param options - Deployment perform options\n * @returns Deployment status and message\n */\nexport async function performDeployment(\n accessToken: string,\n tenantId: string,\n options: PerformDeploymentOptions,\n): Promise<PerformDeploymentResponse> {\n const shouldMock = process.env.FIGMA_MOCK_CONTROL_PLANE === 'true'\n\n if (shouldMock) {\n // MOCK IMPLEMENTATION: Return mock deployment status\n log.debug(\n 'Using mock Control Plane API for performDeployment (FIGMA_MOCK_CONTROL_PLANE != \"false\")',\n )\n\n return {\n deploymentId: options.deploymentId,\n message: 'Deployment initiated successfully',\n tenantDomains: ['example.figmasource.site'],\n }\n }\n\n const url = `${getControlPlaneBaseUrl()}/v1/cms/tenant/${tenantId}/deploy/perform`\n log.debug(`Calling performDeployment API at ${url}`)\n\n // REAL API IMPLEMENTATION\n const response = await controlPlaneFetch({\n context: 'perform deployment',\n options: {\n body: JSON.stringify({ deployment_id: options.deploymentId }),\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n url,\n })\n\n const data = (await response.json()) as PerformDeploymentApiResponse\n\n // Map API response to our interface\n return {\n deploymentId: data.meta.deployment_id,\n message: data.meta.message || 'Deployment initiated',\n tenantDomains: data.meta.tenant_domains,\n }\n}\n\n/**\n * Get dataset info including tenant ID and OAuth credentials\n * Maps to: GET /v1/cms/dataset/:datasetId\n *\n * @param accessToken - OAuth access token\n * @param datasetId - Content System ID (dataset ID)\n * @returns Dataset info with tenant ID and OAuth credentials\n */\nexport async function getDatasetInfo(accessToken: string, datasetId: string): Promise<DatasetInfo> {\n const url = `${getControlPlaneBaseUrl()}/v1/cms/dataset/${datasetId}`\n log.debug(`Calling getDatasetInfo API at ${url}`)\n\n const response = await controlPlaneFetch({\n context: 'get dataset info',\n options: { headers: { Authorization: `Bearer ${accessToken}` } },\n url,\n })\n\n const data = (await response.json()) as DatasetInfoApiResponse\n const sanitizedData = {\n ...data,\n meta: { ...data.meta, oauth_client_secret: '[REDACTED]' },\n }\n log.debug(`Dataset API response: ${JSON.stringify(sanitizedData, null, 2)}`)\n\n return {\n cmsId: data.meta.cms_resource_id,\n oauthClientId: data.meta.oauth_client_id,\n oauthClientSecret: data.meta.oauth_client_secret,\n tenantId: data.meta.tenant_instance_id,\n }\n}\n\nconst MAX_RETRIES = 3\nconst INITIAL_RETRY_DELAY = 1000\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nasync function controlPlaneFetch(params: {\n context: string\n options: RequestInit\n url: string\n}): Promise<Response> {\n const { context, options, url } = params\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const response = await fetch(url, options)\n\n if (response.ok) {\n return response\n }\n\n if (response.status < 500) {\n throw new ControlPlaneError(\n `Failed to ${context}: ${response.status} ${response.statusText}`,\n response.status,\n )\n }\n\n lastError = new ControlPlaneError(\n `Failed to ${context}: ${response.status} ${response.statusText}`,\n response.status,\n )\n } catch (error) {\n if (error instanceof ControlPlaneError) {\n throw error\n }\n lastError = error instanceof Error ? error : new Error('Unknown error')\n }\n\n if (attempt < MAX_RETRIES - 1) {\n await sleep(INITIAL_RETRY_DELAY * Math.pow(2, attempt))\n }\n }\n\n throw new ControlPlaneError(\n `Network error while ${context}: ${lastError?.message || 'Unknown error'}`,\n undefined,\n lastError,\n )\n}\n"],"names":["ENV_CONFIG","getEnvironment","log","getControlPlaneBaseUrl","process","env","FIGMA_API_BASE_URL","apiBaseUrl","ControlPlaneError","Error","message","statusCode","cause","name","listTenants","accessToken","shouldMock","FIGMA_MOCK_CONTROL_PLANE","debug","id","createdAt","domain","parentId","parentType","status","response","controlPlaneFetch","context","options","headers","Authorization","url","json","createTenant","tenantId","Math","random","toString","substring","slug","toLowerCase","replace","Date","toISOString","body","JSON","stringify","method","getTenantDetails","createDeployment","deploymentId","mockBucket","mockRegion","mockBaseUrl","staticAssetUploadUrls","assetPath","staticAssets","encodedPath","encodeURIComponent","codeUploadUrl","static_assets","data","meta","lambda_zip_upload_url","deployment_id","static_asset_upload_urls","performDeployment","tenantDomains","tenant_domains","getDatasetInfo","datasetId","sanitizedData","oauth_client_secret","cmsId","cms_resource_id","oauthClientId","oauth_client_id","oauthClientSecret","tenant_instance_id","MAX_RETRIES","INITIAL_RETRY_DELAY","sleep","ms","Promise","resolve","setTimeout","params","lastError","attempt","fetch","ok","statusText","error","pow","undefined"],"mappings":"AAAA;;;;CAIC,GAID,SAASA,UAAU,EAAEC,cAAc,QAAQ,kBAAiB;AAC5D,YAAYC,SAAS,kBAAiB;AAEtC;;CAEC,GACD,SAASC;IACP,OAAOC,QAAQC,GAAG,CAACC,kBAAkB,IAAIN,UAAU,CAACC,iBAAiB,CAACM,UAAU;AAClF;AAEA;;CAEC,GACD,OAAO,MAAMC,0BAA0BC;;;IACrC,YACEC,OAAe,EACf,AAAOC,UAAmB,EAC1B,AAAOC,KAAa,CACpB;QACA,KAAK,CAACF,eAHCC,aAAAA,iBACAC,QAAAA;QAGP,IAAI,CAACC,IAAI,GAAG;IACd;AACF;AAoGA;;;;;;CAMC,GACD,OAAO,eAAeC,YAAYC,WAAmB;IACnD,MAAMC,aAAaZ,QAAQC,GAAG,CAACY,wBAAwB,KAAK;IAE5D,IAAID,YAAY;QACd,yDAAyD;QACzDd,IAAIgB,KAAK,CAAC;QACV,OAAO;YACL;gBACEC,IAAI;gBACJC,WAAW;gBACXC,QAAQ;gBACRC,UAAU;gBACVC,YAAY;gBACZC,QAAQ;YACV;YACA;gBACEL,IAAI;gBACJC,WAAW;gBACXC,QAAQ;gBACRC,UAAU;gBACVC,YAAY;gBACZC,QAAQ;YACV;SACD;IACH;IAEA,0BAA0B;IAC1B,MAAMC,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YAAEC,SAAS;gBAAEC,eAAe,CAAC,OAAO,EAAEf,aAAa;YAAC;QAAE;QAC/DgB,KAAK,GAAG5B,yBAAyB,UAAU,CAAC;IAC9C;IAEA,OAAOsB,SAASO,IAAI;AACtB;AAEA;;;;;;;CAOC,GACD,OAAO,eAAeC,aACpBlB,WAAmB,EACnBa,OAA4B;IAE5B,8CAA8C;IAC9C,MAAMZ,aAAaZ,QAAQC,GAAG,CAACY,wBAAwB,KAAK;IAE5D,IAAID,YAAY;QACd,wDAAwD;QACxDd,IAAIgB,KAAK,CAAC;QACV,MAAMgB,WAAW,CAAC,OAAO,EAAEC,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG,KAAK;QACxE,MAAMC,OAAOX,QAAQf,IAAI,CAAC2B,WAAW,GAAGC,OAAO,CAAC,eAAe;QAC/D,MAAMpB,SAAS,GAAGkB,KAAK,aAAa,CAAC;QAErC,OAAO;YACLpB,IAAIe;YACJd,WAAW,IAAIsB,OAAOC,WAAW;YACjCtB;YACAC,UAAUM,QAAQN,QAAQ,IAAI;YAC9BC,YAAYK,QAAQL,UAAU,IAAI;YAClCC,QAAQ;QACV;IACF;IAEA,0BAA0B;IAC1B,MAAMC,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YACPgB,MAAMC,KAAKC,SAAS,CAAC;gBAAEjC,MAAMe,QAAQf,IAAI;YAAC;YAC1CgB,SAAS;gBACPC,eAAe,CAAC,OAAO,EAAEf,aAAa;gBACtC,gBAAgB;YAClB;YACAgC,QAAQ;QACV;QACAhB,KAAK,GAAG5B,yBAAyB,UAAU,CAAC;IAC9C;IAEA,OAAOsB,SAASO,IAAI;AACtB;AAEA;;;;;;;CAOC,GACD,OAAO,eAAegB,iBAAiBjC,WAAmB,EAAEmB,QAAgB;IAC1E,8CAA8C;IAC9C,MAAMlB,aAAaZ,QAAQC,GAAG,CAACY,wBAAwB,KAAK;IAE5D,IAAID,YAAY;QACd,8DAA8D;QAC9Dd,IAAIgB,KAAK,CACP;QAEF,OAAO;YACLC,IAAIe;YACJd,WAAW;YACXC,QAAQ;YACRC,UAAU;YACVC,YAAY;YACZC,QAAQ;QACV;IACF;IAEA,0BAA0B;IAC1B,MAAMC,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YAAEC,SAAS;gBAAEC,eAAe,CAAC,OAAO,EAAEf,aAAa;YAAC;QAAE;QAC/DgB,KAAK,GAAG5B,yBAAyB,WAAW,EAAE+B,UAAU;IAC1D;IAEA,OAAOT,SAASO,IAAI;AACtB;AAEA;;;;;;;;CAQC,GACD,OAAO,eAAeiB,iBACpBlC,WAAmB,EACnBmB,QAAgB,EAChBN,OAAgC;IAEhC,8CAA8C;IAC9C,MAAMZ,aAAaZ,QAAQC,GAAG,CAACY,wBAAwB,KAAK;IAE5D,IAAID,YAAY;QACd,gEAAgE;QAChEd,IAAIgB,KAAK,CACP;QAGF,MAAMgC,eAAe,CAAC,OAAO,EAAEf,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,SAAS,CAAC,GAAG,KAAK;QAC5E,MAAMa,aAAa;QACnB,MAAMC,aAAa;QACnB,MAAMC,cAAc,CAAC,QAAQ,EAAEF,WAAW,IAAI,EAAEC,WAAW,cAAc,CAAC;QAE1E,8CAA8C;QAC9C,MAAME,wBAAgD,CAAC;QACvD,KAAK,MAAMC,aAAa3B,QAAQ4B,YAAY,CAAE;YAC5C,MAAMC,cAAcC,mBAAmBH;YACvCD,qBAAqB,CAACC,UAAU,GAC9B,GAAGF,YAAY,CAAC,EAAEnB,SAAS,CAAC,EAAEgB,aAAa,QAAQ,EAAEO,YAAY,qBAAqB,CAAC;QAC3F;QAEA,wCAAwC;QACxC,MAAME,gBAAgB,GAAGN,YAAY,CAAC,EAAEnB,SAAS,CAAC,EAAEgB,aAAa,gCAAgC,CAAC;QAElG,OAAO;YACLS;YACAT;YACAI;QACF;IACF;IAEA,MAAMvB,MAAM,GAAG5B,yBAAyB,eAAe,EAAE+B,SAAS,cAAc,CAAC;IAEjFhC,IAAIgB,KAAK,CAAC,CAAC,gCAAgC,EAAEa,KAAK;IAElD,0BAA0B;IAC1B,MAAMN,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YACPgB,MAAMC,KAAKC,SAAS,CAAC;gBAAEc,eAAehC,QAAQ4B,YAAY;YAAC;YAC3D3B,SAAS;gBACPC,eAAe,CAAC,OAAO,EAAEf,aAAa;gBACtC,gBAAgB;YAClB;YACAgC,QAAQ;QACV;QACAhB;IACF;IAEA,MAAM8B,OAAQ,MAAMpC,SAASO,IAAI;IAEjC,2CAA2C;IAC3C,OAAO;QACL2B,eAAeE,KAAKC,IAAI,CAACC,qBAAqB;QAC9Cb,cAAcW,KAAKC,IAAI,CAACE,aAAa;QACrCV,uBAAuBO,KAAKC,IAAI,CAACG,wBAAwB;IAC3D;AACF;AAEA;;;;;;;;CAQC,GACD,OAAO,eAAeC,kBACpBnD,WAAmB,EACnBmB,QAAgB,EAChBN,OAAiC;IAEjC,MAAMZ,aAAaZ,QAAQC,GAAG,CAACY,wBAAwB,KAAK;IAE5D,IAAID,YAAY;QACd,qDAAqD;QACrDd,IAAIgB,KAAK,CACP;QAGF,OAAO;YACLgC,cAActB,QAAQsB,YAAY;YAClCxC,SAAS;YACTyD,eAAe;gBAAC;aAA2B;QAC7C;IACF;IAEA,MAAMpC,MAAM,GAAG5B,yBAAyB,eAAe,EAAE+B,SAAS,eAAe,CAAC;IAClFhC,IAAIgB,KAAK,CAAC,CAAC,iCAAiC,EAAEa,KAAK;IAEnD,0BAA0B;IAC1B,MAAMN,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YACPgB,MAAMC,KAAKC,SAAS,CAAC;gBAAEkB,eAAepC,QAAQsB,YAAY;YAAC;YAC3DrB,SAAS;gBACPC,eAAe,CAAC,OAAO,EAAEf,aAAa;gBACtC,gBAAgB;YAClB;YACAgC,QAAQ;QACV;QACAhB;IACF;IAEA,MAAM8B,OAAQ,MAAMpC,SAASO,IAAI;IAEjC,oCAAoC;IACpC,OAAO;QACLkB,cAAcW,KAAKC,IAAI,CAACE,aAAa;QACrCtD,SAASmD,KAAKC,IAAI,CAACpD,OAAO,IAAI;QAC9ByD,eAAeN,KAAKC,IAAI,CAACM,cAAc;IACzC;AACF;AAEA;;;;;;;CAOC,GACD,OAAO,eAAeC,eAAetD,WAAmB,EAAEuD,SAAiB;IACzE,MAAMvC,MAAM,GAAG5B,yBAAyB,gBAAgB,EAAEmE,WAAW;IACrEpE,IAAIgB,KAAK,CAAC,CAAC,8BAA8B,EAAEa,KAAK;IAEhD,MAAMN,WAAW,MAAMC,kBAAkB;QACvCC,SAAS;QACTC,SAAS;YAAEC,SAAS;gBAAEC,eAAe,CAAC,OAAO,EAAEf,aAAa;YAAC;QAAE;QAC/DgB;IACF;IAEA,MAAM8B,OAAQ,MAAMpC,SAASO,IAAI;IACjC,MAAMuC,gBAAgB;QACpB,GAAGV,IAAI;QACPC,MAAM;YAAE,GAAGD,KAAKC,IAAI;YAAEU,qBAAqB;QAAa;IAC1D;IACAtE,IAAIgB,KAAK,CAAC,CAAC,sBAAsB,EAAE2B,KAAKC,SAAS,CAACyB,eAAe,MAAM,IAAI;IAE3E,OAAO;QACLE,OAAOZ,KAAKC,IAAI,CAACY,eAAe;QAChCC,eAAed,KAAKC,IAAI,CAACc,eAAe;QACxCC,mBAAmBhB,KAAKC,IAAI,CAACU,mBAAmB;QAChDtC,UAAU2B,KAAKC,IAAI,CAACgB,kBAAkB;IACxC;AACF;AAEA,MAAMC,cAAc;AACpB,MAAMC,sBAAsB;AAE5B,SAASC,MAAMC,EAAU;IACvB,OAAO,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AACtD;AAEA,eAAexD,kBAAkB4D,MAIhC;IACC,MAAM,EAAE3D,OAAO,EAAEC,OAAO,EAAEG,GAAG,EAAE,GAAGuD;IAClC,IAAIC;IAEJ,IAAK,IAAIC,UAAU,GAAGA,UAAUT,aAAaS,UAAW;QACtD,IAAI;YACF,MAAM/D,WAAW,MAAMgE,MAAM1D,KAAKH;YAElC,IAAIH,SAASiE,EAAE,EAAE;gBACf,OAAOjE;YACT;YAEA,IAAIA,SAASD,MAAM,GAAG,KAAK;gBACzB,MAAM,IAAIhB,kBACR,CAAC,UAAU,EAAEmB,QAAQ,EAAE,EAAEF,SAASD,MAAM,CAAC,CAAC,EAAEC,SAASkE,UAAU,EAAE,EACjElE,SAASD,MAAM;YAEnB;YAEA+D,YAAY,IAAI/E,kBACd,CAAC,UAAU,EAAEmB,QAAQ,EAAE,EAAEF,SAASD,MAAM,CAAC,CAAC,EAAEC,SAASkE,UAAU,EAAE,EACjElE,SAASD,MAAM;QAEnB,EAAE,OAAOoE,OAAO;YACd,IAAIA,iBAAiBpF,mBAAmB;gBACtC,MAAMoF;YACR;YACAL,YAAYK,iBAAiBnF,QAAQmF,QAAQ,IAAInF,MAAM;QACzD;QAEA,IAAI+E,UAAUT,cAAc,GAAG;YAC7B,MAAME,MAAMD,sBAAsB7C,KAAK0D,GAAG,CAAC,GAAGL;QAChD;IACF;IAEA,MAAM,IAAIhF,kBACR,CAAC,oBAAoB,EAAEmB,QAAQ,EAAE,EAAE4D,WAAW7E,WAAW,iBAAiB,EAC1EoF,WACAP;AAEJ"}
@@ -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"}
@@ -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_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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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1C"}
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@ import * as p from '@clack/prompts';
2
2
  import arg from 'arg';
3
3
  import pc from 'picocolors';
4
4
  import { buildLambdaZipCommand } from './commands/build-lambda-zip.js';
5
+ import { debugCommand } from './commands/debug.js';
5
6
  import { deployCommand } from './commands/deploy.js';
6
7
  import { initCommand } from './commands/init.js';
7
8
  import { listTokensCommand } from './commands/list-tokens.js';
@@ -82,6 +83,11 @@ class Main {
82
83
  helpMessage();
83
84
  process.exit(0);
84
85
  }
86
+ // Debug command outputs plain text for copy-paste — skip styled intro
87
+ if (subcommand === 'debug') {
88
+ await debugCommand();
89
+ process.exit(0);
90
+ }
85
91
  // eslint-disable-next-line no-console
86
92
  console.log('\n');
87
93
  p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')));
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport arg from 'arg'\nimport pc from 'picocolors'\n\nimport type { CliArgs } from './types.js'\n\nimport { buildLambdaZipCommand } from './commands/build-lambda-zip.js'\nimport { deployCommand } from './commands/deploy.js'\nimport { initCommand } from './commands/init.js'\nimport { listTokensCommand } from './commands/list-tokens.js'\nimport { loginCommand } from './commands/login.js'\nimport { logoutCommand } from './commands/logout.js'\nimport { setEnvironment } from './constants.js'\nimport { feedbackOutro, helpMessage } from './utils/messages.js'\n\n/**\n * Entrypoint for bin/cli.js\n */\nexport async function main(): Promise<void> {\n try {\n await new Main().init()\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(e.message)\n }\n }\n}\n\nclass Main {\n args: CliArgs\n\n constructor() {\n // @ts-expect-error bad typings\n this.args = arg(\n {\n '--all': Boolean,\n '--debug': Boolean,\n '--env': String,\n '--force': Boolean,\n '--help': Boolean,\n '--id': String,\n '--name': String,\n '--skip-auth': Boolean,\n '--skip-build': Boolean,\n '--version': Boolean,\n '--yes': Boolean,\n\n // Aliases\n '-f': '--force',\n '-h': '--help',\n '-v': '--version',\n '-y': '--yes',\n },\n { permissive: true },\n )\n\n // Set debug flag globally\n if (this.args['--debug']) {\n process.env.DEBUG = 'true'\n }\n\n // Handle --env flag for environment switching\n if (this.args['--env']) {\n const envArg = this.args['--env'].toLowerCase()\n if (envArg === 'prod' || envArg === 'production') {\n setEnvironment('production')\n } else if (envArg === 'staging') {\n setEnvironment('staging')\n } else {\n // eslint-disable-next-line no-console\n console.error(`Invalid --env value: ${this.args['--env']}. Use 'prod' or 'staging'.`)\n process.exit(1)\n }\n }\n }\n\n async init(): Promise<void> {\n try {\n if (this.args['--help']) {\n helpMessage()\n process.exit(0)\n }\n\n if (this.args['--version']) {\n const { getOwnVersion } = await import('./utils/version-check.js')\n const version = await getOwnVersion()\n // eslint-disable-next-line no-console\n console.log(version)\n process.exit(0)\n }\n\n // Get the subcommand (first non-flag argument)\n const subcommand = this.args._[0]\n\n if (!subcommand) {\n helpMessage()\n process.exit(0)\n }\n\n // eslint-disable-next-line no-console\n console.log('\\n')\n p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')))\n\n // Route to appropriate command handler\n switch (subcommand) {\n case 'build-lambda-zip':\n await buildLambdaZipCommand()\n break\n\n case 'deploy':\n await deployCommand({\n id: this.args['--id'],\n debug: this.args['--debug'],\n skipBuild: this.args['--skip-build'],\n yes: this.args['--yes'],\n })\n break\n\n case 'init':\n await initCommand({\n id: this.args['--id'],\n name: this.args['--name'],\n debug: this.args['--debug'],\n force: this.args['--force'],\n skipAuth: this.args['--skip-auth'],\n })\n break\n\n case 'list-tokens':\n listTokensCommand({\n all: this.args['--all'],\n debug: this.args['--debug'],\n })\n break\n\n case 'login':\n await loginCommand()\n break\n\n case 'logout':\n await logoutCommand({\n all: this.args['--all'],\n debug: this.args['--debug'],\n })\n break\n\n default:\n p.log.error(pc.red(`Unknown command: ${subcommand}`))\n p.note('Use --help to see available commands', 'Tip')\n process.exit(1)\n }\n\n process.exit(0)\n } catch (err: unknown) {\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : 'An error occurred')\n process.exit(1)\n }\n }\n}\n"],"names":["p","arg","pc","buildLambdaZipCommand","deployCommand","initCommand","listTokensCommand","loginCommand","logoutCommand","setEnvironment","helpMessage","main","Main","init","e","Error","console","error","message","args","Boolean","String","permissive","process","env","DEBUG","envArg","toLowerCase","exit","getOwnVersion","version","log","subcommand","_","intro","bgCyan","black","id","debug","skipBuild","yes","name","force","skipAuth","all","red","note","err"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport arg from 'arg'\nimport pc from 'picocolors'\n\nimport type { CliArgs } from './types.js'\n\nimport { buildLambdaZipCommand } from './commands/build-lambda-zip.js'\nimport { debugCommand } from './commands/debug.js'\nimport { deployCommand } from './commands/deploy.js'\nimport { initCommand } from './commands/init.js'\nimport { listTokensCommand } from './commands/list-tokens.js'\nimport { loginCommand } from './commands/login.js'\nimport { logoutCommand } from './commands/logout.js'\nimport { setEnvironment } from './constants.js'\nimport { feedbackOutro, helpMessage } from './utils/messages.js'\n\n/**\n * Entrypoint for bin/cli.js\n */\nexport async function main(): Promise<void> {\n try {\n await new Main().init()\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(e.message)\n }\n }\n}\n\nclass Main {\n args: CliArgs\n\n constructor() {\n // @ts-expect-error bad typings\n this.args = arg(\n {\n '--all': Boolean,\n '--debug': Boolean,\n '--env': String,\n '--force': Boolean,\n '--help': Boolean,\n '--id': String,\n '--name': String,\n '--skip-auth': Boolean,\n '--skip-build': Boolean,\n '--version': Boolean,\n '--yes': Boolean,\n\n // Aliases\n '-f': '--force',\n '-h': '--help',\n '-v': '--version',\n '-y': '--yes',\n },\n { permissive: true },\n )\n\n // Set debug flag globally\n if (this.args['--debug']) {\n process.env.DEBUG = 'true'\n }\n\n // Handle --env flag for environment switching\n if (this.args['--env']) {\n const envArg = this.args['--env'].toLowerCase()\n if (envArg === 'prod' || envArg === 'production') {\n setEnvironment('production')\n } else if (envArg === 'staging') {\n setEnvironment('staging')\n } else {\n // eslint-disable-next-line no-console\n console.error(`Invalid --env value: ${this.args['--env']}. Use 'prod' or 'staging'.`)\n process.exit(1)\n }\n }\n }\n\n async init(): Promise<void> {\n try {\n if (this.args['--help']) {\n helpMessage()\n process.exit(0)\n }\n\n if (this.args['--version']) {\n const { getOwnVersion } = await import('./utils/version-check.js')\n const version = await getOwnVersion()\n // eslint-disable-next-line no-console\n console.log(version)\n process.exit(0)\n }\n\n // Get the subcommand (first non-flag argument)\n const subcommand = this.args._[0]\n\n if (!subcommand) {\n helpMessage()\n process.exit(0)\n }\n\n // Debug command outputs plain text for copy-paste — skip styled intro\n if (subcommand === 'debug') {\n await debugCommand()\n process.exit(0)\n }\n\n // eslint-disable-next-line no-console\n console.log('\\n')\n p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')))\n\n // Route to appropriate command handler\n switch (subcommand) {\n case 'build-lambda-zip':\n await buildLambdaZipCommand()\n break\n\n case 'deploy':\n await deployCommand({\n id: this.args['--id'],\n debug: this.args['--debug'],\n skipBuild: this.args['--skip-build'],\n yes: this.args['--yes'],\n })\n break\n\n case 'init':\n await initCommand({\n id: this.args['--id'],\n name: this.args['--name'],\n debug: this.args['--debug'],\n force: this.args['--force'],\n skipAuth: this.args['--skip-auth'],\n })\n break\n\n case 'list-tokens':\n listTokensCommand({\n all: this.args['--all'],\n debug: this.args['--debug'],\n })\n break\n\n case 'login':\n await loginCommand()\n break\n\n case 'logout':\n await logoutCommand({\n all: this.args['--all'],\n debug: this.args['--debug'],\n })\n break\n\n default:\n p.log.error(pc.red(`Unknown command: ${subcommand}`))\n p.note('Use --help to see available commands', 'Tip')\n process.exit(1)\n }\n\n process.exit(0)\n } catch (err: unknown) {\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : 'An error occurred')\n process.exit(1)\n }\n }\n}\n"],"names":["p","arg","pc","buildLambdaZipCommand","debugCommand","deployCommand","initCommand","listTokensCommand","loginCommand","logoutCommand","setEnvironment","helpMessage","main","Main","init","e","Error","console","error","message","args","Boolean","String","permissive","process","env","DEBUG","envArg","toLowerCase","exit","getOwnVersion","version","log","subcommand","_","intro","bgCyan","black","id","debug","skipBuild","yes","name","force","skipAuth","all","red","note","err"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Handle the `@payloadcms/figma debug` command
3
+ *
4
+ * Outputs environment, auth, project, and package info for debugging.
5
+ * All data is local — no network calls are made.
6
+ */
7
+ export declare function debugCommand(): Promise<void>;
8
+ //# sourceMappingURL=debug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/commands/debug.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAclD"}