create-payload-app 4.0.0-internal.f15737c → 4.0.0-internal.f2a04f7

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 (36) hide show
  1. package/dist/lib/ast/payload-config.js +13 -13
  2. package/dist/lib/ast/payload-config.js.map +1 -1
  3. package/dist/lib/ast/types.d.ts +1 -1
  4. package/dist/lib/ast/types.d.ts.map +1 -1
  5. package/dist/lib/ast/types.js.map +1 -1
  6. package/dist/lib/configure-payload-config.js +1 -1
  7. package/dist/lib/configure-payload-config.js.map +1 -1
  8. package/dist/lib/init-next.d.ts +5 -0
  9. package/dist/lib/init-next.d.ts.map +1 -1
  10. package/dist/lib/init-next.js +14 -3
  11. package/dist/lib/init-next.js.map +1 -1
  12. package/dist/lib/init-tanstack.js +1 -1
  13. package/dist/lib/init-tanstack.js.map +1 -1
  14. package/dist/lib/tanstack/template-files.d.ts +4 -4
  15. package/dist/lib/tanstack/template-files.d.ts.map +1 -1
  16. package/dist/lib/tanstack/template-files.js +5 -5
  17. package/dist/lib/tanstack/template-files.js.map +1 -1
  18. package/dist/lib/update-payload-in-project.js +3 -3
  19. package/dist/lib/update-payload-in-project.js.map +1 -1
  20. package/dist/main.js +2 -2
  21. package/dist/main.js.map +1 -1
  22. package/dist/template/src/payload.config.ts +1 -1
  23. package/dist/template-tanstack/routes/_payload/admin.$.tsx +19 -3
  24. package/dist/template-tanstack/routes/_payload/admin.index.tsx +19 -3
  25. package/dist/template-tanstack/routes/_payload/custom.css +0 -0
  26. package/dist/template-tanstack/routes/_payload.tsx +0 -2
  27. package/dist/template-tanstack/src/payload.config.ts +1 -1
  28. package/dist/utils/messages.d.ts.map +1 -1
  29. package/dist/utils/messages.js +2 -1
  30. package/dist/utils/messages.js.map +1 -1
  31. package/dist/utils/resolvePackageVersion.d.ts +10 -4
  32. package/dist/utils/resolvePackageVersion.d.ts.map +1 -1
  33. package/dist/utils/resolvePackageVersion.js +24 -3
  34. package/dist/utils/resolvePackageVersion.js.map +1 -1
  35. package/package.json +16 -16
  36. package/dist/template-tanstack/src/payload.css +0 -1
@@ -484,7 +484,7 @@ export function removeSharp(sourceFile) {
484
484
  };
485
485
  }
486
486
  export async function writeTransformedFile(sourceFile, options = {}) {
487
- const { formatWithPrettier = true, validateStructure: shouldValidate = true } = options;
487
+ const { formatWithOxfmt = true, validateStructure: shouldValidate = true } = options;
488
488
  debug(`[AST] Writing transformed file: ${sourceFile.getFilePath()}`);
489
489
  // Validate if requested
490
490
  if (shouldValidate) {
@@ -501,27 +501,27 @@ export async function writeTransformedFile(sourceFile, options = {}) {
501
501
  // Write file
502
502
  debug('[AST] Writing file to disk');
503
503
  await sourceFile.save();
504
- // Format with prettier if requested
505
- if (formatWithPrettier) {
506
- debug('[AST] Running prettier formatting via CLI');
504
+ // Format with oxfmt if requested
505
+ if (formatWithOxfmt) {
506
+ debug('[AST] Running oxfmt formatting via CLI');
507
507
  try {
508
508
  // Detect project directory (go up from file until we find package.json or use dirname)
509
509
  const projectDir = path.dirname(filePath);
510
- // Run prettier via CLI (avoids Jest/ESM compatibility issues)
511
- const prettierCmd = `npx prettier --write "${filePath}"`;
512
- debug(`[AST] Executing: ${prettierCmd}`);
513
- execSync(prettierCmd, {
510
+ // Run oxfmt via CLI (avoids Jest/ESM compatibility issues)
511
+ const oxfmtCmd = `npx oxfmt "${filePath}"`;
512
+ debug(`[AST] Executing: ${oxfmtCmd}`);
513
+ execSync(oxfmtCmd, {
514
514
  cwd: projectDir,
515
515
  stdio: 'pipe'
516
516
  });
517
- debug('[AST] ✓ Prettier formatting successful');
517
+ debug('[AST] ✓ Oxfmt formatting successful');
518
518
  } catch (error) {
519
- // Log but don't fail if prettier fails (might not be installed)
520
- debug(`[AST] ⚠ Prettier formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
519
+ // Log but don't fail if oxfmt fails (might not be installed)
520
+ debug(`[AST] ⚠ Oxfmt formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
521
521
  debug('[AST] Continuing with unformatted output');
522
522
  }
523
523
  } else {
524
- debug('[AST] Skipping prettier formatting (disabled)');
524
+ debug('[AST] Skipping oxfmt formatting (disabled)');
525
525
  }
526
526
  debug('[AST] ✓ File written successfully');
527
527
  return {
@@ -635,7 +635,7 @@ export async function configurePayloadConfig(filePath, options = {}) {
635
635
  }
636
636
  // Write transformed file with validation and formatting
637
637
  return await writeTransformedFile(sourceFile, {
638
- formatWithPrettier: options.formatWithPrettier,
638
+ formatWithOxfmt: options.formatWithOxfmt,
639
639
  validateStructure: options.validateStructure ?? true
640
640
  });
641
641
  } catch (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/payload-config.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport path from 'path'\nimport { Project, QuoteKind, type SourceFile, SyntaxKind } from 'ts-morph'\n\nimport type {\n ConfigureOptions,\n DatabaseAdapter,\n DetectionResult,\n Modification,\n StorageAdapter,\n TransformationResult,\n WriteOptions,\n WriteResult,\n} from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './adapter-config.js'\nimport {\n addImportDeclaration,\n cleanupOrphanedImports,\n formatError,\n removeImportDeclaration,\n} from './utils.js'\n\nexport function detectPayloadConfigStructure(sourceFile: SourceFile): DetectionResult {\n debug(`[AST] Detecting payload config structure in ${sourceFile.getFilePath()}`)\n\n // First find the actual name being used (might be aliased)\n const payloadImport = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === 'payload')\n\n const buildConfigImportSpec = payloadImport\n ?.getNamedImports()\n .find((spec) => spec.getName() === 'buildConfig')\n\n const aliasNode = buildConfigImportSpec?.getAliasNode()\n const buildConfigName = aliasNode ? aliasNode.getText() : 'buildConfig'\n\n debug(`[AST] Looking for function call: ${buildConfigName}`)\n\n // Find buildConfig call expression (using actual name in code)\n const buildConfigCall = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n if (!buildConfigCall) {\n debug(`[AST] ✗ ${buildConfigName} call not found`)\n return {\n error: formatError({\n actual: `No ${buildConfigName} call found in file`,\n context: 'buildConfig call',\n expected: `export default ${buildConfigName}({ ... })`,\n technicalDetails: `Could not find CallExpression with identifier \"${buildConfigName}\"`,\n }),\n success: false,\n }\n }\n\n debug(`[AST] ✓ ${buildConfigName} call found`)\n\n // Get import statements\n const importStatements = sourceFile.getImportDeclarations()\n debug(`[AST] Found ${importStatements.length} import statements`)\n\n // Find db property if it exists\n const configObject = buildConfigCall.getArguments()[0]\n let dbProperty\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n dbProperty = configObject\n .asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n .getProperty('db')\n ?.asKind(SyntaxKind.PropertyAssignment)\n }\n\n debug(`[AST] db property: ${dbProperty ? '✓ found' : '✗ not found'}`)\n\n // Find plugins array if it exists\n let pluginsArray\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const pluginsProperty = objLiteral.getProperty('plugins')\n\n // Handle PropertyAssignment (e.g., plugins: [...])\n const propertyAssignment = pluginsProperty?.asKind(SyntaxKind.PropertyAssignment)\n if (propertyAssignment) {\n const initializer = propertyAssignment.getInitializer()\n if (initializer?.getKind() === SyntaxKind.ArrayLiteralExpression) {\n pluginsArray = initializer.asKind(SyntaxKind.ArrayLiteralExpression)\n }\n }\n // For ShorthandPropertyAssignment (e.g., plugins), we can't get the array directly\n // but we'll detect it in addStorageAdapter\n }\n\n debug(`[AST] plugins array: ${pluginsArray ? '✓ found' : '✗ not found'}`)\n\n // Find all buildConfig calls for edge case detection (using actual name)\n const allBuildConfigCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n const hasImportAlias = !!aliasNode\n\n // Check for other Payload imports\n const payloadImports = payloadImport?.getNamedImports() || []\n const hasOtherPayloadImports =\n payloadImports.length > 1 || payloadImports.some((imp) => imp.getName() !== 'buildConfig')\n\n // Track database adapter imports\n let dbAdapterImportInfo\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n dbAdapterImportInfo = {\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n }\n break\n }\n }\n\n // Track storage adapter imports\n const storageAdapterImports = []\n for (const [, config] of Object.entries(STORAGE_ADAPTER_CONFIG)) {\n if (!config.packageName || !config.adapterName) {\n continue\n }\n\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n storageAdapterImports.push({\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n })\n }\n }\n\n const needsManualIntervention = hasImportAlias || allBuildConfigCalls.length > 2\n\n debug(\n `[AST] Edge cases: alias=${hasImportAlias}, multiple=${allBuildConfigCalls.length > 1}, otherImports=${hasOtherPayloadImports}, manual=${needsManualIntervention}`,\n )\n\n return {\n edgeCases: {\n hasImportAlias,\n hasOtherPayloadImports,\n multipleBuildConfigCalls: allBuildConfigCalls.length > 1,\n needsManualIntervention,\n },\n importSources: {\n dbAdapter: dbAdapterImportInfo,\n storage: storageAdapterImports.length > 0 ? storageAdapterImports : undefined,\n },\n sourceFile,\n structures: {\n buildConfigCall,\n dbProperty,\n importStatements,\n pluginsArray,\n },\n success: true,\n }\n}\n\nexport function addDatabaseAdapter({\n adapter,\n envVarName = 'DATABASE_URL',\n sourceFile,\n}: {\n adapter: DatabaseAdapter\n envVarName?: string\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding database adapter: ${adapter} (envVar: ${envVarName})`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall, dbProperty } = detection.structures\n const config = DB_ADAPTER_CONFIG[adapter]\n\n // Remove old db adapter imports and track position for replacement\n const oldAdapters = Object.values(DB_ADAPTER_CONFIG)\n const removedAdapters: string[] = []\n let importInsertIndex: number | undefined\n oldAdapters.forEach((oldConfig) => {\n if (oldConfig.packageName !== config.packageName) {\n const { removedIndex } = removeImportDeclaration({\n moduleSpecifier: oldConfig.packageName,\n sourceFile,\n })\n if (removedIndex !== undefined) {\n // Use the first removed adapter's position\n if (importInsertIndex === undefined) {\n importInsertIndex = removedIndex\n }\n removedAdapters.push(oldConfig.packageName)\n modifications.push({\n type: 'import-removed',\n description: `Removed import from '${oldConfig.packageName}'`,\n })\n }\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter imports: ${removedAdapters.join(', ')}`)\n }\n\n // Add new import at the position of the removed one (or default position)\n addImportDeclaration({\n insertIndex: importInsertIndex,\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n\n // Add special imports for specific adapters\n if (adapter === 'd1-sqlite') {\n debug('[AST] Adding special import: ./db/migrations')\n addImportDeclaration({\n defaultImport: 'migrations',\n moduleSpecifier: './db/migrations',\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: migrations from './db/migrations'`,\n })\n }\n\n // Get config object\n const configObject = buildConfigCall.getArguments()[0]\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'database adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n const newDbCode = `db: ${config.configTemplate(envVarName)}`\n\n if (dbProperty) {\n // Replace existing db property\n // NOTE: Using replaceWithText() instead of remove() + insertPropertyAssignment()\n // to avoid double comma issues. When remove() is called, ts-morph doesn't always\n // clean up trailing commas correctly, which can result in syntax like \"},,\" when\n // inserting a new property at that position. replaceWithText() preserves the\n // surrounding punctuation correctly.\n debug(`[AST] Replacing existing db property`)\n dbProperty.replaceWithText(newDbCode)\n modifications.push({\n type: 'property-added',\n description: `Replaced db property with ${adapter} adapter`,\n })\n } else {\n // No existing db property - insert at end\n const insertIndex = objLiteral.getProperties().length\n debug(`[AST] Adding db property at index ${insertIndex}`)\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'db',\n initializer: config.configTemplate(envVarName),\n })\n modifications.push({\n type: 'property-added',\n description: `Added db property with ${adapter} adapter`,\n })\n }\n\n debug(`[AST] ✓ Database adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function addStorageAdapter({\n adapter,\n sourceFile,\n}: {\n adapter: StorageAdapter\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding storage adapter: ${adapter}`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const config = STORAGE_ADAPTER_CONFIG[adapter]\n\n // Local disk doesn't need any imports or plugins\n if (adapter === 'localDisk') {\n debug('[AST] localDisk storage adapter - no imports or plugins needed')\n return {\n modifications: [],\n modified: false,\n success: true,\n }\n }\n\n // Add import\n if (config.packageName && config.adapterName) {\n addImportDeclaration({\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'storage adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n // Find or create plugins array\n const pluginsPropertyRaw = objLiteral.getProperty('plugins')\n let pluginsProperty = pluginsPropertyRaw?.asKind(SyntaxKind.PropertyAssignment)\n\n // Check if it's a shorthand property (e.g., `plugins` referencing an imported variable)\n const shorthandProperty = pluginsPropertyRaw?.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n if (shorthandProperty) {\n debug('[AST] Found shorthand plugins property, converting to long form with spread')\n // Get the identifier name (usually 'plugins')\n const identifierName = shorthandProperty.getName()\n\n // Find insert position before removing\n const allProperties = objLiteral.getProperties()\n const insertIndex = allProperties.indexOf(shorthandProperty)\n\n // Remove the shorthand property\n shorthandProperty.remove()\n\n // Create new property with spread operator: plugins: [...plugins, newAdapter]\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'plugins',\n initializer: `[...${identifierName}]`,\n })\n\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Converted shorthand plugins property to array with spread syntax`,\n })\n } else if (!pluginsProperty) {\n debug('[AST] Creating new plugins array')\n // Create plugins array\n objLiteral.addPropertyAssignment({\n name: 'plugins',\n initializer: '[]',\n })\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Created plugins array`,\n })\n } else {\n debug('[AST] Reusing existing plugins array')\n }\n\n if (!pluginsProperty) {\n return {\n error: formatError({\n actual: 'Failed to create or find plugins property',\n context: 'storage adapter configuration',\n expected: 'plugins array property',\n technicalDetails: 'Could not create or access plugins property',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const initializer = pluginsProperty.getInitializer()\n if (!initializer || initializer.getKind() !== SyntaxKind.ArrayLiteralExpression) {\n return {\n error: formatError({\n actual: 'plugins property is not an array',\n context: 'storage adapter configuration',\n expected: 'plugins: [...]',\n technicalDetails: 'plugins property must be an array literal expression',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const pluginsArray = initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n\n // Add storage adapter call\n const configText = config.configTemplate()\n if (configText) {\n pluginsArray.addElement(configText)\n modifications.push({\n type: 'property-added',\n description: `Added ${adapter} to plugins array`,\n })\n }\n\n debug(`[AST] ✓ Storage adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function removeSharp(sourceFile: SourceFile): TransformationResult {\n debug('[AST] Removing sharp import and property')\n\n const modifications: Modification[] = []\n\n // Remove import\n const { removedIndex } = removeImportDeclaration({ moduleSpecifier: 'sharp', sourceFile })\n if (removedIndex !== undefined) {\n modifications.push({\n type: 'import-removed',\n description: `Removed import from 'sharp'`,\n })\n }\n\n // Find and remove sharp property from buildConfig\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n // If detection failed but we removed import, still count as partial success\n if (modifications.length > 0) {\n return {\n modifications,\n modified: true,\n success: true,\n warnings: ['Could not detect config structure to remove sharp property'],\n }\n }\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n warnings: ['buildConfig has no object literal argument - could not remove sharp property'],\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const sharpProperty = objLiteral.getProperty('sharp')\n\n if (sharpProperty) {\n sharpProperty.remove()\n modifications.push({\n type: 'property-removed',\n description: `Removed sharp property from config`,\n })\n debug('[AST] ✓ Sharp property removed from config')\n } else {\n debug('[AST] Sharp property not found (already absent)')\n }\n\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n }\n}\n\n/** This shouldn't be necessary once the templates are updated. Can't hurt to keep in, though */\nexport function removeCommentMarkers(sourceFile: SourceFile): SourceFile {\n // Get the full text and replace comment markers\n let text = sourceFile.getFullText()\n\n // Remove inline comment markers from imports\n text = text.replace(/\\s*\\/\\/\\s*database-adapter-import\\s*$/gm, '')\n text = text.replace(/\\s*\\/\\/\\s*storage-adapter-import-placeholder\\s*$/gm, '')\n\n // Remove standalone comment lines\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-start\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-end\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*storage-adapter-placeholder\\s*\\n/gm, '')\n\n // Also remove the placeholder line from template (storage-adapter-import-placeholder at top)\n text = text.replace(/^\\/\\/\\s*storage-adapter-import-placeholder\\s*\\n/gm, '')\n\n // Replace the entire source file content\n sourceFile.replaceWithText(text)\n\n return sourceFile\n}\n\n/**\n * Validates payload config structure has required elements after transformation.\n * Checks that buildConfig() call exists and has a db property configured.\n */\nexport function validateStructure(sourceFile: SourceFile): WriteResult {\n debug('[AST] Validating payload config structure')\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success) {\n debug('[AST] ✗ Validation failed: detection unsuccessful')\n return {\n error: detection.error,\n success: false,\n }\n }\n\n const { structures } = detection\n\n // Validate db property exists\n if (!structures?.dbProperty) {\n debug('[AST] ✗ Validation failed: db property missing')\n return {\n error: formatError({\n actual: 'No db property found',\n context: 'database configuration',\n expected: 'buildConfig must have a db property',\n technicalDetails: 'PropertyAssignment with name \"db\" not found in buildConfig object',\n }),\n success: false,\n }\n }\n\n debug('[AST] ✓ Validation passed')\n return { success: true }\n}\n\nexport async function writeTransformedFile(\n sourceFile: SourceFile,\n options: WriteOptions = {},\n): Promise<WriteResult> {\n const { formatWithPrettier = true, validateStructure: shouldValidate = true } = options\n\n debug(`[AST] Writing transformed file: ${sourceFile.getFilePath()}`)\n\n // Validate if requested\n if (shouldValidate) {\n const validation = validateStructure(sourceFile)\n if (!validation.success) {\n return validation\n }\n }\n\n // Get file path and save to disk\n const filePath = sourceFile.getFilePath()\n\n // Format with ts-morph before saving (fixes trailing commas, indentation)\n debug('[AST] Formatting with ts-morph')\n sourceFile.formatText()\n\n // Write file\n debug('[AST] Writing file to disk')\n await sourceFile.save()\n\n // Format with prettier if requested\n if (formatWithPrettier) {\n debug('[AST] Running prettier formatting via CLI')\n try {\n // Detect project directory (go up from file until we find package.json or use dirname)\n const projectDir = path.dirname(filePath)\n\n // Run prettier via CLI (avoids Jest/ESM compatibility issues)\n const prettierCmd = `npx prettier --write \"${filePath}\"`\n\n debug(`[AST] Executing: ${prettierCmd}`)\n execSync(prettierCmd, {\n cwd: projectDir,\n stdio: 'pipe', // Suppress output\n })\n debug('[AST] ✓ Prettier formatting successful')\n } catch (error) {\n // Log but don't fail if prettier fails (might not be installed)\n debug(\n `[AST] ⚠ Prettier formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n debug('[AST] Continuing with unformatted output')\n }\n } else {\n debug('[AST] Skipping prettier formatting (disabled)')\n }\n\n debug('[AST] ✓ File written successfully')\n\n return { success: true }\n}\n\nexport async function configurePayloadConfig(\n filePath: string,\n options: ConfigureOptions = {},\n): Promise<WriteResult> {\n debug(`[AST] Configuring payload config: ${filePath}`)\n debug(\n `[AST] Options: db=${options.db?.type}, storage=${options.storage}, removeSharp=${options.removeSharp}`,\n )\n\n const allModifications: Modification[] = []\n const allWarnings: string[] = []\n\n try {\n // Create Project and load source file with proper settings\n const project = new Project({\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n },\n })\n let sourceFile = project.addSourceFileAtPath(filePath)\n\n // Run detection\n const detection = detectPayloadConfigStructure(sourceFile)\n if (!detection.success) {\n return detection\n }\n\n // Apply transformations based on options\n if (options.db) {\n debug('[AST] Applying database adapter transformation')\n const result = addDatabaseAdapter({\n adapter: options.db.type,\n envVarName: options.db.envVarName,\n sourceFile,\n })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.storage) {\n debug('[AST] Applying storage adapter transformation')\n const result = addStorageAdapter({ adapter: options.storage, sourceFile })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.removeSharp) {\n debug('[AST] Applying sharp removal')\n const result = removeSharp(sourceFile)\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n // Remove comment markers from template\n sourceFile = removeCommentMarkers(sourceFile)\n\n // Cleanup orphaned imports after all transformations\n debug('[AST] Cleaning up orphaned imports')\n\n // Cleanup database adapter imports if db was removed\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n if (options.db && config.packageName !== DB_ADAPTER_CONFIG[options.db.type].packageName) {\n const cleanup = cleanupOrphanedImports({\n importNames: [config.adapterName],\n moduleSpecifier: config.packageName,\n sourceFile,\n })\n if (cleanup.removed.length > 0) {\n cleanup.removed.forEach((importName) => {\n allModifications.push({\n type: 'import-removed',\n description: `Cleaned up unused import '${importName}' from '${config.packageName}'`,\n })\n })\n }\n }\n }\n\n // Log summary of modifications\n if (allModifications.length > 0) {\n debug(`[AST] Applied ${allModifications.length} modification(s):`)\n allModifications.forEach((mod) => {\n debug(`[AST] - ${mod.type}: ${mod.description}`)\n })\n }\n\n if (allWarnings.length > 0) {\n debug(`[AST] ${allWarnings.length} warning(s):`)\n allWarnings.forEach((warning) => {\n debug(`[AST] - ${warning}`)\n })\n }\n\n // Write transformed file with validation and formatting\n return await writeTransformedFile(sourceFile, {\n formatWithPrettier: options.formatWithPrettier,\n validateStructure: options.validateStructure ?? true,\n })\n } catch (error) {\n debug(`[AST] ✗ Configuration failed: ${error instanceof Error ? error.message : String(error)}`)\n return {\n error: formatError({\n actual: error instanceof Error ? error.message : String(error),\n context: 'configurePayloadConfig',\n expected: 'Successful file transformation',\n technicalDetails: error instanceof Error ? error.stack || error.message : String(error),\n }),\n success: false,\n }\n }\n}\n"],"names":["execSync","path","Project","QuoteKind","SyntaxKind","debug","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","addImportDeclaration","cleanupOrphanedImports","formatError","removeImportDeclaration","detectPayloadConfigStructure","sourceFile","getFilePath","payloadImport","getImportDeclarations","find","imp","getModuleSpecifierValue","buildConfigImportSpec","getNamedImports","spec","getName","aliasNode","getAliasNode","buildConfigName","getText","buildConfigCall","getDescendantsOfKind","CallExpression","call","expression","getExpression","error","actual","context","expected","technicalDetails","success","importStatements","length","configObject","getArguments","dbProperty","getKind","ObjectLiteralExpression","asKindOrThrow","getProperty","asKind","PropertyAssignment","pluginsArray","objLiteral","pluginsProperty","propertyAssignment","initializer","getInitializer","ArrayLiteralExpression","allBuildConfigCalls","filter","hasImportAlias","payloadImports","hasOtherPayloadImports","some","dbAdapterImportInfo","config","Object","entries","importDecl","packageName","namedImports","hasOtherImports","importDeclaration","storageAdapterImports","adapterName","push","needsManualIntervention","edgeCases","multipleBuildConfigCalls","importSources","dbAdapter","storage","undefined","structures","addDatabaseAdapter","adapter","envVarName","modifications","detection","modified","oldAdapters","values","removedAdapters","importInsertIndex","forEach","oldConfig","removedIndex","moduleSpecifier","type","description","join","insertIndex","defaultImport","newDbCode","configTemplate","replaceWithText","getProperties","insertPropertyAssignment","name","addStorageAdapter","pluginsPropertyRaw","shorthandProperty","ShorthandPropertyAssignment","identifierName","allProperties","indexOf","remove","addPropertyAssignment","configText","addElement","removeSharp","warnings","sharpProperty","removeCommentMarkers","text","getFullText","replace","validateStructure","writeTransformedFile","options","formatWithPrettier","shouldValidate","validation","filePath","formatText","save","projectDir","dirname","prettierCmd","cwd","stdio","Error","message","configurePayloadConfig","db","allModifications","allWarnings","project","manipulationSettings","quoteKind","Single","addSourceFileAtPath","result","cleanup","importNames","removed","importName","mod","warning","String","stack"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/ast/payload-config.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport path from 'path'\nimport { Project, QuoteKind, type SourceFile, SyntaxKind } from 'ts-morph'\n\nimport type {\n ConfigureOptions,\n DatabaseAdapter,\n DetectionResult,\n Modification,\n StorageAdapter,\n TransformationResult,\n WriteOptions,\n WriteResult,\n} from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './adapter-config.js'\nimport {\n addImportDeclaration,\n cleanupOrphanedImports,\n formatError,\n removeImportDeclaration,\n} from './utils.js'\n\nexport function detectPayloadConfigStructure(sourceFile: SourceFile): DetectionResult {\n debug(`[AST] Detecting payload config structure in ${sourceFile.getFilePath()}`)\n\n // First find the actual name being used (might be aliased)\n const payloadImport = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === 'payload')\n\n const buildConfigImportSpec = payloadImport\n ?.getNamedImports()\n .find((spec) => spec.getName() === 'buildConfig')\n\n const aliasNode = buildConfigImportSpec?.getAliasNode()\n const buildConfigName = aliasNode ? aliasNode.getText() : 'buildConfig'\n\n debug(`[AST] Looking for function call: ${buildConfigName}`)\n\n // Find buildConfig call expression (using actual name in code)\n const buildConfigCall = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n if (!buildConfigCall) {\n debug(`[AST] ✗ ${buildConfigName} call not found`)\n return {\n error: formatError({\n actual: `No ${buildConfigName} call found in file`,\n context: 'buildConfig call',\n expected: `export default ${buildConfigName}({ ... })`,\n technicalDetails: `Could not find CallExpression with identifier \"${buildConfigName}\"`,\n }),\n success: false,\n }\n }\n\n debug(`[AST] ✓ ${buildConfigName} call found`)\n\n // Get import statements\n const importStatements = sourceFile.getImportDeclarations()\n debug(`[AST] Found ${importStatements.length} import statements`)\n\n // Find db property if it exists\n const configObject = buildConfigCall.getArguments()[0]\n let dbProperty\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n dbProperty = configObject\n .asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n .getProperty('db')\n ?.asKind(SyntaxKind.PropertyAssignment)\n }\n\n debug(`[AST] db property: ${dbProperty ? '✓ found' : '✗ not found'}`)\n\n // Find plugins array if it exists\n let pluginsArray\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const pluginsProperty = objLiteral.getProperty('plugins')\n\n // Handle PropertyAssignment (e.g., plugins: [...])\n const propertyAssignment = pluginsProperty?.asKind(SyntaxKind.PropertyAssignment)\n if (propertyAssignment) {\n const initializer = propertyAssignment.getInitializer()\n if (initializer?.getKind() === SyntaxKind.ArrayLiteralExpression) {\n pluginsArray = initializer.asKind(SyntaxKind.ArrayLiteralExpression)\n }\n }\n // For ShorthandPropertyAssignment (e.g., plugins), we can't get the array directly\n // but we'll detect it in addStorageAdapter\n }\n\n debug(`[AST] plugins array: ${pluginsArray ? '✓ found' : '✗ not found'}`)\n\n // Find all buildConfig calls for edge case detection (using actual name)\n const allBuildConfigCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n const hasImportAlias = !!aliasNode\n\n // Check for other Payload imports\n const payloadImports = payloadImport?.getNamedImports() || []\n const hasOtherPayloadImports =\n payloadImports.length > 1 || payloadImports.some((imp) => imp.getName() !== 'buildConfig')\n\n // Track database adapter imports\n let dbAdapterImportInfo\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n dbAdapterImportInfo = {\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n }\n break\n }\n }\n\n // Track storage adapter imports\n const storageAdapterImports = []\n for (const [, config] of Object.entries(STORAGE_ADAPTER_CONFIG)) {\n if (!config.packageName || !config.adapterName) {\n continue\n }\n\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n storageAdapterImports.push({\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n })\n }\n }\n\n const needsManualIntervention = hasImportAlias || allBuildConfigCalls.length > 2\n\n debug(\n `[AST] Edge cases: alias=${hasImportAlias}, multiple=${allBuildConfigCalls.length > 1}, otherImports=${hasOtherPayloadImports}, manual=${needsManualIntervention}`,\n )\n\n return {\n edgeCases: {\n hasImportAlias,\n hasOtherPayloadImports,\n multipleBuildConfigCalls: allBuildConfigCalls.length > 1,\n needsManualIntervention,\n },\n importSources: {\n dbAdapter: dbAdapterImportInfo,\n storage: storageAdapterImports.length > 0 ? storageAdapterImports : undefined,\n },\n sourceFile,\n structures: {\n buildConfigCall,\n dbProperty,\n importStatements,\n pluginsArray,\n },\n success: true,\n }\n}\n\nexport function addDatabaseAdapter({\n adapter,\n envVarName = 'DATABASE_URL',\n sourceFile,\n}: {\n adapter: DatabaseAdapter\n envVarName?: string\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding database adapter: ${adapter} (envVar: ${envVarName})`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall, dbProperty } = detection.structures\n const config = DB_ADAPTER_CONFIG[adapter]\n\n // Remove old db adapter imports and track position for replacement\n const oldAdapters = Object.values(DB_ADAPTER_CONFIG)\n const removedAdapters: string[] = []\n let importInsertIndex: number | undefined\n oldAdapters.forEach((oldConfig) => {\n if (oldConfig.packageName !== config.packageName) {\n const { removedIndex } = removeImportDeclaration({\n moduleSpecifier: oldConfig.packageName,\n sourceFile,\n })\n if (removedIndex !== undefined) {\n // Use the first removed adapter's position\n if (importInsertIndex === undefined) {\n importInsertIndex = removedIndex\n }\n removedAdapters.push(oldConfig.packageName)\n modifications.push({\n type: 'import-removed',\n description: `Removed import from '${oldConfig.packageName}'`,\n })\n }\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter imports: ${removedAdapters.join(', ')}`)\n }\n\n // Add new import at the position of the removed one (or default position)\n addImportDeclaration({\n insertIndex: importInsertIndex,\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n\n // Add special imports for specific adapters\n if (adapter === 'd1-sqlite') {\n debug('[AST] Adding special import: ./db/migrations')\n addImportDeclaration({\n defaultImport: 'migrations',\n moduleSpecifier: './db/migrations',\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: migrations from './db/migrations'`,\n })\n }\n\n // Get config object\n const configObject = buildConfigCall.getArguments()[0]\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'database adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n const newDbCode = `db: ${config.configTemplate(envVarName)}`\n\n if (dbProperty) {\n // Replace existing db property\n // NOTE: Using replaceWithText() instead of remove() + insertPropertyAssignment()\n // to avoid double comma issues. When remove() is called, ts-morph doesn't always\n // clean up trailing commas correctly, which can result in syntax like \"},,\" when\n // inserting a new property at that position. replaceWithText() preserves the\n // surrounding punctuation correctly.\n debug(`[AST] Replacing existing db property`)\n dbProperty.replaceWithText(newDbCode)\n modifications.push({\n type: 'property-added',\n description: `Replaced db property with ${adapter} adapter`,\n })\n } else {\n // No existing db property - insert at end\n const insertIndex = objLiteral.getProperties().length\n debug(`[AST] Adding db property at index ${insertIndex}`)\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'db',\n initializer: config.configTemplate(envVarName),\n })\n modifications.push({\n type: 'property-added',\n description: `Added db property with ${adapter} adapter`,\n })\n }\n\n debug(`[AST] ✓ Database adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function addStorageAdapter({\n adapter,\n sourceFile,\n}: {\n adapter: StorageAdapter\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding storage adapter: ${adapter}`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const config = STORAGE_ADAPTER_CONFIG[adapter]\n\n // Local disk doesn't need any imports or plugins\n if (adapter === 'localDisk') {\n debug('[AST] localDisk storage adapter - no imports or plugins needed')\n return {\n modifications: [],\n modified: false,\n success: true,\n }\n }\n\n // Add import\n if (config.packageName && config.adapterName) {\n addImportDeclaration({\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'storage adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n // Find or create plugins array\n const pluginsPropertyRaw = objLiteral.getProperty('plugins')\n let pluginsProperty = pluginsPropertyRaw?.asKind(SyntaxKind.PropertyAssignment)\n\n // Check if it's a shorthand property (e.g., `plugins` referencing an imported variable)\n const shorthandProperty = pluginsPropertyRaw?.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n if (shorthandProperty) {\n debug('[AST] Found shorthand plugins property, converting to long form with spread')\n // Get the identifier name (usually 'plugins')\n const identifierName = shorthandProperty.getName()\n\n // Find insert position before removing\n const allProperties = objLiteral.getProperties()\n const insertIndex = allProperties.indexOf(shorthandProperty)\n\n // Remove the shorthand property\n shorthandProperty.remove()\n\n // Create new property with spread operator: plugins: [...plugins, newAdapter]\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'plugins',\n initializer: `[...${identifierName}]`,\n })\n\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Converted shorthand plugins property to array with spread syntax`,\n })\n } else if (!pluginsProperty) {\n debug('[AST] Creating new plugins array')\n // Create plugins array\n objLiteral.addPropertyAssignment({\n name: 'plugins',\n initializer: '[]',\n })\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Created plugins array`,\n })\n } else {\n debug('[AST] Reusing existing plugins array')\n }\n\n if (!pluginsProperty) {\n return {\n error: formatError({\n actual: 'Failed to create or find plugins property',\n context: 'storage adapter configuration',\n expected: 'plugins array property',\n technicalDetails: 'Could not create or access plugins property',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const initializer = pluginsProperty.getInitializer()\n if (!initializer || initializer.getKind() !== SyntaxKind.ArrayLiteralExpression) {\n return {\n error: formatError({\n actual: 'plugins property is not an array',\n context: 'storage adapter configuration',\n expected: 'plugins: [...]',\n technicalDetails: 'plugins property must be an array literal expression',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const pluginsArray = initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n\n // Add storage adapter call\n const configText = config.configTemplate()\n if (configText) {\n pluginsArray.addElement(configText)\n modifications.push({\n type: 'property-added',\n description: `Added ${adapter} to plugins array`,\n })\n }\n\n debug(`[AST] ✓ Storage adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function removeSharp(sourceFile: SourceFile): TransformationResult {\n debug('[AST] Removing sharp import and property')\n\n const modifications: Modification[] = []\n\n // Remove import\n const { removedIndex } = removeImportDeclaration({ moduleSpecifier: 'sharp', sourceFile })\n if (removedIndex !== undefined) {\n modifications.push({\n type: 'import-removed',\n description: `Removed import from 'sharp'`,\n })\n }\n\n // Find and remove sharp property from buildConfig\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n // If detection failed but we removed import, still count as partial success\n if (modifications.length > 0) {\n return {\n modifications,\n modified: true,\n success: true,\n warnings: ['Could not detect config structure to remove sharp property'],\n }\n }\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n warnings: ['buildConfig has no object literal argument - could not remove sharp property'],\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const sharpProperty = objLiteral.getProperty('sharp')\n\n if (sharpProperty) {\n sharpProperty.remove()\n modifications.push({\n type: 'property-removed',\n description: `Removed sharp property from config`,\n })\n debug('[AST] ✓ Sharp property removed from config')\n } else {\n debug('[AST] Sharp property not found (already absent)')\n }\n\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n }\n}\n\n/** This shouldn't be necessary once the templates are updated. Can't hurt to keep in, though */\nexport function removeCommentMarkers(sourceFile: SourceFile): SourceFile {\n // Get the full text and replace comment markers\n let text = sourceFile.getFullText()\n\n // Remove inline comment markers from imports\n text = text.replace(/\\s*\\/\\/\\s*database-adapter-import\\s*$/gm, '')\n text = text.replace(/\\s*\\/\\/\\s*storage-adapter-import-placeholder\\s*$/gm, '')\n\n // Remove standalone comment lines\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-start\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-end\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*storage-adapter-placeholder\\s*\\n/gm, '')\n\n // Also remove the placeholder line from template (storage-adapter-import-placeholder at top)\n text = text.replace(/^\\/\\/\\s*storage-adapter-import-placeholder\\s*\\n/gm, '')\n\n // Replace the entire source file content\n sourceFile.replaceWithText(text)\n\n return sourceFile\n}\n\n/**\n * Validates payload config structure has required elements after transformation.\n * Checks that buildConfig() call exists and has a db property configured.\n */\nexport function validateStructure(sourceFile: SourceFile): WriteResult {\n debug('[AST] Validating payload config structure')\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success) {\n debug('[AST] ✗ Validation failed: detection unsuccessful')\n return {\n error: detection.error,\n success: false,\n }\n }\n\n const { structures } = detection\n\n // Validate db property exists\n if (!structures?.dbProperty) {\n debug('[AST] ✗ Validation failed: db property missing')\n return {\n error: formatError({\n actual: 'No db property found',\n context: 'database configuration',\n expected: 'buildConfig must have a db property',\n technicalDetails: 'PropertyAssignment with name \"db\" not found in buildConfig object',\n }),\n success: false,\n }\n }\n\n debug('[AST] ✓ Validation passed')\n return { success: true }\n}\n\nexport async function writeTransformedFile(\n sourceFile: SourceFile,\n options: WriteOptions = {},\n): Promise<WriteResult> {\n const { formatWithOxfmt = true, validateStructure: shouldValidate = true } = options\n\n debug(`[AST] Writing transformed file: ${sourceFile.getFilePath()}`)\n\n // Validate if requested\n if (shouldValidate) {\n const validation = validateStructure(sourceFile)\n if (!validation.success) {\n return validation\n }\n }\n\n // Get file path and save to disk\n const filePath = sourceFile.getFilePath()\n\n // Format with ts-morph before saving (fixes trailing commas, indentation)\n debug('[AST] Formatting with ts-morph')\n sourceFile.formatText()\n\n // Write file\n debug('[AST] Writing file to disk')\n await sourceFile.save()\n\n // Format with oxfmt if requested\n if (formatWithOxfmt) {\n debug('[AST] Running oxfmt formatting via CLI')\n try {\n // Detect project directory (go up from file until we find package.json or use dirname)\n const projectDir = path.dirname(filePath)\n\n // Run oxfmt via CLI (avoids Jest/ESM compatibility issues)\n const oxfmtCmd = `npx oxfmt \"${filePath}\"`\n\n debug(`[AST] Executing: ${oxfmtCmd}`)\n execSync(oxfmtCmd, {\n cwd: projectDir,\n stdio: 'pipe', // Suppress output\n })\n debug('[AST] ✓ Oxfmt formatting successful')\n } catch (error) {\n // Log but don't fail if oxfmt fails (might not be installed)\n debug(\n `[AST] ⚠ Oxfmt formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n debug('[AST] Continuing with unformatted output')\n }\n } else {\n debug('[AST] Skipping oxfmt formatting (disabled)')\n }\n\n debug('[AST] ✓ File written successfully')\n\n return { success: true }\n}\n\nexport async function configurePayloadConfig(\n filePath: string,\n options: ConfigureOptions = {},\n): Promise<WriteResult> {\n debug(`[AST] Configuring payload config: ${filePath}`)\n debug(\n `[AST] Options: db=${options.db?.type}, storage=${options.storage}, removeSharp=${options.removeSharp}`,\n )\n\n const allModifications: Modification[] = []\n const allWarnings: string[] = []\n\n try {\n // Create Project and load source file with proper settings\n const project = new Project({\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n },\n })\n let sourceFile = project.addSourceFileAtPath(filePath)\n\n // Run detection\n const detection = detectPayloadConfigStructure(sourceFile)\n if (!detection.success) {\n return detection\n }\n\n // Apply transformations based on options\n if (options.db) {\n debug('[AST] Applying database adapter transformation')\n const result = addDatabaseAdapter({\n adapter: options.db.type,\n envVarName: options.db.envVarName,\n sourceFile,\n })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.storage) {\n debug('[AST] Applying storage adapter transformation')\n const result = addStorageAdapter({ adapter: options.storage, sourceFile })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.removeSharp) {\n debug('[AST] Applying sharp removal')\n const result = removeSharp(sourceFile)\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n // Remove comment markers from template\n sourceFile = removeCommentMarkers(sourceFile)\n\n // Cleanup orphaned imports after all transformations\n debug('[AST] Cleaning up orphaned imports')\n\n // Cleanup database adapter imports if db was removed\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n if (options.db && config.packageName !== DB_ADAPTER_CONFIG[options.db.type].packageName) {\n const cleanup = cleanupOrphanedImports({\n importNames: [config.adapterName],\n moduleSpecifier: config.packageName,\n sourceFile,\n })\n if (cleanup.removed.length > 0) {\n cleanup.removed.forEach((importName) => {\n allModifications.push({\n type: 'import-removed',\n description: `Cleaned up unused import '${importName}' from '${config.packageName}'`,\n })\n })\n }\n }\n }\n\n // Log summary of modifications\n if (allModifications.length > 0) {\n debug(`[AST] Applied ${allModifications.length} modification(s):`)\n allModifications.forEach((mod) => {\n debug(`[AST] - ${mod.type}: ${mod.description}`)\n })\n }\n\n if (allWarnings.length > 0) {\n debug(`[AST] ${allWarnings.length} warning(s):`)\n allWarnings.forEach((warning) => {\n debug(`[AST] - ${warning}`)\n })\n }\n\n // Write transformed file with validation and formatting\n return await writeTransformedFile(sourceFile, {\n formatWithOxfmt: options.formatWithOxfmt,\n validateStructure: options.validateStructure ?? true,\n })\n } catch (error) {\n debug(`[AST] ✗ Configuration failed: ${error instanceof Error ? error.message : String(error)}`)\n return {\n error: formatError({\n actual: error instanceof Error ? error.message : String(error),\n context: 'configurePayloadConfig',\n expected: 'Successful file transformation',\n technicalDetails: error instanceof Error ? error.stack || error.message : String(error),\n }),\n success: false,\n }\n }\n}\n"],"names":["execSync","path","Project","QuoteKind","SyntaxKind","debug","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","addImportDeclaration","cleanupOrphanedImports","formatError","removeImportDeclaration","detectPayloadConfigStructure","sourceFile","getFilePath","payloadImport","getImportDeclarations","find","imp","getModuleSpecifierValue","buildConfigImportSpec","getNamedImports","spec","getName","aliasNode","getAliasNode","buildConfigName","getText","buildConfigCall","getDescendantsOfKind","CallExpression","call","expression","getExpression","error","actual","context","expected","technicalDetails","success","importStatements","length","configObject","getArguments","dbProperty","getKind","ObjectLiteralExpression","asKindOrThrow","getProperty","asKind","PropertyAssignment","pluginsArray","objLiteral","pluginsProperty","propertyAssignment","initializer","getInitializer","ArrayLiteralExpression","allBuildConfigCalls","filter","hasImportAlias","payloadImports","hasOtherPayloadImports","some","dbAdapterImportInfo","config","Object","entries","importDecl","packageName","namedImports","hasOtherImports","importDeclaration","storageAdapterImports","adapterName","push","needsManualIntervention","edgeCases","multipleBuildConfigCalls","importSources","dbAdapter","storage","undefined","structures","addDatabaseAdapter","adapter","envVarName","modifications","detection","modified","oldAdapters","values","removedAdapters","importInsertIndex","forEach","oldConfig","removedIndex","moduleSpecifier","type","description","join","insertIndex","defaultImport","newDbCode","configTemplate","replaceWithText","getProperties","insertPropertyAssignment","name","addStorageAdapter","pluginsPropertyRaw","shorthandProperty","ShorthandPropertyAssignment","identifierName","allProperties","indexOf","remove","addPropertyAssignment","configText","addElement","removeSharp","warnings","sharpProperty","removeCommentMarkers","text","getFullText","replace","validateStructure","writeTransformedFile","options","formatWithOxfmt","shouldValidate","validation","filePath","formatText","save","projectDir","dirname","oxfmtCmd","cwd","stdio","Error","message","configurePayloadConfig","db","allModifications","allWarnings","project","manipulationSettings","quoteKind","Single","addSourceFileAtPath","result","cleanup","importNames","removed","importName","mod","warning","String","stack"],"mappings":"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"}
@@ -108,7 +108,7 @@ export type TransformOptions = {
108
108
  };
109
109
  };
110
110
  export type WriteOptions = {
111
- formatWithPrettier?: boolean;
111
+ formatWithOxfmt?: boolean;
112
112
  validateStructure?: boolean;
113
113
  };
114
114
  export type WriteResult = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/types.ts"],"sourcesContent":["import type {\n ArrayLiteralExpression,\n CallExpression,\n ImportDeclaration,\n PropertyAssignment,\n SourceFile,\n} from 'ts-morph'\n\n// Result types for import utility functions\nexport type ImportRemovalResult = {\n removedIndex?: number\n sourceFile: SourceFile\n}\n\nexport type NamedImportRemovalResult = {\n fullyRemoved: boolean\n index?: number\n sourceFile: SourceFile\n}\n\nexport type ImportCleanupResult = {\n kept: string[]\n removed: string[]\n sourceFile: SourceFile\n}\n\nexport type DetectionError = {\n debugInfo?: Record<string, unknown>\n technicalDetails: string\n userMessage: string\n}\n\nexport type PayloadConfigStructures = {\n buildConfigCall: CallExpression\n dbProperty?: PropertyAssignment\n importStatements: ImportDeclaration[]\n pluginsArray?: ArrayLiteralExpression\n}\n\n/**\n * Detection result with edge case tracking and import source information\n */\nexport type DetectionResult = {\n /** Edge case flags */\n edgeCases?: {\n /** Import uses an alias (e.g., import { buildConfig as bc }) */\n hasImportAlias: boolean\n /** Other Payload imports exist (e.g., CollectionConfig) */\n hasOtherPayloadImports: boolean\n /** Multiple buildConfig calls found in file */\n multipleBuildConfigCalls: boolean\n /** Needs manual intervention (can't be automatically handled) */\n needsManualIntervention: boolean\n }\n error?: DetectionError\n /** Import source tracking */\n importSources?: {\n /** Current database adapter import info */\n dbAdapter?: {\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }\n /** Current storage adapter import info */\n storage?: Array<{\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }>\n }\n /** Source file reference */\n sourceFile?: SourceFile\n /** Detected structures */\n structures?: PayloadConfigStructures\n success: boolean\n}\n\n/**\n * Tracks a single modification made to the AST\n */\nexport type Modification = {\n description: string\n location?: {\n column: number\n line: number\n }\n type:\n | 'function-renamed'\n | 'import-added'\n | 'import-modified'\n | 'import-removed'\n | 'property-added'\n | 'property-removed'\n}\n\n/**\n * Result of transformation operations\n */\nexport type TransformationResult = {\n error?: DetectionError\n modifications: Modification[]\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Final result after writing to disk\n */\nexport type ModificationResult = {\n error?: DetectionError\n filePath: string\n formatted?: boolean\n modifications: Modification[]\n success: boolean\n warnings?: string[]\n}\nexport type DatabaseAdapter = (typeof ALL_DATABASE_ADAPTERS)[number]\n\nexport const ALL_DATABASE_ADAPTERS = [\n 'mongodb',\n 'postgres',\n 'sqlite',\n 'vercel-postgres',\n 'd1-sqlite',\n] as const\n\nexport const ALL_STORAGE_ADAPTERS = [\n 'azureStorage',\n 'gcsStorage',\n 'localDisk',\n 'r2Storage',\n 's3Storage',\n 'vercelBlobStorage',\n] as const\n\nexport type StorageAdapter = (typeof ALL_STORAGE_ADAPTERS)[number]\n\nexport type TransformOptions = {\n databaseAdapter?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storageAdapter?: {\n type: StorageAdapter\n }\n}\n\nexport type WriteOptions = {\n formatWithPrettier?: boolean\n validateStructure?: boolean\n}\n\nexport type WriteResult = {\n error?: DetectionError\n success: boolean\n}\n\nexport type ConfigureOptions = {\n db?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storage?: StorageAdapter\n} & WriteOptions\n"],"names":["ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS"],"mappings":"AAuHA,OAAO,MAAMA,wBAAwB;IACnC;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,uBAAuB;IAClC;IACA;IACA;IACA;IACA;IACA;CACD,CAAS"}
1
+ {"version":3,"sources":["../../../src/lib/ast/types.ts"],"sourcesContent":["import type {\n ArrayLiteralExpression,\n CallExpression,\n ImportDeclaration,\n PropertyAssignment,\n SourceFile,\n} from 'ts-morph'\n\n// Result types for import utility functions\nexport type ImportRemovalResult = {\n removedIndex?: number\n sourceFile: SourceFile\n}\n\nexport type NamedImportRemovalResult = {\n fullyRemoved: boolean\n index?: number\n sourceFile: SourceFile\n}\n\nexport type ImportCleanupResult = {\n kept: string[]\n removed: string[]\n sourceFile: SourceFile\n}\n\nexport type DetectionError = {\n debugInfo?: Record<string, unknown>\n technicalDetails: string\n userMessage: string\n}\n\nexport type PayloadConfigStructures = {\n buildConfigCall: CallExpression\n dbProperty?: PropertyAssignment\n importStatements: ImportDeclaration[]\n pluginsArray?: ArrayLiteralExpression\n}\n\n/**\n * Detection result with edge case tracking and import source information\n */\nexport type DetectionResult = {\n /** Edge case flags */\n edgeCases?: {\n /** Import uses an alias (e.g., import { buildConfig as bc }) */\n hasImportAlias: boolean\n /** Other Payload imports exist (e.g., CollectionConfig) */\n hasOtherPayloadImports: boolean\n /** Multiple buildConfig calls found in file */\n multipleBuildConfigCalls: boolean\n /** Needs manual intervention (can't be automatically handled) */\n needsManualIntervention: boolean\n }\n error?: DetectionError\n /** Import source tracking */\n importSources?: {\n /** Current database adapter import info */\n dbAdapter?: {\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }\n /** Current storage adapter import info */\n storage?: Array<{\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }>\n }\n /** Source file reference */\n sourceFile?: SourceFile\n /** Detected structures */\n structures?: PayloadConfigStructures\n success: boolean\n}\n\n/**\n * Tracks a single modification made to the AST\n */\nexport type Modification = {\n description: string\n location?: {\n column: number\n line: number\n }\n type:\n | 'function-renamed'\n | 'import-added'\n | 'import-modified'\n | 'import-removed'\n | 'property-added'\n | 'property-removed'\n}\n\n/**\n * Result of transformation operations\n */\nexport type TransformationResult = {\n error?: DetectionError\n modifications: Modification[]\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Final result after writing to disk\n */\nexport type ModificationResult = {\n error?: DetectionError\n filePath: string\n formatted?: boolean\n modifications: Modification[]\n success: boolean\n warnings?: string[]\n}\nexport type DatabaseAdapter = (typeof ALL_DATABASE_ADAPTERS)[number]\n\nexport const ALL_DATABASE_ADAPTERS = [\n 'mongodb',\n 'postgres',\n 'sqlite',\n 'vercel-postgres',\n 'd1-sqlite',\n] as const\n\nexport const ALL_STORAGE_ADAPTERS = [\n 'azureStorage',\n 'gcsStorage',\n 'localDisk',\n 'r2Storage',\n 's3Storage',\n 'vercelBlobStorage',\n] as const\n\nexport type StorageAdapter = (typeof ALL_STORAGE_ADAPTERS)[number]\n\nexport type TransformOptions = {\n databaseAdapter?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storageAdapter?: {\n type: StorageAdapter\n }\n}\n\nexport type WriteOptions = {\n formatWithOxfmt?: boolean\n validateStructure?: boolean\n}\n\nexport type WriteResult = {\n error?: DetectionError\n success: boolean\n}\n\nexport type ConfigureOptions = {\n db?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storage?: StorageAdapter\n} & WriteOptions\n"],"names":["ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS"],"mappings":"AAuHA,OAAO,MAAMA,wBAAwB;IACnC;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,uBAAuB;IAClC;IACA;IACA;IACA;IACA;IACA;CACD,CAAS"}
@@ -54,7 +54,7 @@ import { configurePayloadConfig as configurePayloadConfigAST } from './ast/paylo
54
54
  type: args.dbType,
55
55
  envVarName
56
56
  },
57
- formatWithPrettier: true,
57
+ formatWithOxfmt: true,
58
58
  removeSharp: args.sharp === false,
59
59
  storage: args.storageAdapter,
60
60
  validateStructure: false
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/configure-payload-config.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport globby from 'globby'\nimport path from 'path'\n\nimport type { DbType, StorageAdapterType } from '../types.js'\n\nimport { warning } from '../utils/log.js'\nimport { updatePackageJson } from './ast/package-json.js'\nimport { configurePayloadConfig as configurePayloadConfigAST } from './ast/payload-config.js'\n\n/** Get default env var name for db type */\nfunction getEnvVarName(dbType: DbType, customEnvName?: string): string {\n if (customEnvName) {\n return customEnvName\n }\n // Default env var names per adapter type\n if (dbType === 'vercel-postgres') {\n return 'POSTGRES_URL'\n }\n return 'DATABASE_URL'\n}\n\n/** Update payload config with necessary imports and adapters */\nexport async function configurePayloadConfig(args: {\n dbType?: DbType\n envNames?: {\n dbUri: string\n }\n packageJsonName?: string\n projectDirOrConfigPath: { payloadConfigPath: string } | { projectDir: string }\n sharp?: boolean\n storageAdapter?: StorageAdapterType\n}): Promise<void> {\n if (!args.dbType) {\n return\n }\n\n // Update package.json\n const packageJsonPath =\n 'projectDir' in args.projectDirOrConfigPath &&\n path.resolve(args.projectDirOrConfigPath.projectDir, 'package.json')\n\n if (packageJsonPath && fse.existsSync(packageJsonPath)) {\n try {\n updatePackageJson(packageJsonPath, {\n databaseAdapter: args.dbType,\n packageName: args.packageJsonName,\n removeSharp: args.sharp === false,\n storageAdapter: args.storageAdapter,\n })\n } catch (err: unknown) {\n warning(`Unable to configure Payload in package.json`)\n warning(err instanceof Error ? err.message : '')\n }\n }\n\n // Update payload.config.ts\n try {\n let payloadConfigPath: string | undefined\n if (!('payloadConfigPath' in args.projectDirOrConfigPath)) {\n payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: args.projectDirOrConfigPath.projectDir,\n })\n )?.[0]\n } else {\n payloadConfigPath = args.projectDirOrConfigPath.payloadConfigPath\n }\n\n if (!payloadConfigPath) {\n warning('Unable to update payload.config.ts with plugins. Could not find payload.config.ts.')\n return\n }\n\n const envVarName = getEnvVarName(args.dbType, args.envNames?.dbUri)\n\n const result = await configurePayloadConfigAST(payloadConfigPath, {\n db: {\n type: args.dbType,\n envVarName,\n },\n formatWithPrettier: true,\n removeSharp: args.sharp === false,\n storage: args.storageAdapter,\n validateStructure: false,\n })\n\n if (!result.success && result.error) {\n warning(`Unable to update payload.config.ts: ${result.error.userMessage}`)\n }\n } catch (err: unknown) {\n warning(\n `Unable to update payload.config.ts with plugins: ${err instanceof Error ? err.message : ''}`,\n )\n }\n}\n"],"names":["fse","globby","path","warning","updatePackageJson","configurePayloadConfig","configurePayloadConfigAST","getEnvVarName","dbType","customEnvName","args","packageJsonPath","projectDirOrConfigPath","resolve","projectDir","existsSync","databaseAdapter","packageName","packageJsonName","removeSharp","sharp","storageAdapter","err","Error","message","payloadConfigPath","absolute","cwd","envVarName","envNames","dbUri","result","db","type","formatWithPrettier","storage","validateStructure","success","error","userMessage"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,OAAOC,YAAY,SAAQ;AAC3B,OAAOC,UAAU,OAAM;AAIvB,SAASC,OAAO,QAAQ,kBAAiB;AACzC,SAASC,iBAAiB,QAAQ,wBAAuB;AACzD,SAASC,0BAA0BC,yBAAyB,QAAQ,0BAAyB;AAE7F,yCAAyC,GACzC,SAASC,cAAcC,MAAc,EAAEC,aAAsB;IAC3D,IAAIA,eAAe;QACjB,OAAOA;IACT;IACA,yCAAyC;IACzC,IAAID,WAAW,mBAAmB;QAChC,OAAO;IACT;IACA,OAAO;AACT;AAEA,8DAA8D,GAC9D,OAAO,eAAeH,uBAAuBK,IAS5C;IACC,IAAI,CAACA,KAAKF,MAAM,EAAE;QAChB;IACF;IAEA,sBAAsB;IACtB,MAAMG,kBACJ,gBAAgBD,KAAKE,sBAAsB,IAC3CV,KAAKW,OAAO,CAACH,KAAKE,sBAAsB,CAACE,UAAU,EAAE;IAEvD,IAAIH,mBAAmBX,IAAIe,UAAU,CAACJ,kBAAkB;QACtD,IAAI;YACFP,kBAAkBO,iBAAiB;gBACjCK,iBAAiBN,KAAKF,MAAM;gBAC5BS,aAAaP,KAAKQ,eAAe;gBACjCC,aAAaT,KAAKU,KAAK,KAAK;gBAC5BC,gBAAgBX,KAAKW,cAAc;YACrC;QACF,EAAE,OAAOC,KAAc;YACrBnB,QAAQ,CAAC,2CAA2C,CAAC;YACrDA,QAAQmB,eAAeC,QAAQD,IAAIE,OAAO,GAAG;QAC/C;IACF;IAEA,2BAA2B;IAC3B,IAAI;QACF,IAAIC;QACJ,IAAI,CAAE,CAAA,uBAAuBf,KAAKE,sBAAsB,AAAD,GAAI;YACzDa,oBACE,CAAA,MAAMxB,OAAO,wBAAwB;gBACnCyB,UAAU;gBACVC,KAAKjB,KAAKE,sBAAsB,CAACE,UAAU;YAC7C,EAAC,GACA,CAAC,EAAE;QACR,OAAO;YACLW,oBAAoBf,KAAKE,sBAAsB,CAACa,iBAAiB;QACnE;QAEA,IAAI,CAACA,mBAAmB;YACtBtB,QAAQ;YACR;QACF;QAEA,MAAMyB,aAAarB,cAAcG,KAAKF,MAAM,EAAEE,KAAKmB,QAAQ,EAAEC;QAE7D,MAAMC,SAAS,MAAMzB,0BAA0BmB,mBAAmB;YAChEO,IAAI;gBACFC,MAAMvB,KAAKF,MAAM;gBACjBoB;YACF;YACAM,oBAAoB;YACpBf,aAAaT,KAAKU,KAAK,KAAK;YAC5Be,SAASzB,KAAKW,cAAc;YAC5Be,mBAAmB;QACrB;QAEA,IAAI,CAACL,OAAOM,OAAO,IAAIN,OAAOO,KAAK,EAAE;YACnCnC,QAAQ,CAAC,oCAAoC,EAAE4B,OAAOO,KAAK,CAACC,WAAW,EAAE;QAC3E;IACF,EAAE,OAAOjB,KAAc;QACrBnB,QACE,CAAC,iDAAiD,EAAEmB,eAAeC,QAAQD,IAAIE,OAAO,GAAG,IAAI;IAEjG;AACF"}
1
+ {"version":3,"sources":["../../src/lib/configure-payload-config.ts"],"sourcesContent":["import fse from 'fs-extra'\nimport globby from 'globby'\nimport path from 'path'\n\nimport type { DbType, StorageAdapterType } from '../types.js'\n\nimport { warning } from '../utils/log.js'\nimport { updatePackageJson } from './ast/package-json.js'\nimport { configurePayloadConfig as configurePayloadConfigAST } from './ast/payload-config.js'\n\n/** Get default env var name for db type */\nfunction getEnvVarName(dbType: DbType, customEnvName?: string): string {\n if (customEnvName) {\n return customEnvName\n }\n // Default env var names per adapter type\n if (dbType === 'vercel-postgres') {\n return 'POSTGRES_URL'\n }\n return 'DATABASE_URL'\n}\n\n/** Update payload config with necessary imports and adapters */\nexport async function configurePayloadConfig(args: {\n dbType?: DbType\n envNames?: {\n dbUri: string\n }\n packageJsonName?: string\n projectDirOrConfigPath: { payloadConfigPath: string } | { projectDir: string }\n sharp?: boolean\n storageAdapter?: StorageAdapterType\n}): Promise<void> {\n if (!args.dbType) {\n return\n }\n\n // Update package.json\n const packageJsonPath =\n 'projectDir' in args.projectDirOrConfigPath &&\n path.resolve(args.projectDirOrConfigPath.projectDir, 'package.json')\n\n if (packageJsonPath && fse.existsSync(packageJsonPath)) {\n try {\n updatePackageJson(packageJsonPath, {\n databaseAdapter: args.dbType,\n packageName: args.packageJsonName,\n removeSharp: args.sharp === false,\n storageAdapter: args.storageAdapter,\n })\n } catch (err: unknown) {\n warning(`Unable to configure Payload in package.json`)\n warning(err instanceof Error ? err.message : '')\n }\n }\n\n // Update payload.config.ts\n try {\n let payloadConfigPath: string | undefined\n if (!('payloadConfigPath' in args.projectDirOrConfigPath)) {\n payloadConfigPath = (\n await globby('**/payload.config.ts', {\n absolute: true,\n cwd: args.projectDirOrConfigPath.projectDir,\n })\n )?.[0]\n } else {\n payloadConfigPath = args.projectDirOrConfigPath.payloadConfigPath\n }\n\n if (!payloadConfigPath) {\n warning('Unable to update payload.config.ts with plugins. Could not find payload.config.ts.')\n return\n }\n\n const envVarName = getEnvVarName(args.dbType, args.envNames?.dbUri)\n\n const result = await configurePayloadConfigAST(payloadConfigPath, {\n db: {\n type: args.dbType,\n envVarName,\n },\n formatWithOxfmt: true,\n removeSharp: args.sharp === false,\n storage: args.storageAdapter,\n validateStructure: false,\n })\n\n if (!result.success && result.error) {\n warning(`Unable to update payload.config.ts: ${result.error.userMessage}`)\n }\n } catch (err: unknown) {\n warning(\n `Unable to update payload.config.ts with plugins: ${err instanceof Error ? err.message : ''}`,\n )\n }\n}\n"],"names":["fse","globby","path","warning","updatePackageJson","configurePayloadConfig","configurePayloadConfigAST","getEnvVarName","dbType","customEnvName","args","packageJsonPath","projectDirOrConfigPath","resolve","projectDir","existsSync","databaseAdapter","packageName","packageJsonName","removeSharp","sharp","storageAdapter","err","Error","message","payloadConfigPath","absolute","cwd","envVarName","envNames","dbUri","result","db","type","formatWithOxfmt","storage","validateStructure","success","error","userMessage"],"mappings":"AAAA,OAAOA,SAAS,WAAU;AAC1B,OAAOC,YAAY,SAAQ;AAC3B,OAAOC,UAAU,OAAM;AAIvB,SAASC,OAAO,QAAQ,kBAAiB;AACzC,SAASC,iBAAiB,QAAQ,wBAAuB;AACzD,SAASC,0BAA0BC,yBAAyB,QAAQ,0BAAyB;AAE7F,yCAAyC,GACzC,SAASC,cAAcC,MAAc,EAAEC,aAAsB;IAC3D,IAAIA,eAAe;QACjB,OAAOA;IACT;IACA,yCAAyC;IACzC,IAAID,WAAW,mBAAmB;QAChC,OAAO;IACT;IACA,OAAO;AACT;AAEA,8DAA8D,GAC9D,OAAO,eAAeH,uBAAuBK,IAS5C;IACC,IAAI,CAACA,KAAKF,MAAM,EAAE;QAChB;IACF;IAEA,sBAAsB;IACtB,MAAMG,kBACJ,gBAAgBD,KAAKE,sBAAsB,IAC3CV,KAAKW,OAAO,CAACH,KAAKE,sBAAsB,CAACE,UAAU,EAAE;IAEvD,IAAIH,mBAAmBX,IAAIe,UAAU,CAACJ,kBAAkB;QACtD,IAAI;YACFP,kBAAkBO,iBAAiB;gBACjCK,iBAAiBN,KAAKF,MAAM;gBAC5BS,aAAaP,KAAKQ,eAAe;gBACjCC,aAAaT,KAAKU,KAAK,KAAK;gBAC5BC,gBAAgBX,KAAKW,cAAc;YACrC;QACF,EAAE,OAAOC,KAAc;YACrBnB,QAAQ,CAAC,2CAA2C,CAAC;YACrDA,QAAQmB,eAAeC,QAAQD,IAAIE,OAAO,GAAG;QAC/C;IACF;IAEA,2BAA2B;IAC3B,IAAI;QACF,IAAIC;QACJ,IAAI,CAAE,CAAA,uBAAuBf,KAAKE,sBAAsB,AAAD,GAAI;YACzDa,oBACE,CAAA,MAAMxB,OAAO,wBAAwB;gBACnCyB,UAAU;gBACVC,KAAKjB,KAAKE,sBAAsB,CAACE,UAAU;YAC7C,EAAC,GACA,CAAC,EAAE;QACR,OAAO;YACLW,oBAAoBf,KAAKE,sBAAsB,CAACa,iBAAiB;QACnE;QAEA,IAAI,CAACA,mBAAmB;YACtBtB,QAAQ;YACR;QACF;QAEA,MAAMyB,aAAarB,cAAcG,KAAKF,MAAM,EAAEE,KAAKmB,QAAQ,EAAEC;QAE7D,MAAMC,SAAS,MAAMzB,0BAA0BmB,mBAAmB;YAChEO,IAAI;gBACFC,MAAMvB,KAAKF,MAAM;gBACjBoB;YACF;YACAM,iBAAiB;YACjBf,aAAaT,KAAKU,KAAK,KAAK;YAC5Be,SAASzB,KAAKW,cAAc;YAC5Be,mBAAmB;QACrB;QAEA,IAAI,CAACL,OAAOM,OAAO,IAAIN,OAAOO,KAAK,EAAE;YACnCnC,QAAQ,CAAC,oCAAoC,EAAE4B,OAAOO,KAAK,CAACC,WAAW,EAAE;QAC3E;IACF,EAAE,OAAOjB,KAAc;QACrBnB,QACE,CAAC,iDAAiD,EAAEmB,eAAeC,QAAQD,IAAIE,OAAO,GAAG,IAAI;IAEjG;AACF"}
@@ -1,4 +1,9 @@
1
1
  import type { CliArgs, DbType, NextAppDetails, PackageManager } from '../types.js';
2
+ /** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */
3
+ export declare const minimumNextVersion: {
4
+ major: number;
5
+ minor: number;
6
+ };
2
7
  type InitNextArgs = {
3
8
  dbType: DbType;
4
9
  nextAppDetails?: NextAppDetails;
@@ -1 +1 @@
1
- {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAiBlG,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,mBAAmB,CAAC,CAAA;AAElD,KAAK,cAAc,GACf;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC1E;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,CAAA;AAEL,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE1E;AA2GD,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA2FnF"}
1
+ {"version":3,"file":"init-next.d.ts","sourceRoot":"","sources":["../../src/lib/init-next.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AAiBlG,gFAAgF;AAChF,eAAO,MAAM,kBAAkB;IAAK,KAAK;IAAM,KAAK;CAAK,CAAA;AAEzD,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,cAAc,EAAE,cAAc,CAAA;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,mBAAmB,CAAC,CAAA;AAElD,KAAK,cAAc,GACf;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC1E;IACE,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,IAAI,CAAA;CACd,CAAA;AAEL,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAuE1E;AA2GD,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGnF"}
@@ -14,6 +14,10 @@ import { installPackages } from './install-packages.js';
14
14
  import { wrapNextConfig } from './wrap-next-config.js';
15
15
  const filename = fileURLToPath(import.meta.url);
16
16
  const dirname = path.dirname(filename);
17
+ /** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */ export const minimumNextVersion = {
18
+ major: 16,
19
+ minor: 4
20
+ };
17
21
  export async function initNext(args) {
18
22
  const { dbType: dbType, packageManager, projectDir } = args;
19
23
  const nextAppDetails = args.nextAppDetails || await getNextAppDetails(projectDir);
@@ -186,7 +190,7 @@ export async function getNextAppDetails(projectDir) {
186
190
  if (packageObj.dependencies?.next) {
187
191
  nextVersion = packageObj.dependencies.next;
188
192
  // Match versions using regex matching groups
189
- const versionMatch = /(?<major>\d+)/.exec(nextVersion);
193
+ const versionMatch = /(?<major>\d+)(?:\.(?<minor>\d+))?/.exec(nextVersion);
190
194
  if (!versionMatch) {
191
195
  p.log.warn(`Could not determine Next.js version from ${nextVersion}`);
192
196
  return {
@@ -197,9 +201,9 @@ export async function getNextAppDetails(projectDir) {
197
201
  nextVersion
198
202
  };
199
203
  }
200
- const { major } = versionMatch.groups;
204
+ const { major, minor } = versionMatch.groups;
201
205
  const majorVersion = parseInt(major);
202
- if (majorVersion < 15) {
206
+ if (majorVersion < minimumNextVersion.major) {
203
207
  return {
204
208
  hasTopLevelLayout: false,
205
209
  isSrcDir,
@@ -208,6 +212,13 @@ export async function getNextAppDetails(projectDir) {
208
212
  nextVersion
209
213
  };
210
214
  }
215
+ // TODO: Older minor versions of the minimum major are only warned about, not rejected, to make
216
+ // migrating easier. This can be turned into a hard requirement in the future.
217
+ // A specifier without a minor version (e.g. `^16`) can resolve to any minor, so it is not warned about.
218
+ const isBelowMinimumMinor = majorVersion === minimumNextVersion.major && minor !== undefined && parseInt(minor) < minimumNextVersion.minor;
219
+ if (isBelowMinimumMinor) {
220
+ p.log.warn(`Next.js v${nextVersion} is not supported. Upgrade to Next.js >= ${minimumNextVersion.major}.${minimumNextVersion.minor} to use Payload.`);
221
+ }
211
222
  }
212
223
  const isSupportedNextVersion = true;
213
224
  // Check if Payload already installed
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/init-next.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { CliArgs, DbType, NextAppDetails, NextConfigType, PackageManager } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { debug as origDebug, warning } from '../utils/log.js'\nimport { moveMessage } from '../utils/messages.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { configurePayloadTsConfig } from './configure-payload-tsconfig.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { installPackages } from './install-packages.js'\nimport { wrapNextConfig } from './wrap-next-config.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype InitNextArgs = {\n dbType: DbType\n nextAppDetails?: NextAppDetails\n packageManager: PackageManager\n projectDir: string\n useDistFiles?: boolean\n} & Pick<CliArgs, '--debug' | '--payload-version'>\n\ntype InitNextResult =\n | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false }\n | {\n isSrcDir: boolean\n nextAppDir: string\n payloadConfigPath: string\n success: true\n }\n\nexport async function initNext(args: InitNextArgs): Promise<InitNextResult> {\n const { dbType: dbType, packageManager, projectDir } = args\n\n const nextAppDetails = args.nextAppDetails || (await getNextAppDetails(projectDir))\n\n if (!nextAppDetails.nextAppDir) {\n warning(`Could not find app directory in ${projectDir}, creating...`)\n const createdAppDir = path.resolve(projectDir, nextAppDetails.isSrcDir ? 'src/app' : 'app')\n fse.mkdirSync(createdAppDir, { recursive: true })\n nextAppDetails.nextAppDir = createdAppDir\n }\n\n const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails\n\n if (!nextConfigType) {\n return {\n isSrcDir,\n nextAppDir,\n reason: `Could not determine Next Config type in ${projectDir}. Possibly try renaming next.config.js to next.config.cjs or next.config.mjs.`,\n success: false,\n }\n }\n\n if (hasTopLevelLayout) {\n // Output directions for user to move all files from app to top-level directory named `(app)`\n p.log.warn(moveMessage({ nextAppDir, projectDir }))\n return {\n isSrcDir,\n nextAppDir,\n reason: 'Found existing layout.tsx in app directory',\n success: false,\n }\n }\n\n const installSpinner = p.spinner()\n installSpinner.start('Installing Payload and dependencies...')\n\n const configurationResult = await installAndConfigurePayload({\n ...args,\n nextAppDetails,\n nextConfigType,\n useDistFiles: true, // Requires running 'pnpm pack-template-files' in cpa\n })\n\n if (configurationResult.success === false) {\n installSpinner.stop(configurationResult.reason, 1)\n return { ...configurationResult, isSrcDir, success: false }\n }\n\n const { success: installSuccess } = await installDeps({\n dbType,\n packageManager,\n projectDir,\n versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG,\n })\n if (!installSuccess) {\n installSpinner.stop('Failed to install dependencies', 1)\n return {\n ...configurationResult,\n isSrcDir,\n reason: 'Failed to install dependencies',\n success: false,\n }\n }\n\n await configurePayloadTsConfig({\n configPath: path.resolve(projectDir, 'tsconfig.json'),\n payloadConfigPath: configurationResult.payloadConfigPath,\n })\n installSpinner.stop('Successfully installed Payload and dependencies')\n return { ...configurationResult, isSrcDir, nextAppDir, success: true }\n}\n\nasync function installAndConfigurePayload(\n args: {\n nextAppDetails: NextAppDetails\n nextConfigType: NextConfigType\n useDistFiles?: boolean\n } & InitNextArgs,\n): Promise<\n | { payloadConfigPath: string; success: true }\n | { payloadConfigPath?: string; reason: string; success: false }\n> {\n const {\n '--debug': debug,\n nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {},\n nextConfigType,\n projectDir,\n useDistFiles,\n } = args\n\n if (!nextAppDir || !nextConfigPath) {\n return {\n reason: 'Could not find app directory or next.config.js',\n success: false,\n }\n }\n\n const logDebug = (message: string) => {\n if (debug) {\n origDebug(message)\n }\n }\n\n if (!fs.existsSync(projectDir)) {\n return {\n reason: `Could not find specified project directory at ${projectDir}`,\n success: false,\n }\n }\n\n const templateFilesPath =\n dirname.endsWith('dist') || useDistFiles\n ? path.resolve(dirname, '../..', 'dist/template')\n : path.resolve(dirname, '../../../../templates/blank')\n\n logDebug(`Using template files from: ${templateFilesPath}`)\n\n if (!fs.existsSync(templateFilesPath)) {\n return {\n reason: `Could not find template source files from ${templateFilesPath}`,\n success: false,\n }\n } else {\n logDebug('Found template source files')\n }\n\n logDebug(`Copying template files from ${templateFilesPath} to ${nextAppDir}`)\n\n const templateSrcDir = path.resolve(templateFilesPath, isSrcDir ? '' : 'src')\n\n logDebug(`templateSrcDir: ${templateSrcDir}`)\n logDebug(`nextAppDir: ${nextAppDir}`)\n logDebug(`projectDir: ${projectDir}`)\n logDebug(`nextConfigPath: ${nextConfigPath}`)\n logDebug(`payloadConfigPath: ${path.resolve(projectDir, 'payload.config.ts')}`)\n\n logDebug(\n `isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`,\n )\n\n // This is a little clunky and needs to account for isSrcDir\n copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath))\n\n // Wrap next.config.js with withPayload\n await wrapNextConfig({ nextConfigPath, nextConfigType })\n\n return {\n payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'),\n success: true,\n }\n}\n\nasync function installDeps(args: {\n dbType: DbType\n packageManager: PackageManager\n projectDir: string\n versionOrTag?: string\n}) {\n const { dbType, packageManager, projectDir, versionOrTag } = args\n const { getDbPackageName } = await import('./ast/adapter-config.js')\n\n const version = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map(\n (pkg) => `${pkg}@${version}`,\n )\n\n packagesToInstall.push(`${getDbPackageName(dbType)}@${version}`)\n\n // Match graphql version of @payloadcms/next\n packagesToInstall.push('graphql@^16.8.1')\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n return await installPackages({ packageManager, packagesToInstall, projectDir })\n}\n\nexport async function getNextAppDetails(projectDir: string): Promise<NextAppDetails> {\n const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'))\n\n // Match next.config.js, next.config.ts, next.config.mjs, next.config.cjs\n const nextConfigPath: string | undefined = (\n await globby('next.config.(\\\\w)?(t|j)s', { absolute: true, cwd: projectDir })\n )?.[0]\n\n if (!nextConfigPath || nextConfigPath.length === 0) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath: undefined,\n nextVersion: null,\n }\n }\n\n const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'))\n // Check if Next.js version is new enough\n let nextVersion = null\n if (packageObj.dependencies?.next) {\n nextVersion = packageObj.dependencies.next\n // Match versions using regex matching groups\n const versionMatch = /(?<major>\\d+)/.exec(nextVersion)\n if (!versionMatch) {\n p.log.warn(`Could not determine Next.js version from ${nextVersion}`)\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath,\n nextVersion,\n }\n }\n\n const { major } = versionMatch.groups as { major: string }\n const majorVersion = parseInt(major)\n if (majorVersion < 15) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath,\n nextVersion,\n }\n }\n }\n\n const isSupportedNextVersion = true\n\n // Check if Payload already installed\n if (packageObj.dependencies?.payload) {\n return {\n hasTopLevelLayout: false,\n isPayloadInstalled: true,\n isSrcDir,\n isSupportedNextVersion,\n nextConfigPath,\n nextVersion,\n }\n }\n\n let nextAppDir: string | undefined = (\n await globby(['**/app'], {\n absolute: true,\n cwd: projectDir,\n ignore: ['**/node_modules/**'],\n onlyDirectories: true,\n })\n )?.[0]\n\n if (!nextAppDir || nextAppDir.length === 0) {\n nextAppDir = undefined\n }\n\n const configType = getProjectType({ nextConfigPath, packageObj })\n\n const hasTopLevelLayout = nextAppDir\n ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx'))\n : false\n\n return {\n hasTopLevelLayout,\n isSrcDir,\n isSupportedNextVersion,\n nextAppDir,\n nextConfigPath,\n nextConfigType: configType,\n nextVersion,\n }\n}\n\nfunction getProjectType(args: {\n nextConfigPath: string\n packageObj: Record<string, unknown>\n}): NextConfigType {\n const { nextConfigPath, packageObj } = args\n\n if (nextConfigPath.endsWith('.ts')) {\n return 'ts'\n }\n\n if (nextConfigPath.endsWith('.mjs')) {\n return 'esm'\n }\n if (nextConfigPath.endsWith('.cjs')) {\n return 'cjs'\n }\n\n const packageJsonType = packageObj.type\n if (packageJsonType === 'module') {\n return 'esm'\n }\n if (packageJsonType === 'commonjs') {\n return 'cjs'\n }\n\n return 'cjs'\n}\n"],"names":["p","fs","fse","globby","fileURLToPath","path","copyRecursiveSync","debug","origDebug","warning","moveMessage","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","configurePayloadTsConfig","ensurePnpmBuildApprovals","installPackages","wrapNextConfig","filename","url","dirname","initNext","args","dbType","packageManager","projectDir","nextAppDetails","getNextAppDetails","nextAppDir","createdAppDir","resolve","isSrcDir","mkdirSync","recursive","hasTopLevelLayout","nextConfigType","reason","success","log","warn","installSpinner","spinner","start","configurationResult","installAndConfigurePayload","useDistFiles","stop","installSuccess","installDeps","versionOrTag","configPath","payloadConfigPath","nextConfigPath","logDebug","message","existsSync","templateFilesPath","endsWith","templateSrcDir","getDbPackageName","version","packageName","packagesToInstall","map","pkg","push","absolute","cwd","length","isSupportedNextVersion","undefined","nextVersion","packageObj","readJson","dependencies","next","versionMatch","exec","major","groups","majorVersion","parseInt","payload","isPayloadInstalled","ignore","onlyDirectories","configType","getProjectType","packageJsonType","type"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/init-next.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport fs from 'fs'\nimport fse from 'fs-extra'\nimport globby from 'globby'\nimport { fileURLToPath } from 'node:url'\nimport path from 'path'\n\nimport type { CliArgs, DbType, NextAppDetails, NextConfigType, PackageManager } from '../types.js'\n\nimport { copyRecursiveSync } from '../utils/copy-recursive-sync.js'\nimport { debug as origDebug, warning } from '../utils/log.js'\nimport { moveMessage } from '../utils/messages.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { configurePayloadTsConfig } from './configure-payload-tsconfig.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { installPackages } from './install-packages.js'\nimport { wrapNextConfig } from './wrap-next-config.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\n/** Keep in sync with the `next` peer dependency range of `@payloadcms/next`. */\nexport const minimumNextVersion = { major: 16, minor: 4 }\n\ntype InitNextArgs = {\n dbType: DbType\n nextAppDetails?: NextAppDetails\n packageManager: PackageManager\n projectDir: string\n useDistFiles?: boolean\n} & Pick<CliArgs, '--debug' | '--payload-version'>\n\ntype InitNextResult =\n | { isSrcDir: boolean; nextAppDir?: string; reason: string; success: false }\n | {\n isSrcDir: boolean\n nextAppDir: string\n payloadConfigPath: string\n success: true\n }\n\nexport async function initNext(args: InitNextArgs): Promise<InitNextResult> {\n const { dbType: dbType, packageManager, projectDir } = args\n\n const nextAppDetails = args.nextAppDetails || (await getNextAppDetails(projectDir))\n\n if (!nextAppDetails.nextAppDir) {\n warning(`Could not find app directory in ${projectDir}, creating...`)\n const createdAppDir = path.resolve(projectDir, nextAppDetails.isSrcDir ? 'src/app' : 'app')\n fse.mkdirSync(createdAppDir, { recursive: true })\n nextAppDetails.nextAppDir = createdAppDir\n }\n\n const { hasTopLevelLayout, isSrcDir, nextAppDir, nextConfigType } = nextAppDetails\n\n if (!nextConfigType) {\n return {\n isSrcDir,\n nextAppDir,\n reason: `Could not determine Next Config type in ${projectDir}. Possibly try renaming next.config.js to next.config.cjs or next.config.mjs.`,\n success: false,\n }\n }\n\n if (hasTopLevelLayout) {\n // Output directions for user to move all files from app to top-level directory named `(app)`\n p.log.warn(moveMessage({ nextAppDir, projectDir }))\n return {\n isSrcDir,\n nextAppDir,\n reason: 'Found existing layout.tsx in app directory',\n success: false,\n }\n }\n\n const installSpinner = p.spinner()\n installSpinner.start('Installing Payload and dependencies...')\n\n const configurationResult = await installAndConfigurePayload({\n ...args,\n nextAppDetails,\n nextConfigType,\n useDistFiles: true, // Requires running 'pnpm pack-template-files' in cpa\n })\n\n if (configurationResult.success === false) {\n installSpinner.stop(configurationResult.reason, 1)\n return { ...configurationResult, isSrcDir, success: false }\n }\n\n const { success: installSuccess } = await installDeps({\n dbType,\n packageManager,\n projectDir,\n versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG,\n })\n if (!installSuccess) {\n installSpinner.stop('Failed to install dependencies', 1)\n return {\n ...configurationResult,\n isSrcDir,\n reason: 'Failed to install dependencies',\n success: false,\n }\n }\n\n await configurePayloadTsConfig({\n configPath: path.resolve(projectDir, 'tsconfig.json'),\n payloadConfigPath: configurationResult.payloadConfigPath,\n })\n installSpinner.stop('Successfully installed Payload and dependencies')\n return { ...configurationResult, isSrcDir, nextAppDir, success: true }\n}\n\nasync function installAndConfigurePayload(\n args: {\n nextAppDetails: NextAppDetails\n nextConfigType: NextConfigType\n useDistFiles?: boolean\n } & InitNextArgs,\n): Promise<\n | { payloadConfigPath: string; success: true }\n | { payloadConfigPath?: string; reason: string; success: false }\n> {\n const {\n '--debug': debug,\n nextAppDetails: { isSrcDir, nextAppDir, nextConfigPath } = {},\n nextConfigType,\n projectDir,\n useDistFiles,\n } = args\n\n if (!nextAppDir || !nextConfigPath) {\n return {\n reason: 'Could not find app directory or next.config.js',\n success: false,\n }\n }\n\n const logDebug = (message: string) => {\n if (debug) {\n origDebug(message)\n }\n }\n\n if (!fs.existsSync(projectDir)) {\n return {\n reason: `Could not find specified project directory at ${projectDir}`,\n success: false,\n }\n }\n\n const templateFilesPath =\n dirname.endsWith('dist') || useDistFiles\n ? path.resolve(dirname, '../..', 'dist/template')\n : path.resolve(dirname, '../../../../templates/blank')\n\n logDebug(`Using template files from: ${templateFilesPath}`)\n\n if (!fs.existsSync(templateFilesPath)) {\n return {\n reason: `Could not find template source files from ${templateFilesPath}`,\n success: false,\n }\n } else {\n logDebug('Found template source files')\n }\n\n logDebug(`Copying template files from ${templateFilesPath} to ${nextAppDir}`)\n\n const templateSrcDir = path.resolve(templateFilesPath, isSrcDir ? '' : 'src')\n\n logDebug(`templateSrcDir: ${templateSrcDir}`)\n logDebug(`nextAppDir: ${nextAppDir}`)\n logDebug(`projectDir: ${projectDir}`)\n logDebug(`nextConfigPath: ${nextConfigPath}`)\n logDebug(`payloadConfigPath: ${path.resolve(projectDir, 'payload.config.ts')}`)\n\n logDebug(\n `isSrcDir: ${isSrcDir}. source: ${templateSrcDir}. dest: ${path.dirname(nextConfigPath)}`,\n )\n\n // This is a little clunky and needs to account for isSrcDir\n copyRecursiveSync(templateSrcDir, path.dirname(nextConfigPath))\n\n // Wrap next.config.js with withPayload\n await wrapNextConfig({ nextConfigPath, nextConfigType })\n\n return {\n payloadConfigPath: path.resolve(nextAppDir, '../payload.config.ts'),\n success: true,\n }\n}\n\nasync function installDeps(args: {\n dbType: DbType\n packageManager: PackageManager\n projectDir: string\n versionOrTag?: string\n}) {\n const { dbType, packageManager, projectDir, versionOrTag } = args\n const { getDbPackageName } = await import('./ast/adapter-config.js')\n\n const version = await resolvePackageVersion({ packageName: 'payload', versionOrTag })\n\n const packagesToInstall = ['payload', '@payloadcms/next', '@payloadcms/richtext-lexical'].map(\n (pkg) => `${pkg}@${version}`,\n )\n\n packagesToInstall.push(`${getDbPackageName(dbType)}@${version}`)\n\n // Match graphql version of @payloadcms/next\n packagesToInstall.push('graphql@^16.8.1')\n\n await ensurePnpmBuildApprovals({ packageManager, projectDir })\n\n return await installPackages({ packageManager, packagesToInstall, projectDir })\n}\n\nexport async function getNextAppDetails(projectDir: string): Promise<NextAppDetails> {\n const isSrcDir = fs.existsSync(path.resolve(projectDir, 'src'))\n\n // Match next.config.js, next.config.ts, next.config.mjs, next.config.cjs\n const nextConfigPath: string | undefined = (\n await globby('next.config.(\\\\w)?(t|j)s', { absolute: true, cwd: projectDir })\n )?.[0]\n\n if (!nextConfigPath || nextConfigPath.length === 0) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath: undefined,\n nextVersion: null,\n }\n }\n\n const packageObj = await fse.readJson(path.resolve(projectDir, 'package.json'))\n // Check if Next.js version is new enough\n let nextVersion = null\n if (packageObj.dependencies?.next) {\n nextVersion = packageObj.dependencies.next\n // Match versions using regex matching groups\n const versionMatch = /(?<major>\\d+)(?:\\.(?<minor>\\d+))?/.exec(nextVersion)\n if (!versionMatch) {\n p.log.warn(`Could not determine Next.js version from ${nextVersion}`)\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath,\n nextVersion,\n }\n }\n\n const { major, minor } = versionMatch.groups as { major: string; minor?: string }\n const majorVersion = parseInt(major)\n if (majorVersion < minimumNextVersion.major) {\n return {\n hasTopLevelLayout: false,\n isSrcDir,\n isSupportedNextVersion: false,\n nextConfigPath,\n nextVersion,\n }\n }\n\n // TODO: Older minor versions of the minimum major are only warned about, not rejected, to make\n // migrating easier. This can be turned into a hard requirement in the future.\n // A specifier without a minor version (e.g. `^16`) can resolve to any minor, so it is not warned about.\n const isBelowMinimumMinor =\n majorVersion === minimumNextVersion.major &&\n minor !== undefined &&\n parseInt(minor) < minimumNextVersion.minor\n if (isBelowMinimumMinor) {\n p.log.warn(\n `Next.js v${nextVersion} is not supported. Upgrade to Next.js >= ${minimumNextVersion.major}.${minimumNextVersion.minor} to use Payload.`,\n )\n }\n }\n\n const isSupportedNextVersion = true\n\n // Check if Payload already installed\n if (packageObj.dependencies?.payload) {\n return {\n hasTopLevelLayout: false,\n isPayloadInstalled: true,\n isSrcDir,\n isSupportedNextVersion,\n nextConfigPath,\n nextVersion,\n }\n }\n\n let nextAppDir: string | undefined = (\n await globby(['**/app'], {\n absolute: true,\n cwd: projectDir,\n ignore: ['**/node_modules/**'],\n onlyDirectories: true,\n })\n )?.[0]\n\n if (!nextAppDir || nextAppDir.length === 0) {\n nextAppDir = undefined\n }\n\n const configType = getProjectType({ nextConfigPath, packageObj })\n\n const hasTopLevelLayout = nextAppDir\n ? fs.existsSync(path.resolve(nextAppDir, 'layout.tsx'))\n : false\n\n return {\n hasTopLevelLayout,\n isSrcDir,\n isSupportedNextVersion,\n nextAppDir,\n nextConfigPath,\n nextConfigType: configType,\n nextVersion,\n }\n}\n\nfunction getProjectType(args: {\n nextConfigPath: string\n packageObj: Record<string, unknown>\n}): NextConfigType {\n const { nextConfigPath, packageObj } = args\n\n if (nextConfigPath.endsWith('.ts')) {\n return 'ts'\n }\n\n if (nextConfigPath.endsWith('.mjs')) {\n return 'esm'\n }\n if (nextConfigPath.endsWith('.cjs')) {\n return 'cjs'\n }\n\n const packageJsonType = packageObj.type\n if (packageJsonType === 'module') {\n return 'esm'\n }\n if (packageJsonType === 'commonjs') {\n return 'cjs'\n }\n\n return 'cjs'\n}\n"],"names":["p","fs","fse","globby","fileURLToPath","path","copyRecursiveSync","debug","origDebug","warning","moveMessage","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","configurePayloadTsConfig","ensurePnpmBuildApprovals","installPackages","wrapNextConfig","filename","url","dirname","minimumNextVersion","major","minor","initNext","args","dbType","packageManager","projectDir","nextAppDetails","getNextAppDetails","nextAppDir","createdAppDir","resolve","isSrcDir","mkdirSync","recursive","hasTopLevelLayout","nextConfigType","reason","success","log","warn","installSpinner","spinner","start","configurationResult","installAndConfigurePayload","useDistFiles","stop","installSuccess","installDeps","versionOrTag","configPath","payloadConfigPath","nextConfigPath","logDebug","message","existsSync","templateFilesPath","endsWith","templateSrcDir","getDbPackageName","version","packageName","packagesToInstall","map","pkg","push","absolute","cwd","length","isSupportedNextVersion","undefined","nextVersion","packageObj","readJson","dependencies","next","versionMatch","exec","groups","majorVersion","parseInt","isBelowMinimumMinor","payload","isPayloadInstalled","ignore","onlyDirectories","configType","getProjectType","packageJsonType","type"],"mappings":"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"}
@@ -138,7 +138,7 @@ function getRequiredDependencies({ appDetails, dbType, payloadVersion }) {
138
138
  payload: payloadVersion
139
139
  };
140
140
  if (appDetails.kind === 'router-only') {
141
- dependencies['@tanstack/react-start'] = '^1.168.60';
141
+ dependencies['@tanstack/react-start'] = '^1.169.1';
142
142
  }
143
143
  return dependencies;
144
144
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/init-tanstack.ts"],"sourcesContent":["import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport type { CliArgs, DbType, PackageManager, TanStackAppDetails } from '../types.js'\n\nimport { debug } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { getDbPackageName } from './ast/adapter-config.js'\nimport { preparePackageJson } from './ast/package-json.js'\nimport { configurePayloadTsConfig } from './configure-payload-tsconfig.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { installPackages } from './install-packages.js'\nimport { getTanStackAppDetails } from './tanstack/detect.js'\nimport { applyPreparedWrites, prepareTanStackInit } from './tanstack/prepare.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype InitTanStackArgs = {\n appDetails?: TanStackAppDetails\n dbType: DbType\n packageManager: PackageManager\n projectDir: string\n templateRoot?: string\n} & Pick<CliArgs, '--debug' | '--no-deps' | '--payload-version'>\n\ntype InitTanStackResult =\n | { payloadConfigPath: string; success: true }\n | { reason: string; success: false }\n\nexport async function initTanStack(args: InitTanStackArgs): Promise<InitTanStackResult> {\n const appDetailsResult = args.appDetails\n ? { details: args.appDetails, success: true as const }\n : await detectAppDetails({ projectDir: args.projectDir })\n\n if (!appDetailsResult.success) {\n return appDetailsResult\n }\n\n const { details: appDetails } = appDetailsResult\n const templateRoot = args.templateRoot ?? resolveTemplateRoot()\n\n if (args['--debug']) {\n debug(`Using TanStack template files from: ${templateRoot}`)\n }\n\n const prepared = await prepareTanStackInit({ appDetails, templateRoot })\n if (!prepared.success) {\n return prepared\n }\n\n const payloadVersion = await resolvePackageVersion({\n debug: args['--debug'],\n packageName: 'payload',\n versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG,\n })\n const requiredDependencies = getRequiredDependencies({\n appDetails,\n dbType: args.dbType,\n payloadVersion,\n })\n let writes = prepared.writes\n if (appDetails.kind === 'router-only' || args['--no-deps']) {\n try {\n const packageJsonWrite = preparePackageJson({\n filePath: path.join(args.projectDir, 'package.json'),\n options: {\n addDependencies: args['--no-deps'] ? requiredDependencies : undefined,\n removeDependencies:\n appDetails.kind === 'router-only' ? ['@tanstack/router-plugin'] : undefined,\n },\n })\n writes = [...writes, packageJsonWrite]\n } catch (error) {\n return {\n reason: `Could not prepare package.json: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false,\n }\n }\n }\n\n await applyPreparedWrites({ writes })\n\n if (!args['--no-deps']) {\n const packagesToInstall = Object.entries(requiredDependencies).map(\n ([packageName, version]) => `${packageName}@${version}`,\n )\n\n await ensurePnpmBuildApprovals({\n packageManager: args.packageManager,\n projectDir: args.projectDir,\n })\n\n let installation: { success: boolean }\n try {\n installation = await installPackages({\n packageManager: args.packageManager,\n packagesToInstall,\n projectDir: args.projectDir,\n })\n } catch {\n return { reason: 'Failed to install dependencies', success: false }\n }\n if (!installation.success) {\n return { reason: 'Failed to install dependencies', success: false }\n }\n }\n\n const payloadConfigPath = path.join(appDetails.sourceDir, 'payload.config.ts')\n await configurePayloadTsConfig({\n configPath: path.join(args.projectDir, 'tsconfig.json'),\n payloadConfigPath,\n })\n\n return { payloadConfigPath, success: true }\n}\n\nasync function detectAppDetails({\n projectDir,\n}: {\n projectDir: string\n}): Promise<{ details: TanStackAppDetails; success: true } | { reason: string; success: false }> {\n const detection = await getTanStackAppDetails({ projectDir })\n\n if (!detection.detected) {\n return {\n reason: `Could not detect a TanStack application in ${projectDir}.`,\n success: false,\n }\n }\n\n if (!detection.compatible) {\n return { reason: detection.reason, success: false }\n }\n\n return { details: detection.details, success: true }\n}\n\nfunction getRequiredDependencies({\n appDetails,\n dbType,\n payloadVersion,\n}: {\n appDetails: TanStackAppDetails\n dbType: DbType\n payloadVersion: string\n}): Record<string, string> {\n const dependencies: Record<string, string> = {\n '@payloadcms/plugin-mcp': payloadVersion,\n '@payloadcms/richtext-lexical': payloadVersion,\n '@payloadcms/tanstack-start': payloadVersion,\n '@payloadcms/ui': payloadVersion,\n '@vitejs/plugin-rsc': '^0.5.21',\n [getDbPackageName(dbType)]: payloadVersion,\n graphql: '^16.8.1',\n payload: payloadVersion,\n }\n\n if (appDetails.kind === 'router-only') {\n dependencies['@tanstack/react-start'] = '^1.168.60'\n }\n\n return dependencies\n}\n\nfunction resolveTemplateRoot(): string {\n return path.basename(path.dirname(dirname)) === 'dist'\n ? path.resolve(dirname, '../template-tanstack')\n : path.resolve(dirname, '../../../../templates/blank-tanstack/src')\n}\n"],"names":["path","fileURLToPath","debug","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","getDbPackageName","preparePackageJson","configurePayloadTsConfig","ensurePnpmBuildApprovals","installPackages","getTanStackAppDetails","applyPreparedWrites","prepareTanStackInit","filename","url","dirname","initTanStack","args","appDetailsResult","appDetails","details","success","detectAppDetails","projectDir","templateRoot","resolveTemplateRoot","prepared","payloadVersion","packageName","versionOrTag","requiredDependencies","getRequiredDependencies","dbType","writes","kind","packageJsonWrite","filePath","join","options","addDependencies","undefined","removeDependencies","error","reason","Error","message","packagesToInstall","Object","entries","map","version","packageManager","installation","payloadConfigPath","sourceDir","configPath","detection","detected","compatible","dependencies","graphql","payload","basename","resolve"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/init-tanstack.ts"],"sourcesContent":["import path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport type { CliArgs, DbType, PackageManager, TanStackAppDetails } from '../types.js'\n\nimport { debug } from '../utils/log.js'\nimport {\n DEFAULT_PAYLOAD_VERSION_TAG,\n resolvePackageVersion,\n} from '../utils/resolvePackageVersion.js'\nimport { getDbPackageName } from './ast/adapter-config.js'\nimport { preparePackageJson } from './ast/package-json.js'\nimport { configurePayloadTsConfig } from './configure-payload-tsconfig.js'\nimport { ensurePnpmBuildApprovals } from './configure-pnpm-builds.js'\nimport { installPackages } from './install-packages.js'\nimport { getTanStackAppDetails } from './tanstack/detect.js'\nimport { applyPreparedWrites, prepareTanStackInit } from './tanstack/prepare.js'\n\nconst filename = fileURLToPath(import.meta.url)\nconst dirname = path.dirname(filename)\n\ntype InitTanStackArgs = {\n appDetails?: TanStackAppDetails\n dbType: DbType\n packageManager: PackageManager\n projectDir: string\n templateRoot?: string\n} & Pick<CliArgs, '--debug' | '--no-deps' | '--payload-version'>\n\ntype InitTanStackResult =\n | { payloadConfigPath: string; success: true }\n | { reason: string; success: false }\n\nexport async function initTanStack(args: InitTanStackArgs): Promise<InitTanStackResult> {\n const appDetailsResult = args.appDetails\n ? { details: args.appDetails, success: true as const }\n : await detectAppDetails({ projectDir: args.projectDir })\n\n if (!appDetailsResult.success) {\n return appDetailsResult\n }\n\n const { details: appDetails } = appDetailsResult\n const templateRoot = args.templateRoot ?? resolveTemplateRoot()\n\n if (args['--debug']) {\n debug(`Using TanStack template files from: ${templateRoot}`)\n }\n\n const prepared = await prepareTanStackInit({ appDetails, templateRoot })\n if (!prepared.success) {\n return prepared\n }\n\n const payloadVersion = await resolvePackageVersion({\n debug: args['--debug'],\n packageName: 'payload',\n versionOrTag: args['--payload-version'] ?? DEFAULT_PAYLOAD_VERSION_TAG,\n })\n const requiredDependencies = getRequiredDependencies({\n appDetails,\n dbType: args.dbType,\n payloadVersion,\n })\n let writes = prepared.writes\n if (appDetails.kind === 'router-only' || args['--no-deps']) {\n try {\n const packageJsonWrite = preparePackageJson({\n filePath: path.join(args.projectDir, 'package.json'),\n options: {\n addDependencies: args['--no-deps'] ? requiredDependencies : undefined,\n removeDependencies:\n appDetails.kind === 'router-only' ? ['@tanstack/router-plugin'] : undefined,\n },\n })\n writes = [...writes, packageJsonWrite]\n } catch (error) {\n return {\n reason: `Could not prepare package.json: ${error instanceof Error ? error.message : 'Unknown error'}`,\n success: false,\n }\n }\n }\n\n await applyPreparedWrites({ writes })\n\n if (!args['--no-deps']) {\n const packagesToInstall = Object.entries(requiredDependencies).map(\n ([packageName, version]) => `${packageName}@${version}`,\n )\n\n await ensurePnpmBuildApprovals({\n packageManager: args.packageManager,\n projectDir: args.projectDir,\n })\n\n let installation: { success: boolean }\n try {\n installation = await installPackages({\n packageManager: args.packageManager,\n packagesToInstall,\n projectDir: args.projectDir,\n })\n } catch {\n return { reason: 'Failed to install dependencies', success: false }\n }\n if (!installation.success) {\n return { reason: 'Failed to install dependencies', success: false }\n }\n }\n\n const payloadConfigPath = path.join(appDetails.sourceDir, 'payload.config.ts')\n await configurePayloadTsConfig({\n configPath: path.join(args.projectDir, 'tsconfig.json'),\n payloadConfigPath,\n })\n\n return { payloadConfigPath, success: true }\n}\n\nasync function detectAppDetails({\n projectDir,\n}: {\n projectDir: string\n}): Promise<{ details: TanStackAppDetails; success: true } | { reason: string; success: false }> {\n const detection = await getTanStackAppDetails({ projectDir })\n\n if (!detection.detected) {\n return {\n reason: `Could not detect a TanStack application in ${projectDir}.`,\n success: false,\n }\n }\n\n if (!detection.compatible) {\n return { reason: detection.reason, success: false }\n }\n\n return { details: detection.details, success: true }\n}\n\nfunction getRequiredDependencies({\n appDetails,\n dbType,\n payloadVersion,\n}: {\n appDetails: TanStackAppDetails\n dbType: DbType\n payloadVersion: string\n}): Record<string, string> {\n const dependencies: Record<string, string> = {\n '@payloadcms/plugin-mcp': payloadVersion,\n '@payloadcms/richtext-lexical': payloadVersion,\n '@payloadcms/tanstack-start': payloadVersion,\n '@payloadcms/ui': payloadVersion,\n '@vitejs/plugin-rsc': '^0.5.21',\n [getDbPackageName(dbType)]: payloadVersion,\n graphql: '^16.8.1',\n payload: payloadVersion,\n }\n\n if (appDetails.kind === 'router-only') {\n dependencies['@tanstack/react-start'] = '^1.169.1'\n }\n\n return dependencies\n}\n\nfunction resolveTemplateRoot(): string {\n return path.basename(path.dirname(dirname)) === 'dist'\n ? path.resolve(dirname, '../template-tanstack')\n : path.resolve(dirname, '../../../../templates/blank-tanstack/src')\n}\n"],"names":["path","fileURLToPath","debug","DEFAULT_PAYLOAD_VERSION_TAG","resolvePackageVersion","getDbPackageName","preparePackageJson","configurePayloadTsConfig","ensurePnpmBuildApprovals","installPackages","getTanStackAppDetails","applyPreparedWrites","prepareTanStackInit","filename","url","dirname","initTanStack","args","appDetailsResult","appDetails","details","success","detectAppDetails","projectDir","templateRoot","resolveTemplateRoot","prepared","payloadVersion","packageName","versionOrTag","requiredDependencies","getRequiredDependencies","dbType","writes","kind","packageJsonWrite","filePath","join","options","addDependencies","undefined","removeDependencies","error","reason","Error","message","packagesToInstall","Object","entries","map","version","packageManager","installation","payloadConfigPath","sourceDir","configPath","detection","detected","compatible","dependencies","graphql","payload","basename","resolve"],"mappings":"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"}