@payloadcms/figma 0.0.1-alpha.20 → 0.0.1-alpha.21
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/api/control-plane.d.ts.map +1 -1
- package/dist/api/control-plane.js +2 -3
- package/dist/api/control-plane.js.map +1 -1
- package/dist/auth/project-token.d.ts.map +1 -1
- package/dist/auth/project-token.js +2 -1
- package/dist/auth/project-token.js.map +1 -1
- package/dist/auth/token-store.d.ts +10 -0
- package/dist/auth/token-store.d.ts.map +1 -1
- package/dist/auth/token-store.js +17 -0
- package/dist/auth/token-store.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +7 -30
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/init.d.ts +1 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +28 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list-tokens.js +2 -2
- package/dist/commands/list-tokens.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +2 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/db-adapter.d.ts.map +1 -1
- package/dist/db-adapter.js +1 -1
- package/dist/db-adapter.js.map +1 -1
- package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
- package/dist/oauth/components/LogoutButton/index.js +0 -1
- 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.map +1 -1
- package/dist/oauth/strategy/index.d.ts.map +1 -1
- package/dist/oauth/strategy/index.js.map +1 -1
- package/dist/oauth/types.d.ts +1 -1
- package/dist/oauth/types.d.ts.map +1 -1
- package/dist/oauth/types.js.map +1 -1
- package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -1
- package/dist/oauth/utilities/createCookieOptions.js.map +1 -1
- package/dist/plugin/build-config.d.ts +17 -1
- package/dist/plugin/build-config.d.ts.map +1 -1
- package/dist/plugin/build-config.js +9 -4
- package/dist/plugin/build-config.js.map +1 -1
- package/dist/utils/env-management.d.ts +4 -11
- package/dist/utils/env-management.d.ts.map +1 -1
- package/dist/utils/env-management.js +46 -79
- package/dist/utils/env-management.js.map +1 -1
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +5 -7
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/payload-config-ast.d.ts +1 -2
- package/dist/utils/payload-config-ast.d.ts.map +1 -1
- package/dist/utils/payload-config-ast.js +32 -16
- package/dist/utils/payload-config-ast.js.map +1 -1
- package/dist/utils/project.d.ts.map +1 -1
- package/dist/utils/project.js +1 -3
- package/dist/utils/project.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -5,26 +5,27 @@ import pc from 'picocolors';
|
|
|
5
5
|
import { FigmaApiError } from '../api/figma-api.js';
|
|
6
6
|
import { getValidAccessToken } from '../auth/oauth-flow.js';
|
|
7
7
|
import { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js';
|
|
8
|
-
import {
|
|
8
|
+
import { getTokenStore } from '../auth/token-store.js';
|
|
9
|
+
import { addOrUpdateEnvVar } from '../utils/env-management.js';
|
|
9
10
|
import { isDebug } from '../utils/is-debug.js';
|
|
10
11
|
import * as log from '../utils/log.js';
|
|
11
12
|
import { displayManualInstructions, ensurePayloadFigmaConfig } from '../utils/payload-config-modifier.js';
|
|
12
13
|
import { detectPayloadProject, hasRequiredDependencies, initializeGitRepo, installDependencies, isInProjectDirectory, scaffoldProject, validatePayloadVersion } from '../utils/project.js';
|
|
13
14
|
import { loginCommand } from './login.js';
|
|
14
15
|
/**
|
|
15
|
-
* Generate and store project token for a
|
|
16
|
+
* Generate and store project token for a content system
|
|
16
17
|
* Non-blocking - will show warning but not exit on failure
|
|
17
18
|
* Only shows feedback if DEBUG mode is enabled, otherwise runs silently
|
|
18
19
|
*
|
|
19
20
|
* @param tokenStore - Token store instance
|
|
20
|
-
* @param
|
|
21
|
+
* @param contentSystemId - Content System ID to generate token for
|
|
21
22
|
* @param spinner - Clack spinner instance for status updates (only used in debug mode)
|
|
22
|
-
*/ async function generateProjectTokenWithFeedback(tokenStore,
|
|
23
|
+
*/ async function generateProjectTokenWithFeedback(tokenStore, contentSystemId, spinner) {
|
|
23
24
|
if (isDebug()) {
|
|
24
25
|
spinner.start('Generating project token...');
|
|
25
26
|
}
|
|
26
27
|
try {
|
|
27
|
-
const projectToken = await getValidProjectToken(tokenStore,
|
|
28
|
+
const projectToken = await getValidProjectToken(tokenStore, contentSystemId);
|
|
28
29
|
if (isDebug()) {
|
|
29
30
|
if (projectToken) {
|
|
30
31
|
spinner.stop(pc.green('✓ Project token generated'));
|
|
@@ -58,7 +59,7 @@ import { loginCommand } from './login.js';
|
|
|
58
59
|
* @param options - Command options
|
|
59
60
|
*/ export async function initCommand(options) {
|
|
60
61
|
// Check authentication
|
|
61
|
-
const tokenStore =
|
|
62
|
+
const tokenStore = getTokenStore();
|
|
62
63
|
const s = p.spinner();
|
|
63
64
|
if (options.skipAuth) {
|
|
64
65
|
// Skip authentication for testing/development
|
|
@@ -97,13 +98,13 @@ import { loginCommand } from './login.js';
|
|
|
97
98
|
// Note: We no longer check for figma.config.json here
|
|
98
99
|
// Instead, the AST detection will check if figma object already exists in payload.config.ts
|
|
99
100
|
// and skip modification if it does (unless --force is used)
|
|
100
|
-
// Step 3: Get
|
|
101
|
+
// Step 3: Get Content System ID (required argument)
|
|
101
102
|
log.debug('Configuring Project...');
|
|
102
103
|
if (!options.id) {
|
|
103
|
-
p.log.error('
|
|
104
|
+
p.log.error('Content System ID is required. Use --id <content_system_id>');
|
|
104
105
|
process.exit(1);
|
|
105
106
|
}
|
|
106
|
-
const
|
|
107
|
+
const contentSystemId = options.id;
|
|
107
108
|
// Step 4: Detect or scaffold Payload project
|
|
108
109
|
const isInProject = await isInProjectDirectory();
|
|
109
110
|
if (isInProject) {
|
|
@@ -136,9 +137,7 @@ import { loginCommand } from './login.js';
|
|
|
136
137
|
}
|
|
137
138
|
s.start('Checking Payload configuration...');
|
|
138
139
|
const modResult = await ensurePayloadFigmaConfig(process.cwd(), projectInfo.packageManager || 'pnpm', {
|
|
139
|
-
contentSystemId
|
|
140
|
-
region: options.region || 'us-east-1',
|
|
141
|
-
useContentSystem: !options.noContentSystem
|
|
140
|
+
contentSystemId
|
|
142
141
|
});
|
|
143
142
|
if (!modResult.success) {
|
|
144
143
|
s.stop(pc.red('✗ Configuration check failed'));
|
|
@@ -159,6 +158,13 @@ import { loginCommand } from './login.js';
|
|
|
159
158
|
p.log.warn(pc.yellow(`⚠ ${warning}`));
|
|
160
159
|
});
|
|
161
160
|
}
|
|
161
|
+
// Write content system ID to .env file
|
|
162
|
+
try {
|
|
163
|
+
await addOrUpdateEnvVar(process.cwd(), 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
|
|
164
|
+
log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
167
|
+
}
|
|
162
168
|
} else {
|
|
163
169
|
// Has package.json but no Payload - offer to add Payload
|
|
164
170
|
p.log.warn(pc.yellow('⚠ No Payload detected in this project'));
|
|
@@ -181,7 +187,7 @@ import { loginCommand } from './login.js';
|
|
|
181
187
|
}
|
|
182
188
|
// Generate project token (unless skipping auth)
|
|
183
189
|
if (!options.skipAuth) {
|
|
184
|
-
await generateProjectTokenWithFeedback(tokenStore,
|
|
190
|
+
await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s);
|
|
185
191
|
}
|
|
186
192
|
// Success message for existing project
|
|
187
193
|
p.outro(pc.green('✓ Project initialized successfully!'));
|
|
@@ -238,9 +244,7 @@ import { loginCommand } from './login.js';
|
|
|
238
244
|
// Modify Payload configuration
|
|
239
245
|
s.start('Checking Payload configuration...');
|
|
240
246
|
const modResult = await ensurePayloadFigmaConfig(fullPath, 'pnpm', {
|
|
241
|
-
contentSystemId
|
|
242
|
-
region: options.region || 'us-east-1',
|
|
243
|
-
useContentSystem: !options.noContentSystem
|
|
247
|
+
contentSystemId
|
|
244
248
|
});
|
|
245
249
|
if (!modResult.success) {
|
|
246
250
|
s.stop(pc.red('✗ Configuration check failed'));
|
|
@@ -261,9 +265,16 @@ import { loginCommand } from './login.js';
|
|
|
261
265
|
p.log.warn(pc.yellow(`⚠ ${warning}`));
|
|
262
266
|
});
|
|
263
267
|
}
|
|
268
|
+
// Write content system ID to .env file
|
|
269
|
+
try {
|
|
270
|
+
await addOrUpdateEnvVar(fullPath, 'FIGMA_CONTENT_SYSTEM_ID', contentSystemId);
|
|
271
|
+
log.debug(`Added FIGMA_CONTENT_SYSTEM_ID to .env file`);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
p.log.warn(pc.yellow(`⚠ Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
274
|
+
}
|
|
264
275
|
// Generate project token (unless skipping auth)
|
|
265
276
|
if (!options.skipAuth) {
|
|
266
|
-
await generateProjectTokenWithFeedback(tokenStore,
|
|
277
|
+
await generateProjectTokenWithFeedback(tokenStore, contentSystemId, s);
|
|
267
278
|
}
|
|
268
279
|
// Initialize git repository (after all files including lock file are ready)
|
|
269
280
|
initializeGitRepo(fullPath);
|
|
@@ -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 { FigmaApiError } from '../api/figma-api.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken, ProjectTokenError } from '../auth/project-token.js'\nimport { TokenStore } from '../auth/token-store.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport * as log from '../utils/log.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.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 /** Tenant ID to use (optional - will prompt if not provided) */\n id?: string\n /** Project name (for scaffolding) */\n name?: string\n /** Disable Content System (defaults to enabled) */\n noContentSystem?: boolean\n /** AWS region for deployment (defaults to us-east-1) */\n region?: 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 tenant\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 tenantId - Tenant 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 tenantId: 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, tenantId)\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 * 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 authentication\n const tokenStore = new TokenStore()\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(pc.yellow('⚠ Not authenticated'))\n p.log.info('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 CMS ID (required argument)\n log.debug('Configuring Project...')\n\n if (!options.id) {\n p.log.error('CMS ID is required. Use --id <tenant_id>')\n process.exit(1)\n }\n\n const tenantId = options.id\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: tenantId,\n region: options.region || 'us-east-1',\n useContentSystem: !options.noContentSystem,\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 } 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 project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, tenantId, 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: tenantId,\n region: options.region || 'us-east-1',\n useContentSystem: !options.noContentSystem,\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 // Generate project token (unless skipping auth)\n if (!options.skipAuth) {\n await generateProjectTokenWithFeedback(tokenStore, tenantId, 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","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","TokenStore","isDebug","log","displayManualInstructions","ensurePayloadFigmaConfig","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","tenantId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","initCommand","options","s","skipAuth","warn","hasValidTokens","token","info","showNextSteps","newToken","process","exit","red","debug","id","isInProject","projectInfo","hasPayload","payloadVersion","success","hasDeps","cwd","shouldInstall","confirm","initialValue","isCancel","packageManager","modResult","contentSystemId","region","useContentSystem","noContentSystem","modified","changes","length","forEach","change","dim","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 { 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 { addOrUpdateEnvVar } from '../utils/env-management.js'\nimport { isDebug } from '../utils/is-debug.js'\nimport * as log from '../utils/log.js'\nimport {\n displayManualInstructions,\n ensurePayloadFigmaConfig,\n} from '../utils/payload-config-modifier.js'\nimport {\n detectPayloadProject,\n hasRequiredDependencies,\n initializeGitRepo,\n installDependencies,\n isInProjectDirectory,\n scaffoldProject,\n validatePayloadVersion,\n} from '../utils/project.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 * 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 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(pc.yellow('⚠ Not authenticated'))\n p.log.info('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 // 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 content system ID 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 } 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 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 content system ID 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 } 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 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","FigmaApiError","getValidAccessToken","getValidProjectToken","ProjectTokenError","getTokenStore","addOrUpdateEnvVar","isDebug","log","displayManualInstructions","ensurePayloadFigmaConfig","detectPayloadProject","hasRequiredDependencies","initializeGitRepo","installDependencies","isInProjectDirectory","scaffoldProject","validatePayloadVersion","loginCommand","generateProjectTokenWithFeedback","tokenStore","contentSystemId","spinner","start","projectToken","stop","green","yellow","error","warning","message","note","Error","initCommand","options","s","skipAuth","warn","hasValidTokens","token","info","showNextSteps","newToken","process","exit","red","debug","id","isInProject","projectInfo","hasPayload","payloadVersion","success","hasDeps","cwd","shouldInstall","confirm","initialValue","isCancel","packageManager","modResult","modified","changes","length","forEach","change","dim","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,6 +1,6 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import {
|
|
3
|
+
import { getTokenStore } from '../auth/token-store.js';
|
|
4
4
|
import { isDebug } from '../utils/is-debug.js';
|
|
5
5
|
import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-display.js';
|
|
6
6
|
/**
|
|
@@ -10,7 +10,7 @@ import { formatTimestamp, maskToken, showProjectTokens } from '../utils/token-di
|
|
|
10
10
|
*
|
|
11
11
|
* @param _options - Command options (unused)
|
|
12
12
|
*/ export function listTokensCommand(_options = {}) {
|
|
13
|
-
const tokenStore =
|
|
13
|
+
const tokenStore = getTokenStore();
|
|
14
14
|
const tokens = tokenStore.getTokens();
|
|
15
15
|
if (!tokens) {
|
|
16
16
|
p.log.warn(pc.yellow('No tokens found. Not authenticated.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/list-tokens.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport {
|
|
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 { 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 *\n * @param _options - Command options (unused)\n */\nexport function listTokensCommand(_options: ListTokensCommandOptions = {}): void {\n const tokenStore = getTokenStore()\n\n const tokens = tokenStore.getTokens()\n\n if (!tokens) {\n p.log.warn(pc.yellow('No tokens found. 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('Stored Tokens'))\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","isDebug","formatTimestamp","maskToken","showProjectTokens","listTokensCommand","_options","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;AAE3B,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,OAAO,QAAQ,uBAAsB;AAC9C,SAASC,eAAe,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,4BAA2B;AAUzF;;;;;;CAMC,GACD,OAAO,SAASC,kBAAkBC,WAAqC,CAAC,CAAC;IACvE,MAAMC,aAAaP;IAEnB,MAAMQ,SAASD,WAAWE,SAAS;IAEnC,IAAI,CAACD,QAAQ;QACXV,EAAEY,GAAG,CAACC,IAAI,CAACZ,GAAGa,MAAM,CAAC;QACrBd,EAAEe,IAAI,CAAC,CAAC,IAAI,EAAEd,GAAGe,IAAI,CAAC,2BAA2B,gBAAgB,CAAC,EAAE;QACpE;IACF;IAEA,MAAMC,UAAUR,WAAWS,cAAc;IACzC,MAAMC,SAASF,UAAUhB,GAAGmB,KAAK,CAAC,aAAanB,GAAGoB,GAAG,CAAC;IAEtDrB,EAAEY,GAAG,CAACU,IAAI,CAACrB,GAAGsB,IAAI,CAAC;IAEnB,iCAAiC;IACjC,MAAMC,QAAQ;QACZ,CAAC,gBAAgB,EAAEL,QAAQ;QAC3B,CAAC,gBAAgB,EAAEhB,YAAYO,OAAOe,WAAW,GAAGpB,UAAUK,OAAOe,WAAW,GAAG;QACnF,CAAC,gBAAgB,EAAEtB,YAAYO,OAAOgB,YAAY,GAAGrB,UAAUK,OAAOgB,YAAY,GAAG;QACrF,CAAC,gBAAgB,EAAEtB,gBAAgBM,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,EAAE5B,GAAGgC,GAAG,CAACxB,WAAWyB,cAAc,KAAK;IAEnElC,EAAEe,IAAI,CAACS,MAAMQ,IAAI,CAAC,OAAO;IAEzB,IAAI,CAACf,SAAS;QACZjB,EAAEe,IAAI,CACJ,CAAC,yBAAyB,EAAEd,GAAGe,IAAI,CAAC,2BAA2B,mBAAmB,CAAC,EACnF;IAEJ;IAEA,mCAAmC;IACnCV,kBAAkBG;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":"AAUA,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,CA2BlE"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
3
|
import { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getTokenStore } from '../auth/token-store.js';
|
|
5
5
|
import { OAUTH_CONFIG } from '../config/oauth.js';
|
|
6
6
|
import * as log from '../utils/log.js';
|
|
7
7
|
/**
|
|
@@ -13,7 +13,7 @@ import * as log from '../utils/log.js';
|
|
|
13
13
|
const { showNextSteps } = args || {
|
|
14
14
|
showNextSteps: false
|
|
15
15
|
};
|
|
16
|
-
const tokenStore =
|
|
16
|
+
const tokenStore = getTokenStore();
|
|
17
17
|
// Check for existing valid tokens
|
|
18
18
|
try {
|
|
19
19
|
const existingToken = await getValidAccessToken(tokenStore);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/login.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { executeOAuthFlow, getValidAccessToken, OAuthFlowError } from '../auth/oauth-flow.js'\nimport {
|
|
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 { OAUTH_CONFIG } from '../config/oauth.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('Already logged in'))\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 result = await executeOAuthFlow(tokenStore, {\n clientId: OAUTH_CONFIG.clientId,\n redirectUri: OAUTH_CONFIG.redirectUri,\n scopes: OAUTH_CONFIG.scopes,\n })\n\n p.log.success(pc.green('✓ You are now authenticated with Figma'))\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 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","executeOAuthFlow","getValidAccessToken","OAuthFlowError","getTokenStore","OAUTH_CONFIG","log","loginCommand","args","showNextSteps","tokenStore","existingToken","tokens","getTokens","warn","yellow","userId","info","dim","getStoragePath","note","cyan","warning","handleAuthentication","result","clientId","redirectUri","scopes","success","green","debug","error","message","cause","Error","process","exit"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAI3B,SAASC,gBAAgB,EAAEC,mBAAmB,EAAEC,cAAc,QAAQ,wBAAuB;AAC7F,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,YAAY,QAAQ,qBAAoB;AACjD,YAAYC,SAAS,kBAAiB;AAStC;;;;;CAKC,GACD,OAAO,eAAeC,aAAaC,IAAgB;IACjD,MAAM,EAAEC,aAAa,EAAE,GAAGD,QAAQ;QAAEC,eAAe;IAAM;IACzD,MAAMC,aAAaN;IAEnB,kCAAkC;IAClC,IAAI;QACF,MAAMO,gBAAgB,MAAMT,oBAAoBQ;QAChD,IAAIC,eAAe;YACjB,MAAMC,SAASF,WAAWG,SAAS;YACnCd,EAAEO,GAAG,CAACQ,IAAI,CAACd,GAAGe,MAAM,CAAC;YACrB,IAAIH,QAAQI,QAAQ;gBAClBV,IAAIW,IAAI,CAAC,CAAC,SAAS,EAAEL,OAAOI,MAAM,EAAE;YACtC;YACAV,IAAIW,IAAI,CAAC,CAAC,eAAe,EAAEjB,GAAGkB,GAAG,CAACR,WAAWS,cAAc,KAAK;YAChEpB,EAAEqB,IAAI,CAAC,CAAC,8BAA8B,EAAEpB,GAAGqB,IAAI,CAAC,6BAA6B,EAAE;YAC/E;QACF;IACF,EAAE,OAAM;QACN,qDAAqD;QACrDf,IAAIgB,OAAO,CAAC;IACd;IAEA,mBAAmB;IACnB,MAAMC,qBAAqB;QACzBd;QACAC;IACF;AACF;AAEA;;CAEC,GACD,eAAea,qBAAqB,EAClCd,aAAa,EACbC,UAAU,EAIX;IACC,IAAI;QACF,qBAAqB;QACrB,MAAMc,SAAS,MAAMvB,iBAAiBS,YAAY;YAChDe,UAAUpB,aAAaoB,QAAQ;YAC/BC,aAAarB,aAAaqB,WAAW;YACrCC,QAAQtB,aAAasB,MAAM;QAC7B;QAEA5B,EAAEO,GAAG,CAACsB,OAAO,CAAC5B,GAAG6B,KAAK,CAAC;QAEvB,IAAIL,OAAOR,MAAM,EAAE;YACjBV,IAAIwB,KAAK,CAAC,CAAC,SAAS,EAAEN,OAAOR,MAAM,EAAE;QACvC;QAEAV,IAAIwB,KAAK,CAAC,CAAC,eAAe,EAAE9B,GAAGkB,GAAG,CAACR,WAAWS,cAAc,KAAK;QAEjE,kCAAkC;QAClC,IAAIV,kBAAkB,OAAO;YAC3BV,EAAEqB,IAAI,CAAC,CAAC,EAAE,EAAEpB,GAAGqB,IAAI,CAAC,0BAA0B,2BAA2B,CAAC,EAAE;QAC9E;IACF,EAAE,OAAOU,OAAO;QACd,IAAIA,iBAAiB5B,gBAAgB;YACnCG,IAAIyB,KAAK,CAACA,MAAMC,OAAO;YAEvB,IAAID,MAAME,KAAK,EAAE;gBACf3B,IAAIwB,KAAK,CAAC,CAAC,OAAO,EAAEC,MAAME,KAAK,CAACD,OAAO,EAAE;YAC3C;QACF,OAAO;YACL1B,IAAIyB,KAAK,CAACA,iBAAiBG,QAAQH,MAAMC,OAAO,GAAG;QACrD;QAEAG,QAAQC,IAAI,CAAC;IACf;AACF"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as p from '@clack/prompts';
|
|
2
2
|
import pc from 'picocolors';
|
|
3
|
-
import {
|
|
3
|
+
import { getTokenStore } from '../auth/token-store.js';
|
|
4
4
|
import * as log from '../utils/log.js';
|
|
5
5
|
/**
|
|
6
6
|
* Handle the `@payloadcms/figma logout` command
|
|
@@ -9,7 +9,7 @@ import * as log from '../utils/log.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param _options - Command options (unused)
|
|
11
11
|
*/ export async function logoutCommand(_options = {}) {
|
|
12
|
-
const tokenStore =
|
|
12
|
+
const tokenStore = getTokenStore();
|
|
13
13
|
const hasTokens = tokenStore.getTokens() !== null;
|
|
14
14
|
if (!hasTokens) {
|
|
15
15
|
p.log.warn(pc.yellow('No tokens found. Already logged out.'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/commands/logout.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport { getTokenStore } from '../auth/token-store.js'\nimport * as log from '../utils/log.js'\n\n/**\n * Options for logout command\n */\nexport interface LogoutCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n}\n\n/**\n * Handle the `@payloadcms/figma logout` command\n *\n * Clears all stored tokens (OAuth and project tokens) after confirmation.\n *\n * @param _options - Command options (unused)\n */\nexport async function logoutCommand(_options: LogoutCommandOptions = {}): Promise<void> {\n const tokenStore = getTokenStore()\n\n const hasTokens = tokenStore.getTokens() !== null\n\n if (!hasTokens) {\n p.log.warn(pc.yellow('No tokens found. Already logged out.'))\n return\n }\n\n // Confirm logout\n const confirmed = await p.confirm({\n initialValue: false,\n message: 'This will clear all OAuth and project tokens. Continue?',\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.log.info('Logout cancelled')\n return\n }\n\n const s = p.spinner()\n s.start('Clearing tokens...')\n\n try {\n // Clear OAuth tokens\n tokenStore.clearTokens()\n // Clear all project tokens\n tokenStore.clearAllProjectTokens()\n s.stop(pc.green('✓ Logged out successfully'))\n p.log.step('All OAuth and project tokens have been cleared')\n } catch (error) {\n s.stop(pc.red('✗ Failed to clear tokens'))\n log.error(error instanceof Error ? error.message : 'Unknown error')\n process.exit(1)\n }\n}\n"],"names":["p","pc","getTokenStore","log","logoutCommand","_options","tokenStore","hasTokens","getTokens","warn","yellow","confirmed","confirm","initialValue","message","isCancel","info","s","spinner","start","clearTokens","clearAllProjectTokens","stop","green","step","error","red","Error","process","exit"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAE3B,SAASC,aAAa,QAAQ,yBAAwB;AACtD,YAAYC,SAAS,kBAAiB;AAUtC;;;;;;CAMC,GACD,OAAO,eAAeC,cAAcC,WAAiC,CAAC,CAAC;IACrE,MAAMC,aAAaJ;IAEnB,MAAMK,YAAYD,WAAWE,SAAS,OAAO;IAE7C,IAAI,CAACD,WAAW;QACdP,EAAEG,GAAG,CAACM,IAAI,CAACR,GAAGS,MAAM,CAAC;QACrB;IACF;IAEA,iBAAiB;IACjB,MAAMC,YAAY,MAAMX,EAAEY,OAAO,CAAC;QAChCC,cAAc;QACdC,SAAS;IACX;IAEA,IAAId,EAAEe,QAAQ,CAACJ,cAAc,CAACA,WAAW;QACvCX,EAAEG,GAAG,CAACa,IAAI,CAAC;QACX;IACF;IAEA,MAAMC,IAAIjB,EAAEkB,OAAO;IACnBD,EAAEE,KAAK,CAAC;IAER,IAAI;QACF,qBAAqB;QACrBb,WAAWc,WAAW;QACtB,2BAA2B;QAC3Bd,WAAWe,qBAAqB;QAChCJ,EAAEK,IAAI,CAACrB,GAAGsB,KAAK,CAAC;QAChBvB,EAAEG,GAAG,CAACqB,IAAI,CAAC;IACb,EAAE,OAAOC,OAAO;QACdR,EAAEK,IAAI,CAACrB,GAAGyB,GAAG,CAAC;QACdvB,IAAIsB,KAAK,CAACA,iBAAiBE,QAAQF,MAAMX,OAAO,GAAG;QACnDc,QAAQC,IAAI,CAAC;IACf;AACF"}
|
package/dist/db-adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db-adapter.d.ts","sourceRoot":"","sources":["../src/db-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db-adapter.d.ts","sourceRoot":"","sources":["../src/db-adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EAanB,kBAAkB,EAqBnB,MAAM,SAAS,CAAA;AAchB,UAAU,gCAAgC;IACxC,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACvD,GAAG,mBAAmB,CAAA;AAqzBvB,eAAO,MAAM,iBAAiB,SAAU,gCAAgC,KAAG,kBA6C1E,CAAA"}
|
package/dist/db-adapter.js
CHANGED