@payloadcms/figma 0.0.1-alpha.28 → 0.0.1-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/api/control-plane.d.ts +1 -19
  2. package/dist/api/control-plane.d.ts.map +1 -1
  3. package/dist/api/control-plane.js +13 -48
  4. package/dist/api/control-plane.js.map +1 -1
  5. package/dist/api/figma-api.d.ts.map +1 -1
  6. package/dist/api/figma-api.js +12 -38
  7. package/dist/api/figma-api.js.map +1 -1
  8. package/dist/auth/crypto-utils.d.ts.map +1 -1
  9. package/dist/auth/crypto-utils.js +5 -5
  10. package/dist/auth/crypto-utils.js.map +1 -1
  11. package/dist/auth/oauth-flow.js +3 -3
  12. package/dist/auth/oauth-flow.js.map +1 -1
  13. package/dist/auth/project-token.d.ts.map +1 -1
  14. package/dist/auth/project-token.js +4 -9
  15. package/dist/auth/project-token.js.map +1 -1
  16. package/dist/auth/token-store.d.ts +0 -10
  17. package/dist/auth/token-store.d.ts.map +1 -1
  18. package/dist/auth/token-store.js +0 -20
  19. package/dist/auth/token-store.js.map +1 -1
  20. package/dist/cli.js +0 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/deploy.d.ts +0 -2
  23. package/dist/commands/deploy.d.ts.map +1 -1
  24. package/dist/commands/deploy.js +45 -12
  25. package/dist/commands/deploy.js.map +1 -1
  26. package/dist/commands/init.d.ts +5 -1
  27. package/dist/commands/init.d.ts.map +1 -1
  28. package/dist/commands/init.js +85 -90
  29. package/dist/commands/init.js.map +1 -1
  30. package/dist/commands/list-tokens.js +2 -2
  31. package/dist/commands/list-tokens.js.map +1 -1
  32. package/dist/commands/login.d.ts +1 -8
  33. package/dist/commands/login.d.ts.map +1 -1
  34. package/dist/commands/login.js +6 -12
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logout.js +2 -2
  37. package/dist/commands/logout.js.map +1 -1
  38. package/dist/config/oauth.d.ts.map +1 -1
  39. package/dist/config/oauth.js +3 -4
  40. package/dist/config/oauth.js.map +1 -1
  41. package/dist/index.d.ts +1 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/oauth/components/LoginButton/index.d.ts.map +1 -1
  46. package/dist/oauth/components/LoginButton/index.js +6 -50
  47. package/dist/oauth/components/LoginButton/index.js.map +1 -1
  48. package/dist/oauth/components/LoginButton/index.scss +3 -50
  49. package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
  50. package/dist/oauth/components/LogoutButton/index.js +1 -0
  51. package/dist/oauth/components/LogoutButton/index.js.map +1 -1
  52. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  53. package/dist/oauth/endpoints/getLoginEndpoint.js +1 -1
  54. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  55. package/dist/oauth/index.d.ts.map +1 -1
  56. package/dist/oauth/index.js +6 -30
  57. package/dist/oauth/index.js.map +1 -1
  58. package/dist/oauth/strategy/index.d.ts.map +1 -1
  59. package/dist/oauth/strategy/index.js +0 -4
  60. package/dist/oauth/strategy/index.js.map +1 -1
  61. package/dist/oauth/types.d.ts +1 -1
  62. package/dist/oauth/types.d.ts.map +1 -1
  63. package/dist/oauth/types.js.map +1 -1
  64. package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -1
  65. package/dist/oauth/utilities/createCookieOptions.js.map +1 -1
  66. package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -1
  67. package/dist/oauth/utilities/refreshTokens.js +1 -1
  68. package/dist/oauth/utilities/refreshTokens.js.map +1 -1
  69. package/dist/plugin/build-config.d.ts +4 -20
  70. package/dist/plugin/build-config.d.ts.map +1 -1
  71. package/dist/plugin/build-config.js +9 -51
  72. package/dist/plugin/build-config.js.map +1 -1
  73. package/dist/utils/env-management.d.ts +11 -4
  74. package/dist/utils/env-management.d.ts.map +1 -1
  75. package/dist/utils/env-management.js +79 -46
  76. package/dist/utils/env-management.js.map +1 -1
  77. package/dist/utils/messages.d.ts.map +1 -1
  78. package/dist/utils/messages.js +7 -5
  79. package/dist/utils/messages.js.map +1 -1
  80. package/dist/utils/payload-config-ast.d.ts +3 -22
  81. package/dist/utils/payload-config-ast.d.ts.map +1 -1
  82. package/dist/utils/payload-config-ast.js +31 -89
  83. package/dist/utils/payload-config-ast.js.map +1 -1
  84. package/dist/utils/payload-config-finder.d.ts +2 -2
  85. package/dist/utils/payload-config-finder.d.ts.map +1 -1
  86. package/dist/utils/payload-config-finder.js +9 -48
  87. package/dist/utils/payload-config-finder.js.map +1 -1
  88. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  89. package/dist/utils/payload-config-modifier.js +4 -33
  90. package/dist/utils/payload-config-modifier.js.map +1 -1
  91. package/dist/utils/payload-package-check.d.ts +0 -5
  92. package/dist/utils/payload-package-check.d.ts.map +1 -1
  93. package/dist/utils/payload-package-check.js +0 -41
  94. package/dist/utils/payload-package-check.js.map +1 -1
  95. package/dist/utils/project.d.ts.map +1 -1
  96. package/dist/utils/project.js +3 -1
  97. package/dist/utils/project.js.map +1 -1
  98. package/dist/utils/s3-upload.d.ts +1 -0
  99. package/dist/utils/s3-upload.d.ts.map +1 -1
  100. package/dist/utils/s3-upload.js +3 -10
  101. package/dist/utils/s3-upload.js.map +1 -1
  102. package/dist/utils/token-display.d.ts.map +1 -1
  103. package/dist/utils/token-display.js +5 -11
  104. package/dist/utils/token-display.js.map +1 -1
  105. package/package.json +4 -18
  106. package/dist/db-content-api/generated/content-api-types.d.ts +0 -3129
  107. package/dist/db-content-api/generated/content-api-types.d.ts.map +0 -1
  108. package/dist/db-content-api/generated/content-api-types.js +0 -7
  109. package/dist/db-content-api/generated/content-api-types.js.map +0 -1
  110. package/dist/db-content-api/index.d.ts +0 -31
  111. package/dist/db-content-api/index.d.ts.map +0 -1
  112. package/dist/db-content-api/index.js +0 -842
  113. package/dist/db-content-api/index.js.map +0 -1
  114. package/dist/db-content-api/types.d.ts +0 -31
  115. package/dist/db-content-api/types.d.ts.map +0 -1
  116. package/dist/db-content-api/types.js +0 -7
  117. package/dist/db-content-api/types.js.map +0 -1
  118. package/dist/endpoints/health.d.ts +0 -3
  119. package/dist/endpoints/health.d.ts.map +0 -1
  120. package/dist/endpoints/health.js +0 -11
  121. package/dist/endpoints/health.js.map +0 -1
  122. package/dist/exports/client.d.ts +0 -3
  123. package/dist/exports/client.d.ts.map +0 -1
  124. package/dist/exports/client.js +0 -4
  125. package/dist/exports/client.js.map +0 -1
@@ -103,42 +103,13 @@ import { runTypeScriptCheck } from './typescript-validator.js';
103
103
  if (modified) {
104
104
  await sourceFile.save();
105
105
  log.debug('Config file saved');
106
- // 7. Handle package management
106
+ // 7. Uninstall orphaned packages
107
107
  const packagesToUninstall = [];
108
- // Uninstall db adapter (buildFigmaConfig provides its own)
109
108
  if (detection.dbProperty) {
110
109
  packagesToUninstall.push(detection.dbProperty.importSource);
111
110
  }
112
- // Uninstall sharp (Figma infrastructure handles image processing)
113
- if (detection.sharpProperty) {
114
- packagesToUninstall.push('sharp');
115
- }
116
- // Ensure lexical is installed if user doesn't have a custom editor
117
- // (buildFigmaConfig uses lexicalEditor() as default)
118
- if (!detection.editorProperty) {
119
- log.debug('No editor property detected - will ensure lexical is installed for default editor');
120
- } else if (detection.editorProperty.isDefault) {
121
- log.debug('Default lexicalEditor() detected - will ensure lexical is installed');
122
- } else {
123
- log.debug(`Custom editor detected (${detection.editorProperty.importSource}) - skipping lexical installation`);
124
- }
125
- if (!detection.editorProperty || detection.editorProperty.isDefault) {
126
- log.debug('Checking if @payloadcms/richtext-lexical is installed...');
127
- const hasLexical = await checkPackageInstalled(projectPath, '@payloadcms/richtext-lexical');
128
- if (!hasLexical) {
129
- log.debug('@payloadcms/richtext-lexical not found, installing...');
130
- try {
131
- await installPackage(projectPath, '@payloadcms/richtext-lexical', packageManager);
132
- changes.push('Installed @payloadcms/richtext-lexical (default editor)');
133
- log.debug('Successfully installed @payloadcms/richtext-lexical');
134
- } catch (error) {
135
- log.debug(`Failed to install @payloadcms/richtext-lexical: ${error instanceof Error ? error.message : 'Unknown error'}`);
136
- // Don't fail on install error - user can install manually if needed
137
- warnings.push('Could not install @payloadcms/richtext-lexical - you may need to install it manually');
138
- }
139
- } else {
140
- log.debug('@payloadcms/richtext-lexical already installed, skipping');
141
- }
111
+ if (detection.editorProperty?.isDefault) {
112
+ packagesToUninstall.push(detection.editorProperty.importSource);
142
113
  }
143
114
  if (packagesToUninstall.length > 0) {
144
115
  log.debug(`Uninstalling ${packagesToUninstall.length} orphaned packages...`);
@@ -214,7 +185,7 @@ ${pc.bold('Required changes:')}
214
185
 
215
186
  1. Replace buildConfig import:
216
187
  ${pc.dim('- FROM: ')}${pc.cyan("import { buildConfig } from 'payload'")}
217
- ${pc.dim('- TO: ')}${pc.cyan("import { buildFigmaConfig } from '@payloadcms/figma'")}
188
+ ${pc.dim('- TO: ')}${pc.cyan("import { buildConfig } from '@payloadcms/figma'")}
218
189
 
219
190
  2. Remove these properties from buildConfig():
220
191
  • db
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/payload-config-modifier.ts"],"sourcesContent":["import pc from 'picocolors'\nimport { Project } from 'ts-morph'\n\nimport type { PackageManager } from './package-manager.js'\n\nimport { formatFile } from './formatter.js'\nimport * as log from './log.js'\nimport {\n addFigmaProperty,\n applyModifications,\n detectRequiredChanges,\n type FigmaPropertyConfig,\n} from './payload-config-ast.js'\nimport { findPayloadConfig } from './payload-config-finder.js'\nimport { checkPackageInstalled, installPackage, uninstallPackage } from './payload-package-check.js'\nimport { runTypeScriptCheck } from './typescript-validator.js'\n\nexport type ModificationResult = {\n changes: string[]\n error?: string\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Main orchestrator for payload config modification\n * Checks package, detects needed changes, applies modifications\n */\nexport async function ensurePayloadFigmaConfig(\n projectPath: string,\n packageManager: PackageManager,\n figmaConfig?: FigmaPropertyConfig,\n): Promise<ModificationResult> {\n const changes: string[] = []\n const warnings: string[] = []\n let modified = false\n\n try {\n log.debug(`Starting payload config modification for: ${projectPath}`)\n\n // 1. Find config file\n const configPath = await findPayloadConfig(projectPath)\n if (!configPath) {\n log.debug(`Config file not found in: ${projectPath}`)\n return {\n changes: [],\n error: 'payload.config.ts not found in project',\n modified: false,\n success: false,\n }\n }\n\n log.debug(`Found config file: ${configPath}`)\n\n // 2. Check/install @payloadcms/figma package\n const isInstalled = await checkPackageInstalled(projectPath, '@payloadcms/figma')\n if (!isInstalled) {\n log.debug('@payloadcms/figma not installed, attempting installation...')\n try {\n await installPackage(projectPath, '@payloadcms/figma', packageManager)\n changes.push('Installed @payloadcms/figma')\n modified = true\n log.debug('@payloadcms/figma installed successfully')\n } catch (error) {\n log.debug(\n `Failed to install @payloadcms/figma: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n return {\n changes: [],\n error: 'Failed to install @payloadcms/figma',\n modified: false,\n success: false,\n }\n }\n } else {\n log.debug('@payloadcms/figma already installed')\n }\n\n // 3. Parse config with ts-morph\n log.debug('Parsing config file with ts-morph...')\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n })\n const sourceFile = project.addSourceFileAtPath(configPath)\n\n // 4. Detect required changes\n log.debug('Detecting required changes...')\n const detection = detectRequiredChanges(sourceFile)\n\n log.debug(\n `Detection results: needsImportChange=${detection.needsImportChange}, hasAlias=${detection.hasAlias}, hasBuildConfig=${detection.hasBuildConfig}`,\n )\n\n // Handle failure modes\n if (detection.hasAlias) {\n log.debug('Config uses import alias (e.g., buildConfig as X)')\n return {\n changes,\n error: 'Config uses import alias - manual modification required',\n modified,\n success: false,\n }\n }\n\n if (detection.hasBuildConfig === false) {\n log.debug('No buildConfig call found in config file')\n return {\n changes,\n error: 'Config structure not recognized (no buildConfig call found)',\n modified,\n success: false,\n }\n }\n\n // 5. Apply modifications\n log.debug('Applying modifications...')\n const modResult = applyModifications(sourceFile, detection)\n if (modResult.modified) {\n changes.push(...modResult.changes)\n modified = true\n\n log.debug(`Applied ${modResult.changes.length} modifications`)\n }\n\n // 6. Add figma property if config provided and doesn't exist\n if (figmaConfig && !detection.figmaObjectExists) {\n log.debug('Adding figma property to buildConfig...')\n const figmaResult = addFigmaProperty(sourceFile, figmaConfig)\n if (figmaResult.modified) {\n changes.push(...figmaResult.changes)\n modified = true\n log.debug(`Added figma property`)\n } else {\n log.debug('Figma property not added (may already exist)')\n }\n } else if (detection.figmaObjectExists) {\n log.debug('Figma property already exists, skipping')\n }\n\n // Save file if any modifications were made\n if (modified) {\n await sourceFile.save()\n log.debug('Config file saved')\n\n // 7. Handle package management\n const packagesToUninstall: string[] = []\n\n // Uninstall db adapter (buildFigmaConfig provides its own)\n if (detection.dbProperty) {\n packagesToUninstall.push(detection.dbProperty.importSource)\n }\n\n // Uninstall sharp (Figma infrastructure handles image processing)\n if (detection.sharpProperty) {\n packagesToUninstall.push('sharp')\n }\n\n // Ensure lexical is installed if user doesn't have a custom editor\n // (buildFigmaConfig uses lexicalEditor() as default)\n if (!detection.editorProperty) {\n log.debug(\n 'No editor property detected - will ensure lexical is installed for default editor',\n )\n } else if (detection.editorProperty.isDefault) {\n log.debug('Default lexicalEditor() detected - will ensure lexical is installed')\n } else {\n log.debug(\n `Custom editor detected (${detection.editorProperty.importSource}) - skipping lexical installation`,\n )\n }\n\n if (!detection.editorProperty || detection.editorProperty.isDefault) {\n log.debug('Checking if @payloadcms/richtext-lexical is installed...')\n const hasLexical = await checkPackageInstalled(projectPath, '@payloadcms/richtext-lexical')\n if (!hasLexical) {\n log.debug('@payloadcms/richtext-lexical not found, installing...')\n try {\n await installPackage(projectPath, '@payloadcms/richtext-lexical', packageManager)\n changes.push('Installed @payloadcms/richtext-lexical (default editor)')\n log.debug('Successfully installed @payloadcms/richtext-lexical')\n } catch (error) {\n log.debug(\n `Failed to install @payloadcms/richtext-lexical: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n // Don't fail on install error - user can install manually if needed\n warnings.push(\n 'Could not install @payloadcms/richtext-lexical - you may need to install it manually',\n )\n }\n } else {\n log.debug('@payloadcms/richtext-lexical already installed, skipping')\n }\n }\n\n if (packagesToUninstall.length > 0) {\n log.debug(`Uninstalling ${packagesToUninstall.length} orphaned packages...`)\n }\n\n for (const pkg of packagesToUninstall) {\n try {\n await uninstallPackage(projectPath, pkg, packageManager)\n changes.push(`Uninstalled ${pkg}`)\n log.debug(`Uninstalled ${pkg}`)\n } catch (error) {\n log.debug(\n `Failed to uninstall ${pkg}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n // Don't fail on uninstall errors - orphaned package is better than broken config\n }\n }\n\n // 8. Format file\n log.debug('Formatting config file...')\n const formatResult = await formatFile(configPath, packageManager)\n if (!formatResult.success && formatResult.warning) {\n warnings.push(formatResult.warning)\n log.debug(`Formatting warning: ${formatResult.warning}`)\n }\n\n // 9. Run TypeScript validation\n log.debug('Running TypeScript validation...')\n const tsResult = await runTypeScriptCheck(projectPath, packageManager)\n if (!tsResult.success && tsResult.errors.length > 0) {\n warnings.push(\"TypeScript validation found issues - run 'pnpm build' for details\")\n log.debug(`TypeScript validation found ${tsResult.errors.length} issues`)\n }\n } else {\n log.debug('No modifications needed - config already correct')\n }\n\n log.debug('Payload config modification completed successfully')\n\n return {\n changes,\n modified,\n success: true,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n } catch (error) {\n log.debug(\n `Unexpected error in ensurePayloadFigmaConfig: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n if (error instanceof Error && error.stack) {\n log.debug(`Stack trace: ${error.stack}`)\n }\n return {\n changes,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n modified,\n success: false,\n }\n }\n}\n\n/**\n * Display manual configuration instructions\n */\nexport function displayManualInstructions(reason: string): void {\n const leftLineWrap = (message: string): string => {\n // Add '┌ ' prefix to first line, '│ ' to subsequent lines, and '└ ' to last line\n return message\n .split('\\n')\n .map((line, index, arr) => {\n if (index === 0) {\n return `${pc.dim('┌ ')}${line}`\n } else if (index === arr.length - 1) {\n return `${pc.dim('└ ')}${line}`\n } else {\n return `${pc.dim('│ ')}${line}`\n }\n })\n .join('\\n')\n }\n\n const message = leftLineWrap(`${pc.cyan(pc.bold('Manual Configuration Required'))}\n\nUnable to automatically modify payload.config.ts\nReason: ${pc.yellow(reason)}\n\n${pc.bold('Required changes:')}\n\n1. Replace buildConfig import:\n ${pc.dim('- FROM: ')}${pc.cyan(\"import { buildConfig } from 'payload'\")}\n ${pc.dim('- TO: ')}${pc.cyan(\"import { buildFigmaConfig } from '@payloadcms/figma'\")}\n\n2. Remove these properties from buildConfig():\n • db\n • secret\n • editor (if using default lexicalEditor())\n\n3. Install package:\n ${pc.cyan('pnpm add @payloadcms/figma')}\n\nThen run: ${pc.cyan('npx @payloadcms/figma init')}`)\n\n // eslint-disable-next-line no-console\n console.log(message)\n}\n"],"names":["pc","Project","formatFile","log","addFigmaProperty","applyModifications","detectRequiredChanges","findPayloadConfig","checkPackageInstalled","installPackage","uninstallPackage","runTypeScriptCheck","ensurePayloadFigmaConfig","projectPath","packageManager","figmaConfig","changes","warnings","modified","debug","configPath","error","success","isInstalled","push","Error","message","project","skipAddingFilesFromTsConfig","sourceFile","addSourceFileAtPath","detection","needsImportChange","hasAlias","hasBuildConfig","modResult","length","figmaObjectExists","figmaResult","save","packagesToUninstall","dbProperty","importSource","sharpProperty","editorProperty","isDefault","hasLexical","pkg","formatResult","warning","tsResult","errors","undefined","stack","displayManualInstructions","reason","leftLineWrap","split","map","line","index","arr","dim","join","cyan","bold","yellow","console"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/payload-config-modifier.ts"],"sourcesContent":["import pc from 'picocolors'\nimport { Project } from 'ts-morph'\n\nimport type { PackageManager } from './package-manager.js'\n\nimport { formatFile } from './formatter.js'\nimport * as log from './log.js'\nimport {\n addFigmaProperty,\n applyModifications,\n detectRequiredChanges,\n type FigmaPropertyConfig,\n} from './payload-config-ast.js'\nimport { findPayloadConfig } from './payload-config-finder.js'\nimport { checkPackageInstalled, installPackage, uninstallPackage } from './payload-package-check.js'\nimport { runTypeScriptCheck } from './typescript-validator.js'\n\nexport type ModificationResult = {\n changes: string[]\n error?: string\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Main orchestrator for payload config modification\n * Checks package, detects needed changes, applies modifications\n */\nexport async function ensurePayloadFigmaConfig(\n projectPath: string,\n packageManager: PackageManager,\n figmaConfig?: FigmaPropertyConfig,\n): Promise<ModificationResult> {\n const changes: string[] = []\n const warnings: string[] = []\n let modified = false\n\n try {\n log.debug(`Starting payload config modification for: ${projectPath}`)\n\n // 1. Find config file\n const configPath = await findPayloadConfig(projectPath)\n if (!configPath) {\n log.debug(`Config file not found in: ${projectPath}`)\n return {\n changes: [],\n error: 'payload.config.ts not found in project',\n modified: false,\n success: false,\n }\n }\n\n log.debug(`Found config file: ${configPath}`)\n\n // 2. Check/install @payloadcms/figma package\n const isInstalled = await checkPackageInstalled(projectPath, '@payloadcms/figma')\n if (!isInstalled) {\n log.debug('@payloadcms/figma not installed, attempting installation...')\n try {\n await installPackage(projectPath, '@payloadcms/figma', packageManager)\n changes.push('Installed @payloadcms/figma')\n modified = true\n log.debug('@payloadcms/figma installed successfully')\n } catch (error) {\n log.debug(\n `Failed to install @payloadcms/figma: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n return {\n changes: [],\n error: 'Failed to install @payloadcms/figma',\n modified: false,\n success: false,\n }\n }\n } else {\n log.debug('@payloadcms/figma already installed')\n }\n\n // 3. Parse config with ts-morph\n log.debug('Parsing config file with ts-morph...')\n const project = new Project({\n skipAddingFilesFromTsConfig: true,\n })\n const sourceFile = project.addSourceFileAtPath(configPath)\n\n // 4. Detect required changes\n log.debug('Detecting required changes...')\n const detection = detectRequiredChanges(sourceFile)\n\n log.debug(\n `Detection results: needsImportChange=${detection.needsImportChange}, hasAlias=${detection.hasAlias}, hasBuildConfig=${detection.hasBuildConfig}`,\n )\n\n // Handle failure modes\n if (detection.hasAlias) {\n log.debug('Config uses import alias (e.g., buildConfig as X)')\n return {\n changes,\n error: 'Config uses import alias - manual modification required',\n modified,\n success: false,\n }\n }\n\n if (detection.hasBuildConfig === false) {\n log.debug('No buildConfig call found in config file')\n return {\n changes,\n error: 'Config structure not recognized (no buildConfig call found)',\n modified,\n success: false,\n }\n }\n\n // 5. Apply modifications\n log.debug('Applying modifications...')\n const modResult = applyModifications(sourceFile, detection)\n if (modResult.modified) {\n changes.push(...modResult.changes)\n modified = true\n\n log.debug(`Applied ${modResult.changes.length} modifications`)\n }\n\n // 6. Add figma property if config provided and doesn't exist\n if (figmaConfig && !detection.figmaObjectExists) {\n log.debug('Adding figma property to buildConfig...')\n const figmaResult = addFigmaProperty(sourceFile, figmaConfig)\n if (figmaResult.modified) {\n changes.push(...figmaResult.changes)\n modified = true\n log.debug(`Added figma property`)\n } else {\n log.debug('Figma property not added (may already exist)')\n }\n } else if (detection.figmaObjectExists) {\n log.debug('Figma property already exists, skipping')\n }\n\n // Save file if any modifications were made\n if (modified) {\n await sourceFile.save()\n log.debug('Config file saved')\n\n // 7. Uninstall orphaned packages\n const packagesToUninstall: string[] = []\n\n if (detection.dbProperty) {\n packagesToUninstall.push(detection.dbProperty.importSource)\n }\n\n if (detection.editorProperty?.isDefault) {\n packagesToUninstall.push(detection.editorProperty.importSource)\n }\n\n if (packagesToUninstall.length > 0) {\n log.debug(`Uninstalling ${packagesToUninstall.length} orphaned packages...`)\n }\n\n for (const pkg of packagesToUninstall) {\n try {\n await uninstallPackage(projectPath, pkg, packageManager)\n changes.push(`Uninstalled ${pkg}`)\n log.debug(`Uninstalled ${pkg}`)\n } catch (error) {\n log.debug(\n `Failed to uninstall ${pkg}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n // Don't fail on uninstall errors - orphaned package is better than broken config\n }\n }\n\n // 8. Format file\n log.debug('Formatting config file...')\n const formatResult = await formatFile(configPath, packageManager)\n if (!formatResult.success && formatResult.warning) {\n warnings.push(formatResult.warning)\n log.debug(`Formatting warning: ${formatResult.warning}`)\n }\n\n // 9. Run TypeScript validation\n log.debug('Running TypeScript validation...')\n const tsResult = await runTypeScriptCheck(projectPath, packageManager)\n if (!tsResult.success && tsResult.errors.length > 0) {\n warnings.push(\"TypeScript validation found issues - run 'pnpm build' for details\")\n log.debug(`TypeScript validation found ${tsResult.errors.length} issues`)\n }\n } else {\n log.debug('No modifications needed - config already correct')\n }\n\n log.debug('Payload config modification completed successfully')\n\n return {\n changes,\n modified,\n success: true,\n warnings: warnings.length > 0 ? warnings : undefined,\n }\n } catch (error) {\n log.debug(\n `Unexpected error in ensurePayloadFigmaConfig: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n if (error instanceof Error && error.stack) {\n log.debug(`Stack trace: ${error.stack}`)\n }\n return {\n changes,\n error: error instanceof Error ? error.message : 'Unknown error occurred',\n modified,\n success: false,\n }\n }\n}\n\n/**\n * Display manual configuration instructions\n */\nexport function displayManualInstructions(reason: string): void {\n const leftLineWrap = (message: string): string => {\n // Add '┌ ' prefix to first line, '│ ' to subsequent lines, and '└ ' to last line\n return message\n .split('\\n')\n .map((line, index, arr) => {\n if (index === 0) {\n return `${pc.dim('┌ ')}${line}`\n } else if (index === arr.length - 1) {\n return `${pc.dim('└ ')}${line}`\n } else {\n return `${pc.dim('│ ')}${line}`\n }\n })\n .join('\\n')\n }\n\n const message = leftLineWrap(`${pc.cyan(pc.bold('Manual Configuration Required'))}\n\nUnable to automatically modify payload.config.ts\nReason: ${pc.yellow(reason)}\n\n${pc.bold('Required changes:')}\n\n1. Replace buildConfig import:\n ${pc.dim('- FROM: ')}${pc.cyan(\"import { buildConfig } from 'payload'\")}\n ${pc.dim('- TO: ')}${pc.cyan(\"import { buildConfig } from '@payloadcms/figma'\")}\n\n2. Remove these properties from buildConfig():\n • db\n • secret\n • editor (if using default lexicalEditor())\n\n3. Install package:\n ${pc.cyan('pnpm add @payloadcms/figma')}\n\nThen run: ${pc.cyan('npx @payloadcms/figma init')}`)\n\n // eslint-disable-next-line no-console\n console.log(message)\n}\n"],"names":["pc","Project","formatFile","log","addFigmaProperty","applyModifications","detectRequiredChanges","findPayloadConfig","checkPackageInstalled","installPackage","uninstallPackage","runTypeScriptCheck","ensurePayloadFigmaConfig","projectPath","packageManager","figmaConfig","changes","warnings","modified","debug","configPath","error","success","isInstalled","push","Error","message","project","skipAddingFilesFromTsConfig","sourceFile","addSourceFileAtPath","detection","needsImportChange","hasAlias","hasBuildConfig","modResult","length","figmaObjectExists","figmaResult","save","packagesToUninstall","dbProperty","importSource","editorProperty","isDefault","pkg","formatResult","warning","tsResult","errors","undefined","stack","displayManualInstructions","reason","leftLineWrap","split","map","line","index","arr","dim","join","cyan","bold","yellow","console"],"mappings":"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"}
@@ -12,9 +12,4 @@ export declare function installPackage(projectPath: string, packageName: string,
12
12
  * Does not throw on failure - orphaned package is better than broken config
13
13
  */
14
14
  export declare function uninstallPackage(projectPath: string, packageName: string, packageManager: PackageManager): Promise<void>;
15
- /**
16
- * Run an npm script from package.json
17
- * Does not throw on failure - logs warning and continues
18
- */
19
- export declare function runScript(projectPath: string, scriptName: string, packageManager: PackageManager): Promise<boolean>;
20
15
  //# sourceMappingURL=payload-package-check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"payload-package-check.d.ts","sourceRoot":"","sources":["../../src/utils/payload-package-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAI1D;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,OAAO,CAAC,CAwClB"}
1
+ {"version":3,"file":"payload-package-check.d.ts","sourceRoot":"","sources":["../../src/utils/payload-package-check.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAI1D;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -93,46 +93,5 @@ import * as log from './log.js';
93
93
  });
94
94
  });
95
95
  }
96
- /**
97
- * Run an npm script from package.json
98
- * Does not throw on failure - logs warning and continues
99
- */ export async function runScript(projectPath, scriptName, packageManager) {
100
- return new Promise((resolve)=>{
101
- const command = packageManager;
102
- // yarn doesn't need 'run' prefix, but it works with it too
103
- const args = [
104
- 'run',
105
- scriptName
106
- ];
107
- log.debug(`Running script: ${command} ${args.join(' ')} in ${projectPath}`);
108
- let stderr = '';
109
- const child = spawn(command, args, {
110
- cwd: projectPath,
111
- shell: true,
112
- stdio: 'pipe'
113
- });
114
- if (child.stderr) {
115
- child.stderr.on('data', (data)=>{
116
- stderr += data.toString();
117
- });
118
- }
119
- child.on('error', (error)=>{
120
- log.debug(`Failed to run script ${scriptName}: ${error.message}`);
121
- resolve(false);
122
- });
123
- child.on('close', (code)=>{
124
- if (code === 0) {
125
- log.debug(`Successfully ran script: ${scriptName}`);
126
- resolve(true);
127
- } else {
128
- log.debug(`Script ${scriptName} failed (exit code: ${code})`);
129
- if (stderr) {
130
- log.debug(`stderr: ${stderr}`);
131
- }
132
- resolve(false);
133
- }
134
- });
135
- });
136
- }
137
96
 
138
97
  //# sourceMappingURL=payload-package-check.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/payload-package-check.ts"],"sourcesContent":["import { spawn } from 'child_process'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { PackageManager } from './package-manager.js'\n\nimport * as log from './log.js'\n\n/**\n * Check if a package is installed in dependencies (not devDependencies)\n */\nexport async function checkPackageInstalled(\n projectPath: string,\n packageName: string,\n): Promise<boolean> {\n try {\n const pkgJsonPath = path.join(projectPath, 'package.json')\n log.debug(`Checking if ${packageName} is installed in: ${pkgJsonPath}`)\n const pkgJsonContent = await fs.readFile(pkgJsonPath, 'utf-8')\n const pkgJson = JSON.parse(pkgJsonContent)\n const isInstalled = !!pkgJson.dependencies?.[packageName]\n log.debug(`${packageName} is ${isInstalled ? 'installed' : 'not installed'}`)\n return isInstalled\n } catch (error) {\n log.debug(\n `Error checking package installation: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n return false\n }\n}\n\n/**\n * Install a package as a production dependency\n */\nexport async function installPackage(\n projectPath: string,\n packageName: string,\n packageManager: PackageManager,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const command = packageManager\n const args = ['add', packageName]\n\n // npm uses 'install' instead of 'add'\n if (packageManager === 'npm') {\n args[0] = 'install'\n }\n\n log.debug(`Running: ${command} ${args.join(' ')} in ${projectPath}`)\n\n let stderr = ''\n\n const child = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe',\n })\n\n // Capture stderr for debug logging\n if (child.stderr) {\n child.stderr.on('data', (data) => {\n stderr += data.toString()\n })\n }\n\n child.on('error', (error) => {\n log.debug(`Spawn error for ${command}: ${error.message}`)\n reject(new Error(`Failed to spawn ${command}: ${error.message}`))\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n log.debug(`Successfully installed ${packageName}`)\n resolve()\n } else {\n log.debug(`Failed to install ${packageName} (exit code: ${code})`)\n if (stderr) {\n log.debug(`stderr: ${stderr}`)\n }\n reject(new Error(`Failed to install ${packageName}`))\n }\n })\n })\n}\n\n/**\n * Uninstall a package\n * Does not throw on failure - orphaned package is better than broken config\n */\nexport async function uninstallPackage(\n projectPath: string,\n packageName: string,\n packageManager: PackageManager,\n): Promise<void> {\n return new Promise((resolve) => {\n const command = packageManager\n const args = ['remove', packageName]\n\n // npm uses 'uninstall' instead of 'remove'\n if (packageManager === 'npm') {\n args[0] = 'uninstall'\n }\n\n log.debug(`Running: ${command} ${args.join(' ')} in ${projectPath}`)\n\n const child = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe',\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n log.debug(`Successfully uninstalled ${packageName}`)\n } else {\n log.debug(`Failed to uninstall ${packageName} (exit code: ${code}), continuing anyway`)\n }\n // Always resolve, even on error\n resolve()\n })\n })\n}\n\n/**\n * Run an npm script from package.json\n * Does not throw on failure - logs warning and continues\n */\nexport async function runScript(\n projectPath: string,\n scriptName: string,\n packageManager: PackageManager,\n): Promise<boolean> {\n return new Promise((resolve) => {\n const command = packageManager\n // yarn doesn't need 'run' prefix, but it works with it too\n const args = ['run', scriptName]\n\n log.debug(`Running script: ${command} ${args.join(' ')} in ${projectPath}`)\n\n let stderr = ''\n\n const child = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe',\n })\n\n if (child.stderr) {\n child.stderr.on('data', (data) => {\n stderr += data.toString()\n })\n }\n\n child.on('error', (error) => {\n log.debug(`Failed to run script ${scriptName}: ${error.message}`)\n resolve(false)\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n log.debug(`Successfully ran script: ${scriptName}`)\n resolve(true)\n } else {\n log.debug(`Script ${scriptName} failed (exit code: ${code})`)\n if (stderr) {\n log.debug(`stderr: ${stderr}`)\n }\n resolve(false)\n }\n })\n })\n}\n"],"names":["spawn","fs","path","log","checkPackageInstalled","projectPath","packageName","pkgJsonPath","join","debug","pkgJsonContent","readFile","pkgJson","JSON","parse","isInstalled","dependencies","error","Error","message","installPackage","packageManager","Promise","resolve","reject","command","args","stderr","child","cwd","shell","stdio","on","data","toString","code","uninstallPackage","runScript","scriptName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/payload-package-check.ts"],"sourcesContent":["import { spawn } from 'child_process'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { PackageManager } from './package-manager.js'\n\nimport * as log from './log.js'\n\n/**\n * Check if a package is installed in dependencies (not devDependencies)\n */\nexport async function checkPackageInstalled(\n projectPath: string,\n packageName: string,\n): Promise<boolean> {\n try {\n const pkgJsonPath = path.join(projectPath, 'package.json')\n log.debug(`Checking if ${packageName} is installed in: ${pkgJsonPath}`)\n const pkgJsonContent = await fs.readFile(pkgJsonPath, 'utf-8')\n const pkgJson = JSON.parse(pkgJsonContent)\n const isInstalled = !!pkgJson.dependencies?.[packageName]\n log.debug(`${packageName} is ${isInstalled ? 'installed' : 'not installed'}`)\n return isInstalled\n } catch (error) {\n log.debug(\n `Error checking package installation: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n return false\n }\n}\n\n/**\n * Install a package as a production dependency\n */\nexport async function installPackage(\n projectPath: string,\n packageName: string,\n packageManager: PackageManager,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const command = packageManager\n const args = ['add', packageName]\n\n // npm uses 'install' instead of 'add'\n if (packageManager === 'npm') {\n args[0] = 'install'\n }\n\n log.debug(`Running: ${command} ${args.join(' ')} in ${projectPath}`)\n\n let stderr = ''\n\n const child = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe',\n })\n\n // Capture stderr for debug logging\n if (child.stderr) {\n child.stderr.on('data', (data) => {\n stderr += data.toString()\n })\n }\n\n child.on('error', (error) => {\n log.debug(`Spawn error for ${command}: ${error.message}`)\n reject(new Error(`Failed to spawn ${command}: ${error.message}`))\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n log.debug(`Successfully installed ${packageName}`)\n resolve()\n } else {\n log.debug(`Failed to install ${packageName} (exit code: ${code})`)\n if (stderr) {\n log.debug(`stderr: ${stderr}`)\n }\n reject(new Error(`Failed to install ${packageName}`))\n }\n })\n })\n}\n\n/**\n * Uninstall a package\n * Does not throw on failure - orphaned package is better than broken config\n */\nexport async function uninstallPackage(\n projectPath: string,\n packageName: string,\n packageManager: PackageManager,\n): Promise<void> {\n return new Promise((resolve) => {\n const command = packageManager\n const args = ['remove', packageName]\n\n // npm uses 'uninstall' instead of 'remove'\n if (packageManager === 'npm') {\n args[0] = 'uninstall'\n }\n\n log.debug(`Running: ${command} ${args.join(' ')} in ${projectPath}`)\n\n const child = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe',\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n log.debug(`Successfully uninstalled ${packageName}`)\n } else {\n log.debug(`Failed to uninstall ${packageName} (exit code: ${code}), continuing anyway`)\n }\n // Always resolve, even on error\n resolve()\n })\n })\n}\n"],"names":["spawn","fs","path","log","checkPackageInstalled","projectPath","packageName","pkgJsonPath","join","debug","pkgJsonContent","readFile","pkgJson","JSON","parse","isInstalled","dependencies","error","Error","message","installPackage","packageManager","Promise","resolve","reject","command","args","stderr","child","cwd","shell","stdio","on","data","toString","code","uninstallPackage"],"mappings":"AAAA,SAASA,KAAK,QAAQ,gBAAe;AACrC,OAAOC,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAIvB,YAAYC,SAAS,WAAU;AAE/B;;CAEC,GACD,OAAO,eAAeC,sBACpBC,WAAmB,EACnBC,WAAmB;IAEnB,IAAI;QACF,MAAMC,cAAcL,KAAKM,IAAI,CAACH,aAAa;QAC3CF,IAAIM,KAAK,CAAC,CAAC,YAAY,EAAEH,YAAY,kBAAkB,EAAEC,aAAa;QACtE,MAAMG,iBAAiB,MAAMT,GAAGU,QAAQ,CAACJ,aAAa;QACtD,MAAMK,UAAUC,KAAKC,KAAK,CAACJ;QAC3B,MAAMK,cAAc,CAAC,CAACH,QAAQI,YAAY,EAAE,CAACV,YAAY;QACzDH,IAAIM,KAAK,CAAC,GAAGH,YAAY,IAAI,EAAES,cAAc,cAAc,iBAAiB;QAC5E,OAAOA;IACT,EAAE,OAAOE,OAAO;QACdd,IAAIM,KAAK,CACP,CAAC,qCAAqC,EAAEQ,iBAAiBC,QAAQD,MAAME,OAAO,GAAG,iBAAiB;QAEpG,OAAO;IACT;AACF;AAEA;;CAEC,GACD,OAAO,eAAeC,eACpBf,WAAmB,EACnBC,WAAmB,EACnBe,cAA8B;IAE9B,OAAO,IAAIC,QAAQ,CAACC,SAASC;QAC3B,MAAMC,UAAUJ;QAChB,MAAMK,OAAO;YAAC;YAAOpB;SAAY;QAEjC,sCAAsC;QACtC,IAAIe,mBAAmB,OAAO;YAC5BK,IAAI,CAAC,EAAE,GAAG;QACZ;QAEAvB,IAAIM,KAAK,CAAC,CAAC,SAAS,EAAEgB,QAAQ,CAAC,EAAEC,KAAKlB,IAAI,CAAC,KAAK,IAAI,EAAEH,aAAa;QAEnE,IAAIsB,SAAS;QAEb,MAAMC,QAAQ5B,MAAMyB,SAASC,MAAM;YACjCG,KAAKxB;YACLyB,OAAO;YACPC,OAAO;QACT;QAEA,mCAAmC;QACnC,IAAIH,MAAMD,MAAM,EAAE;YAChBC,MAAMD,MAAM,CAACK,EAAE,CAAC,QAAQ,CAACC;gBACvBN,UAAUM,KAAKC,QAAQ;YACzB;QACF;QAEAN,MAAMI,EAAE,CAAC,SAAS,CAACf;YACjBd,IAAIM,KAAK,CAAC,CAAC,gBAAgB,EAAEgB,QAAQ,EAAE,EAAER,MAAME,OAAO,EAAE;YACxDK,OAAO,IAAIN,MAAM,CAAC,gBAAgB,EAAEO,QAAQ,EAAE,EAAER,MAAME,OAAO,EAAE;QACjE;QAEAS,MAAMI,EAAE,CAAC,SAAS,CAACG;YACjB,IAAIA,SAAS,GAAG;gBACdhC,IAAIM,KAAK,CAAC,CAAC,uBAAuB,EAAEH,aAAa;gBACjDiB;YACF,OAAO;gBACLpB,IAAIM,KAAK,CAAC,CAAC,kBAAkB,EAAEH,YAAY,aAAa,EAAE6B,KAAK,CAAC,CAAC;gBACjE,IAAIR,QAAQ;oBACVxB,IAAIM,KAAK,CAAC,CAAC,QAAQ,EAAEkB,QAAQ;gBAC/B;gBACAH,OAAO,IAAIN,MAAM,CAAC,kBAAkB,EAAEZ,aAAa;YACrD;QACF;IACF;AACF;AAEA;;;CAGC,GACD,OAAO,eAAe8B,iBACpB/B,WAAmB,EACnBC,WAAmB,EACnBe,cAA8B;IAE9B,OAAO,IAAIC,QAAQ,CAACC;QAClB,MAAME,UAAUJ;QAChB,MAAMK,OAAO;YAAC;YAAUpB;SAAY;QAEpC,2CAA2C;QAC3C,IAAIe,mBAAmB,OAAO;YAC5BK,IAAI,CAAC,EAAE,GAAG;QACZ;QAEAvB,IAAIM,KAAK,CAAC,CAAC,SAAS,EAAEgB,QAAQ,CAAC,EAAEC,KAAKlB,IAAI,CAAC,KAAK,IAAI,EAAEH,aAAa;QAEnE,MAAMuB,QAAQ5B,MAAMyB,SAASC,MAAM;YACjCG,KAAKxB;YACLyB,OAAO;YACPC,OAAO;QACT;QAEAH,MAAMI,EAAE,CAAC,SAAS,CAACG;YACjB,IAAIA,SAAS,GAAG;gBACdhC,IAAIM,KAAK,CAAC,CAAC,yBAAyB,EAAEH,aAAa;YACrD,OAAO;gBACLH,IAAIM,KAAK,CAAC,CAAC,oBAAoB,EAAEH,YAAY,aAAa,EAAE6B,KAAK,oBAAoB,CAAC;YACxF;YACA,gCAAgC;YAChCZ;QACF;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAOrD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,WAAW,CAAC,CAwCtB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/D;AAiED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC7F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,KAAK,GAAG,MAAM,GAAG,MAAc,GAC9C,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAenF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhG"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAQrD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,GAAE,MAAsB,GAClC,OAAO,CAAC,WAAW,CAAC,CAwCtB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAS/D;AAiED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C7F;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,KAAK,GAAG,MAAM,GAAG,MAAc,GAC9C,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAenF;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhG"}
@@ -5,6 +5,7 @@ import fs from 'fs/promises';
5
5
  import path from 'path';
6
6
  import { ensureGitignore } from './config.js';
7
7
  import { downloadTemplateFromGitHub } from './download-template.js';
8
+ import { manageEnvFiles } from './env-management.js';
8
9
  import { tryInitRepoAndCommit } from './git.js';
9
10
  import { applyLambdaModifications } from './lambda-config.js';
10
11
  /**
@@ -150,8 +151,9 @@ import { applyLambdaModifications } from './lambda-config.js';
150
151
  // Replace workspace:* versions with actual versions
151
152
  replaceWorkspaceVersions(packageJson, latestVersion);
152
153
  await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n', 'utf-8');
154
+ // Manage environment files (generate PAYLOAD_SECRET)
155
+ await manageEnvFiles(projectPath);
153
156
  // Ensure .gitignore has required entries
154
- // Note: .env file is created by init command with FIGMA_CONTENT_SYSTEM_ID
155
157
  await ensureGitignore(projectPath, [
156
158
  '.env',
157
159
  '.env.local',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/project.ts"],"sourcesContent":["/**\n * Project detection and scaffolding utilities\n */\n\nimport { spawn } from 'child_process'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { ProjectInfo } from '../types/config.js'\n\nimport { ensureGitignore } from './config.js'\nimport { downloadTemplateFromGitHub } from './download-template.js'\nimport { tryInitRepoAndCommit } from './git.js'\nimport { applyLambdaModifications } from './lambda-config.js'\n\n/**\n * Detect if current directory has a Payload project\n *\n * @param projectPath - Path to check (defaults to cwd)\n * @returns Project information\n */\nexport async function detectPayloadProject(\n projectPath: string = process.cwd(),\n): Promise<ProjectInfo> {\n const packageJsonPath = path.join(projectPath, 'package.json')\n\n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(content)\n\n // Check for payload in dependencies or devDependencies\n const payloadVersion = packageJson.dependencies?.payload || packageJson.devDependencies?.payload\n\n // Detect package manager\n let packageManager: 'npm' | 'pnpm' | 'yarn' = 'npm'\n try {\n await fs.access(path.join(projectPath, 'pnpm-lock.yaml'))\n packageManager = 'pnpm'\n } catch {\n try {\n await fs.access(path.join(projectPath, 'yarn.lock'))\n packageManager = 'yarn'\n } catch {\n packageManager = 'npm'\n }\n }\n\n return {\n hasPayload: !!payloadVersion,\n packageManager,\n path: projectPath,\n payloadVersion: payloadVersion || undefined,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // No package.json found\n return {\n hasPayload: false,\n path: projectPath,\n }\n }\n throw new Error(`Failed to read package.json: ${(error as Error).message}`)\n }\n}\n\n/**\n * Validate Payload version (must be 3.x)\n *\n * @param version - Version string from package.json\n * @returns True if version is valid\n */\nexport function validatePayloadVersion(version: string): boolean {\n // Extract major version (handle ^3.0.0, ~3.0.0, 3.0.0, etc.)\n const match = version.match(/(\\d+)/)\n if (!match) {\n return false\n }\n\n const majorVersion = parseInt(match[1], 10)\n return majorVersion === 3\n}\n\n/**\n * Fetch the latest version of a package from npm registry\n *\n * @param packageName - Package name to fetch version for\n * @returns Latest version string\n */\nasync function getLatestPackageVersion(packageName: string): Promise<string> {\n const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch version for ${packageName}: ${response.statusText}`)\n }\n\n const data = (await response.json()) as Record<string, unknown>\n\n if (typeof data.latest !== 'string') {\n throw new Error(`Invalid version data received for ${packageName}`)\n }\n\n return data.latest\n}\n\n/**\n * Replace workspace versions in package.json with actual versions\n *\n * @param packageJson - Package JSON object to update\n * @param latestVersion - Latest Payload version to use\n */\nfunction replaceWorkspaceVersions(\n packageJson: Record<string, unknown>,\n latestVersion: string,\n): void {\n const deps = packageJson.dependencies as Record<string, string> | undefined\n if (!deps) {\n return\n }\n\n for (const [key, value] of Object.entries(deps)) {\n // Replace workspace:* or workspace:^ with actual version\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n deps[key] = latestVersion\n }\n // Ensure all payload packages use the same version\n else if (key === 'payload' || key.startsWith('@payloadcms/')) {\n deps[key] = latestVersion\n }\n }\n\n // Also handle devDependencies if present\n const devDeps = packageJson.devDependencies as Record<string, string> | undefined\n if (!devDeps) {\n return\n }\n\n for (const [key, value] of Object.entries(devDeps)) {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n devDeps[key] = latestVersion\n } else if (key === 'payload' || key.startsWith('@payloadcms/')) {\n devDeps[key] = latestVersion\n }\n }\n}\n\n/**\n * Scaffold a new Payload project from GitHub template\n *\n * @param projectPath - Path where to create the project\n * @param projectName - Name for the project\n */\nexport async function scaffoldProject(projectPath: string, projectName: string): Promise<void> {\n // Create project directory if it doesn't exist\n await fs.mkdir(projectPath, { recursive: true })\n\n // Download template from GitHub\n await downloadTemplateFromGitHub(projectPath)\n\n // Apply Lambda modifications BEFORE updating package.json\n // This ensures we don't overwrite version replacements\n await applyLambdaModifications(projectPath)\n\n // Get latest Payload version from npm\n const latestVersion = await getLatestPackageVersion('payload')\n\n // Delete any existing lock files from template (they reference workspace:* versions)\n // This ensures pnpm install creates a fresh lock file with actual versions\n const lockFiles = ['pnpm-lock.yaml', 'yarn.lock', 'package-lock.json']\n for (const lockFile of lockFiles) {\n try {\n await fs.unlink(path.join(projectPath, lockFile))\n } catch {\n // File doesn't exist, ignore\n }\n }\n\n // Update package.json: set name, replace workspace versions\n // This must come AFTER applyLambdaModifications to ensure we have final versions\n const packageJsonPath = path.join(projectPath, 'package.json')\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonContent) as Record<string, unknown>\n packageJson.name = projectName\n\n // Replace workspace:* versions with actual versions\n replaceWorkspaceVersions(packageJson, latestVersion)\n\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8')\n\n // Ensure .gitignore has required entries\n // Note: .env file is created by init command with FIGMA_CONTENT_SYSTEM_ID\n await ensureGitignore(projectPath, ['.env', '.env.local', 'lambda.zip'])\n}\n\n/**\n * Initialize git repository after all setup is complete\n *\n * This should be called AFTER installDependencies so that lock files are included\n *\n * @param projectPath - Path to project directory\n */\nexport function initializeGitRepo(projectPath: string): void {\n tryInitRepoAndCommit(projectPath)\n}\n\n/**\n * Install dependencies using the detected package manager\n *\n * @param projectPath - Path to project\n * @param packageManager - Package manager to use\n * @returns Promise that resolves when installation completes\n */\nexport async function installDependencies(\n projectPath: string,\n packageManager: 'npm' | 'pnpm' | 'yarn' = 'npm',\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(packageManager, ['install'], {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe', // Capture output to avoid interfering with spinner\n })\n\n let stdout = ''\n let stderr = ''\n\n // Capture stdout\n child.stdout?.on('data', (data) => {\n stdout += data.toString()\n })\n\n // Capture stderr\n child.stderr?.on('data', (data) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n // Show captured output on error\n const output = [stdout, stderr].filter(Boolean).join('\\n\\n')\n const errorMessage = output\n ? `${packageManager} install failed with code ${code}\\n\\nOutput:\\n${output}`\n : `${packageManager} install failed with code ${code}`\n reject(new Error(errorMessage))\n }\n })\n\n child.on('error', (error) => {\n reject(new Error(`Failed to run ${packageManager} install: ${error.message}`))\n })\n })\n}\n\n/**\n * Check if required dependencies are installed\n *\n * @param projectPath - Path to project\n * @returns True if all required dependencies exist\n */\nexport async function hasRequiredDependencies(projectPath: string): Promise<boolean> {\n const packageJsonPath = path.join(projectPath, 'package.json')\n\n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(content)\n\n // Check for Payload and Next.js\n const hasPayload = packageJson.dependencies?.payload || packageJson.devDependencies?.payload\n const hasNext = packageJson.dependencies?.next || packageJson.devDependencies?.next\n\n return !!(hasPayload && hasNext)\n } catch {\n return false\n }\n}\n\n/**\n * Check if current directory is a project directory\n *\n * A project directory has package.json\n *\n * @param projectPath - Path to check (defaults to cwd)\n * @returns True if in project directory\n */\nexport async function isInProjectDirectory(projectPath: string = process.cwd()): Promise<boolean> {\n try {\n // Check for package.json\n await fs.access(path.join(projectPath, 'package.json'))\n return true\n } catch {\n return false\n }\n}\n"],"names":["spawn","fs","path","ensureGitignore","downloadTemplateFromGitHub","tryInitRepoAndCommit","applyLambdaModifications","detectPayloadProject","projectPath","process","cwd","packageJsonPath","join","content","readFile","packageJson","JSON","parse","payloadVersion","dependencies","payload","devDependencies","packageManager","access","hasPayload","undefined","error","code","Error","message","validatePayloadVersion","version","match","majorVersion","parseInt","getLatestPackageVersion","packageName","response","fetch","ok","statusText","data","json","latest","replaceWorkspaceVersions","latestVersion","deps","key","value","Object","entries","startsWith","devDeps","scaffoldProject","projectName","mkdir","recursive","lockFiles","lockFile","unlink","packageJsonContent","name","writeFile","stringify","initializeGitRepo","installDependencies","Promise","resolve","reject","child","shell","stdio","stdout","stderr","on","toString","output","filter","Boolean","errorMessage","hasRequiredDependencies","hasNext","next","isInProjectDirectory"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/project.ts"],"sourcesContent":["/**\n * Project detection and scaffolding utilities\n */\n\nimport { spawn } from 'child_process'\nimport fs from 'fs/promises'\nimport path from 'path'\n\nimport type { ProjectInfo } from '../types/config.js'\n\nimport { ensureGitignore } from './config.js'\nimport { downloadTemplateFromGitHub } from './download-template.js'\nimport { manageEnvFiles } from './env-management.js'\nimport { tryInitRepoAndCommit } from './git.js'\nimport { applyLambdaModifications } from './lambda-config.js'\n\n/**\n * Detect if current directory has a Payload project\n *\n * @param projectPath - Path to check (defaults to cwd)\n * @returns Project information\n */\nexport async function detectPayloadProject(\n projectPath: string = process.cwd(),\n): Promise<ProjectInfo> {\n const packageJsonPath = path.join(projectPath, 'package.json')\n\n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(content)\n\n // Check for payload in dependencies or devDependencies\n const payloadVersion = packageJson.dependencies?.payload || packageJson.devDependencies?.payload\n\n // Detect package manager\n let packageManager: 'npm' | 'pnpm' | 'yarn' = 'npm'\n try {\n await fs.access(path.join(projectPath, 'pnpm-lock.yaml'))\n packageManager = 'pnpm'\n } catch {\n try {\n await fs.access(path.join(projectPath, 'yarn.lock'))\n packageManager = 'yarn'\n } catch {\n packageManager = 'npm'\n }\n }\n\n return {\n hasPayload: !!payloadVersion,\n packageManager,\n path: projectPath,\n payloadVersion: payloadVersion || undefined,\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // No package.json found\n return {\n hasPayload: false,\n path: projectPath,\n }\n }\n throw new Error(`Failed to read package.json: ${(error as Error).message}`)\n }\n}\n\n/**\n * Validate Payload version (must be 3.x)\n *\n * @param version - Version string from package.json\n * @returns True if version is valid\n */\nexport function validatePayloadVersion(version: string): boolean {\n // Extract major version (handle ^3.0.0, ~3.0.0, 3.0.0, etc.)\n const match = version.match(/(\\d+)/)\n if (!match) {\n return false\n }\n\n const majorVersion = parseInt(match[1], 10)\n return majorVersion === 3\n}\n\n/**\n * Fetch the latest version of a package from npm registry\n *\n * @param packageName - Package name to fetch version for\n * @returns Latest version string\n */\nasync function getLatestPackageVersion(packageName: string): Promise<string> {\n const response = await fetch(`https://registry.npmjs.org/-/package/${packageName}/dist-tags`)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch version for ${packageName}: ${response.statusText}`)\n }\n\n const data = (await response.json()) as Record<string, unknown>\n\n if (typeof data.latest !== 'string') {\n throw new Error(`Invalid version data received for ${packageName}`)\n }\n\n return data.latest\n}\n\n/**\n * Replace workspace versions in package.json with actual versions\n *\n * @param packageJson - Package JSON object to update\n * @param latestVersion - Latest Payload version to use\n */\nfunction replaceWorkspaceVersions(\n packageJson: Record<string, unknown>,\n latestVersion: string,\n): void {\n const deps = packageJson.dependencies as Record<string, string> | undefined\n if (!deps) {\n return\n }\n\n for (const [key, value] of Object.entries(deps)) {\n // Replace workspace:* or workspace:^ with actual version\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n deps[key] = latestVersion\n }\n // Ensure all payload packages use the same version\n else if (key === 'payload' || key.startsWith('@payloadcms/')) {\n deps[key] = latestVersion\n }\n }\n\n // Also handle devDependencies if present\n const devDeps = packageJson.devDependencies as Record<string, string> | undefined\n if (!devDeps) {\n return\n }\n\n for (const [key, value] of Object.entries(devDeps)) {\n if (typeof value === 'string' && value.startsWith('workspace:')) {\n devDeps[key] = latestVersion\n } else if (key === 'payload' || key.startsWith('@payloadcms/')) {\n devDeps[key] = latestVersion\n }\n }\n}\n\n/**\n * Scaffold a new Payload project from GitHub template\n *\n * @param projectPath - Path where to create the project\n * @param projectName - Name for the project\n */\nexport async function scaffoldProject(projectPath: string, projectName: string): Promise<void> {\n // Create project directory if it doesn't exist\n await fs.mkdir(projectPath, { recursive: true })\n\n // Download template from GitHub\n await downloadTemplateFromGitHub(projectPath)\n\n // Apply Lambda modifications BEFORE updating package.json\n // This ensures we don't overwrite version replacements\n await applyLambdaModifications(projectPath)\n\n // Get latest Payload version from npm\n const latestVersion = await getLatestPackageVersion('payload')\n\n // Delete any existing lock files from template (they reference workspace:* versions)\n // This ensures pnpm install creates a fresh lock file with actual versions\n const lockFiles = ['pnpm-lock.yaml', 'yarn.lock', 'package-lock.json']\n for (const lockFile of lockFiles) {\n try {\n await fs.unlink(path.join(projectPath, lockFile))\n } catch {\n // File doesn't exist, ignore\n }\n }\n\n // Update package.json: set name, replace workspace versions\n // This must come AFTER applyLambdaModifications to ensure we have final versions\n const packageJsonPath = path.join(projectPath, 'package.json')\n const packageJsonContent = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(packageJsonContent) as Record<string, unknown>\n packageJson.name = projectName\n\n // Replace workspace:* versions with actual versions\n replaceWorkspaceVersions(packageJson, latestVersion)\n\n await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\\n', 'utf-8')\n\n // Manage environment files (generate PAYLOAD_SECRET)\n await manageEnvFiles(projectPath)\n\n // Ensure .gitignore has required entries\n await ensureGitignore(projectPath, ['.env', '.env.local', 'lambda.zip'])\n}\n\n/**\n * Initialize git repository after all setup is complete\n *\n * This should be called AFTER installDependencies so that lock files are included\n *\n * @param projectPath - Path to project directory\n */\nexport function initializeGitRepo(projectPath: string): void {\n tryInitRepoAndCommit(projectPath)\n}\n\n/**\n * Install dependencies using the detected package manager\n *\n * @param projectPath - Path to project\n * @param packageManager - Package manager to use\n * @returns Promise that resolves when installation completes\n */\nexport async function installDependencies(\n projectPath: string,\n packageManager: 'npm' | 'pnpm' | 'yarn' = 'npm',\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(packageManager, ['install'], {\n cwd: projectPath,\n shell: true,\n stdio: 'pipe', // Capture output to avoid interfering with spinner\n })\n\n let stdout = ''\n let stderr = ''\n\n // Capture stdout\n child.stdout?.on('data', (data) => {\n stdout += data.toString()\n })\n\n // Capture stderr\n child.stderr?.on('data', (data) => {\n stderr += data.toString()\n })\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve()\n } else {\n // Show captured output on error\n const output = [stdout, stderr].filter(Boolean).join('\\n\\n')\n const errorMessage = output\n ? `${packageManager} install failed with code ${code}\\n\\nOutput:\\n${output}`\n : `${packageManager} install failed with code ${code}`\n reject(new Error(errorMessage))\n }\n })\n\n child.on('error', (error) => {\n reject(new Error(`Failed to run ${packageManager} install: ${error.message}`))\n })\n })\n}\n\n/**\n * Check if required dependencies are installed\n *\n * @param projectPath - Path to project\n * @returns True if all required dependencies exist\n */\nexport async function hasRequiredDependencies(projectPath: string): Promise<boolean> {\n const packageJsonPath = path.join(projectPath, 'package.json')\n\n try {\n const content = await fs.readFile(packageJsonPath, 'utf-8')\n const packageJson = JSON.parse(content)\n\n // Check for Payload and Next.js\n const hasPayload = packageJson.dependencies?.payload || packageJson.devDependencies?.payload\n const hasNext = packageJson.dependencies?.next || packageJson.devDependencies?.next\n\n return !!(hasPayload && hasNext)\n } catch {\n return false\n }\n}\n\n/**\n * Check if current directory is a project directory\n *\n * A project directory has package.json\n *\n * @param projectPath - Path to check (defaults to cwd)\n * @returns True if in project directory\n */\nexport async function isInProjectDirectory(projectPath: string = process.cwd()): Promise<boolean> {\n try {\n // Check for package.json\n await fs.access(path.join(projectPath, 'package.json'))\n return true\n } catch {\n return false\n }\n}\n"],"names":["spawn","fs","path","ensureGitignore","downloadTemplateFromGitHub","manageEnvFiles","tryInitRepoAndCommit","applyLambdaModifications","detectPayloadProject","projectPath","process","cwd","packageJsonPath","join","content","readFile","packageJson","JSON","parse","payloadVersion","dependencies","payload","devDependencies","packageManager","access","hasPayload","undefined","error","code","Error","message","validatePayloadVersion","version","match","majorVersion","parseInt","getLatestPackageVersion","packageName","response","fetch","ok","statusText","data","json","latest","replaceWorkspaceVersions","latestVersion","deps","key","value","Object","entries","startsWith","devDeps","scaffoldProject","projectName","mkdir","recursive","lockFiles","lockFile","unlink","packageJsonContent","name","writeFile","stringify","initializeGitRepo","installDependencies","Promise","resolve","reject","child","shell","stdio","stdout","stderr","on","toString","output","filter","Boolean","errorMessage","hasRequiredDependencies","hasNext","next","isInProjectDirectory"],"mappings":"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"}
@@ -18,6 +18,7 @@ export interface UploadResults {
18
18
  *
19
19
  * @param filePath - Absolute path to file to upload
20
20
  * @param signedUrl - Signed S3 upload URL
21
+ * @param contentType - MIME type (optional)
21
22
  * @throws Error if upload fails after retries
22
23
  */
23
24
  export declare function uploadFile(filePath: string, signedUrl: string, contentType?: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"s3-upload.d.ts","sourceRoot":"","sources":["../../src/utils/s3-upload.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAA;IACtB,uCAAuC;IACvC,cAAc,EAAE,OAAO,CAAA;IACvB,2BAA2B;IAC3B,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAsBD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACrD,OAAO,CAAC,aAAa,CAAC,CAgDxB"}
1
+ {"version":3,"file":"s3-upload.d.ts","sourceRoot":"","sources":["../../src/utils/s3-upload.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,cAAc,EAAE,MAAM,CAAA;IACtB,uCAAuC;IACvC,cAAc,EAAE,OAAO,CAAA;IACvB,2BAA2B;IAC3B,kBAAkB,EAAE,MAAM,CAAA;CAC3B;AAsBD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACrD,OAAO,CAAC,aAAa,CAAC,CAgDxB"}
@@ -23,6 +23,7 @@ const INITIAL_RETRY_DELAY = 1000 // 1 second
23
23
  *
24
24
  * @param filePath - Absolute path to file to upload
25
25
  * @param signedUrl - Signed S3 upload URL
26
+ * @param contentType - MIME type (optional)
26
27
  * @throws Error if upload fails after retries
27
28
  */ export async function uploadFile(filePath, signedUrl, contentType) {
28
29
  // Skip actual upload for mock URLs
@@ -44,18 +45,10 @@ const INITIAL_RETRY_DELAY = 1000 // 1 second
44
45
  let lastError = null;
45
46
  for(let attempt = 0; attempt < MAX_RETRIES; attempt++){
46
47
  try {
47
- // Content-type only needed if css or js, else let S3 infer
48
- const ext = path.extname(filePath).toLowerCase();
49
- let determinedContentType = contentType;
50
- if (ext === '.js') {
51
- determinedContentType = 'application/javascript';
52
- } else if (ext === '.css') {
53
- determinedContentType = 'text/css';
54
- }
55
48
  const response = await fetch(signedUrl, {
56
49
  body: fileBuffer,
57
- headers: determinedContentType ? {
58
- 'Content-Type': determinedContentType
50
+ headers: contentType ? {
51
+ 'Content-Type': contentType
59
52
  } : {},
60
53
  method: 'PUT'
61
54
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/s3-upload.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport * as log from './log.js'\n\n/**\n * Results from uploading assets\n */\nexport interface UploadResults {\n /** Number of static assets that failed to upload */\n assetsFailed: number\n /** Number of static assets successfully uploaded */\n assetsUploaded: number\n /** Whether Lambda code was uploaded */\n lambdaUploaded: boolean\n /** Total bytes uploaded */\n totalBytesUploaded: number\n}\n\n/**\n * Retry configuration\n */\nconst MAX_RETRIES = 3\nconst INITIAL_RETRY_DELAY = 1000 // 1 second\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Check if a signed URL is a mock URL\n */\nfunction isMockUrl(signedUrl: string): boolean {\n return signedUrl.includes('X-Amz-Signature=mock')\n}\n\n/**\n * Upload a file to S3 using a signed URL\n *\n * Retries up to 3 times with exponential backoff\n *\n * @param filePath - Absolute path to file to upload\n * @param signedUrl - Signed S3 upload URL\n * @throws Error if upload fails after retries\n */\nexport async function uploadFile(\n filePath: string,\n signedUrl: string,\n contentType?: string,\n): Promise<void> {\n // Skip actual upload for mock URLs\n if (isMockUrl(signedUrl)) {\n log.debug(`Mock upload detected for ${path.basename(filePath)}`)\n // Verify file exists\n const stats = await fs.stat(filePath)\n\n // Simulate upload latency based on file size\n // lambda.zip: ~1-2 seconds, small files: 50-150ms\n const isLargeFile = stats.size > 1024 * 1024 // > 1MB\n const latency = isLargeFile\n ? 1000 + Math.random() * 1000 // 1-2 seconds for large files\n : 50 + Math.random() * 100 // 50-150ms for small files\n await sleep(latency)\n return\n }\n\n const fileBuffer = await fs.readFile(filePath)\n\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n // Content-type only needed if css or js, else let S3 infer\n const ext = path.extname(filePath).toLowerCase()\n\n let determinedContentType: string | undefined = contentType\n if (ext === '.js') {\n determinedContentType = 'application/javascript'\n } else if (ext === '.css') {\n determinedContentType = 'text/css'\n }\n\n const response = await fetch(signedUrl, {\n body: fileBuffer,\n headers: determinedContentType ? { 'Content-Type': determinedContentType } : {},\n method: 'PUT',\n })\n\n if (response.ok) {\n return // Success\n }\n\n lastError = new Error(`Upload failed: ${response.status} ${response.statusText}`)\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error')\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < MAX_RETRIES - 1) {\n await sleep(INITIAL_RETRY_DELAY * Math.pow(2, attempt))\n }\n }\n\n throw lastError || new Error('Upload failed after retries')\n}\n\n/**\n * Upload Lambda code zip to S3\n *\n * @param zipPath - Path to lambda.zip\n * @param signedUrl - Signed S3 upload URL\n */\nexport async function uploadLambdaZip(zipPath: string, signedUrl: string): Promise<void> {\n await uploadFile(zipPath, signedUrl, 'application/zip')\n}\n\n/**\n * Upload static assets to S3 in parallel\n *\n * Uploads up to 5 files concurrently\n *\n * @param projectPath - Path to project root\n * @param assetUrls - Map of asset paths to signed URLs\n * @param onProgress - Optional callback for progress updates (uploaded, total)\n * @returns Upload results with counts\n */\nexport async function uploadStaticAssets(\n projectPath: string,\n assetUrls: Record<string, string>,\n onProgress?: (uploaded: number, total: number) => void,\n): Promise<UploadResults> {\n const results: UploadResults = {\n assetsFailed: 0,\n assetsUploaded: 0,\n lambdaUploaded: false,\n totalBytesUploaded: 0,\n }\n\n const assetPaths = Object.keys(assetUrls)\n\n if (assetPaths.length === 0) {\n return results\n }\n\n // Upload assets with limited concurrency\n const CONCURRENCY = 5\n for (let i = 0; i < assetPaths.length; i += CONCURRENCY) {\n const batch = assetPaths.slice(i, i + CONCURRENCY)\n\n await Promise.all(\n batch.map(async (assetPath) => {\n try {\n // Convert _next back to .next for file system\n const fsPath = assetPath.replace(/^_next\\//, '.next/')\n const fullPath = path.join(projectPath, fsPath)\n const signedUrl = assetUrls[assetPath]\n\n await uploadFile(fullPath, signedUrl)\n\n results.assetsUploaded++\n\n // Track bytes uploaded\n const stats = await fs.stat(fullPath)\n results.totalBytesUploaded += stats.size\n\n // Report progress\n onProgress?.(results.assetsUploaded, assetPaths.length)\n } catch (error) {\n results.assetsFailed++\n log.debug(\n `Failed to upload ${assetPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }),\n )\n }\n\n return results\n}\n"],"names":["fs","path","log","MAX_RETRIES","INITIAL_RETRY_DELAY","sleep","ms","Promise","resolve","setTimeout","isMockUrl","signedUrl","includes","uploadFile","filePath","contentType","debug","basename","stats","stat","isLargeFile","size","latency","Math","random","fileBuffer","readFile","lastError","attempt","ext","extname","toLowerCase","determinedContentType","response","fetch","body","headers","method","ok","Error","status","statusText","error","pow","uploadLambdaZip","zipPath","uploadStaticAssets","projectPath","assetUrls","onProgress","results","assetsFailed","assetsUploaded","lambdaUploaded","totalBytesUploaded","assetPaths","Object","keys","length","CONCURRENCY","i","batch","slice","all","map","assetPath","fsPath","replace","fullPath","join","message"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAC5B,OAAOC,UAAU,OAAM;AAEvB,YAAYC,SAAS,WAAU;AAgB/B;;CAEC,GACD,MAAMC,cAAc;AACpB,MAAMC,sBAAsB,KAAK,WAAW;;AAE5C;;CAEC,GACD,SAASC,MAAMC,EAAU;IACvB,OAAO,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AACtD;AAEA;;CAEC,GACD,SAASI,UAAUC,SAAiB;IAClC,OAAOA,UAAUC,QAAQ,CAAC;AAC5B;AAEA;;;;;;;;CAQC,GACD,OAAO,eAAeC,WACpBC,QAAgB,EAChBH,SAAiB,EACjBI,WAAoB;IAEpB,mCAAmC;IACnC,IAAIL,UAAUC,YAAY;QACxBT,IAAIc,KAAK,CAAC,CAAC,yBAAyB,EAAEf,KAAKgB,QAAQ,CAACH,WAAW;QAC/D,qBAAqB;QACrB,MAAMI,QAAQ,MAAMlB,GAAGmB,IAAI,CAACL;QAE5B,6CAA6C;QAC7C,kDAAkD;QAClD,MAAMM,cAAcF,MAAMG,IAAI,GAAG,OAAO,KAAK,QAAQ;;QACrD,MAAMC,UAAUF,cACZ,OAAOG,KAAKC,MAAM,KAAK,KAAK,8BAA8B;WAC1D,KAAKD,KAAKC,MAAM,KAAK,IAAI,2BAA2B;;QACxD,MAAMnB,MAAMiB;QACZ;IACF;IAEA,MAAMG,aAAa,MAAMzB,GAAG0B,QAAQ,CAACZ;IAErC,IAAIa,YAA0B;IAE9B,IAAK,IAAIC,UAAU,GAAGA,UAAUzB,aAAayB,UAAW;QACtD,IAAI;YACF,2DAA2D;YAC3D,MAAMC,MAAM5B,KAAK6B,OAAO,CAAChB,UAAUiB,WAAW;YAE9C,IAAIC,wBAA4CjB;YAChD,IAAIc,QAAQ,OAAO;gBACjBG,wBAAwB;YAC1B,OAAO,IAAIH,QAAQ,QAAQ;gBACzBG,wBAAwB;YAC1B;YAEA,MAAMC,WAAW,MAAMC,MAAMvB,WAAW;gBACtCwB,MAAMV;gBACNW,SAASJ,wBAAwB;oBAAE,gBAAgBA;gBAAsB,IAAI,CAAC;gBAC9EK,QAAQ;YACV;YAEA,IAAIJ,SAASK,EAAE,EAAE;gBACf,QAAO,UAAU;YACnB;YAEAX,YAAY,IAAIY,MAAM,CAAC,eAAe,EAAEN,SAASO,MAAM,CAAC,CAAC,EAAEP,SAASQ,UAAU,EAAE;QAClF,EAAE,OAAOC,OAAO;YACdf,YAAYe,iBAAiBH,QAAQG,QAAQ,IAAIH,MAAM;QACzD;QAEA,0CAA0C;QAC1C,IAAIX,UAAUzB,cAAc,GAAG;YAC7B,MAAME,MAAMD,sBAAsBmB,KAAKoB,GAAG,CAAC,GAAGf;QAChD;IACF;IAEA,MAAMD,aAAa,IAAIY,MAAM;AAC/B;AAEA;;;;;CAKC,GACD,OAAO,eAAeK,gBAAgBC,OAAe,EAAElC,SAAiB;IACtE,MAAME,WAAWgC,SAASlC,WAAW;AACvC;AAEA;;;;;;;;;CASC,GACD,OAAO,eAAemC,mBACpBC,WAAmB,EACnBC,SAAiC,EACjCC,UAAsD;IAEtD,MAAMC,UAAyB;QAC7BC,cAAc;QACdC,gBAAgB;QAChBC,gBAAgB;QAChBC,oBAAoB;IACtB;IAEA,MAAMC,aAAaC,OAAOC,IAAI,CAACT;IAE/B,IAAIO,WAAWG,MAAM,KAAK,GAAG;QAC3B,OAAOR;IACT;IAEA,yCAAyC;IACzC,MAAMS,cAAc;IACpB,IAAK,IAAIC,IAAI,GAAGA,IAAIL,WAAWG,MAAM,EAAEE,KAAKD,YAAa;QACvD,MAAME,QAAQN,WAAWO,KAAK,CAACF,GAAGA,IAAID;QAEtC,MAAMpD,QAAQwD,GAAG,CACfF,MAAMG,GAAG,CAAC,OAAOC;YACf,IAAI;gBACF,8CAA8C;gBAC9C,MAAMC,SAASD,UAAUE,OAAO,CAAC,YAAY;gBAC7C,MAAMC,WAAWnE,KAAKoE,IAAI,CAACtB,aAAamB;gBACxC,MAAMvD,YAAYqC,SAAS,CAACiB,UAAU;gBAEtC,MAAMpD,WAAWuD,UAAUzD;gBAE3BuC,QAAQE,cAAc;gBAEtB,uBAAuB;gBACvB,MAAMlC,QAAQ,MAAMlB,GAAGmB,IAAI,CAACiD;gBAC5BlB,QAAQI,kBAAkB,IAAIpC,MAAMG,IAAI;gBAExC,kBAAkB;gBAClB4B,aAAaC,QAAQE,cAAc,EAAEG,WAAWG,MAAM;YACxD,EAAE,OAAOhB,OAAO;gBACdQ,QAAQC,YAAY;gBACpBjD,IAAIc,KAAK,CACP,CAAC,iBAAiB,EAAEiD,UAAU,EAAE,EAAEvB,iBAAiBH,QAAQG,MAAM4B,OAAO,GAAG,iBAAiB;YAEhG;QACF;IAEJ;IAEA,OAAOpB;AACT"}
1
+ {"version":3,"sources":["../../src/utils/s3-upload.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\n\nimport * as log from './log.js'\n\n/**\n * Results from uploading assets\n */\nexport interface UploadResults {\n /** Number of static assets that failed to upload */\n assetsFailed: number\n /** Number of static assets successfully uploaded */\n assetsUploaded: number\n /** Whether Lambda code was uploaded */\n lambdaUploaded: boolean\n /** Total bytes uploaded */\n totalBytesUploaded: number\n}\n\n/**\n * Retry configuration\n */\nconst MAX_RETRIES = 3\nconst INITIAL_RETRY_DELAY = 1000 // 1 second\n\n/**\n * Sleep for specified milliseconds\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Check if a signed URL is a mock URL\n */\nfunction isMockUrl(signedUrl: string): boolean {\n return signedUrl.includes('X-Amz-Signature=mock')\n}\n\n/**\n * Upload a file to S3 using a signed URL\n *\n * Retries up to 3 times with exponential backoff\n *\n * @param filePath - Absolute path to file to upload\n * @param signedUrl - Signed S3 upload URL\n * @param contentType - MIME type (optional)\n * @throws Error if upload fails after retries\n */\nexport async function uploadFile(\n filePath: string,\n signedUrl: string,\n contentType?: string,\n): Promise<void> {\n // Skip actual upload for mock URLs\n if (isMockUrl(signedUrl)) {\n log.debug(`Mock upload detected for ${path.basename(filePath)}`)\n // Verify file exists\n const stats = await fs.stat(filePath)\n\n // Simulate upload latency based on file size\n // lambda.zip: ~1-2 seconds, small files: 50-150ms\n const isLargeFile = stats.size > 1024 * 1024 // > 1MB\n const latency = isLargeFile\n ? 1000 + Math.random() * 1000 // 1-2 seconds for large files\n : 50 + Math.random() * 100 // 50-150ms for small files\n await sleep(latency)\n return\n }\n\n const fileBuffer = await fs.readFile(filePath)\n\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {\n try {\n const response = await fetch(signedUrl, {\n body: fileBuffer,\n headers: contentType ? { 'Content-Type': contentType } : {},\n method: 'PUT',\n })\n\n if (response.ok) {\n return // Success\n }\n\n lastError = new Error(`Upload failed: ${response.status} ${response.statusText}`)\n } catch (error) {\n lastError = error instanceof Error ? error : new Error('Unknown error')\n }\n\n // Wait before retry (exponential backoff)\n if (attempt < MAX_RETRIES - 1) {\n await sleep(INITIAL_RETRY_DELAY * Math.pow(2, attempt))\n }\n }\n\n throw lastError || new Error('Upload failed after retries')\n}\n\n/**\n * Upload Lambda code zip to S3\n *\n * @param zipPath - Path to lambda.zip\n * @param signedUrl - Signed S3 upload URL\n */\nexport async function uploadLambdaZip(zipPath: string, signedUrl: string): Promise<void> {\n await uploadFile(zipPath, signedUrl, 'application/zip')\n}\n\n/**\n * Upload static assets to S3 in parallel\n *\n * Uploads up to 5 files concurrently\n *\n * @param projectPath - Path to project root\n * @param assetUrls - Map of asset paths to signed URLs\n * @param onProgress - Optional callback for progress updates (uploaded, total)\n * @returns Upload results with counts\n */\nexport async function uploadStaticAssets(\n projectPath: string,\n assetUrls: Record<string, string>,\n onProgress?: (uploaded: number, total: number) => void,\n): Promise<UploadResults> {\n const results: UploadResults = {\n assetsFailed: 0,\n assetsUploaded: 0,\n lambdaUploaded: false,\n totalBytesUploaded: 0,\n }\n\n const assetPaths = Object.keys(assetUrls)\n\n if (assetPaths.length === 0) {\n return results\n }\n\n // Upload assets with limited concurrency\n const CONCURRENCY = 5\n for (let i = 0; i < assetPaths.length; i += CONCURRENCY) {\n const batch = assetPaths.slice(i, i + CONCURRENCY)\n\n await Promise.all(\n batch.map(async (assetPath) => {\n try {\n // Convert _next back to .next for file system\n const fsPath = assetPath.replace(/^_next\\//, '.next/')\n const fullPath = path.join(projectPath, fsPath)\n const signedUrl = assetUrls[assetPath]\n\n await uploadFile(fullPath, signedUrl)\n\n results.assetsUploaded++\n\n // Track bytes uploaded\n const stats = await fs.stat(fullPath)\n results.totalBytesUploaded += stats.size\n\n // Report progress\n onProgress?.(results.assetsUploaded, assetPaths.length)\n } catch (error) {\n results.assetsFailed++\n log.debug(\n `Failed to upload ${assetPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n }\n }),\n )\n }\n\n return results\n}\n"],"names":["fs","path","log","MAX_RETRIES","INITIAL_RETRY_DELAY","sleep","ms","Promise","resolve","setTimeout","isMockUrl","signedUrl","includes","uploadFile","filePath","contentType","debug","basename","stats","stat","isLargeFile","size","latency","Math","random","fileBuffer","readFile","lastError","attempt","response","fetch","body","headers","method","ok","Error","status","statusText","error","pow","uploadLambdaZip","zipPath","uploadStaticAssets","projectPath","assetUrls","onProgress","results","assetsFailed","assetsUploaded","lambdaUploaded","totalBytesUploaded","assetPaths","Object","keys","length","CONCURRENCY","i","batch","slice","all","map","assetPath","fsPath","replace","fullPath","join","message"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"token-display.d.ts","sourceRoot":"","sources":["../../src/utils/token-display.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAyC9D"}
1
+ {"version":3,"file":"token-display.d.ts","sourceRoot":"","sources":["../../src/utils/token-display.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsBzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAkC9D"}
@@ -37,33 +37,27 @@ import { isDebug } from './is-debug.js';
37
37
  // Get all tenant IDs that have project tokens
38
38
  const tenantIds = tokenStore.getAllProjectTokenTenantIds();
39
39
  if (tenantIds.length === 0) {
40
- p.note(pc.dim('No project tokens stored.'), `Project Tokens`);
40
+ p.log.step(pc.dim('No project tokens stored.'));
41
+ p.note(`Run ${pc.cyan('@payloadcms/figma init')} to create a CMS instance`, 'Tip');
41
42
  return;
42
43
  }
43
44
  const projectTokenLines = [];
44
- let displayedCount = 0;
45
- tenantIds.forEach((tenantId)=>{
45
+ tenantIds.forEach((tenantId, index)=>{
46
46
  const projectToken = tokenStore.getProjectToken(tenantId);
47
47
  if (!projectToken) {
48
48
  return;
49
49
  }
50
50
  const isValid = tokenStore.hasValidProjectToken(tenantId);
51
51
  const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired');
52
- if (displayedCount > 0) {
52
+ if (index > 0) {
53
53
  projectTokenLines.push(''); // Blank line between tokens
54
54
  }
55
55
  projectTokenLines.push(`Tenant ID: ${tenantId}`);
56
56
  projectTokenLines.push(`Status: ${status}`);
57
57
  projectTokenLines.push(`Token: ${isDebug() ? projectToken.token : maskToken(projectToken.token)}`);
58
58
  projectTokenLines.push(`Expires: ${formatTimestamp(projectToken.expiresAt)}`);
59
- displayedCount++;
60
59
  });
61
- // Handle case where all tokens were expired and auto-cleaned
62
- if (displayedCount === 0) {
63
- p.note(pc.dim('No project tokens stored.'), `Project Tokens`);
64
- return;
65
- }
66
- p.note(projectTokenLines.join('\n'), `Project Tokens (${displayedCount})`);
60
+ p.note(projectTokenLines.join('\n'), `Project Tokens (${tenantIds.length})`);
67
61
  }
68
62
 
69
63
  //# sourceMappingURL=token-display.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/token-display.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { isDebug } from './is-debug.js'\n\n/**\n * Mask token for display (show first 4 and last 4 characters)\n */\nexport function maskToken(token: string): string {\n if (token.length <= 8) {\n return '***'\n }\n return `${token.slice(0, 4)}${'*'.repeat(Math.min(token.length - 8, 32))}${token.slice(-4)}`\n}\n\n/**\n * Format timestamp as human-readable string with color coding\n */\nexport function formatTimestamp(timestamp: number): string {\n const now = Date.now()\n const diff = timestamp - now\n\n if (diff < 0) {\n return pc.red('Expired')\n }\n\n const minutes = Math.floor(diff / 60000)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n if (days > 0) {\n return pc.green(`${days}d ${hours % 24}h`)\n }\n if (hours > 0) {\n return pc.green(`${hours}h ${minutes % 60}m`)\n }\n if (minutes > 5) {\n return pc.yellow(`${minutes}m`)\n }\n return pc.red(`${minutes}m`)\n}\n\n/**\n * Show all stored project tokens\n */\nexport function showProjectTokens(tokenStore: TokenStore): void {\n // Get all tenant IDs that have project tokens\n const tenantIds = tokenStore.getAllProjectTokenTenantIds()\n\n if (tenantIds.length === 0) {\n p.note(pc.dim('No project tokens stored.'), `Project Tokens`)\n return\n }\n const projectTokenLines: string[] = []\n let displayedCount = 0\n\n tenantIds.forEach((tenantId) => {\n const projectToken = tokenStore.getProjectToken(tenantId)\n\n if (!projectToken) {\n return\n }\n\n const isValid = tokenStore.hasValidProjectToken(tenantId)\n const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired')\n\n if (displayedCount > 0) {\n projectTokenLines.push('') // Blank line between tokens\n }\n\n projectTokenLines.push(`Tenant ID: ${tenantId}`)\n projectTokenLines.push(`Status: ${status}`)\n projectTokenLines.push(\n `Token: ${isDebug() ? projectToken.token : maskToken(projectToken.token)}`,\n )\n projectTokenLines.push(`Expires: ${formatTimestamp(projectToken.expiresAt)}`)\n displayedCount++\n })\n\n // Handle case where all tokens were expired and auto-cleaned\n if (displayedCount === 0) {\n p.note(pc.dim('No project tokens stored.'), `Project Tokens`)\n return\n }\n\n p.note(projectTokenLines.join('\\n'), `Project Tokens (${displayedCount})`)\n}\n"],"names":["p","pc","isDebug","maskToken","token","length","slice","repeat","Math","min","formatTimestamp","timestamp","now","Date","diff","red","minutes","floor","hours","days","green","yellow","showProjectTokens","tokenStore","tenantIds","getAllProjectTokenTenantIds","note","dim","projectTokenLines","displayedCount","forEach","tenantId","projectToken","getProjectToken","isValid","hasValidProjectToken","status","push","expiresAt","join"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAI3B,SAASC,OAAO,QAAQ,gBAAe;AAEvC;;CAEC,GACD,OAAO,SAASC,UAAUC,KAAa;IACrC,IAAIA,MAAMC,MAAM,IAAI,GAAG;QACrB,OAAO;IACT;IACA,OAAO,GAAGD,MAAME,KAAK,CAAC,GAAG,KAAK,IAAIC,MAAM,CAACC,KAAKC,GAAG,CAACL,MAAMC,MAAM,GAAG,GAAG,OAAOD,MAAME,KAAK,CAAC,CAAC,IAAI;AAC9F;AAEA;;CAEC,GACD,OAAO,SAASI,gBAAgBC,SAAiB;IAC/C,MAAMC,MAAMC,KAAKD,GAAG;IACpB,MAAME,OAAOH,YAAYC;IAEzB,IAAIE,OAAO,GAAG;QACZ,OAAOb,GAAGc,GAAG,CAAC;IAChB;IAEA,MAAMC,UAAUR,KAAKS,KAAK,CAACH,OAAO;IAClC,MAAMI,QAAQV,KAAKS,KAAK,CAACD,UAAU;IACnC,MAAMG,OAAOX,KAAKS,KAAK,CAACC,QAAQ;IAEhC,IAAIC,OAAO,GAAG;QACZ,OAAOlB,GAAGmB,KAAK,CAAC,GAAGD,KAAK,EAAE,EAAED,QAAQ,GAAG,CAAC,CAAC;IAC3C;IACA,IAAIA,QAAQ,GAAG;QACb,OAAOjB,GAAGmB,KAAK,CAAC,GAAGF,MAAM,EAAE,EAAEF,UAAU,GAAG,CAAC,CAAC;IAC9C;IACA,IAAIA,UAAU,GAAG;QACf,OAAOf,GAAGoB,MAAM,CAAC,GAAGL,QAAQ,CAAC,CAAC;IAChC;IACA,OAAOf,GAAGc,GAAG,CAAC,GAAGC,QAAQ,CAAC,CAAC;AAC7B;AAEA;;CAEC,GACD,OAAO,SAASM,kBAAkBC,UAAsB;IACtD,8CAA8C;IAC9C,MAAMC,YAAYD,WAAWE,2BAA2B;IAExD,IAAID,UAAUnB,MAAM,KAAK,GAAG;QAC1BL,EAAE0B,IAAI,CAACzB,GAAG0B,GAAG,CAAC,8BAA8B,CAAC,cAAc,CAAC;QAC5D;IACF;IACA,MAAMC,oBAA8B,EAAE;IACtC,IAAIC,iBAAiB;IAErBL,UAAUM,OAAO,CAAC,CAACC;QACjB,MAAMC,eAAeT,WAAWU,eAAe,CAACF;QAEhD,IAAI,CAACC,cAAc;YACjB;QACF;QAEA,MAAME,UAAUX,WAAWY,oBAAoB,CAACJ;QAChD,MAAMK,SAASF,UAAUjC,GAAGmB,KAAK,CAAC,aAAanB,GAAGc,GAAG,CAAC;QAEtD,IAAIc,iBAAiB,GAAG;YACtBD,kBAAkBS,IAAI,CAAC,KAAI,4BAA4B;QACzD;QAEAT,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAEN,UAAU;QACpDH,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAED,QAAQ;QAClDR,kBAAkBS,IAAI,CACpB,CAAC,gBAAgB,EAAEnC,YAAY8B,aAAa5B,KAAK,GAAGD,UAAU6B,aAAa5B,KAAK,GAAG;QAErFwB,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAE3B,gBAAgBsB,aAAaM,SAAS,GAAG;QACnFT;IACF;IAEA,6DAA6D;IAC7D,IAAIA,mBAAmB,GAAG;QACxB7B,EAAE0B,IAAI,CAACzB,GAAG0B,GAAG,CAAC,8BAA8B,CAAC,cAAc,CAAC;QAC5D;IACF;IAEA3B,EAAE0B,IAAI,CAACE,kBAAkBW,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAEV,eAAe,CAAC,CAAC;AAC3E"}
1
+ {"version":3,"sources":["../../src/utils/token-display.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nimport type { TokenStore } from '../auth/token-store.js'\n\nimport { isDebug } from './is-debug.js'\n\n/**\n * Mask token for display (show first 4 and last 4 characters)\n */\nexport function maskToken(token: string): string {\n if (token.length <= 8) {\n return '***'\n }\n return `${token.slice(0, 4)}${'*'.repeat(Math.min(token.length - 8, 32))}${token.slice(-4)}`\n}\n\n/**\n * Format timestamp as human-readable string with color coding\n */\nexport function formatTimestamp(timestamp: number): string {\n const now = Date.now()\n const diff = timestamp - now\n\n if (diff < 0) {\n return pc.red('Expired')\n }\n\n const minutes = Math.floor(diff / 60000)\n const hours = Math.floor(minutes / 60)\n const days = Math.floor(hours / 24)\n\n if (days > 0) {\n return pc.green(`${days}d ${hours % 24}h`)\n }\n if (hours > 0) {\n return pc.green(`${hours}h ${minutes % 60}m`)\n }\n if (minutes > 5) {\n return pc.yellow(`${minutes}m`)\n }\n return pc.red(`${minutes}m`)\n}\n\n/**\n * Show all stored project tokens\n */\nexport function showProjectTokens(tokenStore: TokenStore): void {\n // Get all tenant IDs that have project tokens\n const tenantIds = tokenStore.getAllProjectTokenTenantIds()\n\n if (tenantIds.length === 0) {\n p.log.step(pc.dim('No project tokens stored.'))\n p.note(`Run ${pc.cyan('@payloadcms/figma init')} to create a CMS instance`, 'Tip')\n return\n }\n const projectTokenLines: string[] = []\n\n tenantIds.forEach((tenantId, index) => {\n const projectToken = tokenStore.getProjectToken(tenantId)\n\n if (!projectToken) {\n return\n }\n\n const isValid = tokenStore.hasValidProjectToken(tenantId)\n const status = isValid ? pc.green('✓ Valid') : pc.red('✗ Expired')\n\n if (index > 0) {\n projectTokenLines.push('') // Blank line between tokens\n }\n\n projectTokenLines.push(`Tenant ID: ${tenantId}`)\n projectTokenLines.push(`Status: ${status}`)\n projectTokenLines.push(\n `Token: ${isDebug() ? projectToken.token : maskToken(projectToken.token)}`,\n )\n projectTokenLines.push(`Expires: ${formatTimestamp(projectToken.expiresAt)}`)\n })\n\n p.note(projectTokenLines.join('\\n'), `Project Tokens (${tenantIds.length})`)\n}\n"],"names":["p","pc","isDebug","maskToken","token","length","slice","repeat","Math","min","formatTimestamp","timestamp","now","Date","diff","red","minutes","floor","hours","days","green","yellow","showProjectTokens","tokenStore","tenantIds","getAllProjectTokenTenantIds","log","step","dim","note","cyan","projectTokenLines","forEach","tenantId","index","projectToken","getProjectToken","isValid","hasValidProjectToken","status","push","expiresAt","join"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,QAAQ,aAAY;AAI3B,SAASC,OAAO,QAAQ,gBAAe;AAEvC;;CAEC,GACD,OAAO,SAASC,UAAUC,KAAa;IACrC,IAAIA,MAAMC,MAAM,IAAI,GAAG;QACrB,OAAO;IACT;IACA,OAAO,GAAGD,MAAME,KAAK,CAAC,GAAG,KAAK,IAAIC,MAAM,CAACC,KAAKC,GAAG,CAACL,MAAMC,MAAM,GAAG,GAAG,OAAOD,MAAME,KAAK,CAAC,CAAC,IAAI;AAC9F;AAEA;;CAEC,GACD,OAAO,SAASI,gBAAgBC,SAAiB;IAC/C,MAAMC,MAAMC,KAAKD,GAAG;IACpB,MAAME,OAAOH,YAAYC;IAEzB,IAAIE,OAAO,GAAG;QACZ,OAAOb,GAAGc,GAAG,CAAC;IAChB;IAEA,MAAMC,UAAUR,KAAKS,KAAK,CAACH,OAAO;IAClC,MAAMI,QAAQV,KAAKS,KAAK,CAACD,UAAU;IACnC,MAAMG,OAAOX,KAAKS,KAAK,CAACC,QAAQ;IAEhC,IAAIC,OAAO,GAAG;QACZ,OAAOlB,GAAGmB,KAAK,CAAC,GAAGD,KAAK,EAAE,EAAED,QAAQ,GAAG,CAAC,CAAC;IAC3C;IACA,IAAIA,QAAQ,GAAG;QACb,OAAOjB,GAAGmB,KAAK,CAAC,GAAGF,MAAM,EAAE,EAAEF,UAAU,GAAG,CAAC,CAAC;IAC9C;IACA,IAAIA,UAAU,GAAG;QACf,OAAOf,GAAGoB,MAAM,CAAC,GAAGL,QAAQ,CAAC,CAAC;IAChC;IACA,OAAOf,GAAGc,GAAG,CAAC,GAAGC,QAAQ,CAAC,CAAC;AAC7B;AAEA;;CAEC,GACD,OAAO,SAASM,kBAAkBC,UAAsB;IACtD,8CAA8C;IAC9C,MAAMC,YAAYD,WAAWE,2BAA2B;IAExD,IAAID,UAAUnB,MAAM,KAAK,GAAG;QAC1BL,EAAE0B,GAAG,CAACC,IAAI,CAAC1B,GAAG2B,GAAG,CAAC;QAClB5B,EAAE6B,IAAI,CAAC,CAAC,IAAI,EAAE5B,GAAG6B,IAAI,CAAC,0BAA0B,yBAAyB,CAAC,EAAE;QAC5E;IACF;IACA,MAAMC,oBAA8B,EAAE;IAEtCP,UAAUQ,OAAO,CAAC,CAACC,UAAUC;QAC3B,MAAMC,eAAeZ,WAAWa,eAAe,CAACH;QAEhD,IAAI,CAACE,cAAc;YACjB;QACF;QAEA,MAAME,UAAUd,WAAWe,oBAAoB,CAACL;QAChD,MAAMM,SAASF,UAAUpC,GAAGmB,KAAK,CAAC,aAAanB,GAAGc,GAAG,CAAC;QAEtD,IAAImB,QAAQ,GAAG;YACbH,kBAAkBS,IAAI,CAAC,KAAI,4BAA4B;QACzD;QAEAT,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAEP,UAAU;QACpDF,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAED,QAAQ;QAClDR,kBAAkBS,IAAI,CACpB,CAAC,gBAAgB,EAAEtC,YAAYiC,aAAa/B,KAAK,GAAGD,UAAUgC,aAAa/B,KAAK,GAAG;QAErF2B,kBAAkBS,IAAI,CAAC,CAAC,gBAAgB,EAAE9B,gBAAgByB,aAAaM,SAAS,GAAG;IACrF;IAEAzC,EAAE6B,IAAI,CAACE,kBAAkBW,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAElB,UAAUnB,MAAM,CAAC,CAAC,CAAC;AAC7E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/figma",
3
- "version": "0.0.1-alpha.28",
3
+ "version": "0.0.1-alpha.3",
4
4
  "license": "SEE LICENSE IN LICENSE.md",
5
5
  "type": "module",
6
6
  "exports": {
@@ -8,11 +8,6 @@
8
8
  "import": "./dist/index.js",
9
9
  "types": "./dist/index.d.ts",
10
10
  "default": "./dist/index.js"
11
- },
12
- "./client": {
13
- "import": "./dist/exports/client.js",
14
- "types": "./dist/exports/client.d.ts",
15
- "default": "./dist/exports/client.js"
16
11
  }
17
12
  },
18
13
  "main": "./dist/index.js",
@@ -34,7 +29,6 @@
34
29
  "esprima-next": "^6.0.2",
35
30
  "figures": "^6.1.0",
36
31
  "jose": "6.0.12",
37
- "jsonwebtoken": "9.0.2",
38
32
  "open": "^10.1.0",
39
33
  "picocolors": "1.1.1",
40
34
  "tar": "^7.4.3",
@@ -43,19 +37,13 @@
43
37
  },
44
38
  "devDependencies": {
45
39
  "@types/node": "22.12.0",
46
- "openapi-typescript": "^7.10.1",
47
40
  "tsx": "4.20.6",
48
41
  "typescript": "5.9.3",
49
42
  "vitest": "3.2.4"
50
43
  },
51
44
  "peerDependencies": {
52
- "@payloadcms/richtext-lexical": "^3.0.0",
53
- "payload": "^3.0.0"
54
- },
55
- "peerDependenciesMeta": {
56
- "@payloadcms/richtext-lexical": {
57
- "optional": true
58
- }
45
+ "@payloadcms/richtext-lexical": "^3.54.0",
46
+ "payload": "^3.54.0"
59
47
  },
60
48
  "publishConfig": {
61
49
  "registry": "https://registry.npmjs.org/"
@@ -63,17 +51,15 @@
63
51
  "scripts": {
64
52
  "build": "pnpm build:swc && pnpm build:types && pnpm copyfiles",
65
53
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
66
- "build:types": "tsc --project tsconfig.build.json",
54
+ "build:types": "tsc",
67
55
  "clean": "rimraf -g \"{dist,*.tsbuildinfo,package}\"",
68
56
  "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png}\" dist/",
69
57
  "debug:clear-tokens": "tsx scripts/clear-tokens.ts",
70
58
  "debug:expire-token": "tsx scripts/expire-token.ts",
71
- "debug:get-project-token": "tsx scripts/get-project-token.ts",
72
59
  "debug:jwks": "tsx scripts/test-jwks-validation.ts",
73
60
  "debug:refresh-token": "tsx scripts/refresh-token.ts",
74
61
  "debug:tokens": "tsx scripts/debug-tokens.ts",
75
62
  "debug:write-token": "tsx scripts/write-token.ts",
76
- "generate:types": "tsx scripts/generate-types.ts",
77
63
  "lint": "eslint .",
78
64
  "lint:fix": "eslint . --fix",
79
65
  "start": "pnpm build && node ./bin/cli.js",