@payloadcms/figma 0.0.1-alpha.48 → 0.0.1-alpha.49
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.
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +15 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +6 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/constants.d.ts +5 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/db-content-api/index.d.ts.map +1 -1
- package/dist/db-content-api/index.js +12 -1
- package/dist/db-content-api/index.js.map +1 -1
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +6 -0
- package/dist/plugin/build-config.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gBAAgB;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gCAAgC;IAChC,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA6BD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0QhF"}
|
package/dist/commands/deploy.js
CHANGED
|
@@ -2,10 +2,10 @@ import * as p from '@clack/prompts';
|
|
|
2
2
|
import spawn from 'cross-spawn';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import pc from 'picocolors';
|
|
5
|
-
import { ControlPlaneError, createDeployment, performDeployment } from '../api/control-plane.js';
|
|
5
|
+
import { ControlPlaneError, createDeployment, getTenantDetails, performDeployment } from '../api/control-plane.js';
|
|
6
6
|
import { getValidAccessToken } from '../auth/oauth-flow.js';
|
|
7
7
|
import { getTokenStore } from '../auth/token-store.js';
|
|
8
|
-
import { getEnvironment } from '../constants.js';
|
|
8
|
+
import { CONTENT_SYSTEM_NOT_FOUND_MESSAGE, getEnvironment } from '../constants.js';
|
|
9
9
|
import { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js';
|
|
10
10
|
import { detectBuild, getBuildCommand } from '../utils/build-detection.js';
|
|
11
11
|
import { getEnvVar } from '../utils/env-management.js';
|
|
@@ -77,6 +77,19 @@ import { loginCommand } from './login.js';
|
|
|
77
77
|
process.exit(1);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
// ===== PREFLIGHT: Verify content system exists =====
|
|
81
|
+
spinner.start('Verifying content system...');
|
|
82
|
+
try {
|
|
83
|
+
await getTenantDetails(accessToken, tenantId);
|
|
84
|
+
spinner.stop(pc.green('✓ Content system verified'));
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (error instanceof ControlPlaneError && (error.statusCode === 404 || error.statusCode === 410)) {
|
|
87
|
+
spinner.stop(pc.red('✗ Content system not found'));
|
|
88
|
+
p.log.error(pc.red(CONTENT_SYSTEM_NOT_FOUND_MESSAGE));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
80
93
|
// ===== BUILD =====
|
|
81
94
|
let buildInfo;
|
|
82
95
|
if (options.skipBuild) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport spawn from 'cross-spawn'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport { ControlPlaneError, createDeployment, performDeployment } from '../api/control-plane.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js'\nimport { detectBuild, getBuildCommand } from '../utils/build-detection.js'\nimport { getEnvVar } from '../utils/env-management.js'\nimport * as log from '../utils/log.js'\nimport { getPackageManager } from '../utils/package-manager.js'\nimport { isInProjectDirectory } from '../utils/project.js'\nimport { uploadLambdaZip, uploadStaticAssets } from '../utils/s3-upload.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for deploy command\n */\nexport interface DeployCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Tenant ID */\n id?: string\n /** Skip the build step (use existing build) */\n skipBuild?: boolean\n /** Skip confirmation prompts */\n yes?: boolean\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B'\n }\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n\n/**\n * Format date to human-readable string in local time\n */\nfunction formatDate(date: Date): string {\n return date.toLocaleString('en-US', {\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n month: 'long',\n timeZoneName: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Execute the deploy command\n *\n * @param options - Command options\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const projectPath = process.cwd()\n const spinner = p.spinner()\n\n let tenantId = options.id\n if (!tenantId) {\n tenantId = (await getEnvVar(projectPath, 'FIGMA_TENANT_ID')) ?? undefined\n }\n if (!tenantId) {\n p.log.error(pc.red('✗ Tenant ID not found. Run `@payloadcms/figma init` first.'))\n process.exit(1)\n }\n\n try {\n // ===== PRE-FLIGHT CHECKS =====\n\n // Check if in project directory\n if (!(await isInProjectDirectory(projectPath))) {\n p.log.error(pc.red(\"✗ 'deploy' command is not available outside of a Payload project.\"))\n p.note(\n 'Create a project or connect an existing one to Figma: npx @payloadcms/figma init',\n 'Tip',\n )\n process.exit(1)\n }\n\n // Check authentication\n const tokenStore = getTokenStore(getEnvironment())\n\n let accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.message('Please log in to continue')\n await loginCommand()\n accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.error(pc.red('✗ Authentication failed'))\n process.exit(1)\n }\n }\n\n // ===== BUILD =====\n\n let buildInfo: Awaited<ReturnType<typeof detectBuild>>\n\n if (options.skipBuild) {\n // User asserts build exists - verify it\n spinner.start('Checking for build...')\n buildInfo = await detectBuild(projectPath)\n\n if (!buildInfo) {\n spinner.stop(pc.red('✗ No build found'))\n p.log.error('Use deploy without --skip-build to build first.')\n process.exit(1)\n }\n\n spinner.stop(pc.green('✓ Build found'))\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n ].join('\\n'),\n 'Build Details',\n )\n } else {\n // Always build (no prompt)\n const buildCmd = await getBuildCommand(projectPath)\n\n if (!buildCmd) {\n p.log.error('No build script found in package.json')\n p.note('Add a build script to package.json: \"build\": \"next build\"', 'Tip')\n process.exit(1)\n }\n\n const packageManager = await getPackageManager(projectPath)\n const buildCommand = `${packageManager} run build`\n p.log.step(`Running ${buildCommand}...\\n`)\n\n try {\n // Stream build output to user with formatting\n const buildProcess = spawn(packageManager, ['run', 'build'], {\n cwd: projectPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Indent and dim output\n buildProcess.stdout?.on('data', (data) => {\n const lines = data.toString().split(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\n }\n })\n })\n\n buildProcess.stderr?.on('data', (data) => {\n const lines = data.toString().split(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\n }\n })\n })\n\n const exitCode = await new Promise<number>((resolve) => {\n buildProcess.on('close', resolve)\n })\n\n if (exitCode !== 0) {\n throw new Error(`Build process exited with code ${exitCode}`)\n }\n\n p.log.success(pc.green('✓ Build completed'))\n } catch (error) {\n p.log.error(pc.red('✗ Build failed'))\n if (error instanceof Error && options.debug) {\n log.error(`Build error: ${error.message}`)\n }\n process.exit(1)\n }\n\n // Verify build output\n buildInfo = await detectBuild(projectPath)\n if (!buildInfo) {\n p.log.error(pc.red('✗ Build completed but standalone build not found'))\n p.note('Ensure next.config.js has output: \"standalone\"', 'Check Lambda Configuration')\n process.exit(1)\n }\n }\n\n // ===== DEPLOYMENT PREPARATION =====\n\n // Create Lambda zip\n spinner.start('Creating deployment package...')\n try {\n await createLambdaZip(projectPath)\n spinner.stop(pc.green('✓ Deployment package created'))\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to create deployment package'))\n throw error\n }\n\n // Collect static assets\n spinner.start('Collecting static assets...')\n const staticAssets = await collectStaticAssets(projectPath)\n const zipPath = path.join(projectPath, 'lambda.zip')\n const zipSize = await getFileSize(zipPath)\n spinner.stop(pc.green(`✓ ${staticAssets.length} static assets detected`))\n\n log.debug(`Lambda zip size: ${formatBytes(zipSize)}`)\n log.debug(`Static assets: ${staticAssets.length} files`)\n\n // ===== DEPLOYMENT CONFIRMATION =====\n\n if (!options.yes) {\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n `${pc.cyan('Code size:')} ${formatBytes(zipSize)}`,\n `${pc.cyan('Static assets:')} ${staticAssets.length} files`,\n ].join('\\n'),\n 'Details',\n )\n }\n\n // ===== DEPLOYMENT EXECUTION =====\n\n // Step 1: Create deployment\n spinner.start('Creating deployment...')\n const createResponse = await createDeployment(accessToken, tenantId, {\n staticAssets,\n })\n\n const deploymentId = createResponse.deploymentId\n const codeUploadUrl = createResponse.codeUploadUrl\n const staticAssetUploadUrls = createResponse.staticAssetUploadUrls\n\n log.debug(`Deployment ID: ${deploymentId}`)\n\n // Step 2: Upload code\n spinner.message(`Uploading code (${formatBytes(zipSize)})...`)\n await uploadLambdaZip(zipPath, codeUploadUrl)\n spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`))\n\n // Step 3: Upload static assets\n if (staticAssets.length > 0) {\n spinner.start('Uploading static assets...')\n\n const uploadResults = await uploadStaticAssets(\n projectPath,\n staticAssetUploadUrls,\n (uploaded, total) => {\n spinner.message(`Uploading static assets (${uploaded}/${total})...`)\n },\n )\n\n if (uploadResults.assetsFailed > 0) {\n spinner.stop(\n pc.yellow(\n `⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`,\n ),\n )\n p.log.warning(\n `${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`,\n )\n } else {\n spinner.stop(\n pc.green(\n `✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`,\n ),\n )\n }\n }\n\n // Step 4: Perform deployment\n spinner.start('Performing deployment...')\n const result = await performDeployment(accessToken, tenantId, {\n deploymentId,\n })\n const tenantDomains = result.tenantDomains ?? []\n spinner.stop(pc.green('✓ Deployment initiated'))\n\n // TODO: Add deployment progress tracking\n // Future: Poll deployment status and show progress\n // API endpoint: GET /v1/tenant/{tenant_id}/deploy/{deployment_id}/status\n\n // Success output\n if (tenantDomains.length > 0) {\n p.log.step(`URL: ${pc.cyan(`https://${tenantDomains[0]}`)}`)\n }\n p.log.step('This usually takes 2-3 minutes to complete.')\n } catch (error) {\n if (error instanceof ControlPlaneError) {\n spinner.stop(pc.red(`✗ ${error.message}`))\n if (error.statusCode) {\n p.log.message(pc.dim(` HTTP ${error.statusCode}`))\n }\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error'\n spinner.stop(pc.red(`✗ ${message}`))\n }\n\n if (options.debug && error instanceof Error && error.stack) {\n log.error(`Stack trace: ${error.stack}`)\n }\n process.exit(1)\n }\n}\n"],"names":["p","spawn","path","pc","ControlPlaneError","createDeployment","performDeployment","getValidAccessToken","getTokenStore","getEnvironment","collectStaticAssets","createLambdaZip","getFileSize","detectBuild","getBuildCommand","getEnvVar","log","getPackageManager","isInProjectDirectory","uploadLambdaZip","uploadStaticAssets","loginCommand","formatBytes","bytes","k","sizes","i","Math","floor","parseFloat","pow","toFixed","formatDate","date","toLocaleString","day","hour","minute","month","timeZoneName","year","deployCommand","options","projectPath","process","cwd","spinner","tenantId","id","undefined","error","red","exit","note","tokenStore","accessToken","message","buildInfo","skipBuild","start","stop","green","cyan","buildId","timestamp","join","buildCmd","packageManager","buildCommand","step","buildProcess","stdio","stdout","on","data","lines","toString","split","forEach","line","trim","console","dim","stderr","exitCode","Promise","resolve","Error","success","debug","staticAssets","zipPath","zipSize","length","yes","createResponse","deploymentId","codeUploadUrl","staticAssetUploadUrls","uploadResults","uploaded","total","assetsFailed","yellow","assetsUploaded","warning","totalBytesUploaded","result","tenantDomains","statusCode","stack"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport spawn from 'cross-spawn'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport {\n ControlPlaneError,\n createDeployment,\n getTenantDetails,\n performDeployment,\n} from '../api/control-plane.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { CONTENT_SYSTEM_NOT_FOUND_MESSAGE, getEnvironment } from '../constants.js'\nimport { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js'\nimport { detectBuild, getBuildCommand } from '../utils/build-detection.js'\nimport { getEnvVar } from '../utils/env-management.js'\nimport * as log from '../utils/log.js'\nimport { getPackageManager } from '../utils/package-manager.js'\nimport { isInProjectDirectory } from '../utils/project.js'\nimport { uploadLambdaZip, uploadStaticAssets } from '../utils/s3-upload.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for deploy command\n */\nexport interface DeployCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Tenant ID */\n id?: string\n /** Skip the build step (use existing build) */\n skipBuild?: boolean\n /** Skip confirmation prompts */\n yes?: boolean\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B'\n }\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n\n/**\n * Format date to human-readable string in local time\n */\nfunction formatDate(date: Date): string {\n return date.toLocaleString('en-US', {\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n month: 'long',\n timeZoneName: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Execute the deploy command\n *\n * @param options - Command options\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const projectPath = process.cwd()\n const spinner = p.spinner()\n\n let tenantId = options.id\n if (!tenantId) {\n tenantId = (await getEnvVar(projectPath, 'FIGMA_TENANT_ID')) ?? undefined\n }\n if (!tenantId) {\n p.log.error(pc.red('✗ Tenant ID not found. Run `@payloadcms/figma init` first.'))\n process.exit(1)\n }\n\n try {\n // ===== PRE-FLIGHT CHECKS =====\n\n // Check if in project directory\n if (!(await isInProjectDirectory(projectPath))) {\n p.log.error(pc.red(\"✗ 'deploy' command is not available outside of a Payload project.\"))\n p.note(\n 'Create a project or connect an existing one to Figma: npx @payloadcms/figma init',\n 'Tip',\n )\n process.exit(1)\n }\n\n // Check authentication\n const tokenStore = getTokenStore(getEnvironment())\n\n let accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.message('Please log in to continue')\n await loginCommand()\n accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.error(pc.red('✗ Authentication failed'))\n process.exit(1)\n }\n }\n\n // ===== PREFLIGHT: Verify content system exists =====\n spinner.start('Verifying content system...')\n try {\n await getTenantDetails(accessToken, tenantId)\n spinner.stop(pc.green('✓ Content system verified'))\n } catch (error) {\n if (\n error instanceof ControlPlaneError &&\n (error.statusCode === 404 || error.statusCode === 410)\n ) {\n spinner.stop(pc.red('✗ Content system not found'))\n p.log.error(pc.red(CONTENT_SYSTEM_NOT_FOUND_MESSAGE))\n process.exit(1)\n }\n throw error\n }\n\n // ===== BUILD =====\n\n let buildInfo: Awaited<ReturnType<typeof detectBuild>>\n\n if (options.skipBuild) {\n // User asserts build exists - verify it\n spinner.start('Checking for build...')\n buildInfo = await detectBuild(projectPath)\n\n if (!buildInfo) {\n spinner.stop(pc.red('✗ No build found'))\n p.log.error('Use deploy without --skip-build to build first.')\n process.exit(1)\n }\n\n spinner.stop(pc.green('✓ Build found'))\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n ].join('\\n'),\n 'Build Details',\n )\n } else {\n // Always build (no prompt)\n const buildCmd = await getBuildCommand(projectPath)\n\n if (!buildCmd) {\n p.log.error('No build script found in package.json')\n p.note('Add a build script to package.json: \"build\": \"next build\"', 'Tip')\n process.exit(1)\n }\n\n const packageManager = await getPackageManager(projectPath)\n const buildCommand = `${packageManager} run build`\n p.log.step(`Running ${buildCommand}...\\n`)\n\n try {\n // Stream build output to user with formatting\n const buildProcess = spawn(packageManager, ['run', 'build'], {\n cwd: projectPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Indent and dim output\n buildProcess.stdout?.on('data', (data) => {\n const lines = data.toString().split(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\n }\n })\n })\n\n buildProcess.stderr?.on('data', (data) => {\n const lines = data.toString().split(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\n }\n })\n })\n\n const exitCode = await new Promise<number>((resolve) => {\n buildProcess.on('close', resolve)\n })\n\n if (exitCode !== 0) {\n throw new Error(`Build process exited with code ${exitCode}`)\n }\n\n p.log.success(pc.green('✓ Build completed'))\n } catch (error) {\n p.log.error(pc.red('✗ Build failed'))\n if (error instanceof Error && options.debug) {\n log.error(`Build error: ${error.message}`)\n }\n process.exit(1)\n }\n\n // Verify build output\n buildInfo = await detectBuild(projectPath)\n if (!buildInfo) {\n p.log.error(pc.red('✗ Build completed but standalone build not found'))\n p.note('Ensure next.config.js has output: \"standalone\"', 'Check Lambda Configuration')\n process.exit(1)\n }\n }\n\n // ===== DEPLOYMENT PREPARATION =====\n\n // Create Lambda zip\n spinner.start('Creating deployment package...')\n try {\n await createLambdaZip(projectPath)\n spinner.stop(pc.green('✓ Deployment package created'))\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to create deployment package'))\n throw error\n }\n\n // Collect static assets\n spinner.start('Collecting static assets...')\n const staticAssets = await collectStaticAssets(projectPath)\n const zipPath = path.join(projectPath, 'lambda.zip')\n const zipSize = await getFileSize(zipPath)\n spinner.stop(pc.green(`✓ ${staticAssets.length} static assets detected`))\n\n log.debug(`Lambda zip size: ${formatBytes(zipSize)}`)\n log.debug(`Static assets: ${staticAssets.length} files`)\n\n // ===== DEPLOYMENT CONFIRMATION =====\n\n if (!options.yes) {\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n `${pc.cyan('Code size:')} ${formatBytes(zipSize)}`,\n `${pc.cyan('Static assets:')} ${staticAssets.length} files`,\n ].join('\\n'),\n 'Details',\n )\n }\n\n // ===== DEPLOYMENT EXECUTION =====\n\n // Step 1: Create deployment\n spinner.start('Creating deployment...')\n const createResponse = await createDeployment(accessToken, tenantId, {\n staticAssets,\n })\n\n const deploymentId = createResponse.deploymentId\n const codeUploadUrl = createResponse.codeUploadUrl\n const staticAssetUploadUrls = createResponse.staticAssetUploadUrls\n\n log.debug(`Deployment ID: ${deploymentId}`)\n\n // Step 2: Upload code\n spinner.message(`Uploading code (${formatBytes(zipSize)})...`)\n await uploadLambdaZip(zipPath, codeUploadUrl)\n spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`))\n\n // Step 3: Upload static assets\n if (staticAssets.length > 0) {\n spinner.start('Uploading static assets...')\n\n const uploadResults = await uploadStaticAssets(\n projectPath,\n staticAssetUploadUrls,\n (uploaded, total) => {\n spinner.message(`Uploading static assets (${uploaded}/${total})...`)\n },\n )\n\n if (uploadResults.assetsFailed > 0) {\n spinner.stop(\n pc.yellow(\n `⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`,\n ),\n )\n p.log.warning(\n `${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`,\n )\n } else {\n spinner.stop(\n pc.green(\n `✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`,\n ),\n )\n }\n }\n\n // Step 4: Perform deployment\n spinner.start('Performing deployment...')\n const result = await performDeployment(accessToken, tenantId, {\n deploymentId,\n })\n const tenantDomains = result.tenantDomains ?? []\n spinner.stop(pc.green('✓ Deployment initiated'))\n\n // TODO: Add deployment progress tracking\n // Future: Poll deployment status and show progress\n // API endpoint: GET /v1/tenant/{tenant_id}/deploy/{deployment_id}/status\n\n // Success output\n if (tenantDomains.length > 0) {\n p.log.step(`URL: ${pc.cyan(`https://${tenantDomains[0]}`)}`)\n }\n p.log.step('This usually takes 2-3 minutes to complete.')\n } catch (error) {\n if (error instanceof ControlPlaneError) {\n spinner.stop(pc.red(`✗ ${error.message}`))\n if (error.statusCode) {\n p.log.message(pc.dim(` HTTP ${error.statusCode}`))\n }\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error'\n spinner.stop(pc.red(`✗ ${message}`))\n }\n\n if (options.debug && error instanceof Error && error.stack) {\n log.error(`Stack trace: ${error.stack}`)\n }\n process.exit(1)\n }\n}\n"],"names":["p","spawn","path","pc","ControlPlaneError","createDeployment","getTenantDetails","performDeployment","getValidAccessToken","getTokenStore","CONTENT_SYSTEM_NOT_FOUND_MESSAGE","getEnvironment","collectStaticAssets","createLambdaZip","getFileSize","detectBuild","getBuildCommand","getEnvVar","log","getPackageManager","isInProjectDirectory","uploadLambdaZip","uploadStaticAssets","loginCommand","formatBytes","bytes","k","sizes","i","Math","floor","parseFloat","pow","toFixed","formatDate","date","toLocaleString","day","hour","minute","month","timeZoneName","year","deployCommand","options","projectPath","process","cwd","spinner","tenantId","id","undefined","error","red","exit","note","tokenStore","accessToken","message","start","stop","green","statusCode","buildInfo","skipBuild","cyan","buildId","timestamp","join","buildCmd","packageManager","buildCommand","step","buildProcess","stdio","stdout","on","data","lines","toString","split","forEach","line","trim","console","dim","stderr","exitCode","Promise","resolve","Error","success","debug","staticAssets","zipPath","zipSize","length","yes","createResponse","deploymentId","codeUploadUrl","staticAssetUploadUrls","uploadResults","uploaded","total","assetsFailed","yellow","assetsUploaded","warning","totalBytesUploaded","result","tenantDomains","stack"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAwCA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAoED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
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,CAmY5E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -2,12 +2,12 @@ import * as p from '@clack/prompts';
|
|
|
2
2
|
import fs from 'fs/promises';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import pc from 'picocolors';
|
|
5
|
-
import { getDatasetInfo } from '../api/control-plane.js';
|
|
5
|
+
import { ControlPlaneError, getDatasetInfo } from '../api/control-plane.js';
|
|
6
6
|
import { FigmaApiError } from '../api/figma-api.js';
|
|
7
7
|
import { getValidAccessToken } from '../auth/oauth-flow.js';
|
|
8
8
|
import { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js';
|
|
9
9
|
import { getTokenStore } from '../auth/token-store.js';
|
|
10
|
-
import { getEnvironment } from '../constants.js';
|
|
10
|
+
import { CONTENT_SYSTEM_NOT_FOUND_MESSAGE, getEnvironment } from '../constants.js';
|
|
11
11
|
import { ensureGitignore } from '../utils/config.js';
|
|
12
12
|
import { addOrUpdateEnvVar } from '../utils/env-management.js';
|
|
13
13
|
import { isDebug } from '../utils/is-debug.js';
|
|
@@ -135,6 +135,10 @@ import { loginCommand } from './login.js';
|
|
|
135
135
|
try {
|
|
136
136
|
datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId);
|
|
137
137
|
} catch (error) {
|
|
138
|
+
if (error instanceof ControlPlaneError && (error.statusCode === 404 || error.statusCode === 410)) {
|
|
139
|
+
p.log.error(pc.red(CONTENT_SYSTEM_NOT_FOUND_MESSAGE));
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
138
142
|
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
139
143
|
p.log.error(pc.red(`✗ Unable to fetch dataset info for content system "${contentSystemId}"`));
|
|
140
144
|
p.log.error(pc.dim(`Details: ${message}`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { getDatasetInfo } from '../api/control-plane.js'\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { ensureGitignore } from '../utils/config.js'\nimport { addOrUpdateEnvVar } from '../utils/env-management.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { applyLambdaModifications } from '../utils/lambda-config.js'\nimport * as log from '../utils/log.js'\nimport {\n detectPackageManagerFromEnvironment,\n getRunCommand,\n resolvePackageManager,\n} from '../utils/package-manager.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport { runScript } from '../utils/payload-package-check.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.js'\nimport { checkForUpdates, getOwnVersion } from '../utils/version-check.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for init command\n */\nexport interface InitCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Force reconfiguration of existing project */\n force?: boolean\n /** Content System ID to use */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Skip authentication check (for testing/development) */\n skipAuth?: boolean\n /** Skip prompts and use defaults where possible */\n yes?: boolean\n}\n\n/**\n * Generate and store project token for a content system\n * Non-blocking - will show warning but not exit on failure\n * Only shows feedback if DEBUG mode is enabled, otherwise runs silently\n *\n * @param tokenStore - Token store instance\n * @param contentSystemId - Content System ID to generate token for\n * @param spinner - Clack spinner instance for status updates (only used in debug mode)\n */\nasync function generateProjectTokenWithFeedback(\n tokenStore: TokenStore,\n contentSystemId: string,\n spinner: ReturnType<typeof p.spinner>,\n): Promise<void> {\n if (isDebug()) {\n spinner.start('Generating project token...')\n }\n\n try {\n const projectToken = await getValidProjectToken(tokenStore, contentSystemId)\n if (isDebug()) {\n if (projectToken) {\n spinner.stop(pc.green('✓ Project token generated'))\n } else {\n spinner.stop(pc.yellow('⚠ Project token not generated (authentication required)'))\n }\n }\n } catch (error) {\n if (isDebug()) {\n spinner.stop(pc.yellow('⚠ Project token generation failed'))\n }\n // Always show failures, even without debug\n if (error instanceof ProjectTokenError || error instanceof FigmaApiError) {\n log.warning(error.message)\n p.note(\n 'Project token is used for authenticating to the Content API.\\nYou can continue without it, but may need to regenerate later.',\n 'Note',\n )\n } else {\n log.warning(\n `Unable to retrieve project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n // Don't exit - token generation failure shouldn't block initialization\n }\n}\n\n/**\n * Fetch dataset info from the API\n * Throws on error - caller must handle\n */\nasync function fetchDatasetInfo(\n accessToken: string,\n datasetId: string,\n): Promise<{ oauthClientId: string; oauthClientSecret: string; tenantId: string }> {\n log.debug('Fetching dataset info...')\n\n const datasetInfo = await getDatasetInfo(accessToken, datasetId)\n log.debug('Dataset info retrieved successfully')\n return {\n oauthClientId: datasetInfo.oauthClientId,\n oauthClientSecret: datasetInfo.oauthClientSecret,\n tenantId: datasetInfo.tenantId,\n }\n}\n\n/**\n * Handle the `init` command\n *\n * Sets up a project by:\n * 1. Checking authentication\n * 2. Detecting/scaffolding Payload project\n * 3. Fetching tenant details\n * 4. Storing configuration\n *\n * @param options - Command options\n */\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n // Check for outdated version (non-blocking)\n const currentVersion = await getOwnVersion()\n await checkForUpdates(currentVersion)\n\n // Check authentication\n const tokenStore = getTokenStore(getEnvironment())\n const s = p.spinner()\n\n if (options.skipAuth) {\n // Skip authentication for testing/development\n p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'))\n } else {\n try {\n // Check for valid cached tokens first (no API call needed)\n if (!tokenStore.hasValidTokens()) {\n // Need to refresh or authenticate - show spinner for API call\n s.start('Checking authentication...')\n const token = await getValidAccessToken(tokenStore)\n if (!token) {\n s.stop('Authentication required to continue')\n\n // Run login command\n await loginCommand({ showNextSteps: false })\n\n // Get token after auth\n const newToken = await getValidAccessToken(tokenStore)\n if (!newToken) {\n p.log.error('Authentication failed')\n process.exit(1)\n }\n } else {\n s.stop(pc.green('✓ Authenticated'))\n }\n }\n } catch (error) {\n s.stop(pc.red('✗ Authentication failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n p.note('Run `figma auth` to authenticate', 'Tip')\n process.exit(1)\n }\n }\n\n // Note: We no longer check for figma.config.json here\n // Instead, the AST detection will check if figma object already exists in payload.config.ts\n // and skip modification if it does (unless --force is used)\n\n // Step 3: Get Content System ID (required argument)\n log.debug('Configuring Project...')\n\n if (!options.id) {\n p.log.error('Content System ID is required. Use --id <content_system_id>')\n process.exit(1)\n }\n\n const contentSystemId = options.id\n\n // Fetch dataset info (required - will fail if feature not enabled)\n let datasetInfo: { oauthClientId: string; oauthClientSecret: string; tenantId: string } | null =\n null\n if (!options.skipAuth) {\n const accessToken = await getValidAccessToken(tokenStore)\n if (accessToken) {\n try {\n datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId)\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n p.log.error(\n pc.red(`✗ Unable to fetch dataset info for content system \"${contentSystemId}\"`),\n )\n p.log.error(pc.dim(`Details: ${message}`))\n p.note(\n 'This may indicate the CMS feature is not enabled for your account.\\n' +\n 'Contact support if you believe this is an error.',\n 'Error',\n )\n process.exit(1)\n }\n }\n }\n\n // Step 4: Detect or scaffold Payload project\n const isInProject = await isInProjectDirectory()\n\n if (isInProject) {\n // ===== EXISTING PROJECT FLOW =====\n log.debug('Project directory detected')\n\n // Detect Payload\n const projectInfo = await detectPayloadProject()\n const packageManager = await resolvePackageManager(process.cwd())\n\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(process.cwd(), packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID',\n contentSystemId,\n )\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n } else {\n // Has package.json but no Payload - offer to add Payload\n p.log.warn(pc.yellow('⚠ No Payload detected in this project'))\n\n const shouldAddPayload = await p.confirm({\n initialValue: true,\n message: 'Would you like to add Payload to this project?',\n })\n\n if (p.isCancel(shouldAddPayload)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (!shouldAddPayload) {\n p.log.error('Payload is required to use Figma CMS')\n process.exit(1)\n }\n\n // TODO: Add Payload to existing project (future enhancement)\n p.log.error('Adding Payload to existing projects is not yet supported')\n p.note('Create a new project or manually add Payload dependencies', 'Action Required')\n process.exit(1)\n }\n\n // Generate import map to prevent errors on first dev run\n await runScript(process.cwd(), 'generate:importmap', packageManager)\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), packageManager)\n\n // Ensure .gitignore has required entries\n await ensureGitignore(process.cwd(), ['.env', '.env.local', 'lambda.zip'])\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = [`Start development server: \\`${getRunCommand(packageManager)} dev\\``].filter(\n Boolean,\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n const packageManager = detectPackageManagerFromEnvironment()\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName, packageManager)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n fullPath,\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n\n // Generate import map to prevent errors on first dev run\n await runScript(fullPath, 'generate:importmap', packageManager)\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n `${getRunCommand(packageManager)} dev or follow directions in README.md`,\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","getDatasetInfo","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","getEnvironment","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","detectPackageManagerFromEnvironment","getRunCommand","resolvePackageManager","displayManualInstructions","ensurePayloadFigmaConfig","runScript","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","checkForUpdates","getOwnVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","fetchDatasetInfo","accessToken","datasetId","debug","datasetInfo","oauthClientId","oauthClientSecret","tenantId","initCommand","options","currentVersion","s","skipAuth","warn","hasValidTokens","token","showNextSteps","newToken","process","exit","red","id","dim","isInProject","projectInfo","packageManager","cwd","hasPayload","payloadVersion","success","hasDeps","shouldInstall","confirm","initialValue","isCancel","modResult","modified","changes","length","forEach","change","warnings","env","shouldAddPayload","cancel","outro","nextSteps","filter","Boolean","join","projectPathInput","text","placeholder","validate","value","undefined","projectPath","fullPath","resolve","projectName","name","basename","mkdir","recursive","step","bgGreen","black","relativePath","relative","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { ControlPlaneError, getDatasetInfo } from '../api/control-plane.js'\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { CONTENT_SYSTEM_NOT_FOUND_MESSAGE, getEnvironment } from '../constants.js'\nimport { ensureGitignore } from '../utils/config.js'\nimport { addOrUpdateEnvVar } from '../utils/env-management.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { applyLambdaModifications } from '../utils/lambda-config.js'\nimport * as log from '../utils/log.js'\nimport {\n detectPackageManagerFromEnvironment,\n getRunCommand,\n resolvePackageManager,\n} from '../utils/package-manager.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport { runScript } from '../utils/payload-package-check.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.js'\nimport { checkForUpdates, getOwnVersion } from '../utils/version-check.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for init command\n */\nexport interface InitCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Force reconfiguration of existing project */\n force?: boolean\n /** Content System ID to use */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Skip authentication check (for testing/development) */\n skipAuth?: boolean\n /** Skip prompts and use defaults where possible */\n yes?: boolean\n}\n\n/**\n * Generate and store project token for a content system\n * Non-blocking - will show warning but not exit on failure\n * Only shows feedback if DEBUG mode is enabled, otherwise runs silently\n *\n * @param tokenStore - Token store instance\n * @param contentSystemId - Content System ID to generate token for\n * @param spinner - Clack spinner instance for status updates (only used in debug mode)\n */\nasync function generateProjectTokenWithFeedback(\n tokenStore: TokenStore,\n contentSystemId: string,\n spinner: ReturnType<typeof p.spinner>,\n): Promise<void> {\n if (isDebug()) {\n spinner.start('Generating project token...')\n }\n\n try {\n const projectToken = await getValidProjectToken(tokenStore, contentSystemId)\n if (isDebug()) {\n if (projectToken) {\n spinner.stop(pc.green('✓ Project token generated'))\n } else {\n spinner.stop(pc.yellow('⚠ Project token not generated (authentication required)'))\n }\n }\n } catch (error) {\n if (isDebug()) {\n spinner.stop(pc.yellow('⚠ Project token generation failed'))\n }\n // Always show failures, even without debug\n if (error instanceof ProjectTokenError || error instanceof FigmaApiError) {\n log.warning(error.message)\n p.note(\n 'Project token is used for authenticating to the Content API.\\nYou can continue without it, but may need to regenerate later.',\n 'Note',\n )\n } else {\n log.warning(\n `Unable to retrieve project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n // Don't exit - token generation failure shouldn't block initialization\n }\n}\n\n/**\n * Fetch dataset info from the API\n * Throws on error - caller must handle\n */\nasync function fetchDatasetInfo(\n accessToken: string,\n datasetId: string,\n): Promise<{ oauthClientId: string; oauthClientSecret: string; tenantId: string }> {\n log.debug('Fetching dataset info...')\n\n const datasetInfo = await getDatasetInfo(accessToken, datasetId)\n log.debug('Dataset info retrieved successfully')\n return {\n oauthClientId: datasetInfo.oauthClientId,\n oauthClientSecret: datasetInfo.oauthClientSecret,\n tenantId: datasetInfo.tenantId,\n }\n}\n\n/**\n * Handle the `init` command\n *\n * Sets up a project by:\n * 1. Checking authentication\n * 2. Detecting/scaffolding Payload project\n * 3. Fetching tenant details\n * 4. Storing configuration\n *\n * @param options - Command options\n */\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n // Check for outdated version (non-blocking)\n const currentVersion = await getOwnVersion()\n await checkForUpdates(currentVersion)\n\n // Check authentication\n const tokenStore = getTokenStore(getEnvironment())\n const s = p.spinner()\n\n if (options.skipAuth) {\n // Skip authentication for testing/development\n p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'))\n } else {\n try {\n // Check for valid cached tokens first (no API call needed)\n if (!tokenStore.hasValidTokens()) {\n // Need to refresh or authenticate - show spinner for API call\n s.start('Checking authentication...')\n const token = await getValidAccessToken(tokenStore)\n if (!token) {\n s.stop('Authentication required to continue')\n\n // Run login command\n await loginCommand({ showNextSteps: false })\n\n // Get token after auth\n const newToken = await getValidAccessToken(tokenStore)\n if (!newToken) {\n p.log.error('Authentication failed')\n process.exit(1)\n }\n } else {\n s.stop(pc.green('✓ Authenticated'))\n }\n }\n } catch (error) {\n s.stop(pc.red('✗ Authentication failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n p.note('Run `figma auth` to authenticate', 'Tip')\n process.exit(1)\n }\n }\n\n // Note: We no longer check for figma.config.json here\n // Instead, the AST detection will check if figma object already exists in payload.config.ts\n // and skip modification if it does (unless --force is used)\n\n // Step 3: Get Content System ID (required argument)\n log.debug('Configuring Project...')\n\n if (!options.id) {\n p.log.error('Content System ID is required. Use --id <content_system_id>')\n process.exit(1)\n }\n\n const contentSystemId = options.id\n\n // Fetch dataset info (required - will fail if feature not enabled)\n let datasetInfo: { oauthClientId: string; oauthClientSecret: string; tenantId: string } | null =\n null\n if (!options.skipAuth) {\n const accessToken = await getValidAccessToken(tokenStore)\n if (accessToken) {\n try {\n datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId)\n } catch (error) {\n if (\n error instanceof ControlPlaneError &&\n (error.statusCode === 404 || error.statusCode === 410)\n ) {\n p.log.error(pc.red(CONTENT_SYSTEM_NOT_FOUND_MESSAGE))\n process.exit(1)\n }\n\n const message = error instanceof Error ? error.message : 'Unknown error'\n p.log.error(\n pc.red(`✗ Unable to fetch dataset info for content system \"${contentSystemId}\"`),\n )\n p.log.error(pc.dim(`Details: ${message}`))\n p.note(\n 'This may indicate the CMS feature is not enabled for your account.\\n' +\n 'Contact support if you believe this is an error.',\n 'Error',\n )\n process.exit(1)\n }\n }\n }\n\n // Step 4: Detect or scaffold Payload project\n const isInProject = await isInProjectDirectory()\n\n if (isInProject) {\n // ===== EXISTING PROJECT FLOW =====\n log.debug('Project directory detected')\n\n // Detect Payload\n const projectInfo = await detectPayloadProject()\n const packageManager = await resolvePackageManager(process.cwd())\n\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(process.cwd(), packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID',\n contentSystemId,\n )\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n } else {\n // Has package.json but no Payload - offer to add Payload\n p.log.warn(pc.yellow('⚠ No Payload detected in this project'))\n\n const shouldAddPayload = await p.confirm({\n initialValue: true,\n message: 'Would you like to add Payload to this project?',\n })\n\n if (p.isCancel(shouldAddPayload)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (!shouldAddPayload) {\n p.log.error('Payload is required to use Figma CMS')\n process.exit(1)\n }\n\n // TODO: Add Payload to existing project (future enhancement)\n p.log.error('Adding Payload to existing projects is not yet supported')\n p.note('Create a new project or manually add Payload dependencies', 'Action Required')\n process.exit(1)\n }\n\n // Generate import map to prevent errors on first dev run\n await runScript(process.cwd(), 'generate:importmap', packageManager)\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), packageManager)\n\n // Ensure .gitignore has required entries\n await ensureGitignore(process.cwd(), ['.env', '.env.local', 'lambda.zip'])\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = [`Start development server: \\`${getRunCommand(packageManager)} dev\\``].filter(\n Boolean,\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n const packageManager = detectPackageManagerFromEnvironment()\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName, packageManager)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, packageManager)\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, packageManager, {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error', packageManager)\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_API_CONTENT_SYSTEM_ID to .env file`)\n\n const env = getEnvironment()\n if (env !== 'production') {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env)\n log.debug(`Added FIGMA_ENV=${env} to .env file`)\n }\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n fullPath,\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n\n // Generate import map to prevent errors on first dev run\n await runScript(fullPath, 'generate:importmap', packageManager)\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n `${getRunCommand(packageManager)} dev or follow directions in README.md`,\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","ControlPlaneError","getDatasetInfo","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","CONTENT_SYSTEM_NOT_FOUND_MESSAGE","getEnvironment","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","detectPackageManagerFromEnvironment","getRunCommand","resolvePackageManager","displayManualInstructions","ensurePayloadFigmaConfig","runScript","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","checkForUpdates","getOwnVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","fetchDatasetInfo","accessToken","datasetId","debug","datasetInfo","oauthClientId","oauthClientSecret","tenantId","initCommand","options","currentVersion","s","skipAuth","warn","hasValidTokens","token","showNextSteps","newToken","process","exit","red","id","statusCode","dim","isInProject","projectInfo","packageManager","cwd","hasPayload","payloadVersion","success","hasDeps","shouldInstall","confirm","initialValue","isCancel","modResult","modified","changes","length","forEach","change","warnings","env","shouldAddPayload","cancel","outro","nextSteps","filter","Boolean","join","projectPathInput","text","placeholder","validate","value","undefined","projectPath","fullPath","resolve","projectName","name","basename","mkdir","recursive","step","bgGreen","black","relativePath","relative","push"],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -21,6 +21,11 @@ type EnvironmentConfig = {
|
|
|
21
21
|
* Selected via FIGMA_ENV ('production' | 'staging'), defaults to 'production'.
|
|
22
22
|
*/
|
|
23
23
|
export declare const ENV_CONFIG: Record<Environment, EnvironmentConfig>;
|
|
24
|
+
/**
|
|
25
|
+
* User-facing error message when Content API returns 404 or 410.
|
|
26
|
+
* Used across CLI commands and the db adapter for consistent messaging.
|
|
27
|
+
*/
|
|
28
|
+
export declare const CONTENT_SYSTEM_NOT_FOUND_MESSAGE = "Content system not found. Verify your Content System ID is correct, or contact your team admin for assistance.";
|
|
24
29
|
/**
|
|
25
30
|
* Set environment override (used by --env CLI flag)
|
|
26
31
|
* Pass undefined to clear the override
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,CAAA;AAElD,KAAK,iBAAiB,GAAG;IACvB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAA;IACxB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAiB7D,CAAA;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,CAAA;AAElD,KAAK,iBAAiB,GAAG;IACvB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAA;IAClB,yCAAyC;IACzC,gBAAgB,EAAE,MAAM,CAAA;IACxB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAA;IAChB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAA;IACrB,8BAA8B;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAiB7D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gCAAgC,mHACqE,CAAA;AAIlH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAEjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA0B5C"}
|
package/dist/constants.js
CHANGED
|
@@ -20,6 +20,10 @@ import { getEnvVarSync } from './utils/env-management.js';
|
|
|
20
20
|
jwksUri: 'https://static.figmacontentstaging.com/.well_known/jwks.json'
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* User-facing error message when Content API returns 404 or 410.
|
|
25
|
+
* Used across CLI commands and the db adapter for consistent messaging.
|
|
26
|
+
*/ export const CONTENT_SYSTEM_NOT_FOUND_MESSAGE = 'Content system not found. Verify your Content System ID is correct, or contact your team admin for assistance.';
|
|
23
27
|
let envOverride;
|
|
24
28
|
/**
|
|
25
29
|
* Set environment override (used by --env CLI flag)
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import { getEnvVarSync } from './utils/env-management.js'\n\n/**\n * Figma environment (production or staging)\n */\nexport type Environment = 'production' | 'staging'\n\ntype EnvironmentConfig = {\n /** Figma API base URL. Override: FIGMA_API_BASE_URL */\n apiBaseUrl: string\n /** OAuth authorization URL (CLI auth) */\n authorizationUrl: string\n /** OAuth client ID. Override: FIGMA_CLIENT_ID or FIGMA_OAUTH_CLIENT_ID */\n clientId: string\n /** Content API base URL. Override: FIGMA_CONTENT_API_URL */\n contentApiUrl: string\n /** OIDC discovery endpoint */\n identityMetadata: string\n /** JSON Web Key Set URL for token validation */\n jwksUri: string\n}\n\n/**\n * Environment-specific configuration for Figma integration.\n * Selected via FIGMA_ENV ('production' | 'staging'), defaults to 'production'.\n */\nexport const ENV_CONFIG: Record<Environment, EnvironmentConfig> = {\n production: {\n apiBaseUrl: 'https://api.figma.com',\n authorizationUrl: 'https://www.figma.com/oauth',\n clientId: 'lelKVTAzOekFnirnlAMbuD',\n contentApiUrl: 'https://us-east-1.cms-tenants-001-production.figmacontent.com',\n identityMetadata: 'https://www.figma.com/.well-known/openid-configuration',\n jwksUri: 'https://static.figmacontent.com/.well_known/jwks.json',\n },\n staging: {\n apiBaseUrl: 'https://api.staging.figma.com',\n authorizationUrl: 'https://staging.figma.com/oauth',\n clientId: 'wqAToBAp4UI9AZ5M6wTfT9',\n contentApiUrl: 'https://us-east-1.cms-tenants-001-staging.figmacontentstaging.com',\n identityMetadata: 'https://staging.figma.com/.well-known/openid-configuration',\n jwksUri: 'https://static.figmacontentstaging.com/.well_known/jwks.json',\n },\n}\n\nlet envOverride: Environment | undefined\n\n/**\n * Set environment override (used by --env CLI flag)\n * Pass undefined to clear the override\n */\nexport function setEnvironment(env: Environment | undefined): void {\n envOverride = env\n}\n\n/**\n * Get current Figma environment\n * Priority: 1) setEnvironment override, 2) FIGMA_ENV env var, 3) .env file, 4) 'production' default\n */\nexport function getEnvironment(): Environment {\n if (envOverride) {\n return envOverride\n }\n\n // Check process.env first (case-insensitive)\n if (process.env.FIGMA_ENV?.toLowerCase() === 'staging') {\n return 'staging'\n }\n\n // Fall back to .env file in cwd\n const envFileValue = getEnvVarSync(process.cwd(), 'FIGMA_ENV')\n if (envFileValue) {\n const env = envFileValue.toLowerCase()\n if (env === 'staging') {\n return 'staging'\n }\n if (env !== 'production') {\n console.warn(\n `Warning: Invalid FIGMA_ENV value \"${envFileValue}\" in .env file. Using production.`,\n )\n }\n return 'production'\n }\n\n return 'production'\n}\n"],"names":["getEnvVarSync","ENV_CONFIG","production","apiBaseUrl","authorizationUrl","clientId","contentApiUrl","identityMetadata","jwksUri","staging","envOverride","setEnvironment","env","getEnvironment","process","FIGMA_ENV","toLowerCase","envFileValue","cwd","console","warn"],"mappings":"AAAA,SAASA,aAAa,QAAQ,4BAA2B;AAsBzD;;;CAGC,GACD,OAAO,MAAMC,aAAqD;IAChEC,YAAY;QACVC,YAAY;QACZC,kBAAkB;QAClBC,UAAU;QACVC,eAAe;QACfC,kBAAkB;QAClBC,SAAS;IACX;IACAC,SAAS;QACPN,YAAY;QACZC,kBAAkB;QAClBC,UAAU;QACVC,eAAe;QACfC,kBAAkB;QAClBC,SAAS;IACX;AACF,EAAC;AAED,
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"sourcesContent":["import { getEnvVarSync } from './utils/env-management.js'\n\n/**\n * Figma environment (production or staging)\n */\nexport type Environment = 'production' | 'staging'\n\ntype EnvironmentConfig = {\n /** Figma API base URL. Override: FIGMA_API_BASE_URL */\n apiBaseUrl: string\n /** OAuth authorization URL (CLI auth) */\n authorizationUrl: string\n /** OAuth client ID. Override: FIGMA_CLIENT_ID or FIGMA_OAUTH_CLIENT_ID */\n clientId: string\n /** Content API base URL. Override: FIGMA_CONTENT_API_URL */\n contentApiUrl: string\n /** OIDC discovery endpoint */\n identityMetadata: string\n /** JSON Web Key Set URL for token validation */\n jwksUri: string\n}\n\n/**\n * Environment-specific configuration for Figma integration.\n * Selected via FIGMA_ENV ('production' | 'staging'), defaults to 'production'.\n */\nexport const ENV_CONFIG: Record<Environment, EnvironmentConfig> = {\n production: {\n apiBaseUrl: 'https://api.figma.com',\n authorizationUrl: 'https://www.figma.com/oauth',\n clientId: 'lelKVTAzOekFnirnlAMbuD',\n contentApiUrl: 'https://us-east-1.cms-tenants-001-production.figmacontent.com',\n identityMetadata: 'https://www.figma.com/.well-known/openid-configuration',\n jwksUri: 'https://static.figmacontent.com/.well_known/jwks.json',\n },\n staging: {\n apiBaseUrl: 'https://api.staging.figma.com',\n authorizationUrl: 'https://staging.figma.com/oauth',\n clientId: 'wqAToBAp4UI9AZ5M6wTfT9',\n contentApiUrl: 'https://us-east-1.cms-tenants-001-staging.figmacontentstaging.com',\n identityMetadata: 'https://staging.figma.com/.well-known/openid-configuration',\n jwksUri: 'https://static.figmacontentstaging.com/.well_known/jwks.json',\n },\n}\n\n/**\n * User-facing error message when Content API returns 404 or 410.\n * Used across CLI commands and the db adapter for consistent messaging.\n */\nexport const CONTENT_SYSTEM_NOT_FOUND_MESSAGE =\n 'Content system not found. Verify your Content System ID is correct, or contact your team admin for assistance.'\n\nlet envOverride: Environment | undefined\n\n/**\n * Set environment override (used by --env CLI flag)\n * Pass undefined to clear the override\n */\nexport function setEnvironment(env: Environment | undefined): void {\n envOverride = env\n}\n\n/**\n * Get current Figma environment\n * Priority: 1) setEnvironment override, 2) FIGMA_ENV env var, 3) .env file, 4) 'production' default\n */\nexport function getEnvironment(): Environment {\n if (envOverride) {\n return envOverride\n }\n\n // Check process.env first (case-insensitive)\n if (process.env.FIGMA_ENV?.toLowerCase() === 'staging') {\n return 'staging'\n }\n\n // Fall back to .env file in cwd\n const envFileValue = getEnvVarSync(process.cwd(), 'FIGMA_ENV')\n if (envFileValue) {\n const env = envFileValue.toLowerCase()\n if (env === 'staging') {\n return 'staging'\n }\n if (env !== 'production') {\n console.warn(\n `Warning: Invalid FIGMA_ENV value \"${envFileValue}\" in .env file. Using production.`,\n )\n }\n return 'production'\n }\n\n return 'production'\n}\n"],"names":["getEnvVarSync","ENV_CONFIG","production","apiBaseUrl","authorizationUrl","clientId","contentApiUrl","identityMetadata","jwksUri","staging","CONTENT_SYSTEM_NOT_FOUND_MESSAGE","envOverride","setEnvironment","env","getEnvironment","process","FIGMA_ENV","toLowerCase","envFileValue","cwd","console","warn"],"mappings":"AAAA,SAASA,aAAa,QAAQ,4BAA2B;AAsBzD;;;CAGC,GACD,OAAO,MAAMC,aAAqD;IAChEC,YAAY;QACVC,YAAY;QACZC,kBAAkB;QAClBC,UAAU;QACVC,eAAe;QACfC,kBAAkB;QAClBC,SAAS;IACX;IACAC,SAAS;QACPN,YAAY;QACZC,kBAAkB;QAClBC,UAAU;QACVC,eAAe;QACfC,kBAAkB;QAClBC,SAAS;IACX;AACF,EAAC;AAED;;;CAGC,GACD,OAAO,MAAME,mCACX,iHAAgH;AAElH,IAAIC;AAEJ;;;CAGC,GACD,OAAO,SAASC,eAAeC,GAA4B;IACzDF,cAAcE;AAChB;AAEA;;;CAGC,GACD,OAAO,SAASC;IACd,IAAIH,aAAa;QACf,OAAOA;IACT;IAEA,6CAA6C;IAC7C,IAAII,QAAQF,GAAG,CAACG,SAAS,EAAEC,kBAAkB,WAAW;QACtD,OAAO;IACT;IAEA,gCAAgC;IAChC,MAAMC,eAAelB,cAAce,QAAQI,GAAG,IAAI;IAClD,IAAID,cAAc;QAChB,MAAML,MAAMK,aAAaD,WAAW;QACpC,IAAIJ,QAAQ,WAAW;YACrB,OAAO;QACT;QACA,IAAIA,QAAQ,cAAc;YACxBO,QAAQC,IAAI,CACV,CAAC,kCAAkC,EAAEH,aAAa,iCAAiC,CAAC;QAExF;QACA,OAAO;IACT;IAEA,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db-content-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAcnB,kBAAkB,EA+BnB,MAAM,SAAS,CAAA;AAEhB,OAAO,YAAY,MAAM,eAAe,CAAA;AAIxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db-content-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAcnB,kBAAkB,EA+BnB,MAAM,SAAS,CAAA;AAEhB,OAAO,YAAY,MAAM,eAAe,CAAA;AAIxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AAO7D,OAAO,EAAE,KAAK,QAAQ,EAA+C,MAAM,qBAAqB,CAAA;AAOhG,KAAK,iBAAiB,GAAG;IACvB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,IAAI,EAAE,QAAQ,CAAA;IACd,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,QAAQ,CAAA;IACd,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9C,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,mBAAmB,CAAA;AAgrBvB,eAAO,MAAM,iBAAiB,SAAU,iBAAiB,KAAG,kBAyD1D,CAAA"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import createClient from 'openapi-fetch';
|
|
2
2
|
import { createDatabaseAdapter } from 'payload';
|
|
3
3
|
import { v4 as uuid } from 'uuid';
|
|
4
|
+
import { FigmaApiError } from '../api/figma-api.js';
|
|
5
|
+
import { CONTENT_SYSTEM_NOT_FOUND_MESSAGE } from '../constants.js';
|
|
4
6
|
import { getGlobalSlug } from './temp-utilities/slug.js';
|
|
5
7
|
import { addFallbackSort } from './temp-utilities/sorting.js';
|
|
6
8
|
import { unwrapDocument, unwrapFindResponse } from './temp-utilities/unwrapDocument.js';
|
|
@@ -13,13 +15,16 @@ import { convertPayloadWhereToContentAPI } from './utilities/where.js';
|
|
|
13
15
|
async function syncCollections() {
|
|
14
16
|
let existingIds;
|
|
15
17
|
try {
|
|
16
|
-
const { data: response, error } = await this.client.GET('/api/v0/content_systems/{contentSystemId}/collections', {
|
|
18
|
+
const { data: response, error, response: httpResponse } = await this.client.GET('/api/v0/content_systems/{contentSystemId}/collections', {
|
|
17
19
|
params: {
|
|
18
20
|
path: {
|
|
19
21
|
contentSystemId: this.contentSystemId
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
});
|
|
25
|
+
if (httpResponse.status === 404 || httpResponse.status === 410) {
|
|
26
|
+
throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE);
|
|
27
|
+
}
|
|
23
28
|
if (error) {
|
|
24
29
|
throw new Error(JSON.stringify(error));
|
|
25
30
|
}
|
|
@@ -29,6 +34,12 @@ async function syncCollections() {
|
|
|
29
34
|
existingIds = new Set(response.data.map((c)=>c.id));
|
|
30
35
|
this.payload.logger.info(`Found ${existingIds.size} existing collections`);
|
|
31
36
|
} catch (error) {
|
|
37
|
+
if (error instanceof Error && error.message === CONTENT_SYSTEM_NOT_FOUND_MESSAGE) {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
if (error instanceof FigmaApiError && (error.statusCode === 404 || error.statusCode === 410)) {
|
|
41
|
+
throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE);
|
|
42
|
+
}
|
|
32
43
|
this.payload.logger.warn(`Failed to fetch collections, will attempt to create all: ${error.message}`);
|
|
33
44
|
existingIds = new Set();
|
|
34
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db-content-api/index.ts"],"sourcesContent":["import type {\n BaseDatabaseAdapter,\n Count,\n CountArgs,\n CountGlobalVersionArgs,\n CountGlobalVersions,\n CountVersions,\n Create,\n CreateArgs,\n CreateGlobal,\n CreateGlobalArgs,\n CreateGlobalVersion,\n CreateGlobalVersionArgs,\n CreateVersion,\n CreateVersionArgs,\n DatabaseAdapterObj,\n DeleteMany,\n DeleteManyArgs,\n DeleteOne,\n DeleteOneArgs,\n DeleteVersions,\n DeleteVersionsArgs,\n Find,\n FindArgs,\n FindGlobal,\n FindGlobalArgs,\n FindGlobalVersions,\n FindGlobalVersionsArgs,\n FindOne,\n FindOneArgs,\n FindVersions,\n FindVersionsArgs,\n QueryDrafts,\n QueryDraftsArgs,\n UpdateGlobal,\n UpdateGlobalArgs,\n UpdateGlobalVersion,\n UpdateGlobalVersionArgs,\n UpdateMany,\n UpdateManyArgs,\n UpdateOne,\n UpdateOneArgs,\n UpdateVersion,\n UpdateVersionArgs,\n Upsert,\n UpsertArgs,\n} from 'payload'\n\nimport createClient from 'openapi-fetch'\nimport { createDatabaseAdapter } from 'payload'\nimport { v4 as uuid } from 'uuid'\n\nimport type { paths } from './generated/content-api-types.js'\n\nimport { getGlobalSlug } from './temp-utilities/slug.js'\nimport { addFallbackSort } from './temp-utilities/sorting.js'\nimport { unwrapDocument, unwrapFindResponse } from './temp-utilities/unwrapDocument.js'\nimport { type AuthMode, createAuthMiddleware, createErrorMiddleware } from './utilities/auth.js'\nimport { dataToContentAPI } from './utilities/data/index.js'\nimport { convertPayloadJoinsToContentAPI } from './utilities/joins.js'\nimport { addFallbackLocale } from './utilities/locale/index.js'\nimport { buildMeta } from './utilities/meta/buildMeta.js'\nimport { convertPayloadWhereToContentAPI } from './utilities/where.js'\n\ntype ContentAPIOptions = {\n allowIDOnCreate?: boolean\n auth: AuthMode\n contentSystemId: string\n url: string\n}\n\nexport type ContentAPIAdapter = {\n auth: AuthMode\n clearDatabase: () => Promise<void>\n client: ReturnType<typeof createClient<paths>>\n contentSystemId: string\n url: string\n} & BaseDatabaseAdapter\n\nasync function syncCollections(this: ContentAPIAdapter) {\n let existingIds: Set<string>\n try {\n const { data: response, error } = await this.client.GET(\n '/api/v0/content_systems/{contentSystemId}/collections',\n {\n params: { path: { contentSystemId: this.contentSystemId } },\n },\n )\n\n if (error) {\n throw new Error(JSON.stringify(error))\n }\n if (!response) {\n throw new Error('No response from collections endpoint')\n }\n\n existingIds = new Set(response.data.map((c) => c.id))\n this.payload.logger.info(`Found ${existingIds.size} existing collections`)\n } catch (error) {\n this.payload.logger.warn(\n `Failed to fetch collections, will attempt to create all: ${(error as Error).message}`,\n )\n existingIds = new Set()\n }\n\n for (const collection of this.payload.config.collections) {\n if (!existingIds.has(collection.slug)) {\n await createCollection.call(this, collection.slug)\n }\n }\n\n for (const global of this.payload.config.globals || []) {\n const globalId = `_global-${global.slug}`\n if (!existingIds.has(globalId)) {\n await createCollection.call(this, globalId)\n }\n }\n}\n\nasync function init(this: ContentAPIAdapter) {\n if (this.auth.mode === 'apiKey') {\n this.payload.logger.info('Using API Key authentication')\n } else if (this.auth.mode === 'tokenStore') {\n this.payload.logger.info('Using TokenStore authentication (local dev)')\n } else {\n this.payload.logger.info('Using Dev JWT authentication (testing)')\n }\n\n if (process.env.PAYLOAD_DROP_DATABASE === 'true') {\n await this.clearDatabase()\n }\n\n await syncCollections.call(this)\n}\n\nasync function createCollection(this: ContentAPIAdapter, collectionId: string) {\n try {\n const { error } = await this.client.POST(\n '/api/v0/content_systems/{contentSystemId}/collections',\n {\n body: { id: collectionId },\n params: { path: { contentSystemId: this.contentSystemId } },\n },\n )\n\n if (error) {\n throw new Error(JSON.stringify(error))\n }\n this.payload.logger.info(`Created collection: ${collectionId}`)\n } catch (error) {\n const errorMessage = (error as Error).message\n if (!errorMessage.includes('already exists') && !errorMessage.includes('409')) {\n this.payload.logger.warn(`Failed to create collection ${collectionId}: ${errorMessage}`)\n }\n }\n}\n\nasync function findMany(\n this: ContentAPIAdapter,\n {\n collection,\n joins,\n limit,\n locale: localeArg,\n page,\n pagination: _pagination,\n sort,\n where,\n // Not yet passed to Content API:\n // - select: supported by Content API, pass-through possible\n // Not supported by Content API:\n // - draftsEnabled, versions, projection\n }: Pick<FindArgs, 'joins' | 'locale' | 'pagination' | 'sort' | 'where'> &\n Required<Pick<FindArgs, 'collection' | 'limit' | 'page'>>,\n) {\n const locale = addFallbackLocale(localeArg, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:find', {\n body: {\n collection,\n contentSystemId: this.contentSystemId,\n join: convertPayloadJoinsToContentAPI(this.payload, collection, joins),\n limit,\n locale,\n page: page ?? 1,\n sort: addFallbackSort(sort, this.payload, collection),\n where: convertPayloadWhereToContentAPI(where ?? {}),\n ...buildMeta(this.payload, { collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API findMany error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from findMany')\n }\n\n return unwrapFindResponse(this.payload, response.result, collection)\n}\n\nasync function find(this: ContentAPIAdapter, args: FindArgs) {\n const collectionConfig = this.payload.config.collections.find((c) => c.slug === args.collection)\n return findMany.call(this, {\n collection: args.collection,\n joins: args.joins,\n // TODO: FindArgs.limit should be 'number' not 'number | undefined'\n // is sanitized by Payload Core before calling the adapter (defaults to 10 or 0 based on pagination)\n limit: args.limit!,\n locale: args.locale,\n page: args.page ?? 1,\n pagination: args.pagination,\n sort: args.sort || collectionConfig?.defaultSort,\n where: args.where,\n })\n}\n\n// TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183\nasync function findVersions(this: ContentAPIAdapter, args: Omit<FindVersionsArgs, 'skip'>) {\n const sortWithFallback = addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection)\n\n const whereClause = convertPayloadWhereToContentAPI(args.where ?? {}, {\n parentToDocumentId: true,\n stripVersionPrefix: true,\n })\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:find', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n // TODO: FindVersionsArgs.limit should be 'number' not 'number | undefined'\n // is sanitized by Payload Core before calling the adapter (defaults to 10 or 0 based on pagination)\n limit: args.limit!,\n locale,\n page: args.page ?? 1,\n sort: sortWithFallback,\n where: whereClause,\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API findVersions error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from findVersions')\n }\n\n return unwrapFindResponse(this.payload, response.result, args.collection)\n}\n\nasync function queryDrafts(this: ContentAPIAdapter, args: QueryDraftsArgs) {\n const versionsResult = await this.findVersions({\n collection: args.collection,\n limit: args.limit,\n locale: args.locale,\n page: args.page,\n pagination: args.pagination,\n sort: args.sort,\n where: { ...args.where, latest: { equals: true } },\n })\n\n // queryDrafts should return documents with fields at root level, not nested in 'version'\n // So we need to unwrap the version structure and merge version fields to root\n const docs = versionsResult.docs.map((versionDoc) => {\n const { version, ...versionMeta } = versionDoc\n return {\n ...versionMeta,\n ...version,\n // Keep version metadata like parent, but document fields take precedence\n id: version.id, // Document ID, not version ID\n }\n })\n\n return {\n ...versionsResult,\n docs,\n }\n}\n\nasync function createVersion(this: ContentAPIAdapter, args: CreateVersionArgs) {\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:create', {\n body: {\n collection: args.collectionSlug,\n contentSystemId: this.contentSystemId,\n versionDoc: {\n createdAt: args.createdAt,\n latest: !args.autosave,\n parent: String(args.parent),\n updatedAt: args.updatedAt,\n version: dataToContentAPI(this.payload, args.collectionSlug, args.versionData, {\n applyDefaults: true,\n publishedLocale: args.publishedLocale,\n }),\n },\n },\n })\n\n if (error) {\n throw new Error(`Content API createVersion error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from createVersion')\n }\n return unwrapDocument(this.payload, response.result, args.collectionSlug)\n}\n\nasync function updateVersion(this: ContentAPIAdapter, args: UpdateVersionArgs) {\n const where = args.where ?? { id: { equals: args.id } }\n const locale = addFallbackLocale(args.locale, this.payload)\n\n // versionData contains version metadata plus nested version content\n const { publishedLocale, version, ...versionMeta } = args.versionData\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n locale,\n versionDoc: {\n createdAt: versionMeta.createdAt,\n latest: versionMeta.latest,\n parent: versionMeta.parent != null ? String(versionMeta.parent) : undefined,\n updatedAt: versionMeta.updatedAt,\n version: dataToContentAPI(this.payload, args.collection, version, { publishedLocale }),\n },\n where: convertPayloadWhereToContentAPI(where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, { collection: args.collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateVersion error: ${JSON.stringify(error)}`)\n }\n if (!response?.result || !('data' in response.result)) {\n throw new Error('No document data in updateVersion response')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function deleteVersions(this: ContentAPIAdapter, args: DeleteVersionsArgs) {\n if (!args.collection) {\n throw new Error('deleteVersions requires a collection')\n }\n\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { error } = await this.client.POST('/api/v0/document_versions:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteVersions error: ${JSON.stringify(error)}`)\n }\n}\n\nasync function findOne(this: ContentAPIAdapter, args: FindOneArgs) {\n const { docs } = await this.find({\n collection: args.collection,\n joins: args.joins,\n limit: 1,\n locale: args.locale,\n pagination: false,\n where: args.where,\n })\n return docs[0] ?? null\n}\n\nasync function updateMany(this: ContentAPIAdapter, args: UpdateManyArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n doc: dataToContentAPI(this.payload, args.collection, args.data),\n limit: args.limit,\n locale,\n returning: {},\n sort: addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection),\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateMany error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from updateMany')\n }\n\n if (response.result && 'data' in response.result) {\n return response.result.data.map((doc) => unwrapDocument(this.payload, doc, args.collection))\n }\n return null\n}\n\nasync function updateOne(this: ContentAPIAdapter, args: UpdateOneArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n const where = args.where ?? { id: { equals: args.id } }\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n doc: dataToContentAPI(this.payload, args.collection, args.data),\n locale,\n returning: {},\n where: convertPayloadWhereToContentAPI(where),\n ...buildMeta(this.payload, { collection: args.collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateOne error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from updateOne')\n }\n if (!response.result || !('data' in response.result)) {\n throw new Error('Unexpected response format from updateOne')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function deleteMany(this: ContentAPIAdapter, args: DeleteManyArgs) {\n const locale = addFallbackLocale(args.req?.locale, this.payload)\n\n const { error } = await this.client.POST('/api/v0/documents:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteMany error: ${JSON.stringify(error)}`)\n }\n}\n\nasync function deleteOne(this: ContentAPIAdapter, args: DeleteOneArgs) {\n const locale = addFallbackLocale(args.req?.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n returning: {}, // Request deleted document back\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteOne error: ${JSON.stringify(error)}`)\n }\n if (!response?.result || !('data' in response.result)) {\n throw new Error('No document data in deleteOne response')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function create(this: ContentAPIAdapter, args: CreateArgs) {\n const isGlobalCollection = args.collection.startsWith('_global-')\n const customIDType = this.payload.collections[args.collection]?.customIDType\n const id =\n (isGlobalCollection || customIDType || this.allowIDOnCreate) &&\n args.data.id != null &&\n (typeof args.data.id === 'string' || typeof args.data.id === 'number')\n ? String(args.data.id)\n : uuid()\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:create', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n doc: {\n ...dataToContentAPI(this.payload, args.collection, args.data, {\n applyDefaults: true,\n createdAt: true,\n }),\n id,\n },\n locale,\n ...buildMeta(this.payload, { collection: args.collection, locale }),\n },\n })\n\n if (error) {\n throw new Error(`Content API create error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from create')\n }\n return unwrapDocument(this.payload, response.result, args.collection)\n}\n\nasync function clearDatabase(this: ContentAPIAdapter) {\n this.payload.logger.info(`---- CLEARING CONTENT API DATABASE ----`)\n try {\n await fetch(`${this.url}/dev/clear-db`, {\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n this.payload.logger.info('---- CONTENT API DATABASE CLEARED ----')\n\n // Re-sync collections after clearing\n await syncCollections.call(this)\n } catch (error) {\n this.payload.logger.error(`Failed to clear database: ${(error as Error).message}`)\n throw error\n }\n}\n\nasync function count(this: ContentAPIAdapter, args: CountArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:count', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API count error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from count')\n }\n\n return { totalDocs: response.result.count }\n}\n\nasync function countVersions(this: ContentAPIAdapter, args: CountArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:count', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API countVersions error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from countVersions')\n }\n\n return { totalDocs: response.result.count }\n}\n\nasync function upsert(this: ContentAPIAdapter, args: UpsertArgs) {\n let documentId = args.data.id as string | undefined\n if (!documentId && args.where && 'id' in args.where) {\n const idClause = (args.where as Record<string, unknown>).id as Record<string, unknown>\n if (idClause && 'equals' in idClause) {\n documentId = idClause.equals as string\n }\n }\n if (!documentId) {\n documentId = uuid()\n }\n\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: { id: documentId },\n doc: dataToContentAPI(this.payload, args.collection, args.data, {\n applyDefaults: true,\n createdAt: true,\n }),\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API upsert error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from upsert')\n }\n if (!response.result || !('data' in response.result)) {\n throw new Error('Unexpected response format from upsert')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n throw new Error('No document data in upsert response')\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nfunction createGlobal(this: ContentAPIAdapter, args: CreateGlobalArgs) {\n return this.create({\n collection: getGlobalSlug(args.slug),\n data: { ...args.data, id: args.slug, globalType: args.slug },\n })\n}\n\nfunction findGlobal(this: ContentAPIAdapter, args: FindGlobalArgs) {\n return this.findOne({\n collection: getGlobalSlug(args.slug),\n locale: args.locale,\n where: args.where ?? {},\n })\n}\n\nasync function updateGlobal(this: ContentAPIAdapter, args: UpdateGlobalArgs) {\n // Use upsert to ensure the global exists\n // Use slug as the consistent document ID for globals\n return this.upsert({\n collection: getGlobalSlug(args.slug),\n data: args.data,\n where: { id: { equals: args.slug } },\n })\n}\n\n// TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183\nfunction findGlobalVersions(this: ContentAPIAdapter, args: Omit<FindGlobalVersionsArgs, 'skip'>) {\n return this.findVersions({\n collection: getGlobalSlug(args.global),\n limit: args.limit,\n locale: args.locale,\n page: args.page,\n pagination: args.pagination,\n sort: args.sort,\n where: args.where,\n })\n}\n\nfunction createGlobalVersion(this: ContentAPIAdapter, args: CreateGlobalVersionArgs) {\n // For globals, use the globalSlug as the consistent document ID\n // This matches what we do in updateGlobal\n return this.createVersion({\n autosave: args.autosave,\n collectionSlug: getGlobalSlug(args.globalSlug),\n createdAt: args.createdAt,\n parent: args.globalSlug,\n publishedLocale: args.publishedLocale,\n updatedAt: args.updatedAt,\n versionData: args.versionData,\n })\n}\n\nfunction updateGlobalVersion(this: ContentAPIAdapter, args: UpdateGlobalVersionArgs) {\n // UpdateVersion requires either id OR where, not both\n if (args.id !== undefined) {\n return this.updateVersion({\n id: args.id,\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n versionData: args.versionData,\n })\n }\n // args.where is guaranteed by Payload when args.id is undefined\n return this.updateVersion({\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n versionData: args.versionData,\n where: args.where,\n })\n}\n\nfunction countGlobalVersions(this: ContentAPIAdapter, args: CountGlobalVersionArgs) {\n return this.countVersions({\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n where: args.where,\n })\n}\n\nexport const contentAPIAdapter = (opts: ContentAPIOptions): DatabaseAdapterObj => ({\n name: 'content-api',\n defaultIDType: 'text',\n init: ({ payload }) => {\n const client = createClient<paths>({ baseUrl: opts.url })\n\n const middlewareOpts = {\n auth: opts.auth,\n contentSystemId: opts.contentSystemId,\n logger: payload.logger,\n url: opts.url,\n }\n\n client.use(createAuthMiddleware(middlewareOpts))\n client.use(createErrorMiddleware(middlewareOpts))\n\n return createDatabaseAdapter<ContentAPIAdapter>({\n name: 'content-api',\n allowIDOnCreate: opts.allowIDOnCreate ?? false,\n auth: opts.auth,\n beginTransaction: () => Promise.resolve(null),\n clearDatabase: clearDatabase as () => Promise<void>,\n client,\n commitTransaction: async () => {},\n contentSystemId: opts.contentSystemId,\n count: count as Count,\n countGlobalVersions: countGlobalVersions as CountGlobalVersions,\n countVersions: countVersions as CountVersions,\n create: create as Create,\n createGlobal: createGlobal as CreateGlobal,\n createGlobalVersion: createGlobalVersion as CreateGlobalVersion,\n createVersion: createVersion as CreateVersion,\n defaultIDType: 'text',\n deleteMany: deleteMany as DeleteMany,\n deleteOne: deleteOne as DeleteOne,\n deleteVersions: deleteVersions as DeleteVersions,\n find: find as Find,\n findDistinct: () =>\n Promise.reject(new Error('findDistinct is not yet implemented for Content API adapter')),\n findGlobal: findGlobal as FindGlobal,\n findGlobalVersions: findGlobalVersions as FindGlobalVersions,\n findOne: findOne as FindOne,\n findVersions: findVersions as FindVersions,\n init,\n packageName: '@payloadcms/db-content-api',\n payload,\n queryDrafts: queryDrafts as QueryDrafts,\n rollbackTransaction: async () => {},\n updateGlobal: updateGlobal as UpdateGlobal,\n updateGlobalVersion: updateGlobalVersion as UpdateGlobalVersion,\n updateMany: updateMany as UpdateMany,\n updateOne: updateOne as UpdateOne,\n updateVersion: updateVersion as UpdateVersion,\n upsert: upsert as Upsert,\n url: opts.url,\n })\n },\n})\n"],"names":["createClient","createDatabaseAdapter","v4","uuid","getGlobalSlug","addFallbackSort","unwrapDocument","unwrapFindResponse","createAuthMiddleware","createErrorMiddleware","dataToContentAPI","convertPayloadJoinsToContentAPI","addFallbackLocale","buildMeta","convertPayloadWhereToContentAPI","syncCollections","existingIds","data","response","error","client","GET","params","path","contentSystemId","Error","JSON","stringify","Set","map","c","id","payload","logger","info","size","warn","message","collection","config","collections","has","slug","createCollection","call","global","globals","globalId","init","auth","mode","process","env","PAYLOAD_DROP_DATABASE","clearDatabase","collectionId","POST","body","errorMessage","includes","findMany","joins","limit","locale","localeArg","page","pagination","_pagination","sort","where","join","result","find","args","collectionConfig","defaultSort","findVersions","sortWithFallback","whereClause","parentToDocumentId","stripVersionPrefix","queryDrafts","versionsResult","latest","equals","docs","versionDoc","version","versionMeta","createVersion","collectionSlug","createdAt","autosave","parent","String","updatedAt","versionData","applyDefaults","publishedLocale","updateVersion","createOnMissing","undefined","doc","deleteVersions","findOne","updateMany","returning","updateOne","deleteMany","req","deleteOne","create","isGlobalCollection","startsWith","customIDType","allowIDOnCreate","fetch","url","headers","method","count","totalDocs","countVersions","upsert","documentId","idClause","createGlobal","globalType","findGlobal","updateGlobal","findGlobalVersions","createGlobalVersion","globalSlug","updateGlobalVersion","countGlobalVersions","contentAPIAdapter","opts","name","defaultIDType","baseUrl","middlewareOpts","use","beginTransaction","Promise","resolve","commitTransaction","findDistinct","reject","packageName","rollbackTransaction"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/db-content-api/index.ts"],"sourcesContent":["import type {\n BaseDatabaseAdapter,\n Count,\n CountArgs,\n CountGlobalVersionArgs,\n CountGlobalVersions,\n CountVersions,\n Create,\n CreateArgs,\n CreateGlobal,\n CreateGlobalArgs,\n CreateGlobalVersion,\n CreateGlobalVersionArgs,\n CreateVersion,\n CreateVersionArgs,\n DatabaseAdapterObj,\n DeleteMany,\n DeleteManyArgs,\n DeleteOne,\n DeleteOneArgs,\n DeleteVersions,\n DeleteVersionsArgs,\n Find,\n FindArgs,\n FindGlobal,\n FindGlobalArgs,\n FindGlobalVersions,\n FindGlobalVersionsArgs,\n FindOne,\n FindOneArgs,\n FindVersions,\n FindVersionsArgs,\n QueryDrafts,\n QueryDraftsArgs,\n UpdateGlobal,\n UpdateGlobalArgs,\n UpdateGlobalVersion,\n UpdateGlobalVersionArgs,\n UpdateMany,\n UpdateManyArgs,\n UpdateOne,\n UpdateOneArgs,\n UpdateVersion,\n UpdateVersionArgs,\n Upsert,\n UpsertArgs,\n} from 'payload'\n\nimport createClient from 'openapi-fetch'\nimport { createDatabaseAdapter } from 'payload'\nimport { v4 as uuid } from 'uuid'\n\nimport type { paths } from './generated/content-api-types.js'\n\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { CONTENT_SYSTEM_NOT_FOUND_MESSAGE } from '../constants.js'\nimport { getGlobalSlug } from './temp-utilities/slug.js'\nimport { addFallbackSort } from './temp-utilities/sorting.js'\nimport { unwrapDocument, unwrapFindResponse } from './temp-utilities/unwrapDocument.js'\nimport { type AuthMode, createAuthMiddleware, createErrorMiddleware } from './utilities/auth.js'\nimport { dataToContentAPI } from './utilities/data/index.js'\nimport { convertPayloadJoinsToContentAPI } from './utilities/joins.js'\nimport { addFallbackLocale } from './utilities/locale/index.js'\nimport { buildMeta } from './utilities/meta/buildMeta.js'\nimport { convertPayloadWhereToContentAPI } from './utilities/where.js'\n\ntype ContentAPIOptions = {\n allowIDOnCreate?: boolean\n auth: AuthMode\n contentSystemId: string\n url: string\n}\n\nexport type ContentAPIAdapter = {\n auth: AuthMode\n clearDatabase: () => Promise<void>\n client: ReturnType<typeof createClient<paths>>\n contentSystemId: string\n url: string\n} & BaseDatabaseAdapter\n\nasync function syncCollections(this: ContentAPIAdapter) {\n let existingIds: Set<string>\n try {\n const {\n data: response,\n error,\n response: httpResponse,\n } = await this.client.GET('/api/v0/content_systems/{contentSystemId}/collections', {\n params: { path: { contentSystemId: this.contentSystemId } },\n })\n\n if (httpResponse.status === 404 || httpResponse.status === 410) {\n throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE)\n }\n\n if (error) {\n throw new Error(JSON.stringify(error))\n }\n if (!response) {\n throw new Error('No response from collections endpoint')\n }\n\n existingIds = new Set(response.data.map((c) => c.id))\n this.payload.logger.info(`Found ${existingIds.size} existing collections`)\n } catch (error) {\n if (error instanceof Error && error.message === CONTENT_SYSTEM_NOT_FOUND_MESSAGE) {\n throw error\n }\n\n if (error instanceof FigmaApiError && (error.statusCode === 404 || error.statusCode === 410)) {\n throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE)\n }\n\n this.payload.logger.warn(\n `Failed to fetch collections, will attempt to create all: ${(error as Error).message}`,\n )\n existingIds = new Set()\n }\n\n for (const collection of this.payload.config.collections) {\n if (!existingIds.has(collection.slug)) {\n await createCollection.call(this, collection.slug)\n }\n }\n\n for (const global of this.payload.config.globals || []) {\n const globalId = `_global-${global.slug}`\n if (!existingIds.has(globalId)) {\n await createCollection.call(this, globalId)\n }\n }\n}\n\nasync function init(this: ContentAPIAdapter) {\n if (this.auth.mode === 'apiKey') {\n this.payload.logger.info('Using API Key authentication')\n } else if (this.auth.mode === 'tokenStore') {\n this.payload.logger.info('Using TokenStore authentication (local dev)')\n } else {\n this.payload.logger.info('Using Dev JWT authentication (testing)')\n }\n\n if (process.env.PAYLOAD_DROP_DATABASE === 'true') {\n await this.clearDatabase()\n }\n\n await syncCollections.call(this)\n}\n\nasync function createCollection(this: ContentAPIAdapter, collectionId: string) {\n try {\n const { error } = await this.client.POST(\n '/api/v0/content_systems/{contentSystemId}/collections',\n {\n body: { id: collectionId },\n params: { path: { contentSystemId: this.contentSystemId } },\n },\n )\n\n if (error) {\n throw new Error(JSON.stringify(error))\n }\n this.payload.logger.info(`Created collection: ${collectionId}`)\n } catch (error) {\n const errorMessage = (error as Error).message\n if (!errorMessage.includes('already exists') && !errorMessage.includes('409')) {\n this.payload.logger.warn(`Failed to create collection ${collectionId}: ${errorMessage}`)\n }\n }\n}\n\nasync function findMany(\n this: ContentAPIAdapter,\n {\n collection,\n joins,\n limit,\n locale: localeArg,\n page,\n pagination: _pagination,\n sort,\n where,\n // Not yet passed to Content API:\n // - select: supported by Content API, pass-through possible\n // Not supported by Content API:\n // - draftsEnabled, versions, projection\n }: Pick<FindArgs, 'joins' | 'locale' | 'pagination' | 'sort' | 'where'> &\n Required<Pick<FindArgs, 'collection' | 'limit' | 'page'>>,\n) {\n const locale = addFallbackLocale(localeArg, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:find', {\n body: {\n collection,\n contentSystemId: this.contentSystemId,\n join: convertPayloadJoinsToContentAPI(this.payload, collection, joins),\n limit,\n locale,\n page: page ?? 1,\n sort: addFallbackSort(sort, this.payload, collection),\n where: convertPayloadWhereToContentAPI(where ?? {}),\n ...buildMeta(this.payload, { collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API findMany error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from findMany')\n }\n\n return unwrapFindResponse(this.payload, response.result, collection)\n}\n\nasync function find(this: ContentAPIAdapter, args: FindArgs) {\n const collectionConfig = this.payload.config.collections.find((c) => c.slug === args.collection)\n return findMany.call(this, {\n collection: args.collection,\n joins: args.joins,\n // TODO: FindArgs.limit should be 'number' not 'number | undefined'\n // is sanitized by Payload Core before calling the adapter (defaults to 10 or 0 based on pagination)\n limit: args.limit!,\n locale: args.locale,\n page: args.page ?? 1,\n pagination: args.pagination,\n sort: args.sort || collectionConfig?.defaultSort,\n where: args.where,\n })\n}\n\n// TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183\nasync function findVersions(this: ContentAPIAdapter, args: Omit<FindVersionsArgs, 'skip'>) {\n const sortWithFallback = addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection)\n\n const whereClause = convertPayloadWhereToContentAPI(args.where ?? {}, {\n parentToDocumentId: true,\n stripVersionPrefix: true,\n })\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:find', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n // TODO: FindVersionsArgs.limit should be 'number' not 'number | undefined'\n // is sanitized by Payload Core before calling the adapter (defaults to 10 or 0 based on pagination)\n limit: args.limit!,\n locale,\n page: args.page ?? 1,\n sort: sortWithFallback,\n where: whereClause,\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API findVersions error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from findVersions')\n }\n\n return unwrapFindResponse(this.payload, response.result, args.collection)\n}\n\nasync function queryDrafts(this: ContentAPIAdapter, args: QueryDraftsArgs) {\n const versionsResult = await this.findVersions({\n collection: args.collection,\n limit: args.limit,\n locale: args.locale,\n page: args.page,\n pagination: args.pagination,\n sort: args.sort,\n where: { ...args.where, latest: { equals: true } },\n })\n\n // queryDrafts should return documents with fields at root level, not nested in 'version'\n // So we need to unwrap the version structure and merge version fields to root\n const docs = versionsResult.docs.map((versionDoc) => {\n const { version, ...versionMeta } = versionDoc\n return {\n ...versionMeta,\n ...version,\n // Keep version metadata like parent, but document fields take precedence\n id: version.id, // Document ID, not version ID\n }\n })\n\n return {\n ...versionsResult,\n docs,\n }\n}\n\nasync function createVersion(this: ContentAPIAdapter, args: CreateVersionArgs) {\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:create', {\n body: {\n collection: args.collectionSlug,\n contentSystemId: this.contentSystemId,\n versionDoc: {\n createdAt: args.createdAt,\n latest: !args.autosave,\n parent: String(args.parent),\n updatedAt: args.updatedAt,\n version: dataToContentAPI(this.payload, args.collectionSlug, args.versionData, {\n applyDefaults: true,\n publishedLocale: args.publishedLocale,\n }),\n },\n },\n })\n\n if (error) {\n throw new Error(`Content API createVersion error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from createVersion')\n }\n return unwrapDocument(this.payload, response.result, args.collectionSlug)\n}\n\nasync function updateVersion(this: ContentAPIAdapter, args: UpdateVersionArgs) {\n const where = args.where ?? { id: { equals: args.id } }\n const locale = addFallbackLocale(args.locale, this.payload)\n\n // versionData contains version metadata plus nested version content\n const { publishedLocale, version, ...versionMeta } = args.versionData\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n locale,\n versionDoc: {\n createdAt: versionMeta.createdAt,\n latest: versionMeta.latest,\n parent: versionMeta.parent != null ? String(versionMeta.parent) : undefined,\n updatedAt: versionMeta.updatedAt,\n version: dataToContentAPI(this.payload, args.collection, version, { publishedLocale }),\n },\n where: convertPayloadWhereToContentAPI(where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, { collection: args.collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateVersion error: ${JSON.stringify(error)}`)\n }\n if (!response?.result || !('data' in response.result)) {\n throw new Error('No document data in updateVersion response')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function deleteVersions(this: ContentAPIAdapter, args: DeleteVersionsArgs) {\n if (!args.collection) {\n throw new Error('deleteVersions requires a collection')\n }\n\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { error } = await this.client.POST('/api/v0/document_versions:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteVersions error: ${JSON.stringify(error)}`)\n }\n}\n\nasync function findOne(this: ContentAPIAdapter, args: FindOneArgs) {\n const { docs } = await this.find({\n collection: args.collection,\n joins: args.joins,\n limit: 1,\n locale: args.locale,\n pagination: false,\n where: args.where,\n })\n return docs[0] ?? null\n}\n\nasync function updateMany(this: ContentAPIAdapter, args: UpdateManyArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n doc: dataToContentAPI(this.payload, args.collection, args.data),\n limit: args.limit,\n locale,\n returning: {},\n sort: addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection),\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateMany error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from updateMany')\n }\n\n if (response.result && 'data' in response.result) {\n return response.result.data.map((doc) => unwrapDocument(this.payload, doc, args.collection))\n }\n return null\n}\n\nasync function updateOne(this: ContentAPIAdapter, args: UpdateOneArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n const where = args.where ?? { id: { equals: args.id } }\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: false,\n doc: dataToContentAPI(this.payload, args.collection, args.data),\n locale,\n returning: {},\n where: convertPayloadWhereToContentAPI(where),\n ...buildMeta(this.payload, { collection: args.collection, locale, where }),\n },\n })\n\n if (error) {\n throw new Error(`Content API updateOne error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from updateOne')\n }\n if (!response.result || !('data' in response.result)) {\n throw new Error('Unexpected response format from updateOne')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function deleteMany(this: ContentAPIAdapter, args: DeleteManyArgs) {\n const locale = addFallbackLocale(args.req?.locale, this.payload)\n\n const { error } = await this.client.POST('/api/v0/documents:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteMany error: ${JSON.stringify(error)}`)\n }\n}\n\nasync function deleteOne(this: ContentAPIAdapter, args: DeleteOneArgs) {\n const locale = addFallbackLocale(args.req?.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:delete', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n returning: {}, // Request deleted document back\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API deleteOne error: ${JSON.stringify(error)}`)\n }\n if (!response?.result || !('data' in response.result)) {\n throw new Error('No document data in deleteOne response')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n return null\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nasync function create(this: ContentAPIAdapter, args: CreateArgs) {\n const isGlobalCollection = args.collection.startsWith('_global-')\n const customIDType = this.payload.collections[args.collection]?.customIDType\n const id =\n (isGlobalCollection || customIDType || this.allowIDOnCreate) &&\n args.data.id != null &&\n (typeof args.data.id === 'string' || typeof args.data.id === 'number')\n ? String(args.data.id)\n : uuid()\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:create', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n doc: {\n ...dataToContentAPI(this.payload, args.collection, args.data, {\n applyDefaults: true,\n createdAt: true,\n }),\n id,\n },\n locale,\n ...buildMeta(this.payload, { collection: args.collection, locale }),\n },\n })\n\n if (error) {\n throw new Error(`Content API create error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from create')\n }\n return unwrapDocument(this.payload, response.result, args.collection)\n}\n\nasync function clearDatabase(this: ContentAPIAdapter) {\n this.payload.logger.info(`---- CLEARING CONTENT API DATABASE ----`)\n try {\n await fetch(`${this.url}/dev/clear-db`, {\n headers: { 'Content-Type': 'application/json' },\n method: 'POST',\n })\n this.payload.logger.info('---- CONTENT API DATABASE CLEARED ----')\n\n // Re-sync collections after clearing\n await syncCollections.call(this)\n } catch (error) {\n this.payload.logger.error(`Failed to clear database: ${(error as Error).message}`)\n throw error\n }\n}\n\nasync function count(this: ContentAPIAdapter, args: CountArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:count', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API count error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from count')\n }\n\n return { totalDocs: response.result.count }\n}\n\nasync function countVersions(this: ContentAPIAdapter, args: CountArgs) {\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/document_versions:count', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n locale,\n where: convertPayloadWhereToContentAPI(args.where, { stripVersionPrefix: true }),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API countVersions error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from countVersions')\n }\n\n return { totalDocs: response.result.count }\n}\n\nasync function upsert(this: ContentAPIAdapter, args: UpsertArgs) {\n let documentId = args.data.id as string | undefined\n if (!documentId && args.where && 'id' in args.where) {\n const idClause = (args.where as Record<string, unknown>).id as Record<string, unknown>\n if (idClause && 'equals' in idClause) {\n documentId = idClause.equals as string\n }\n }\n if (!documentId) {\n documentId = uuid()\n }\n\n const locale = addFallbackLocale(args.locale, this.payload)\n\n const { data: response, error } = await this.client.POST('/api/v0/documents:update', {\n body: {\n collection: args.collection,\n contentSystemId: this.contentSystemId,\n createOnMissing: { id: documentId },\n doc: dataToContentAPI(this.payload, args.collection, args.data, {\n applyDefaults: true,\n createdAt: true,\n }),\n locale,\n where: convertPayloadWhereToContentAPI(args.where),\n ...buildMeta(this.payload, {\n collection: args.collection,\n locale,\n where: args.where,\n }),\n },\n })\n\n if (error) {\n throw new Error(`Content API upsert error: ${JSON.stringify(error)}`)\n }\n if (!response) {\n throw new Error('No response from upsert')\n }\n if (!response.result || !('data' in response.result)) {\n throw new Error('Unexpected response format from upsert')\n }\n\n const doc = response.result.data[0]\n if (!doc) {\n throw new Error('No document data in upsert response')\n }\n\n return unwrapDocument(this.payload, doc, args.collection)\n}\n\nfunction createGlobal(this: ContentAPIAdapter, args: CreateGlobalArgs) {\n return this.create({\n collection: getGlobalSlug(args.slug),\n data: { ...args.data, id: args.slug, globalType: args.slug },\n })\n}\n\nfunction findGlobal(this: ContentAPIAdapter, args: FindGlobalArgs) {\n return this.findOne({\n collection: getGlobalSlug(args.slug),\n locale: args.locale,\n where: args.where ?? {},\n })\n}\n\nasync function updateGlobal(this: ContentAPIAdapter, args: UpdateGlobalArgs) {\n // Use upsert to ensure the global exists\n // Use slug as the consistent document ID for globals\n return this.upsert({\n collection: getGlobalSlug(args.slug),\n data: args.data,\n where: { id: { equals: args.slug } },\n })\n}\n\n// TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183\nfunction findGlobalVersions(this: ContentAPIAdapter, args: Omit<FindGlobalVersionsArgs, 'skip'>) {\n return this.findVersions({\n collection: getGlobalSlug(args.global),\n limit: args.limit,\n locale: args.locale,\n page: args.page,\n pagination: args.pagination,\n sort: args.sort,\n where: args.where,\n })\n}\n\nfunction createGlobalVersion(this: ContentAPIAdapter, args: CreateGlobalVersionArgs) {\n // For globals, use the globalSlug as the consistent document ID\n // This matches what we do in updateGlobal\n return this.createVersion({\n autosave: args.autosave,\n collectionSlug: getGlobalSlug(args.globalSlug),\n createdAt: args.createdAt,\n parent: args.globalSlug,\n publishedLocale: args.publishedLocale,\n updatedAt: args.updatedAt,\n versionData: args.versionData,\n })\n}\n\nfunction updateGlobalVersion(this: ContentAPIAdapter, args: UpdateGlobalVersionArgs) {\n // UpdateVersion requires either id OR where, not both\n if (args.id !== undefined) {\n return this.updateVersion({\n id: args.id,\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n versionData: args.versionData,\n })\n }\n // args.where is guaranteed by Payload when args.id is undefined\n return this.updateVersion({\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n versionData: args.versionData,\n where: args.where,\n })\n}\n\nfunction countGlobalVersions(this: ContentAPIAdapter, args: CountGlobalVersionArgs) {\n return this.countVersions({\n collection: getGlobalSlug(args.global),\n locale: args.locale,\n where: args.where,\n })\n}\n\nexport const contentAPIAdapter = (opts: ContentAPIOptions): DatabaseAdapterObj => ({\n name: 'content-api',\n defaultIDType: 'text',\n init: ({ payload }) => {\n const client = createClient<paths>({ baseUrl: opts.url })\n\n const middlewareOpts = {\n auth: opts.auth,\n contentSystemId: opts.contentSystemId,\n logger: payload.logger,\n url: opts.url,\n }\n\n client.use(createAuthMiddleware(middlewareOpts))\n client.use(createErrorMiddleware(middlewareOpts))\n\n return createDatabaseAdapter<ContentAPIAdapter>({\n name: 'content-api',\n allowIDOnCreate: opts.allowIDOnCreate ?? false,\n auth: opts.auth,\n beginTransaction: () => Promise.resolve(null),\n clearDatabase: clearDatabase as () => Promise<void>,\n client,\n commitTransaction: async () => {},\n contentSystemId: opts.contentSystemId,\n count: count as Count,\n countGlobalVersions: countGlobalVersions as CountGlobalVersions,\n countVersions: countVersions as CountVersions,\n create: create as Create,\n createGlobal: createGlobal as CreateGlobal,\n createGlobalVersion: createGlobalVersion as CreateGlobalVersion,\n createVersion: createVersion as CreateVersion,\n defaultIDType: 'text',\n deleteMany: deleteMany as DeleteMany,\n deleteOne: deleteOne as DeleteOne,\n deleteVersions: deleteVersions as DeleteVersions,\n find: find as Find,\n findDistinct: () =>\n Promise.reject(new Error('findDistinct is not yet implemented for Content API adapter')),\n findGlobal: findGlobal as FindGlobal,\n findGlobalVersions: findGlobalVersions as FindGlobalVersions,\n findOne: findOne as FindOne,\n findVersions: findVersions as FindVersions,\n init,\n packageName: '@payloadcms/db-content-api',\n payload,\n queryDrafts: queryDrafts as QueryDrafts,\n rollbackTransaction: async () => {},\n updateGlobal: updateGlobal as UpdateGlobal,\n updateGlobalVersion: updateGlobalVersion as UpdateGlobalVersion,\n updateMany: updateMany as UpdateMany,\n updateOne: updateOne as UpdateOne,\n updateVersion: updateVersion as UpdateVersion,\n upsert: upsert as Upsert,\n url: opts.url,\n })\n },\n})\n"],"names":["createClient","createDatabaseAdapter","v4","uuid","FigmaApiError","CONTENT_SYSTEM_NOT_FOUND_MESSAGE","getGlobalSlug","addFallbackSort","unwrapDocument","unwrapFindResponse","createAuthMiddleware","createErrorMiddleware","dataToContentAPI","convertPayloadJoinsToContentAPI","addFallbackLocale","buildMeta","convertPayloadWhereToContentAPI","syncCollections","existingIds","data","response","error","httpResponse","client","GET","params","path","contentSystemId","status","Error","JSON","stringify","Set","map","c","id","payload","logger","info","size","message","statusCode","warn","collection","config","collections","has","slug","createCollection","call","global","globals","globalId","init","auth","mode","process","env","PAYLOAD_DROP_DATABASE","clearDatabase","collectionId","POST","body","errorMessage","includes","findMany","joins","limit","locale","localeArg","page","pagination","_pagination","sort","where","join","result","find","args","collectionConfig","defaultSort","findVersions","sortWithFallback","whereClause","parentToDocumentId","stripVersionPrefix","queryDrafts","versionsResult","latest","equals","docs","versionDoc","version","versionMeta","createVersion","collectionSlug","createdAt","autosave","parent","String","updatedAt","versionData","applyDefaults","publishedLocale","updateVersion","createOnMissing","undefined","doc","deleteVersions","findOne","updateMany","returning","updateOne","deleteMany","req","deleteOne","create","isGlobalCollection","startsWith","customIDType","allowIDOnCreate","fetch","url","headers","method","count","totalDocs","countVersions","upsert","documentId","idClause","createGlobal","globalType","findGlobal","updateGlobal","findGlobalVersions","createGlobalVersion","globalSlug","updateGlobalVersion","countGlobalVersions","contentAPIAdapter","opts","name","defaultIDType","baseUrl","middlewareOpts","use","beginTransaction","Promise","resolve","commitTransaction","findDistinct","reject","packageName","rollbackTransaction"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/plugin/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,eAAe,EAAE,MAAM,SAAS,CAAA;AAmB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;CAC1B,GAAG;IACF,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,CAAA;QACvB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAC3B,CAAA;CACF,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AA6B7B;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/plugin/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAS,eAAe,EAAE,MAAM,SAAS,CAAA;AAmB7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;CAC1B,GAAG;IACF,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,CAAA;QACvB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAC3B,CAAA;CACF,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AA6B7B;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAgJpF"}
|
|
@@ -53,6 +53,7 @@ import { contentApiStorageAdapter } from '../storage-content-api/index.js';
|
|
|
53
53
|
const env = getEnvironment();
|
|
54
54
|
const url = process.env.FIGMA_CONTENT_API_URL || ENV_CONFIG[env].contentApiUrl;
|
|
55
55
|
const { contentSystemId } = config.figma;
|
|
56
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
56
57
|
// Determine database adapter based on environment
|
|
57
58
|
let db;
|
|
58
59
|
if (config.figma.useContentSystem === false) {
|
|
@@ -149,6 +150,11 @@ import { contentApiStorageAdapter } from '../storage-content-api/index.js';
|
|
|
149
150
|
health,
|
|
150
151
|
schema
|
|
151
152
|
],
|
|
153
|
+
...isProduction && !config.logger ? {
|
|
154
|
+
logger: {
|
|
155
|
+
options: {}
|
|
156
|
+
}
|
|
157
|
+
} : {},
|
|
152
158
|
secret: 'MY_SECRET',
|
|
153
159
|
// Add oauth to plugins if not already present
|
|
154
160
|
plugins: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/build-config.ts"],"sourcesContent":["import type { Config, Field, SanitizedConfig } from 'payload'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { buildConfig as payloadBuildConfig } from 'payload'\n\nimport type { StorageClientConfig } from '../storage-content-api/index.js'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport { contentAPIAdapter } from '../db-content-api/index.js'\nimport { health } from '../endpoints/health.js'\nimport { schema } from '../endpoints/schema.js'\nimport { oAuth2Plugin } from '../oauth/index.js'\nimport { createStorageClient } from '../storage-content-api/client.js'\nimport { getGenerateSignedURLHandler } from '../storage-content-api/client-uploads/generateSignedURL.js'\nimport { contentApiStorageAdapter } from '../storage-content-api/index.js'\n\n/**\n * Configuration type for Payload projects on the Figma platform.\n *\n * Differences from standard Payload Config:\n * - `db`: Omitted (auto-injected by Figma platform)\n * - `secret`: Omitted (auto-injected by Figma platform)\n * - `editor`: Optional (defaults to lexicalEditor() if not provided)\n *\n * @example\n * // Minimal config\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!\n * },\n * collections: [...]\n * }\n *\n * @example\n * // With custom editor\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!\n * },\n * collections: [...],\n * editor: lexicalEditor({ features: [...] })\n * }\n *\n * @example\n * // Disable Content System (use custom db)\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!,\n * useContentSystem: false\n * },\n * db: mongooseAdapter({ url: process.env.DATABASE_URI }),\n * collections: [...]\n * }\n */\nexport type FigmaConfig = {\n editor?: Config['editor']\n} & {\n figma: {\n contentSystemId: string\n storage?: boolean\n useContentSystem?: boolean\n }\n} & Omit<Config, 'db' | 'editor' | 'secret'> &\n Partial<Pick<Config, 'db'>>\n\n/**\n * Fields added to users collection for Figma profile info\n */\nconst figmaUserFields: Field[] = [\n {\n name: 'figmaHandle',\n type: 'text',\n admin: {\n readOnly: true,\n },\n label: 'Name',\n },\n {\n name: 'figmaImageUrl',\n type: 'text',\n admin: {\n components: {\n Cell: '@payloadcms/figma/client#FigmaAvatarCell',\n },\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n label: 'Profile Picture',\n },\n]\n\n/**\n * Figma platform wrapper for Payload's buildConfig.\n * Automatically injects:\n * - Figma database adapter\n * - Secret (platform-provided)\n * - Default lexicalEditor (if no custom editor specified)\n *\n * @param config - Payload configuration (db and secret omitted, editor optional)\n * @returns Promise<SanitizedConfig> - Built Payload configuration\n */\nexport async function buildFigmaConfig(config: FigmaConfig): Promise<SanitizedConfig> {\n // Validate required environment variable\n if (!config.figma.contentSystemId) {\n throw new Error(\n 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID is required. ' +\n 'Ensure your .env file contains: FIGMA_CONTENT_API_CONTENT_SYSTEM_ID=your-content-system-id',\n )\n }\n\n const env = getEnvironment()\n const url = process.env.FIGMA_CONTENT_API_URL || ENV_CONFIG[env].contentApiUrl\n const { contentSystemId } = config.figma\n\n // Determine database adapter based on environment\n let db: Config['db']\n\n if (config.figma.useContentSystem === false) {\n db = config.db!\n } else if (process.env.FIGMA_CONTENT_API_ACCESS_KEY) {\n db = contentAPIAdapter({\n auth: { apiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY, mode: 'apiKey' },\n contentSystemId,\n url,\n })\n } else if (process.env.FIGMA_DEV_JWT === 'true') {\n db = contentAPIAdapter({\n auth: { mode: 'devJwt' },\n contentSystemId,\n url,\n })\n } else {\n db = contentAPIAdapter({\n auth: { mode: 'tokenStore', tokenStore: getTokenStore(getEnvironment()) },\n contentSystemId,\n url,\n })\n }\n\n // Build storage plugin if there are upload collections and storage is not disabled\n const uploadCollections = (config.collections || []).filter((c) => c.upload)\n let storagePlugin: ReturnType<typeof cloudStoragePlugin> | undefined\n\n if (uploadCollections.length > 0 && config.figma.storage !== false) {\n const storageConfig: StorageClientConfig = process.env.FIGMA_CONTENT_API_ACCESS_KEY\n ? { baseUrl: url, contentApiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY }\n : process.env.FIGMA_DEV_JWT === 'true'\n ? {\n auth: { mode: 'devJwt' },\n baseUrl: url,\n contentSystemId,\n }\n : {\n auth: { mode: 'tokenStore', tokenStore: getTokenStore(getEnvironment()) },\n baseUrl: url,\n contentSystemId,\n }\n\n const adapter = contentApiStorageAdapter(storageConfig)\n const storageClient = createStorageClient(storageConfig)\n\n const collectionsMap = uploadCollections.reduce(\n (acc, c) => {\n acc[c.slug] = { adapter, disableLocalStorage: true }\n return acc\n },\n {} as Record<string, { adapter: typeof adapter; disableLocalStorage: boolean }>,\n )\n\n initClientUploads({\n clientHandler: '@payloadcms/figma/client#ContentApiClientUploadHandler',\n collections: collectionsMap,\n config: config as unknown as Config,\n enabled: true,\n serverHandler: getGenerateSignedURLHandler({ client: storageClient }),\n serverHandlerPath: '/content-api-storage-signed-url',\n })\n\n storagePlugin = cloudStoragePlugin({ collections: collectionsMap })\n }\n\n // Build complete config with Figma platform defaults\n const configWithFigmaDefaults: Config = {\n ...config,\n admin: {\n // Auto-refresh tokens before expiry to prevent unexpected logouts.\n autoRefresh: true,\n avatar: {\n Component: '@payloadcms/figma/client#FigmaAvatar',\n },\n ...config.admin,\n },\n custom: {\n figma: config.figma || {},\n },\n db,\n editor: config.editor ?? lexicalEditor(),\n endpoints: [...(config.endpoints ?? []), health, schema],\n secret: 'MY_SECRET',\n // Add oauth to plugins if not already present\n plugins: [\n ...(config.plugins ?? []),\n ...(storagePlugin ? [storagePlugin] : []),\n oAuth2Plugin({\n collections: [\n {\n slug: 'users',\n // Use adapter because Figma app doesn't support OIDC scopes\n authorizationURLParams: {\n response_mode: 'query',\n response_type: 'code',\n },\n clientID: process.env.FIGMA_OAUTH_CLIENT_ID!,\n clientSecret: process.env.FIGMA_OAUTH_CLIENT_SECRET,\n identityMetadata: ENV_CONFIG[env].identityMetadata,\n scope: ['current_user:read'],\n token: 'id_token', // Adapter creates JWT id_token from Figma user info\n usernameField: 'email',\n },\n ],\n debug: !!process.env.DEBUG,\n disabled: false,\n }),\n ],\n }\n\n // Inject figma fields into users collection\n const collections = configWithFigmaDefaults.collections?.map((col) => {\n if (col.slug === 'users') {\n return {\n ...col,\n fields: [...(col.fields || []), ...figmaUserFields],\n }\n }\n return col\n })\n\n if (collections) {\n configWithFigmaDefaults.collections = collections\n }\n\n // Delegate to Payload's buildConfig\n return await payloadBuildConfig(configWithFigmaDefaults)\n}\n"],"names":["cloudStoragePlugin","initClientUploads","lexicalEditor","buildConfig","payloadBuildConfig","getTokenStore","ENV_CONFIG","getEnvironment","contentAPIAdapter","health","schema","oAuth2Plugin","createStorageClient","getGenerateSignedURLHandler","contentApiStorageAdapter","figmaUserFields","name","type","admin","readOnly","label","components","Cell","disableBulkEdit","hidden","buildFigmaConfig","config","figma","contentSystemId","Error","env","url","process","FIGMA_CONTENT_API_URL","contentApiUrl","db","useContentSystem","FIGMA_CONTENT_API_ACCESS_KEY","auth","apiKey","mode","FIGMA_DEV_JWT","tokenStore","uploadCollections","collections","filter","c","upload","storagePlugin","length","storage","storageConfig","baseUrl","contentApiKey","adapter","storageClient","collectionsMap","reduce","acc","slug","disableLocalStorage","clientHandler","enabled","serverHandler","client","serverHandlerPath","configWithFigmaDefaults","autoRefresh","avatar","Component","custom","editor","endpoints","secret","plugins","authorizationURLParams","response_mode","response_type","clientID","FIGMA_OAUTH_CLIENT_ID","clientSecret","FIGMA_OAUTH_CLIENT_SECRET","identityMetadata","scope","token","usernameField","debug","DEBUG","disabled","map","col","fields"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/plugin/build-config.ts"],"sourcesContent":["import type { Config, Field, SanitizedConfig } from 'payload'\n\nimport { cloudStoragePlugin } from '@payloadcms/plugin-cloud-storage'\nimport { initClientUploads } from '@payloadcms/plugin-cloud-storage/utilities'\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { buildConfig as payloadBuildConfig } from 'payload'\n\nimport type { StorageClientConfig } from '../storage-content-api/index.js'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { ENV_CONFIG, getEnvironment } from '../constants.js'\nimport { contentAPIAdapter } from '../db-content-api/index.js'\nimport { health } from '../endpoints/health.js'\nimport { schema } from '../endpoints/schema.js'\nimport { oAuth2Plugin } from '../oauth/index.js'\nimport { createStorageClient } from '../storage-content-api/client.js'\nimport { getGenerateSignedURLHandler } from '../storage-content-api/client-uploads/generateSignedURL.js'\nimport { contentApiStorageAdapter } from '../storage-content-api/index.js'\n\n/**\n * Configuration type for Payload projects on the Figma platform.\n *\n * Differences from standard Payload Config:\n * - `db`: Omitted (auto-injected by Figma platform)\n * - `secret`: Omitted (auto-injected by Figma platform)\n * - `editor`: Optional (defaults to lexicalEditor() if not provided)\n *\n * @example\n * // Minimal config\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!\n * },\n * collections: [...]\n * }\n *\n * @example\n * // With custom editor\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!\n * },\n * collections: [...],\n * editor: lexicalEditor({ features: [...] })\n * }\n *\n * @example\n * // Disable Content System (use custom db)\n * const config: FigmaConfig = {\n * figma: {\n * contentSystemId: process.env.FIGMA_CONTENT_API_CONTENT_SYSTEM_ID!,\n * useContentSystem: false\n * },\n * db: mongooseAdapter({ url: process.env.DATABASE_URI }),\n * collections: [...]\n * }\n */\nexport type FigmaConfig = {\n editor?: Config['editor']\n} & {\n figma: {\n contentSystemId: string\n storage?: boolean\n useContentSystem?: boolean\n }\n} & Omit<Config, 'db' | 'editor' | 'secret'> &\n Partial<Pick<Config, 'db'>>\n\n/**\n * Fields added to users collection for Figma profile info\n */\nconst figmaUserFields: Field[] = [\n {\n name: 'figmaHandle',\n type: 'text',\n admin: {\n readOnly: true,\n },\n label: 'Name',\n },\n {\n name: 'figmaImageUrl',\n type: 'text',\n admin: {\n components: {\n Cell: '@payloadcms/figma/client#FigmaAvatarCell',\n },\n disableBulkEdit: true,\n hidden: true,\n readOnly: true,\n },\n label: 'Profile Picture',\n },\n]\n\n/**\n * Figma platform wrapper for Payload's buildConfig.\n * Automatically injects:\n * - Figma database adapter\n * - Secret (platform-provided)\n * - Default lexicalEditor (if no custom editor specified)\n *\n * @param config - Payload configuration (db and secret omitted, editor optional)\n * @returns Promise<SanitizedConfig> - Built Payload configuration\n */\nexport async function buildFigmaConfig(config: FigmaConfig): Promise<SanitizedConfig> {\n // Validate required environment variable\n if (!config.figma.contentSystemId) {\n throw new Error(\n 'FIGMA_CONTENT_API_CONTENT_SYSTEM_ID is required. ' +\n 'Ensure your .env file contains: FIGMA_CONTENT_API_CONTENT_SYSTEM_ID=your-content-system-id',\n )\n }\n\n const env = getEnvironment()\n const url = process.env.FIGMA_CONTENT_API_URL || ENV_CONFIG[env].contentApiUrl\n const { contentSystemId } = config.figma\n const isProduction = process.env.NODE_ENV === 'production'\n\n // Determine database adapter based on environment\n let db: Config['db']\n\n if (config.figma.useContentSystem === false) {\n db = config.db!\n } else if (process.env.FIGMA_CONTENT_API_ACCESS_KEY) {\n db = contentAPIAdapter({\n auth: { apiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY, mode: 'apiKey' },\n contentSystemId,\n url,\n })\n } else if (process.env.FIGMA_DEV_JWT === 'true') {\n db = contentAPIAdapter({\n auth: { mode: 'devJwt' },\n contentSystemId,\n url,\n })\n } else {\n db = contentAPIAdapter({\n auth: { mode: 'tokenStore', tokenStore: getTokenStore(getEnvironment()) },\n contentSystemId,\n url,\n })\n }\n\n // Build storage plugin if there are upload collections and storage is not disabled\n const uploadCollections = (config.collections || []).filter((c) => c.upload)\n let storagePlugin: ReturnType<typeof cloudStoragePlugin> | undefined\n\n if (uploadCollections.length > 0 && config.figma.storage !== false) {\n const storageConfig: StorageClientConfig = process.env.FIGMA_CONTENT_API_ACCESS_KEY\n ? { baseUrl: url, contentApiKey: process.env.FIGMA_CONTENT_API_ACCESS_KEY }\n : process.env.FIGMA_DEV_JWT === 'true'\n ? {\n auth: { mode: 'devJwt' },\n baseUrl: url,\n contentSystemId,\n }\n : {\n auth: { mode: 'tokenStore', tokenStore: getTokenStore(getEnvironment()) },\n baseUrl: url,\n contentSystemId,\n }\n\n const adapter = contentApiStorageAdapter(storageConfig)\n const storageClient = createStorageClient(storageConfig)\n\n const collectionsMap = uploadCollections.reduce(\n (acc, c) => {\n acc[c.slug] = { adapter, disableLocalStorage: true }\n return acc\n },\n {} as Record<string, { adapter: typeof adapter; disableLocalStorage: boolean }>,\n )\n\n initClientUploads({\n clientHandler: '@payloadcms/figma/client#ContentApiClientUploadHandler',\n collections: collectionsMap,\n config: config as unknown as Config,\n enabled: true,\n serverHandler: getGenerateSignedURLHandler({ client: storageClient }),\n serverHandlerPath: '/content-api-storage-signed-url',\n })\n\n storagePlugin = cloudStoragePlugin({ collections: collectionsMap })\n }\n\n // Build complete config with Figma platform defaults\n const configWithFigmaDefaults: Config = {\n ...config,\n admin: {\n // Auto-refresh tokens before expiry to prevent unexpected logouts.\n autoRefresh: true,\n avatar: {\n Component: '@payloadcms/figma/client#FigmaAvatar',\n },\n ...config.admin,\n },\n custom: {\n figma: config.figma || {},\n },\n db,\n editor: config.editor ?? lexicalEditor(),\n endpoints: [...(config.endpoints ?? []), health, schema],\n ...(isProduction && !config.logger ? { logger: { options: {} } } : {}),\n secret: 'MY_SECRET',\n // Add oauth to plugins if not already present\n plugins: [\n ...(config.plugins ?? []),\n ...(storagePlugin ? [storagePlugin] : []),\n oAuth2Plugin({\n collections: [\n {\n slug: 'users',\n // Use adapter because Figma app doesn't support OIDC scopes\n authorizationURLParams: {\n response_mode: 'query',\n response_type: 'code',\n },\n clientID: process.env.FIGMA_OAUTH_CLIENT_ID!,\n clientSecret: process.env.FIGMA_OAUTH_CLIENT_SECRET,\n identityMetadata: ENV_CONFIG[env].identityMetadata,\n scope: ['current_user:read'],\n token: 'id_token', // Adapter creates JWT id_token from Figma user info\n usernameField: 'email',\n },\n ],\n debug: !!process.env.DEBUG,\n disabled: false,\n }),\n ],\n }\n\n // Inject figma fields into users collection\n const collections = configWithFigmaDefaults.collections?.map((col) => {\n if (col.slug === 'users') {\n return {\n ...col,\n fields: [...(col.fields || []), ...figmaUserFields],\n }\n }\n return col\n })\n\n if (collections) {\n configWithFigmaDefaults.collections = collections\n }\n\n // Delegate to Payload's buildConfig\n return await payloadBuildConfig(configWithFigmaDefaults)\n}\n"],"names":["cloudStoragePlugin","initClientUploads","lexicalEditor","buildConfig","payloadBuildConfig","getTokenStore","ENV_CONFIG","getEnvironment","contentAPIAdapter","health","schema","oAuth2Plugin","createStorageClient","getGenerateSignedURLHandler","contentApiStorageAdapter","figmaUserFields","name","type","admin","readOnly","label","components","Cell","disableBulkEdit","hidden","buildFigmaConfig","config","figma","contentSystemId","Error","env","url","process","FIGMA_CONTENT_API_URL","contentApiUrl","isProduction","NODE_ENV","db","useContentSystem","FIGMA_CONTENT_API_ACCESS_KEY","auth","apiKey","mode","FIGMA_DEV_JWT","tokenStore","uploadCollections","collections","filter","c","upload","storagePlugin","length","storage","storageConfig","baseUrl","contentApiKey","adapter","storageClient","collectionsMap","reduce","acc","slug","disableLocalStorage","clientHandler","enabled","serverHandler","client","serverHandlerPath","configWithFigmaDefaults","autoRefresh","avatar","Component","custom","editor","endpoints","logger","options","secret","plugins","authorizationURLParams","response_mode","response_type","clientID","FIGMA_OAUTH_CLIENT_ID","clientSecret","FIGMA_OAUTH_CLIENT_SECRET","identityMetadata","scope","token","usernameField","debug","DEBUG","disabled","map","col","fields"],"mappings":"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"}
|