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

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 (79) 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/cli.d.ts.map +1 -1
  5. package/dist/cli.js +6 -0
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/debug.d.ts +8 -0
  8. package/dist/commands/debug.d.ts.map +1 -0
  9. package/dist/commands/debug.js +156 -0
  10. package/dist/commands/debug.js.map +1 -0
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +17 -14
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/db-content-api/index.d.ts.map +1 -1
  15. package/dist/db-content-api/index.js +26 -7
  16. package/dist/db-content-api/index.js.map +1 -1
  17. package/dist/db-content-api/temp-utilities/types.d.ts +22 -0
  18. package/dist/db-content-api/temp-utilities/types.d.ts.map +1 -0
  19. package/dist/db-content-api/temp-utilities/types.js +15 -0
  20. package/dist/db-content-api/temp-utilities/types.js.map +1 -0
  21. package/dist/db-content-api/utilities/data/index.d.ts +14 -4
  22. package/dist/db-content-api/utilities/data/index.d.ts.map +1 -1
  23. package/dist/db-content-api/utilities/data/index.js +15 -8
  24. package/dist/db-content-api/utilities/data/index.js.map +1 -1
  25. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +23 -0
  26. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts.map +1 -0
  27. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +42 -0
  28. package/dist/db-content-api/utilities/data/transformPublishedLocale.js.map +1 -0
  29. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts.map +1 -1
  30. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +11 -0
  31. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js.map +1 -1
  32. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +17 -2
  33. package/dist/db-content-api/utilities/meta/buildMeta.d.ts.map +1 -1
  34. package/dist/db-content-api/utilities/meta/buildMeta.js +4 -1
  35. package/dist/db-content-api/utilities/meta/buildMeta.js.map +1 -1
  36. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +8 -2
  37. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts.map +1 -1
  38. package/dist/db-content-api/utilities/meta/buildPathTypes.js +41 -11
  39. package/dist/db-content-api/utilities/meta/buildPathTypes.js.map +1 -1
  40. package/dist/db-content-api/utilities/where.d.ts +8 -0
  41. package/dist/db-content-api/utilities/where.d.ts.map +1 -1
  42. package/dist/db-content-api/utilities/where.js +6 -0
  43. package/dist/db-content-api/utilities/where.js.map +1 -1
  44. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  45. package/dist/oauth/endpoints/getLoginEndpoint.js +18 -13
  46. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  47. package/dist/templates/README.md +1 -1
  48. package/dist/types/config.d.ts +2 -1
  49. package/dist/types/config.d.ts.map +1 -1
  50. package/dist/types/config.js +0 -2
  51. package/dist/types/config.js.map +1 -1
  52. package/dist/types.d.ts +0 -1
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js.map +1 -1
  55. package/dist/utils/lambda-config.d.ts +1 -1
  56. package/dist/utils/lambda-config.d.ts.map +1 -1
  57. package/dist/utils/lambda-config.js +2 -2
  58. package/dist/utils/lambda-config.js.map +1 -1
  59. package/dist/utils/messages.d.ts +1 -1
  60. package/dist/utils/messages.d.ts.map +1 -1
  61. package/dist/utils/messages.js +1 -0
  62. package/dist/utils/messages.js.map +1 -1
  63. package/dist/utils/package-manager.d.ts +24 -0
  64. package/dist/utils/package-manager.d.ts.map +1 -1
  65. package/dist/utils/package-manager.js +53 -0
  66. package/dist/utils/package-manager.js.map +1 -1
  67. package/dist/utils/payload-config-modifier.d.ts +1 -1
  68. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  69. package/dist/utils/payload-config-modifier.js +4 -3
  70. package/dist/utils/payload-config-modifier.js.map +1 -1
  71. package/dist/utils/project.d.ts +3 -2
  72. package/dist/utils/project.d.ts.map +1 -1
  73. package/dist/utils/project.js +4 -2
  74. package/dist/utils/project.js.map +1 -1
  75. package/package.json +1 -1
  76. package/dist/db-content-api/utilities/meta/index.d.ts +0 -5
  77. package/dist/db-content-api/utilities/meta/index.d.ts.map +0 -1
  78. package/dist/db-content-api/utilities/meta/index.js +0 -5
  79. 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":"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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"}
@@ -0,0 +1,156 @@
1
+ import fsSync from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import { getTokenStore } from '../auth/token-store.js';
6
+ import { getEnvironment } from '../constants.js';
7
+ import { getEnvVarSync } from '../utils/env-management.js';
8
+ import { maskToken } from '../utils/token-display.js';
9
+ import { getOwnVersion } from '../utils/version-check.js';
10
+ /**
11
+ * Handle the `@payloadcms/figma debug` command
12
+ *
13
+ * Outputs environment, auth, project, and package info for debugging.
14
+ * All data is local — no network calls are made.
15
+ */ export async function debugCommand() {
16
+ const env = getEnvironment();
17
+ const tokenStore = getTokenStore(env);
18
+ const cwd = process.cwd();
19
+ const lines = [
20
+ 'Debug Info:',
21
+ ''
22
+ ];
23
+ appendSystemSection(lines, env);
24
+ appendAuthSection(lines, tokenStore, cwd);
25
+ appendProjectSection(lines, tokenStore, cwd);
26
+ await appendPackagesSection(lines);
27
+ // eslint-disable-next-line no-console
28
+ console.log(lines.join('\n'));
29
+ }
30
+ function appendSystemSection(lines, env) {
31
+ lines.push(`Environment: ${env}`);
32
+ lines.push(`Node: ${process.version}`);
33
+ lines.push(`OS: ${os.platform()} ${os.arch()}`);
34
+ lines.push('');
35
+ }
36
+ function appendAuthSection(lines, tokenStore, cwd) {
37
+ const tokens = tokenStore.getTokens();
38
+ lines.push('Auth:');
39
+ if (!tokens) {
40
+ lines.push(' Status: Not authenticated');
41
+ lines.push('');
42
+ return;
43
+ }
44
+ const isValid = tokenStore.hasValidTokens();
45
+ lines.push(` Status: ${isValid ? 'Authenticated' : 'Token expired'}`);
46
+ const email = getEmailFromClaims(tokenStore, cwd);
47
+ if (email) {
48
+ lines.push(` Email: ${email}`);
49
+ } else if (tokens.userId) {
50
+ lines.push(` User ID: ${tokens.userId}`);
51
+ }
52
+ lines.push(` Token Expires: ${formatExpiryTime(tokens.expiresAt)}`);
53
+ lines.push('');
54
+ }
55
+ function appendProjectSection(lines, tokenStore, cwd) {
56
+ const contentSystemId = getEnvVarSync(cwd, 'FIGMA_CONTENT_SYSTEM_ID');
57
+ const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID');
58
+ const oauthClientId = getEnvVarSync(cwd, 'FIGMA_OAUTH_CLIENT_ID');
59
+ lines.push('Project:');
60
+ if (!contentSystemId && !tenantId && !oauthClientId) {
61
+ lines.push(" Not initialized (run 'init' first)");
62
+ lines.push('');
63
+ return;
64
+ }
65
+ if (contentSystemId) {
66
+ lines.push(` Content System ID: ${contentSystemId}`);
67
+ }
68
+ if (tenantId) {
69
+ lines.push(` Tenant ID: ${tenantId}`);
70
+ }
71
+ if (oauthClientId) {
72
+ lines.push(` OAuth Client ID: ${maskToken(oauthClientId)}`);
73
+ }
74
+ if (contentSystemId) {
75
+ const projectToken = tokenStore.getProjectToken(contentSystemId);
76
+ if (projectToken) {
77
+ lines.push(` Project Token: ${formatExpiryTime(projectToken.expiresAt)}`);
78
+ }
79
+ }
80
+ lines.push('');
81
+ }
82
+ async function appendPackagesSection(lines) {
83
+ lines.push('Packages:');
84
+ const cliVersion = await getOwnVersion();
85
+ lines.push(` @payloadcms/figma: ${cliVersion}`);
86
+ const payloadVersion = getPayloadVersion();
87
+ lines.push(` payload: ${payloadVersion}`);
88
+ }
89
+ /**
90
+ * Try env-based tenant ID first, then iterate all stored project tokens.
91
+ */ function getEmailFromClaims(tokenStore, cwd) {
92
+ const tenantId = getEnvVarSync(cwd, 'FIGMA_TENANT_ID');
93
+ if (tenantId) {
94
+ const email = tokenStore.getProjectTokenClaims(tenantId)?.email;
95
+ if (email) {
96
+ return email;
97
+ }
98
+ }
99
+ for (const id of tokenStore.getAllProjectTokenTenantIds()){
100
+ const email = tokenStore.getProjectTokenClaims(id)?.email;
101
+ if (email) {
102
+ return email;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ function getPayloadVersion() {
108
+ try {
109
+ const require = createRequire(path.join(process.cwd(), 'noop.js'));
110
+ const resolved = require.resolve('payload');
111
+ const packageJsonPath = findPackageJson(path.dirname(resolved));
112
+ if (!packageJsonPath) {
113
+ return 'not found';
114
+ }
115
+ const content = fsSync.readFileSync(packageJsonPath, 'utf-8');
116
+ return JSON.parse(content).version;
117
+ } catch {
118
+ return 'not found';
119
+ }
120
+ }
121
+ function findPackageJson(dir) {
122
+ const { root } = path.parse(dir);
123
+ while(dir !== root){
124
+ const candidate = path.join(dir, 'package.json');
125
+ if (fsSync.existsSync(candidate)) {
126
+ return candidate;
127
+ }
128
+ dir = path.dirname(dir);
129
+ }
130
+ return null;
131
+ }
132
+ /**
133
+ * Format expiry timestamp as ISO string with relative time
134
+ * e.g. "2026-02-11T10:30:00.000Z (in 23h 15m)" or "2026-02-10T08:00:00.000Z (expired 2h ago)"
135
+ */ function formatExpiryTime(expiresAt) {
136
+ const iso = new Date(expiresAt).toISOString();
137
+ const diff = expiresAt - Date.now();
138
+ if (diff < 0) {
139
+ return `${iso} (expired ${formatDuration(Math.abs(diff))} ago)`;
140
+ }
141
+ return `${iso} (in ${formatDuration(diff)})`;
142
+ }
143
+ function formatDuration(ms) {
144
+ const minutes = Math.floor(ms / 60000);
145
+ const hours = Math.floor(minutes / 60);
146
+ const days = Math.floor(hours / 24);
147
+ if (days > 0) {
148
+ return `${days}d ${hours % 24}h`;
149
+ }
150
+ if (hours > 0) {
151
+ return `${hours}h ${minutes % 60}m`;
152
+ }
153
+ return `${minutes}m`;
154
+ }
155
+
156
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +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 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmCA;;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,CAuX5E"}