@payloadcms/figma 0.0.1-alpha.40 → 0.0.1-alpha.42
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/auth/oauth-flow.d.ts.map +1 -1
- package/dist/auth/oauth-flow.js +6 -3
- package/dist/auth/oauth-flow.js.map +1 -1
- package/dist/auth/refresh.d.ts +2 -1
- package/dist/auth/refresh.d.ts.map +1 -1
- package/dist/auth/refresh.js +11 -3
- package/dist/auth/refresh.js.map +1 -1
- package/dist/auth/token-store.d.ts +6 -4
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +17 -14
- package/dist/auth/token-store.js.map +1 -1
- package/dist/auth/types.d.ts +7 -4
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli.js +8 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +2 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +12 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list-tokens.d.ts +3 -3
- package/dist/commands/list-tokens.d.ts.map +1 -1
- package/dist/commands/list-tokens.js +20 -8
- package/dist/commands/list-tokens.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +12 -4
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +5 -4
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +55 -12
- package/dist/commands/logout.js.map +1 -1
- package/dist/db-content-api/generated/content-api-types.d.ts +168 -102
- package/dist/db-content-api/generated/content-api-types.d.ts.map +1 -1
- package/dist/db-content-api/generated/content-api-types.js.map +1 -1
- package/dist/db-content-api/index.d.ts.map +1 -1
- package/dist/db-content-api/index.js +82 -67
- package/dist/db-content-api/index.js.map +1 -1
- package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +31 -1
- package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts.map +1 -1
- package/dist/db-content-api/temp-utilities/unwrapDocument.js +24 -24
- package/dist/db-content-api/temp-utilities/unwrapDocument.js.map +1 -1
- package/dist/db-content-api/utilities/buildPathTypes.d.ts +12 -0
- package/dist/db-content-api/utilities/buildPathTypes.d.ts.map +1 -0
- package/dist/db-content-api/utilities/buildPathTypes.js +157 -0
- package/dist/db-content-api/utilities/buildPathTypes.js.map +1 -0
- package/dist/db-content-api/utilities/data/index.d.ts +2 -0
- package/dist/db-content-api/utilities/data/index.d.ts.map +1 -1
- package/dist/db-content-api/utilities/data/index.js +18 -1
- package/dist/db-content-api/utilities/data/index.js.map +1 -1
- package/dist/db-content-api/utilities/where.d.ts.map +1 -1
- package/dist/db-content-api/utilities/where.js +17 -3
- package/dist/db-content-api/utilities/where.js.map +1 -1
- package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LogoutButton/index.js +5 -3
- package/dist/oauth/components/LogoutButton/index.js.map +1 -1
- package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
- package/dist/oauth/endpoints/getLoginEndpoint.js +17 -7
- package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
- package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +1 -1
- package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -4
- package/dist/oauth/endpoints/getLogoutEndpoint.js.map +1 -1
- package/dist/plugin/build-config.js +3 -3
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/storage-content-api/api-types.d.ts +8 -1
- package/dist/storage-content-api/api-types.d.ts.map +1 -1
- package/dist/storage-content-api/api-types.js.map +1 -1
- package/dist/storage-content-api/client-uploads/generateSignedURL.js +1 -0
- package/dist/storage-content-api/client-uploads/generateSignedURL.js.map +1 -1
- package/dist/storage-content-api/generateURL.d.ts.map +1 -1
- package/dist/storage-content-api/generateURL.js +3 -2
- package/dist/storage-content-api/generateURL.js.map +1 -1
- package/dist/storage-content-api/handleDelete.d.ts.map +1 -1
- package/dist/storage-content-api/handleDelete.js +4 -2
- package/dist/storage-content-api/handleDelete.js.map +1 -1
- package/dist/storage-content-api/handleUpload.d.ts +1 -1
- package/dist/storage-content-api/handleUpload.d.ts.map +1 -1
- package/dist/storage-content-api/handleUpload.js +11 -3
- package/dist/storage-content-api/handleUpload.js.map +1 -1
- package/dist/storage-content-api/staticHandler.js +1 -0
- package/dist/storage-content-api/staticHandler.js.map +1 -1
- package/dist/utils/format-env-suffix.d.ts +12 -0
- package/dist/utils/format-env-suffix.d.ts.map +1 -0
- package/dist/utils/format-env-suffix.js +13 -0
- package/dist/utils/format-env-suffix.js.map +1 -0
- package/dist/utils/lambda-config.js +26 -12
- package/dist/utils/lambda-config.js.map +1 -1
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +1 -2
- package/dist/utils/messages.js.map +1 -1
- package/package.json +1 -1
- package/dist/db-content-api/temp-utilities/pagination.d.ts +0 -13
- package/dist/db-content-api/temp-utilities/pagination.d.ts.map +0 -1
- package/dist/db-content-api/temp-utilities/pagination.js +0 -45
- package/dist/db-content-api/temp-utilities/pagination.js.map +0 -1
- package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
- package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
- package/dist/oauth/utilities/getAdminPath.js +0 -9
- package/dist/oauth/utilities/getAdminPath.js.map +0 -1
|
@@ -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 { 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()\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","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 { 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAoED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuX5E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -7,6 +7,7 @@ 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
11
|
import { ensureGitignore } from '../utils/config.js';
|
|
11
12
|
import { addOrUpdateEnvVar } from '../utils/env-management.js';
|
|
12
13
|
import { isDebug } from '../utils/is-debug.js';
|
|
@@ -80,7 +81,7 @@ import { loginCommand } from './login.js';
|
|
|
80
81
|
const currentVersion = await getOwnVersion();
|
|
81
82
|
await checkForUpdates(currentVersion);
|
|
82
83
|
// Check authentication
|
|
83
|
-
const tokenStore = getTokenStore();
|
|
84
|
+
const tokenStore = getTokenStore(getEnvironment());
|
|
84
85
|
const s = p.spinner();
|
|
85
86
|
if (options.skipAuth) {
|
|
86
87
|
// Skip authentication for testing/development
|
|
@@ -198,6 +199,11 @@ import { loginCommand } from './login.js';
|
|
|
198
199
|
try {
|
|
199
200
|
await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
|
|
200
201
|
log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
|
|
202
|
+
const env = getEnvironment();
|
|
203
|
+
if (env !== 'production') {
|
|
204
|
+
await addOrUpdateEnvVar(process.cwd(), 'FIGMA_ENV', env);
|
|
205
|
+
log.debug(`Added FIGMA_ENV=${env} to .env file`);
|
|
206
|
+
}
|
|
201
207
|
if (datasetInfo) {
|
|
202
208
|
await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId);
|
|
203
209
|
await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId);
|
|
@@ -321,6 +327,11 @@ import { loginCommand } from './login.js';
|
|
|
321
327
|
try {
|
|
322
328
|
await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
|
|
323
329
|
log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
|
|
330
|
+
const env = getEnvironment();
|
|
331
|
+
if (env !== 'production') {
|
|
332
|
+
await addOrUpdateEnvVar(fullPath, 'FIGMA_ENV', env);
|
|
333
|
+
log.debug(`Added FIGMA_ENV=${env} to .env file`);
|
|
334
|
+
}
|
|
324
335
|
if (datasetInfo) {
|
|
325
336
|
await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId);
|
|
326
337
|
await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { getDatasetInfo } from '../api/control-plane.js'\nimport { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { ensureGitignore } from '../utils/config.js'\nimport { addOrUpdateEnvVar } from '../utils/env-management.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { applyLambdaModifications } from '../utils/lambda-config.js'\nimport * as log from '../utils/log.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport { runScript } from '../utils/payload-package-check.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.js'\nimport { checkForUpdates, getOwnVersion } from '../utils/version-check.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for init command\n */\nexport interface InitCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Force reconfiguration of existing project */\n force?: boolean\n /** Content System ID to use */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Skip authentication check (for testing/development) */\n skipAuth?: boolean\n /** Skip prompts and use defaults where possible */\n yes?: boolean\n}\n\n/**\n * Generate and store project token for a content system\n * Non-blocking - will show warning but not exit on failure\n * Only shows feedback if DEBUG mode is enabled, otherwise runs silently\n *\n * @param tokenStore - Token store instance\n * @param contentSystemId - Content System ID to generate token for\n * @param spinner - Clack spinner instance for status updates (only used in debug mode)\n */\nasync function generateProjectTokenWithFeedback(\n tokenStore: TokenStore,\n contentSystemId: string,\n spinner: ReturnType<typeof p.spinner>,\n): Promise<void> {\n if (isDebug()) {\n spinner.start('Generating project token...')\n }\n\n try {\n const projectToken = await getValidProjectToken(tokenStore, contentSystemId)\n if (isDebug()) {\n if (projectToken) {\n spinner.stop(pc.green('✓ Project token generated'))\n } else {\n spinner.stop(pc.yellow('⚠ Project token not generated (authentication required)'))\n }\n }\n } catch (error) {\n if (isDebug()) {\n spinner.stop(pc.yellow('⚠ Project token generation failed'))\n }\n // Always show failures, even without debug\n if (error instanceof ProjectTokenError || error instanceof FigmaApiError) {\n log.warning(error.message)\n p.note(\n 'Project token is used for authenticating to the Content API.\\nYou can continue without it, but may need to regenerate later.',\n 'Note',\n )\n } else {\n log.warning(\n `Unable to retrieve project token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n // Don't exit - token generation failure shouldn't block initialization\n }\n}\n\n/**\n * Fetch dataset info from the API\n * Throws on error - caller must handle\n */\nasync function fetchDatasetInfo(\n accessToken: string,\n datasetId: string,\n): Promise<{ oauthClientId: string; oauthClientSecret: string; tenantId: string }> {\n log.debug('Fetching dataset info...')\n\n const datasetInfo = await getDatasetInfo(accessToken, datasetId)\n log.debug('Dataset info retrieved successfully')\n return {\n oauthClientId: datasetInfo.oauthClientId,\n oauthClientSecret: datasetInfo.oauthClientSecret,\n tenantId: datasetInfo.tenantId,\n }\n}\n\n/**\n * Handle the `init` command\n *\n * Sets up a project by:\n * 1. Checking authentication\n * 2. Detecting/scaffolding Payload project\n * 3. Fetching tenant details\n * 4. Storing configuration\n *\n * @param options - Command options\n */\nexport async function initCommand(options: InitCommandOptions): Promise<void> {\n // Check for outdated version (non-blocking)\n const currentVersion = await getOwnVersion()\n await checkForUpdates(currentVersion)\n\n // Check authentication\n const tokenStore = getTokenStore()\n const s = p.spinner()\n\n if (options.skipAuth) {\n // Skip authentication for testing/development\n p.log.warn(pc.yellow('Skipping authentication (--skip-auth mode)'))\n } else {\n try {\n // Check for valid cached tokens first (no API call needed)\n if (!tokenStore.hasValidTokens()) {\n // Need to refresh or authenticate - show spinner for API call\n s.start('Checking authentication...')\n const token = await getValidAccessToken(tokenStore)\n if (!token) {\n s.stop('Authentication required to continue')\n\n // Run login command\n await loginCommand({ showNextSteps: false })\n\n // Get token after auth\n const newToken = await getValidAccessToken(tokenStore)\n if (!newToken) {\n p.log.error('Authentication failed')\n process.exit(1)\n }\n } else {\n s.stop(pc.green('✓ Authenticated'))\n }\n }\n } catch (error) {\n s.stop(pc.red('✗ Authentication failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n p.note('Run `figma auth` to authenticate', 'Tip')\n process.exit(1)\n }\n }\n\n // Note: We no longer check for figma.config.json here\n // Instead, the AST detection will check if figma object already exists in payload.config.ts\n // and skip modification if it does (unless --force is used)\n\n // Step 3: Get Content System ID (required argument)\n log.debug('Configuring Project...')\n\n if (!options.id) {\n p.log.error('Content System ID is required. Use --id <content_system_id>')\n process.exit(1)\n }\n\n const contentSystemId = options.id\n\n // Fetch dataset info (required - will fail if feature not enabled)\n let datasetInfo: { oauthClientId: string; oauthClientSecret: string; tenantId: string } | null =\n null\n if (!options.skipAuth) {\n const accessToken = await getValidAccessToken(tokenStore)\n if (accessToken) {\n try {\n datasetInfo = await fetchDatasetInfo(accessToken, contentSystemId)\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n p.log.error(\n pc.red(`✗ Unable to fetch dataset info for content system \"${contentSystemId}\"`),\n )\n p.log.error(pc.dim(`Details: ${message}`))\n p.note(\n 'This may indicate the CMS feature is not enabled for your account.\\n' +\n 'Contact support if you believe this is an error.',\n 'Error',\n )\n process.exit(1)\n }\n }\n }\n\n // Step 4: Detect or scaffold Payload project\n const isInProject = await isInProjectDirectory()\n\n if (isInProject) {\n // ===== EXISTING PROJECT FLOW =====\n log.debug('Project directory detected')\n\n // Detect Payload\n const projectInfo = await detectPayloadProject()\n\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), projectInfo.packageManager || 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(\n process.cwd(),\n projectInfo.packageManager || 'pnpm',\n {\n contentSystemId,\n },\n )\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n process.cwd(),\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n } else {\n // Has package.json but no Payload - offer to add Payload\n p.log.warn(pc.yellow('⚠ No Payload detected in this project'))\n\n const shouldAddPayload = await p.confirm({\n initialValue: true,\n message: 'Would you like to add Payload to this project?',\n })\n\n if (p.isCancel(shouldAddPayload)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n if (!shouldAddPayload) {\n p.log.error('Payload is required to use Figma CMS')\n process.exit(1)\n }\n\n // TODO: Add Payload to existing project (future enhancement)\n p.log.error('Adding Payload to existing projects is not yet supported')\n p.note('Create a new project or manually add Payload dependencies', 'Action Required')\n process.exit(1)\n }\n\n // Generate import map to prevent errors on first pnpm dev\n await runScript(process.cwd(), 'generate:importmap', projectInfo.packageManager || 'pnpm')\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), projectInfo.packageManager || 'pnpm')\n\n // Ensure .gitignore has required entries\n await ensureGitignore(process.cwd(), ['.env', '.env.local', 'lambda.zip'])\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = ['Start development server: `pnpm dev`'].filter(Boolean)\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n if (datasetInfo) {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_TENANT_ID', datasetInfo.tenantId)\n await addOrUpdateEnvVar(fullPath, 'FIGMA_OAUTH_CLIENT_ID', datasetInfo.oauthClientId)\n await addOrUpdateEnvVar(\n fullPath,\n 'FIGMA_OAUTH_CLIENT_SECRET',\n datasetInfo.oauthClientSecret,\n )\n log.debug(\n `Added FIGMA_TENANT_ID, FIGMA_OAUTH_CLIENT_ID, FIGMA_OAUTH_CLIENT_SECRET to .env file`,\n )\n }\n } catch (error) {\n p.log.warn(\n pc.yellow(\n `⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`,\n ),\n )\n }\n\n // Generate import map to prevent errors on first pnpm dev\n await runScript(fullPath, 'generate:importmap', 'pnpm')\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n 'pnpm dev or follow directions in README.md',\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","getDatasetInfo","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","displayManualInstructions","ensurePayloadFigmaConfig","runScript","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","checkForUpdates","getOwnVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","fetchDatasetInfo","accessToken","datasetId","debug","datasetInfo","oauthClientId","oauthClientSecret","tenantId","initCommand","options","currentVersion","s","skipAuth","warn","hasValidTokens","token","showNextSteps","newToken","process","exit","red","id","dim","isInProject","projectInfo","hasPayload","payloadVersion","success","hasDeps","cwd","shouldInstall","confirm","initialValue","isCancel","packageManager","modResult","modified","changes","length","forEach","change","warnings","shouldAddPayload","cancel","outro","nextSteps","filter","Boolean","join","projectPathInput","text","placeholder","validate","value","undefined","projectPath","fullPath","resolve","projectName","name","basename","mkdir","recursive","step","bgGreen","black","relativePath","relative","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/init.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs/promises'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport type { 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 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\n if (projectInfo.hasPayload) {\n // Validate existing Payload version\n if (projectInfo.payloadVersion && !validatePayloadVersion(projectInfo.payloadVersion)) {\n p.log.warn(\n pc.yellow(\n `Payload version ${projectInfo.payloadVersion} detected. Version 3.x is required.`,\n ),\n )\n p.note('Upgrade to Payload 3.x before continuing', 'Action Required')\n process.exit(1)\n }\n\n p.log.success(pc.green(`✓ Payload ${projectInfo.payloadVersion || 'detected'}`))\n\n // Check dependencies\n s.start('Checking dependencies...')\n const hasDeps = await hasRequiredDependencies(process.cwd())\n s.stop(pc.green('✓ Dependencies checked'))\n\n if (!hasDeps) {\n const shouldInstall = await p.confirm({\n initialValue: true,\n message: 'Install dependencies now?',\n })\n\n if (!p.isCancel(shouldInstall) && shouldInstall) {\n s.start('Installing dependencies...')\n await installDependencies(process.cwd(), projectInfo.packageManager || 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n }\n }\n\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(\n process.cwd(),\n projectInfo.packageManager || 'pnpm',\n {\n contentSystemId,\n },\n )\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n 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 pnpm dev\n await runScript(process.cwd(), 'generate:importmap', projectInfo.packageManager || 'pnpm')\n\n // Apply Lambda modifications (run.sh, standalone output, lambda:buildzip script)\n await applyLambdaModifications(process.cwd(), projectInfo.packageManager || 'pnpm')\n\n // Ensure .gitignore has required entries\n await ensureGitignore(process.cwd(), ['.env', '.env.local', 'lambda.zip'])\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Success message for existing project\n p.outro(pc.green('✓ Project initialized successfully!'))\n\n const nextSteps = ['Start development server: `pnpm dev`'].filter(Boolean)\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n } else {\n // ===== NEW PROJECT FLOW =====\n // p.log.info('No project detected - Creating New Project')\n\n // Prompt for path\n const projectPathInput = await p.text({\n initialValue: './',\n message: 'Enter path to create project:',\n placeholder: './my-cms-project',\n validate: (value) => {\n if (!value) {\n return 'Path is required'\n }\n // Allow relative or absolute paths\n return undefined\n },\n })\n\n if (p.isCancel(projectPathInput)) {\n p.cancel('Operation cancelled')\n process.exit(0)\n }\n\n const projectPath = projectPathInput\n const fullPath = path.resolve(process.cwd(), projectPath)\n\n // Get project name from path or prompt\n const projectName = options.name || path.basename(fullPath)\n\n // Create directory\n try {\n await fs.mkdir(fullPath, { recursive: true })\n } catch (error) {\n p.log.error(\n `Failed to create directory: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n process.exit(1)\n }\n\n // Scaffold project\n s.start('Downloading template from GitHub...')\n try {\n await scaffoldProject(fullPath, projectName)\n s.stop(pc.green('✓ Template downloaded'))\n\n s.start('Installing dependencies...')\n await installDependencies(fullPath, 'pnpm')\n s.stop(pc.green('✓ Dependencies installed'))\n } catch (error) {\n s.stop(pc.red('✗ Failed'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n\n // Modify Payload configuration\n s.start('Checking Payload configuration...')\n const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {\n contentSystemId,\n })\n\n if (!modResult.success) {\n s.stop(pc.red('✗ Configuration check failed'))\n displayManualInstructions(modResult.error || 'Unknown error')\n process.exit(1)\n }\n\n if (modResult.modified) {\n s.stop(pc.green('✓ Payload configuration updated'))\n if (modResult.changes.length > 0) {\n modResult.changes.forEach((change) => log.debug(pc.dim(` → ${change}`)))\n }\n } else {\n s.stop(pc.green('✓ Payload configuration valid'))\n }\n\n // Display warnings if any\n if (modResult.warnings && modResult.warnings.length > 0) {\n modResult.warnings.forEach((warning) => {\n p.log.warn(pc.yellow(`⚠ ${warning}`))\n })\n }\n\n // Write environment variables to .env file\n try {\n await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId)\n log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`)\n\n 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 pnpm dev\n await runScript(fullPath, 'generate:importmap', 'pnpm')\n\n // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s)\n }\n\n // Initialize git repository (after all files including lock file are ready)\n initializeGitRepo(fullPath)\n\n // Success message for NEW project\n p.log.step(pc.bgGreen(pc.black(' Project created successfully! ')))\n\n const relativePath = path.relative(process.cwd(), fullPath)\n const nextSteps: string[] = []\n\n // Only show cd command if user needs to navigate\n if (relativePath && relativePath !== '.') {\n nextSteps.push(`cd ${relativePath}`)\n }\n\n nextSteps.push(\n 'pnpm dev or follow directions in README.md',\n '',\n 'Documentation:',\n '- Getting Started: https://payloadcms.com/docs/getting-started/what-is-payload',\n '- Configuration: https://payloadcms.com/docs/configuration/overview',\n )\n\n p.note(nextSteps.join('\\n'), 'Next Steps')\n p.outro(pc.green('✓ Done'))\n }\n}\n"],"names":["p","fs","path","pc","getDatasetInfo","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","getEnvironment","ensureGitignore","addOrUpdateEnvVar","isDebug","applyLambdaModifications","log","displayManualInstructions","ensurePayloadFigmaConfig","runScript","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","checkForUpdates","getOwnVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","fetchDatasetInfo","accessToken","datasetId","debug","datasetInfo","oauthClientId","oauthClientSecret","tenantId","initCommand","options","currentVersion","s","skipAuth","warn","hasValidTokens","token","showNextSteps","newToken","process","exit","red","id","dim","isInProject","projectInfo","hasPayload","payloadVersion","success","hasDeps","cwd","shouldInstall","confirm","initialValue","isCancel","packageManager","modResult","modified","changes","length","forEach","change","warnings","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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"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
* Options for list-tokens command
|
|
3
3
|
*/
|
|
4
4
|
export interface ListTokensCommandOptions {
|
|
5
|
+
/** Show all environments */
|
|
6
|
+
all?: boolean;
|
|
5
7
|
/** Enable debug mode */
|
|
6
8
|
debug?: boolean;
|
|
7
9
|
}
|
|
@@ -9,8 +11,6 @@ export interface ListTokensCommandOptions {
|
|
|
9
11
|
* Handle the `@payloadcms/figma list-tokens` command
|
|
10
12
|
*
|
|
11
13
|
* Displays stored token information including OAuth and project tokens.
|
|
12
|
-
*
|
|
13
|
-
* @param _options - Command options (unused)
|
|
14
14
|
*/
|
|
15
|
-
export declare function listTokensCommand(
|
|
15
|
+
export declare function listTokensCommand(options?: ListTokensCommandOptions): void;
|
|
16
16
|
//# sourceMappingURL=list-tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-tokens.d.ts","sourceRoot":"","sources":["../../src/commands/list-tokens.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,4BAA4B;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,IAAI,CAU9E"}
|
|
@@ -2,27 +2,39 @@ import * as p from '@clack/prompts';
|
|
|
2
2
|
import pc from 'picocolors';
|
|
3
3
|
import { getTokenStore } from '../auth/token-store.js';
|
|
4
4
|
import { getEnvironment } from '../constants.js';
|
|
5
|
+
import { formatEnvSuffix } from '../utils/format-env-suffix.js';
|
|
5
6
|
import { isDebug } from '../utils/is-debug.js';
|
|
6
7
|
import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js';
|
|
8
|
+
const ALL_ENVIRONMENTS = [
|
|
9
|
+
'production',
|
|
10
|
+
'staging'
|
|
11
|
+
];
|
|
7
12
|
/**
|
|
8
13
|
* Handle the `@payloadcms/figma list-tokens` command
|
|
9
14
|
*
|
|
10
15
|
* Displays stored token information including OAuth and project tokens.
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
*/ export function listTokensCommand(options = {}) {
|
|
17
|
+
if (options.all) {
|
|
18
|
+
// Show detailed info for all environments
|
|
19
|
+
for (const env of ALL_ENVIRONMENTS){
|
|
20
|
+
showTokenDetails(env);
|
|
21
|
+
}
|
|
22
|
+
} else {
|
|
23
|
+
// Show detailed info for current environment only
|
|
24
|
+
showTokenDetails(getEnvironment());
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function showTokenDetails(env) {
|
|
28
|
+
const tokenStore = getTokenStore(env);
|
|
15
29
|
const tokens = tokenStore.getTokens();
|
|
16
30
|
if (!tokens) {
|
|
17
|
-
p.log.warn(pc.yellow(
|
|
31
|
+
p.log.warn(pc.yellow(`No tokens found${formatEnvSuffix(env, ' for ')}. Not authenticated.`));
|
|
18
32
|
p.note(`Run ${pc.cyan('@payloadcms/figma login')} to authenticate`, 'Tip');
|
|
19
33
|
return;
|
|
20
34
|
}
|
|
21
35
|
const isValid = tokenStore.hasValidTokens();
|
|
22
36
|
const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired');
|
|
23
|
-
|
|
24
|
-
const envSuffix = env === 'staging' ? ` (${env})` : '';
|
|
25
|
-
p.log.step(pc.bold(`Token Status${envSuffix}`));
|
|
37
|
+
p.log.step(pc.bold(`Token Status${formatEnvSuffix(env, ' (', ')')}`));
|
|
26
38
|
// Build OAuth token info display
|
|
27
39
|
const lines = [
|
|
28
40
|
`Status: ${status}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/list-tokens.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js'\n\n/**\n * Options for list-tokens command\n */\nexport interface ListTokensCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma list-tokens` command\n *\n * Displays stored token information including OAuth and project tokens.\n
|
|
1
|
+
{"version":3,"sources":["../../src/commands/list-tokens.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { Environment } from '../constants.js'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getEnvironment } from '../constants.js'\nimport { formatEnvSuffix } from '../utils/format-env-suffix.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js'\n\n/**\n * Options for list-tokens command\n */\nexport interface ListTokensCommandOptions {\n /** Show all environments */\n all?: boolean\n /** Enable debug mode */\n debug?: boolean\n}\n\nconst ALL_ENVIRONMENTS: Environment[] = ['production', 'staging']\n\n/**\n * Handle the `@payloadcms/figma list-tokens` command\n *\n * Displays stored token information including OAuth and project tokens.\n */\nexport function listTokensCommand(options: ListTokensCommandOptions = {}): void {\n if (options.all) {\n // Show detailed info for all environments\n for (const env of ALL_ENVIRONMENTS) {\n showTokenDetails(env)\n }\n } else {\n // Show detailed info for current environment only\n showTokenDetails(getEnvironment())\n }\n}\n\nfunction showTokenDetails(env: Environment): void {\n const tokenStore = getTokenStore(env)\n const tokens = tokenStore.getTokens()\n\n if (!tokens) {\n p.log.warn(pc.yellow(`No tokens found${formatEnvSuffix(env, ' for ')}. Not authenticated.`))\n p.note(`Run ${pc.cyan('@payloadcms/figma login')} to authenticate`, 'Tip')\n return\n }\n\n const isValid = tokenStore.hasValidTokens()\n const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired')\n\n p.log.step(pc.bold(`Token Status${formatEnvSuffix(env, ' (', ')')}`))\n\n // Build OAuth token info display\n const lines = [\n `Status: ${status}`,\n `Access Token: ${isDebug() ? tokens.accessToken : maskToken(tokens.accessToken)}`,\n `Refresh Token: ${isDebug() ? tokens.refreshToken : maskToken(tokens.refreshToken)}`,\n `Expires: ${formatTimestamp(tokens.expiresAt)}`,\n ]\n\n if (tokens.userId) {\n lines.push(`User ID: ${tokens.userId}`)\n }\n\n if (tokens.scopes && tokens.scopes.length > 0) {\n lines.push(`Scopes: ${tokens.scopes.join(', ')}`)\n }\n\n lines.push(`Storage Path: ${pc.dim(tokenStore.getStoragePath())}`)\n\n p.note(lines.join('\\n'), 'OAuth Tokens')\n\n if (!isValid) {\n p.note(\n `Tokens have expired. Run ${pc.cyan('@payloadcms/figma login')} to re-authenticate`,\n 'Action Required',\n )\n }\n\n // Show project tokens if any exist\n showProjectTokens(tokenStore)\n}\n"],"names":["p","pc","getTokenStore","getEnvironment","formatEnvSuffix","isDebug","formatTimestamp","maskToken","showProjectTokens","ALL_ENVIRONMENTS","listTokensCommand","options","all","env","showTokenDetails","tokenStore","tokens","getTokens","log","warn","yellow","note","cyan","isValid","hasValidTokens","status","green","red","step","bold","lines","accessToken","refreshToken","expiresAt","userId","push","scopes","length","join","dim","getStoragePath"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAI3B,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,cAAc,QAAQ,kBAAiB;AAChD,SAASC,eAAe,QAAQ,gCAA+B;AAC/D,SAASC,OAAO,QAAQ,uBAAsB;AAC9C,SAASC,eAAe,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,4BAA2B;AAYzF,MAAMC,mBAAkC;IAAC;IAAc;CAAU;AAEjE;;;;CAIC,GACD,OAAO,SAASC,kBAAkBC,UAAoC,CAAC,CAAC;IACtE,IAAIA,QAAQC,GAAG,EAAE;QACf,0CAA0C;QAC1C,KAAK,MAAMC,OAAOJ,iBAAkB;YAClCK,iBAAiBD;QACnB;IACF,OAAO;QACL,kDAAkD;QAClDC,iBAAiBX;IACnB;AACF;AAEA,SAASW,iBAAiBD,GAAgB;IACxC,MAAME,aAAab,cAAcW;IACjC,MAAMG,SAASD,WAAWE,SAAS;IAEnC,IAAI,CAACD,QAAQ;QACXhB,EAAEkB,GAAG,CAACC,IAAI,CAAClB,GAAGmB,MAAM,CAAC,CAAC,eAAe,EAAEhB,gBAAgBS,KAAK,SAAS,oBAAoB,CAAC;QAC1Fb,EAAEqB,IAAI,CAAC,CAAC,IAAI,EAAEpB,GAAGqB,IAAI,CAAC,2BAA2B,gBAAgB,CAAC,EAAE;QACpE;IACF;IAEA,MAAMC,UAAUR,WAAWS,cAAc;IACzC,MAAMC,SAASF,UAAUtB,GAAGyB,KAAK,CAAC,aAAazB,GAAG0B,GAAG,CAAC;IAEtD3B,EAAEkB,GAAG,CAACU,IAAI,CAAC3B,GAAG4B,IAAI,CAAC,CAAC,YAAY,EAAEzB,gBAAgBS,KAAK,MAAM,MAAM;IAEnE,iCAAiC;IACjC,MAAMiB,QAAQ;QACZ,CAAC,gBAAgB,EAAEL,QAAQ;QAC3B,CAAC,gBAAgB,EAAEpB,YAAYW,OAAOe,WAAW,GAAGxB,UAAUS,OAAOe,WAAW,GAAG;QACnF,CAAC,gBAAgB,EAAE1B,YAAYW,OAAOgB,YAAY,GAAGzB,UAAUS,OAAOgB,YAAY,GAAG;QACrF,CAAC,gBAAgB,EAAE1B,gBAAgBU,OAAOiB,SAAS,GAAG;KACvD;IAED,IAAIjB,OAAOkB,MAAM,EAAE;QACjBJ,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAEnB,OAAOkB,MAAM,EAAE;IAC/C;IAEA,IAAIlB,OAAOoB,MAAM,IAAIpB,OAAOoB,MAAM,CAACC,MAAM,GAAG,GAAG;QAC7CP,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAEnB,OAAOoB,MAAM,CAACE,IAAI,CAAC,OAAO;IAC1D;IAEAR,MAAMK,IAAI,CAAC,CAAC,gBAAgB,EAAElC,GAAGsC,GAAG,CAACxB,WAAWyB,cAAc,KAAK;IAEnExC,EAAEqB,IAAI,CAACS,MAAMQ,IAAI,CAAC,OAAO;IAEzB,IAAI,CAACf,SAAS;QACZvB,EAAEqB,IAAI,CACJ,CAAC,yBAAyB,EAAEpB,GAAGqB,IAAI,CAAC,2BAA2B,mBAAmB,CAAC,EACnF;IAEJ;IAEA,mCAAmC;IACnCd,kBAAkBO;AACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAaA,KAAK,SAAS,GAAG;IACf;;OAEG;IACH,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BlE"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
+
import { CallbackError } from '../auth/callback-server.js';
|
|
3
4
|
import { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js';
|
|
4
5
|
import { getTokenStore } from '../auth/token-store.js';
|
|
5
6
|
import { getOAuthConfig } from '../config/oauth.js';
|
|
6
7
|
import { getEnvironment } from '../constants.js';
|
|
8
|
+
import { formatEnvSuffix } from '../utils/format-env-suffix.js';
|
|
7
9
|
import * as log from '../utils/log.js';
|
|
8
10
|
/**
|
|
9
11
|
* Handle the `@payloadcms/figma login` command
|
|
@@ -14,13 +16,14 @@ import * as log from '../utils/log.js';
|
|
|
14
16
|
const { showNextSteps } = args || {
|
|
15
17
|
showNextSteps: false
|
|
16
18
|
};
|
|
17
|
-
const
|
|
19
|
+
const env = getEnvironment();
|
|
20
|
+
const tokenStore = getTokenStore(env);
|
|
18
21
|
// Check for existing valid tokens
|
|
19
22
|
try {
|
|
20
23
|
const existingToken = await getValidAccessToken(tokenStore);
|
|
21
24
|
if (existingToken) {
|
|
22
25
|
const tokens = tokenStore.getTokens();
|
|
23
|
-
p.log.warn(pc.yellow(
|
|
26
|
+
p.log.warn(pc.yellow(`Already logged in${formatEnvSuffix(env)}`));
|
|
24
27
|
if (tokens?.userId) {
|
|
25
28
|
log.info(`User ID: ${tokens.userId}`);
|
|
26
29
|
}
|
|
@@ -50,8 +53,7 @@ import * as log from '../utils/log.js';
|
|
|
50
53
|
scopes: oauthConfig.scopes
|
|
51
54
|
});
|
|
52
55
|
const env = getEnvironment();
|
|
53
|
-
|
|
54
|
-
p.log.success(pc.green(`✓ Logged in to Figma${envSuffix}`));
|
|
56
|
+
p.log.success(pc.green(`✓ Logged in${formatEnvSuffix(env)}`));
|
|
55
57
|
if (result.userId) {
|
|
56
58
|
log.debug(`User ID: ${result.userId}`);
|
|
57
59
|
}
|
|
@@ -62,6 +64,12 @@ import * as log from '../utils/log.js';
|
|
|
62
64
|
}
|
|
63
65
|
} catch (error) {
|
|
64
66
|
if (error instanceof OAuthFlowError) {
|
|
67
|
+
const isTimeout = error.cause instanceof CallbackError && error.cause.code === 'timeout';
|
|
68
|
+
if (isTimeout) {
|
|
69
|
+
p.log.error(pc.red('✗ Authentication timed out.'));
|
|
70
|
+
p.note(`Run ${pc.cyan('@payloadcms/figma login')} to try again.`, 'Tip');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
65
73
|
log.error(error.message);
|
|
66
74
|
if (error.cause) {
|
|
67
75
|
log.debug(`Cause: ${error.cause.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getOAuthConfig } from '../config/oauth.js'\nimport { getEnvironment } from '../constants.js'\nimport * as log from '../utils/log.js'\n\ntype LoginArgs = {\n /** Set this to show next steps after login\n * @default true\n */\n showNextSteps: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma login` command\n *\n * Authenticates the user with Figma OAuth2 and stores tokens locally.\n * If valid tokens already exist, shows an error message.\n */\nexport async function loginCommand(args?: LoginArgs): Promise<void> {\n const { showNextSteps } = args || { showNextSteps: false }\n const tokenStore = getTokenStore()\n\n // Check for existing valid tokens\n try {\n const existingToken = await getValidAccessToken(tokenStore)\n if (existingToken) {\n const tokens = tokenStore.getTokens()\n p.log.warn(pc.yellow(
|
|
1
|
+
{"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { CallbackError } from '../auth/callback-server.js'\nimport { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { getOAuthConfig } from '../config/oauth.js'\nimport { getEnvironment } from '../constants.js'\nimport { formatEnvSuffix } from '../utils/format-env-suffix.js'\nimport * as log from '../utils/log.js'\n\ntype LoginArgs = {\n /** Set this to show next steps after login\n * @default true\n */\n showNextSteps: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma login` command\n *\n * Authenticates the user with Figma OAuth2 and stores tokens locally.\n * If valid tokens already exist, shows an error message.\n */\nexport async function loginCommand(args?: LoginArgs): Promise<void> {\n const { showNextSteps } = args || { showNextSteps: false }\n const env = getEnvironment()\n const tokenStore = getTokenStore(env)\n\n // Check for existing valid tokens\n try {\n const existingToken = await getValidAccessToken(tokenStore)\n if (existingToken) {\n const tokens = tokenStore.getTokens()\n p.log.warn(pc.yellow(`Already logged in${formatEnvSuffix(env)}`))\n if (tokens?.userId) {\n log.info(`User ID: ${tokens.userId}`)\n }\n log.info(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n p.note(`To re-authenticate, first run ${pc.cyan('@payloadcms/figma logout')}`, 'Tip')\n return\n }\n } catch {\n // Token refresh failed - continue with new auth flow\n log.warning('Existing tokens are invalid. Starting new authentication...')\n }\n\n // Start OAuth flow\n await handleAuthentication({\n showNextSteps,\n tokenStore,\n })\n}\n\n/**\n * Handle authentication flow\n */\nasync function handleAuthentication({\n showNextSteps,\n tokenStore,\n}: {\n showNextSteps: boolean\n tokenStore: TokenStore\n}): Promise<void> {\n try {\n // Execute OAuth flow\n const oauthConfig = getOAuthConfig()\n const result = await executeOAuthFlow(tokenStore, {\n clientId: oauthConfig.clientId,\n redirectUri: oauthConfig.redirectUri,\n scopes: oauthConfig.scopes,\n })\n\n const env = getEnvironment()\n p.log.success(pc.green(`✓ Logged in${formatEnvSuffix(env)}`))\n\n if (result.userId) {\n log.debug(`User ID: ${result.userId}`)\n }\n\n log.debug(`Token storage: ${pc.dim(tokenStore.getStoragePath())}`)\n\n // Show next steps unless disabled\n if (showNextSteps !== false) {\n p.note(` ${pc.cyan('@payloadcms/figma init')} Create a new CMS instance`, 'Next Steps')\n }\n } catch (error) {\n if (error instanceof OAuthFlowError) {\n const isTimeout = error.cause instanceof CallbackError && error.cause.code === 'timeout'\n\n if (isTimeout) {\n p.log.error(pc.red('✗ Authentication timed out.'))\n p.note(`Run ${pc.cyan('@payloadcms/figma login')} to try again.`, 'Tip')\n process.exit(1)\n }\n\n log.error(error.message)\n\n if (error.cause) {\n log.debug(`Cause: ${error.cause.message}`)\n }\n } else {\n log.error(error instanceof Error ? error.message : 'Unknown error')\n }\n\n process.exit(1)\n }\n}\n"],"names":["p","pc","CallbackError","executeOAuthFlow","getValidAccessToken","OAuthFlowError","getTokenStore","getOAuthConfig","getEnvironment","formatEnvSuffix","log","loginCommand","args","showNextSteps","env","tokenStore","existingToken","tokens","getTokens","warn","yellow","userId","info","dim","getStoragePath","note","cyan","warning","handleAuthentication","oauthConfig","result","clientId","redirectUri","scopes","success","green","debug","error","isTimeout","cause","code","red","process","exit","message","Error"],"mappings":"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"}
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
* Options for logout command
|
|
3
3
|
*/
|
|
4
4
|
export interface LogoutCommandOptions {
|
|
5
|
+
/** Logout from all environments */
|
|
6
|
+
all?: boolean;
|
|
5
7
|
/** Enable debug mode */
|
|
6
8
|
debug?: boolean;
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* Handle the `@payloadcms/figma logout` command
|
|
10
12
|
*
|
|
11
|
-
* Clears
|
|
12
|
-
*
|
|
13
|
-
* @param _options - Command options (unused)
|
|
13
|
+
* Clears stored tokens (OAuth and project tokens) after confirmation.
|
|
14
|
+
* By default clears only current environment. Use --all for all environments.
|
|
14
15
|
*/
|
|
15
|
-
export declare function logoutCommand(
|
|
16
|
+
export declare function logoutCommand(options?: LogoutCommandOptions): Promise<void>;
|
|
16
17
|
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
3
|
import { getTokenStore } from '../auth/token-store.js';
|
|
4
|
+
import { getEnvironment } from '../constants.js';
|
|
5
|
+
import { formatEnvSuffix } from '../utils/format-env-suffix.js';
|
|
4
6
|
import * as log from '../utils/log.js';
|
|
7
|
+
const ALL_ENVIRONMENTS = [
|
|
8
|
+
'production',
|
|
9
|
+
'staging'
|
|
10
|
+
];
|
|
5
11
|
/**
|
|
6
12
|
* Handle the `@payloadcms/figma logout` command
|
|
7
13
|
*
|
|
8
|
-
* Clears
|
|
9
|
-
*
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
* Clears stored tokens (OAuth and project tokens) after confirmation.
|
|
15
|
+
* By default clears only current environment. Use --all for all environments.
|
|
16
|
+
*/ export async function logoutCommand(options = {}) {
|
|
17
|
+
const currentEnv = getEnvironment();
|
|
18
|
+
if (options.all) {
|
|
19
|
+
await logoutAllEnvironments();
|
|
20
|
+
} else {
|
|
21
|
+
await logoutSingleEnvironment(currentEnv);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function logoutSingleEnvironment(env) {
|
|
25
|
+
const tokenStore = getTokenStore(env);
|
|
13
26
|
const hasTokens = tokenStore.getTokens() !== null;
|
|
14
27
|
if (!hasTokens) {
|
|
15
|
-
p.log.warn(pc.yellow(
|
|
28
|
+
p.log.warn(pc.yellow(`No tokens found${formatEnvSuffix(env, ' for ')}. Already logged out.`));
|
|
16
29
|
return;
|
|
17
30
|
}
|
|
18
|
-
// Confirm logout
|
|
19
31
|
const confirmed = await p.confirm({
|
|
20
32
|
initialValue: false,
|
|
21
|
-
message:
|
|
33
|
+
message: `This will clear all OAuth and project tokens${formatEnvSuffix(env, ' for ')}. Continue?`
|
|
22
34
|
});
|
|
23
35
|
if (p.isCancel(confirmed) || !confirmed) {
|
|
24
36
|
p.log.info('Logout cancelled');
|
|
@@ -27,12 +39,43 @@ import * as log from '../utils/log.js';
|
|
|
27
39
|
const s = p.spinner();
|
|
28
40
|
s.start('Clearing tokens...');
|
|
29
41
|
try {
|
|
30
|
-
// Clear OAuth tokens
|
|
31
42
|
tokenStore.clearTokens();
|
|
32
|
-
// Clear all project tokens
|
|
33
43
|
tokenStore.clearAllProjectTokens();
|
|
34
|
-
s.stop(pc.green(
|
|
35
|
-
|
|
44
|
+
s.stop(pc.green(`✓ Logged out${formatEnvSuffix(env, ' from ')}`));
|
|
45
|
+
} catch (error) {
|
|
46
|
+
s.stop(pc.red('✗ Failed to clear tokens'));
|
|
47
|
+
log.error(error instanceof Error ? error.message : 'Unknown error');
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function logoutAllEnvironments() {
|
|
52
|
+
// Check which environments have tokens
|
|
53
|
+
const envsWithTokens = ALL_ENVIRONMENTS.filter((env)=>{
|
|
54
|
+
const store = getTokenStore(env);
|
|
55
|
+
return store.getTokens() !== null;
|
|
56
|
+
});
|
|
57
|
+
if (envsWithTokens.length === 0) {
|
|
58
|
+
p.log.warn(pc.yellow('No tokens found in any environment. Already logged out.'));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const envList = envsWithTokens.join(' and ');
|
|
62
|
+
const confirmed = await p.confirm({
|
|
63
|
+
initialValue: false,
|
|
64
|
+
message: `This will clear all OAuth and project tokens for ${envList}. Continue?`
|
|
65
|
+
});
|
|
66
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
67
|
+
p.log.info('Logout cancelled');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const s = p.spinner();
|
|
71
|
+
s.start('Clearing tokens...');
|
|
72
|
+
try {
|
|
73
|
+
for (const env of envsWithTokens){
|
|
74
|
+
const store = getTokenStore(env);
|
|
75
|
+
store.clearTokens();
|
|
76
|
+
store.clearAllProjectTokens();
|
|
77
|
+
}
|
|
78
|
+
s.stop(pc.green('✓ Logged out from all environments'));
|
|
36
79
|
} catch (error) {
|
|
37
80
|
s.stop(pc.red('✗ Failed to clear tokens'));
|
|
38
81
|
log.error(error instanceof Error ? error.message : 'Unknown error');
|