create-payload-app 3.67.0-internal.87c53da → 3.68.0-internal-debug.56c9b68

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 (51) hide show
  1. package/dist/ast-integration.spec.js +131 -0
  2. package/dist/ast-integration.spec.js.map +1 -0
  3. package/dist/lib/ast/adapter-config.d.ts +40 -0
  4. package/dist/lib/ast/adapter-config.d.ts.map +1 -0
  5. package/dist/lib/ast/adapter-config.js +145 -0
  6. package/dist/lib/ast/adapter-config.js.map +1 -0
  7. package/dist/lib/ast/package-json.d.ts +13 -0
  8. package/dist/lib/ast/package-json.d.ts.map +1 -0
  9. package/dist/lib/ast/package-json.js +103 -0
  10. package/dist/lib/ast/package-json.js.map +1 -0
  11. package/dist/lib/ast/package-json.spec.js +66 -0
  12. package/dist/lib/ast/package-json.spec.js.map +1 -0
  13. package/dist/lib/ast/payload-config.d.ts +23 -0
  14. package/dist/lib/ast/payload-config.d.ts.map +1 -0
  15. package/dist/lib/ast/payload-config.js +655 -0
  16. package/dist/lib/ast/payload-config.js.map +1 -0
  17. package/dist/lib/ast/payload-config.spec.js +364 -0
  18. package/dist/lib/ast/payload-config.spec.js.map +1 -0
  19. package/dist/lib/ast/types.d.ts +126 -0
  20. package/dist/lib/ast/types.d.ts.map +1 -0
  21. package/dist/lib/ast/types.js +18 -0
  22. package/dist/lib/ast/types.js.map +1 -0
  23. package/dist/lib/ast/utils.d.ts +48 -0
  24. package/dist/lib/ast/utils.d.ts.map +1 -0
  25. package/dist/lib/ast/utils.js +189 -0
  26. package/dist/lib/ast/utils.js.map +1 -0
  27. package/dist/lib/ast/utils.spec.js +225 -0
  28. package/dist/lib/ast/utils.spec.js.map +1 -0
  29. package/dist/lib/configure-payload-config.d.ts.map +1 -1
  30. package/dist/lib/configure-payload-config.js +30 -86
  31. package/dist/lib/configure-payload-config.js.map +1 -1
  32. package/dist/lib/create-project.spec.js +9 -5
  33. package/dist/lib/create-project.spec.js.map +1 -1
  34. package/dist/lib/init-next.d.ts.map +1 -1
  35. package/dist/lib/init-next.js +2 -1
  36. package/dist/lib/init-next.js.map +1 -1
  37. package/dist/main.d.ts.map +1 -1
  38. package/dist/main.js +4 -0
  39. package/dist/main.js.map +1 -1
  40. package/dist/template/src/payload.config.ts +2 -7
  41. package/dist/types.d.ts +3 -2
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/utils/log.d.ts.map +1 -1
  45. package/dist/utils/log.js +3 -1
  46. package/dist/utils/log.js.map +1 -1
  47. package/package.json +5 -2
  48. package/dist/lib/replacements.d.ts +0 -27
  49. package/dist/lib/replacements.d.ts.map +0 -1
  50. package/dist/lib/replacements.js +0 -104
  51. package/dist/lib/replacements.js.map +0 -1
@@ -0,0 +1,131 @@
1
+ import * as fs from 'fs';
2
+ import * as fse from 'fs-extra';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { configurePayloadConfig } from './lib/configure-payload-config';
6
+ import { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './lib/ast/adapter-config';
7
+ const TEST_CASES = [
8
+ {
9
+ name: 'blank + mongodb + localDisk',
10
+ template: 'blank',
11
+ dbType: 'mongodb',
12
+ storageAdapter: 'localDisk'
13
+ },
14
+ {
15
+ name: 'blank + postgres + vercelBlobStorage',
16
+ template: 'blank',
17
+ dbType: 'postgres',
18
+ storageAdapter: 'vercelBlobStorage'
19
+ },
20
+ {
21
+ name: 'website + mongodb + s3Storage',
22
+ template: 'website',
23
+ dbType: 'mongodb',
24
+ storageAdapter: 's3Storage'
25
+ },
26
+ {
27
+ name: 'website + postgres + localDisk',
28
+ template: 'website',
29
+ dbType: 'postgres',
30
+ storageAdapter: 'localDisk'
31
+ },
32
+ {
33
+ name: 'ecommerce + mongodb + localDisk',
34
+ template: 'ecommerce',
35
+ dbType: 'mongodb',
36
+ storageAdapter: 'localDisk'
37
+ },
38
+ {
39
+ name: 'ecommerce + postgres + r2Storage',
40
+ template: 'ecommerce',
41
+ dbType: 'postgres',
42
+ storageAdapter: 'r2Storage'
43
+ }
44
+ ];
45
+ describe('AST Integration Tests', ()=>{
46
+ let tempDir;
47
+ const templatesRoot = path.resolve(__dirname, '../../..', 'templates');
48
+ beforeEach(()=>{
49
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-ast-integration-'));
50
+ });
51
+ afterEach(()=>{
52
+ if (tempDir && fs.existsSync(tempDir)) {
53
+ fs.rmSync(tempDir, {
54
+ recursive: true,
55
+ force: true
56
+ });
57
+ }
58
+ });
59
+ describe.each(TEST_CASES)('$name', ({ template, dbType, storageAdapter })=>{
60
+ it('successfully applies AST transformations', async ()=>{
61
+ // Setup: Copy template to temp directory
62
+ const templateDir = path.join(templatesRoot, template);
63
+ const testProjectDir = path.join(tempDir, template);
64
+ if (!fs.existsSync(templateDir)) {
65
+ throw new Error(`Template ${template} not found at ${templateDir}`);
66
+ }
67
+ fse.copySync(templateDir, testProjectDir);
68
+ const payloadConfigPath = path.join(testProjectDir, 'src', 'payload.config.ts');
69
+ const packageJsonPath = path.join(testProjectDir, 'package.json');
70
+ // Verify files exist before transformation
71
+ expect(fs.existsSync(payloadConfigPath)).toBe(true);
72
+ expect(fs.existsSync(packageJsonPath)).toBe(true);
73
+ // Apply transformations
74
+ await configurePayloadConfig({
75
+ dbType,
76
+ storageAdapter,
77
+ projectDirOrConfigPath: {
78
+ projectDir: testProjectDir
79
+ }
80
+ });
81
+ // Verify payload.config.ts transformations
82
+ const configContent = fs.readFileSync(payloadConfigPath, 'utf-8');
83
+ // Check database adapter import
84
+ const dbConfig = DB_ADAPTER_CONFIG[dbType];
85
+ expect(configContent).toContain(`from '${dbConfig.packageName}'`);
86
+ expect(configContent).toContain(`import { ${dbConfig.adapterName} }`);
87
+ // Check database adapter config
88
+ expect(configContent).toMatch(new RegExp(`db:\\s*${dbConfig.adapterName}\\(`));
89
+ // Check storage adapter if not localDisk
90
+ if (storageAdapter !== 'localDisk') {
91
+ const storageConfig = STORAGE_ADAPTER_CONFIG[storageAdapter];
92
+ if (storageConfig.packageName && storageConfig.adapterName) {
93
+ expect(configContent).toContain(`from '${storageConfig.packageName}'`);
94
+ expect(configContent).toContain(`import { ${storageConfig.adapterName} }`);
95
+ expect(configContent).toContain(`${storageConfig.adapterName}(`);
96
+ }
97
+ }
98
+ // Check that old mongodb adapter is removed if we switched to postgres
99
+ if (dbType === 'postgres') {
100
+ expect(configContent).not.toContain('@payloadcms/db-mongodb');
101
+ expect(configContent).not.toContain('mongooseAdapter');
102
+ }
103
+ // Check that plugins array exists if storage adapter was added
104
+ if (storageAdapter !== 'localDisk') {
105
+ expect(configContent).toContain('plugins:');
106
+ }
107
+ // Verify package.json transformations
108
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
109
+ // Check that correct db adapter package is in dependencies
110
+ expect(packageJson.dependencies[dbConfig.packageName]).toBeDefined();
111
+ // Check that old db adapters are removed
112
+ Object.entries(DB_ADAPTER_CONFIG).forEach(([key, config])=>{
113
+ if (key !== dbType && config.packageName !== dbConfig.packageName) {
114
+ expect(packageJson.dependencies[config.packageName]).toBeUndefined();
115
+ }
116
+ });
117
+ // Note: Storage adapter dependencies are NOT automatically added to package.json
118
+ // by configurePayloadConfig - only the payload.config.ts is updated.
119
+ // This is expected behavior as storage adapters are typically installed separately.
120
+ // Verify file is valid TypeScript (basic syntax check)
121
+ expect(configContent).toContain('buildConfig');
122
+ expect(configContent).toContain('export default');
123
+ // Verify no placeholder comments remain
124
+ expect(configContent).not.toContain('database-adapter-import');
125
+ expect(configContent).not.toContain('database-adapter-config-start');
126
+ expect(configContent).not.toContain('storage-adapter-placeholder');
127
+ });
128
+ });
129
+ });
130
+
131
+ //# sourceMappingURL=ast-integration.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ast-integration.spec.ts"],"sourcesContent":["import * as fs from 'fs'\nimport * as fse from 'fs-extra'\nimport * as path from 'path'\nimport * as os from 'os'\nimport { configurePayloadConfig } from './lib/configure-payload-config'\nimport type { DbType, StorageAdapterType } from './types'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './lib/ast/adapter-config'\n\ninterface TestCase {\n name: string\n template: string\n dbType: DbType\n storageAdapter: StorageAdapterType\n}\n\nconst TEST_CASES: TestCase[] = [\n {\n name: 'blank + mongodb + localDisk',\n template: 'blank',\n dbType: 'mongodb',\n storageAdapter: 'localDisk',\n },\n {\n name: 'blank + postgres + vercelBlobStorage',\n template: 'blank',\n dbType: 'postgres',\n storageAdapter: 'vercelBlobStorage',\n },\n {\n name: 'website + mongodb + s3Storage',\n template: 'website',\n dbType: 'mongodb',\n storageAdapter: 's3Storage',\n },\n {\n name: 'website + postgres + localDisk',\n template: 'website',\n dbType: 'postgres',\n storageAdapter: 'localDisk',\n },\n {\n name: 'ecommerce + mongodb + localDisk',\n template: 'ecommerce',\n dbType: 'mongodb',\n storageAdapter: 'localDisk',\n },\n {\n name: 'ecommerce + postgres + r2Storage',\n template: 'ecommerce',\n dbType: 'postgres',\n storageAdapter: 'r2Storage',\n },\n]\n\ndescribe('AST Integration Tests', () => {\n let tempDir: string\n const templatesRoot = path.resolve(__dirname, '../../..', 'templates')\n\n beforeEach(() => {\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-ast-integration-'))\n })\n\n afterEach(() => {\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true })\n }\n })\n\n describe.each(TEST_CASES)('$name', ({ template, dbType, storageAdapter }) => {\n it('successfully applies AST transformations', async () => {\n // Setup: Copy template to temp directory\n const templateDir = path.join(templatesRoot, template)\n const testProjectDir = path.join(tempDir, template)\n\n if (!fs.existsSync(templateDir)) {\n throw new Error(`Template ${template} not found at ${templateDir}`)\n }\n\n fse.copySync(templateDir, testProjectDir)\n\n const payloadConfigPath = path.join(testProjectDir, 'src', 'payload.config.ts')\n const packageJsonPath = path.join(testProjectDir, 'package.json')\n\n // Verify files exist before transformation\n expect(fs.existsSync(payloadConfigPath)).toBe(true)\n expect(fs.existsSync(packageJsonPath)).toBe(true)\n\n // Apply transformations\n await configurePayloadConfig({\n dbType,\n storageAdapter,\n projectDirOrConfigPath: { projectDir: testProjectDir },\n })\n\n // Verify payload.config.ts transformations\n const configContent = fs.readFileSync(payloadConfigPath, 'utf-8')\n\n // Check database adapter import\n const dbConfig = DB_ADAPTER_CONFIG[dbType]\n expect(configContent).toContain(`from '${dbConfig.packageName}'`)\n expect(configContent).toContain(`import { ${dbConfig.adapterName} }`)\n\n // Check database adapter config\n expect(configContent).toMatch(new RegExp(`db:\\\\s*${dbConfig.adapterName}\\\\(`))\n\n // Check storage adapter if not localDisk\n if (storageAdapter !== 'localDisk') {\n const storageConfig = STORAGE_ADAPTER_CONFIG[storageAdapter]\n\n if (storageConfig.packageName && storageConfig.adapterName) {\n expect(configContent).toContain(`from '${storageConfig.packageName}'`)\n expect(configContent).toContain(`import { ${storageConfig.adapterName} }`)\n expect(configContent).toContain(`${storageConfig.adapterName}(`)\n }\n }\n\n // Check that old mongodb adapter is removed if we switched to postgres\n if (dbType === 'postgres') {\n expect(configContent).not.toContain('@payloadcms/db-mongodb')\n expect(configContent).not.toContain('mongooseAdapter')\n }\n\n // Check that plugins array exists if storage adapter was added\n if (storageAdapter !== 'localDisk') {\n expect(configContent).toContain('plugins:')\n }\n\n // Verify package.json transformations\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'))\n\n // Check that correct db adapter package is in dependencies\n expect(packageJson.dependencies[dbConfig.packageName]).toBeDefined()\n\n // Check that old db adapters are removed\n Object.entries(DB_ADAPTER_CONFIG).forEach(([key, config]) => {\n if (key !== dbType && config.packageName !== dbConfig.packageName) {\n expect(packageJson.dependencies[config.packageName]).toBeUndefined()\n }\n })\n\n // Note: Storage adapter dependencies are NOT automatically added to package.json\n // by configurePayloadConfig - only the payload.config.ts is updated.\n // This is expected behavior as storage adapters are typically installed separately.\n\n // Verify file is valid TypeScript (basic syntax check)\n expect(configContent).toContain('buildConfig')\n expect(configContent).toContain('export default')\n\n // Verify no placeholder comments remain\n expect(configContent).not.toContain('database-adapter-import')\n expect(configContent).not.toContain('database-adapter-config-start')\n expect(configContent).not.toContain('storage-adapter-placeholder')\n })\n })\n})\n"],"names":["fs","fse","path","os","configurePayloadConfig","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","TEST_CASES","name","template","dbType","storageAdapter","describe","tempDir","templatesRoot","resolve","__dirname","beforeEach","mkdtempSync","join","tmpdir","afterEach","existsSync","rmSync","recursive","force","each","it","templateDir","testProjectDir","Error","copySync","payloadConfigPath","packageJsonPath","expect","toBe","projectDirOrConfigPath","projectDir","configContent","readFileSync","dbConfig","toContain","packageName","adapterName","toMatch","RegExp","storageConfig","not","packageJson","JSON","parse","dependencies","toBeDefined","Object","entries","forEach","key","config","toBeUndefined"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Centralized adapter configuration
3
+ * Shared across all AST transformation and test files
4
+ */
5
+ import type { DatabaseAdapter, StorageAdapter } from './types.js';
6
+ export type DatabaseAdapterConfig = {
7
+ adapterName: string;
8
+ configTemplate: (envVar: string) => string;
9
+ packageName: string;
10
+ };
11
+ export type StorageAdapterConfig = {
12
+ adapterName: null | string;
13
+ configTemplate: () => null | string;
14
+ packageName: null | string;
15
+ };
16
+ /**
17
+ * Database adapter configurations
18
+ */
19
+ export declare const DB_ADAPTER_CONFIG: Record<DatabaseAdapter, DatabaseAdapterConfig>;
20
+ /**
21
+ * Storage adapter configurations
22
+ */
23
+ export declare const STORAGE_ADAPTER_CONFIG: Record<StorageAdapter, StorageAdapterConfig>;
24
+ /**
25
+ * Helper to get database adapter package name
26
+ */
27
+ export declare function getDbPackageName(adapter: DatabaseAdapter): string;
28
+ /**
29
+ * Helper to get database adapter name
30
+ */
31
+ export declare function getDbAdapterName(adapter: DatabaseAdapter): string;
32
+ /**
33
+ * Helper to get storage adapter package name
34
+ */
35
+ export declare function getStoragePackageName(adapter: StorageAdapter): null | string;
36
+ /**
37
+ * Helper to get storage adapter name
38
+ */
39
+ export declare function getStorageAdapterName(adapter: StorageAdapter): null | string;
40
+ //# sourceMappingURL=adapter-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter-config.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/adapter-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,IAAI,GAAG,MAAM,CAAA;IACnC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CA0CnE,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAwEtE,CAAA;AAEV;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Centralized adapter configuration
3
+ * Shared across all AST transformation and test files
4
+ */ /**
5
+ * Database adapter configurations
6
+ */ export const DB_ADAPTER_CONFIG = {
7
+ 'd1-sqlite': {
8
+ adapterName: 'sqliteD1Adapter',
9
+ configTemplate: ()=>`sqliteD1Adapter({
10
+ binding: cloudflare.env.D1,
11
+ })`,
12
+ packageName: '@payloadcms/db-d1-sqlite'
13
+ },
14
+ mongodb: {
15
+ adapterName: 'mongooseAdapter',
16
+ configTemplate: (envVar)=>`mongooseAdapter({
17
+ url: process.env.${envVar} || '',
18
+ })`,
19
+ packageName: '@payloadcms/db-mongodb'
20
+ },
21
+ postgres: {
22
+ adapterName: 'postgresAdapter',
23
+ configTemplate: (envVar)=>`postgresAdapter({
24
+ pool: {
25
+ connectionString: process.env.${envVar} || '',
26
+ },
27
+ })`,
28
+ packageName: '@payloadcms/db-postgres'
29
+ },
30
+ sqlite: {
31
+ adapterName: 'sqliteAdapter',
32
+ configTemplate: ()=>`sqliteAdapter({
33
+ client: {
34
+ url: process.env.DATABASE_URI || '',
35
+ },
36
+ })`,
37
+ packageName: '@payloadcms/db-sqlite'
38
+ },
39
+ 'vercel-postgres': {
40
+ adapterName: 'vercelPostgresAdapter',
41
+ configTemplate: ()=>`vercelPostgresAdapter({
42
+ pool: {
43
+ connectionString: process.env.POSTGRES_URL || '',
44
+ },
45
+ })`,
46
+ packageName: '@payloadcms/db-vercel-postgres'
47
+ }
48
+ };
49
+ /**
50
+ * Storage adapter configurations
51
+ */ export const STORAGE_ADAPTER_CONFIG = {
52
+ azureStorage: {
53
+ adapterName: 'azureStorage',
54
+ configTemplate: ()=>`azureStorage({
55
+ collections: {
56
+ media: true,
57
+ },
58
+ connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING || '',
59
+ containerName: process.env.AZURE_STORAGE_CONTAINER_NAME || '',
60
+ })`,
61
+ packageName: '@payloadcms/storage-azure'
62
+ },
63
+ gcsStorage: {
64
+ adapterName: 'gcsStorage',
65
+ configTemplate: ()=>`gcsStorage({
66
+ collections: {
67
+ media: true,
68
+ },
69
+ bucket: process.env.GCS_BUCKET || '',
70
+ })`,
71
+ packageName: '@payloadcms/storage-gcs'
72
+ },
73
+ localDisk: {
74
+ adapterName: null,
75
+ configTemplate: ()=>null,
76
+ packageName: null
77
+ },
78
+ r2Storage: {
79
+ adapterName: 'r2Storage',
80
+ configTemplate: ()=>`r2Storage({
81
+ bucket: cloudflare.env.R2,
82
+ collections: { media: true },
83
+ })`,
84
+ packageName: '@payloadcms/storage-r2'
85
+ },
86
+ s3Storage: {
87
+ adapterName: 's3Storage',
88
+ configTemplate: ()=>`s3Storage({
89
+ collections: {
90
+ media: true,
91
+ },
92
+ bucket: process.env.S3_BUCKET || '',
93
+ config: {
94
+ credentials: {
95
+ accessKeyId: process.env.S3_ACCESS_KEY_ID || '',
96
+ secretAccessKey: process.env.S3_SECRET_ACCESS_KEY || '',
97
+ },
98
+ region: process.env.S3_REGION || '',
99
+ },
100
+ })`,
101
+ packageName: '@payloadcms/storage-s3'
102
+ },
103
+ uploadthingStorage: {
104
+ adapterName: 'uploadthingStorage',
105
+ configTemplate: ()=>`uploadthingStorage({
106
+ collections: {
107
+ media: true,
108
+ },
109
+ token: process.env.UPLOADTHING_SECRET || '',
110
+ })`,
111
+ packageName: '@payloadcms/storage-uploadthing'
112
+ },
113
+ vercelBlobStorage: {
114
+ adapterName: 'vercelBlobStorage',
115
+ configTemplate: ()=>`vercelBlobStorage({
116
+ collections: {
117
+ media: true,
118
+ },
119
+ token: process.env.BLOB_READ_WRITE_TOKEN || '',
120
+ })`,
121
+ packageName: '@payloadcms/storage-vercel-blob'
122
+ }
123
+ };
124
+ /**
125
+ * Helper to get database adapter package name
126
+ */ export function getDbPackageName(adapter) {
127
+ return DB_ADAPTER_CONFIG[adapter].packageName;
128
+ }
129
+ /**
130
+ * Helper to get database adapter name
131
+ */ export function getDbAdapterName(adapter) {
132
+ return DB_ADAPTER_CONFIG[adapter].adapterName;
133
+ }
134
+ /**
135
+ * Helper to get storage adapter package name
136
+ */ export function getStoragePackageName(adapter) {
137
+ return STORAGE_ADAPTER_CONFIG[adapter].packageName;
138
+ }
139
+ /**
140
+ * Helper to get storage adapter name
141
+ */ export function getStorageAdapterName(adapter) {
142
+ return STORAGE_ADAPTER_CONFIG[adapter].adapterName;
143
+ }
144
+
145
+ //# sourceMappingURL=adapter-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/ast/adapter-config.ts"],"sourcesContent":["/**\n * Centralized adapter configuration\n * Shared across all AST transformation and test files\n */\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nexport type DatabaseAdapterConfig = {\n adapterName: string\n configTemplate: (envVar: string) => string\n packageName: string\n}\n\nexport type StorageAdapterConfig = {\n adapterName: null | string\n configTemplate: () => null | string\n packageName: null | string\n}\n\n/**\n * Database adapter configurations\n */\nexport const DB_ADAPTER_CONFIG: Record<DatabaseAdapter, DatabaseAdapterConfig> = {\n 'd1-sqlite': {\n adapterName: 'sqliteD1Adapter',\n configTemplate: () => `sqliteD1Adapter({\n binding: cloudflare.env.D1,\n})`,\n packageName: '@payloadcms/db-d1-sqlite',\n },\n mongodb: {\n adapterName: 'mongooseAdapter',\n configTemplate: (envVar: string) => `mongooseAdapter({\n url: process.env.${envVar} || '',\n})`,\n packageName: '@payloadcms/db-mongodb',\n },\n postgres: {\n adapterName: 'postgresAdapter',\n configTemplate: (envVar: string) => `postgresAdapter({\n pool: {\n connectionString: process.env.${envVar} || '',\n },\n})`,\n packageName: '@payloadcms/db-postgres',\n },\n sqlite: {\n adapterName: 'sqliteAdapter',\n configTemplate: () => `sqliteAdapter({\n client: {\n url: process.env.DATABASE_URI || '',\n },\n})`,\n packageName: '@payloadcms/db-sqlite',\n },\n 'vercel-postgres': {\n adapterName: 'vercelPostgresAdapter',\n configTemplate: () => `vercelPostgresAdapter({\n pool: {\n connectionString: process.env.POSTGRES_URL || '',\n },\n})`,\n packageName: '@payloadcms/db-vercel-postgres',\n },\n} as const\n\n/**\n * Storage adapter configurations\n */\nexport const STORAGE_ADAPTER_CONFIG: Record<StorageAdapter, StorageAdapterConfig> = {\n azureStorage: {\n adapterName: 'azureStorage',\n configTemplate: () => `azureStorage({\n collections: {\n media: true,\n },\n connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING || '',\n containerName: process.env.AZURE_STORAGE_CONTAINER_NAME || '',\n })`,\n packageName: '@payloadcms/storage-azure',\n },\n gcsStorage: {\n adapterName: 'gcsStorage',\n configTemplate: () => `gcsStorage({\n collections: {\n media: true,\n },\n bucket: process.env.GCS_BUCKET || '',\n })`,\n packageName: '@payloadcms/storage-gcs',\n },\n localDisk: {\n adapterName: null,\n configTemplate: () => null,\n packageName: null,\n },\n r2Storage: {\n adapterName: 'r2Storage',\n configTemplate: () => `r2Storage({\n bucket: cloudflare.env.R2,\n collections: { media: true },\n })`,\n packageName: '@payloadcms/storage-r2',\n },\n s3Storage: {\n adapterName: 's3Storage',\n configTemplate: () => `s3Storage({\n collections: {\n media: true,\n },\n bucket: process.env.S3_BUCKET || '',\n config: {\n credentials: {\n accessKeyId: process.env.S3_ACCESS_KEY_ID || '',\n secretAccessKey: process.env.S3_SECRET_ACCESS_KEY || '',\n },\n region: process.env.S3_REGION || '',\n },\n })`,\n packageName: '@payloadcms/storage-s3',\n },\n uploadthingStorage: {\n adapterName: 'uploadthingStorage',\n configTemplate: () => `uploadthingStorage({\n collections: {\n media: true,\n },\n token: process.env.UPLOADTHING_SECRET || '',\n })`,\n packageName: '@payloadcms/storage-uploadthing',\n },\n vercelBlobStorage: {\n adapterName: 'vercelBlobStorage',\n configTemplate: () => `vercelBlobStorage({\n collections: {\n media: true,\n },\n token: process.env.BLOB_READ_WRITE_TOKEN || '',\n })`,\n packageName: '@payloadcms/storage-vercel-blob',\n },\n} as const\n\n/**\n * Helper to get database adapter package name\n */\nexport function getDbPackageName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get database adapter name\n */\nexport function getDbAdapterName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].adapterName\n}\n\n/**\n * Helper to get storage adapter package name\n */\nexport function getStoragePackageName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get storage adapter name\n */\nexport function getStorageAdapterName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].adapterName\n}\n"],"names":["DB_ADAPTER_CONFIG","adapterName","configTemplate","packageName","mongodb","envVar","postgres","sqlite","STORAGE_ADAPTER_CONFIG","azureStorage","gcsStorage","localDisk","r2Storage","s3Storage","uploadthingStorage","vercelBlobStorage","getDbPackageName","adapter","getDbAdapterName","getStoragePackageName","getStorageAdapterName"],"mappings":"AAAA;;;CAGC,GAgBD;;CAEC,GACD,OAAO,MAAMA,oBAAoE;IAC/E,aAAa;QACXC,aAAa;QACbC,gBAAgB,IAAM,CAAC;;EAEzB,CAAC;QACCC,aAAa;IACf;IACAC,SAAS;QACPH,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;mBACtB,EAAEA,OAAO;EAC1B,CAAC;QACCF,aAAa;IACf;IACAG,UAAU;QACRL,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;;kCAEP,EAAEA,OAAO;;EAEzC,CAAC;QACCF,aAAa;IACf;IACAI,QAAQ;QACNN,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;IACA,mBAAmB;QACjBF,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,MAAMK,yBAAuE;IAClFC,cAAc;QACZR,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;IAMvB,CAAC;QACDC,aAAa;IACf;IACAO,YAAY;QACVT,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;IACAQ,WAAW;QACTV,aAAa;QACbC,gBAAgB,IAAM;QACtBC,aAAa;IACf;IACAS,WAAW;QACTX,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;IAGvB,CAAC;QACDC,aAAa;IACf;IACAU,WAAW;QACTZ,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;;;;;;;IAYvB,CAAC;QACDC,aAAa;IACf;IACAW,oBAAoB;QAClBb,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;IACAY,mBAAmB;QACjBd,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,SAASa,iBAAiBC,OAAwB;IACvD,OAAOjB,iBAAiB,CAACiB,QAAQ,CAACd,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASe,iBAAiBD,OAAwB;IACvD,OAAOjB,iBAAiB,CAACiB,QAAQ,CAAChB,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASkB,sBAAsBF,OAAuB;IAC3D,OAAOT,sBAAsB,CAACS,QAAQ,CAACd,WAAW;AACpD;AAEA;;CAEC,GACD,OAAO,SAASiB,sBAAsBH,OAAuB;IAC3D,OAAOT,sBAAsB,CAACS,QAAQ,CAAChB,WAAW;AACpD"}
@@ -0,0 +1,13 @@
1
+ import type { DatabaseAdapter, StorageAdapter } from './types.js';
2
+ type PackageJsonTransformOptions = {
3
+ databaseAdapter?: DatabaseAdapter;
4
+ packageName?: string;
5
+ removeSharp?: boolean;
6
+ storageAdapter?: StorageAdapter;
7
+ };
8
+ /**
9
+ * Main orchestration function
10
+ */
11
+ export declare function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void;
12
+ export {};
13
+ //# sourceMappingURL=package-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/package-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMjE,KAAK,2BAA2B,GAAG;IACjC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAa9F"}
@@ -0,0 +1,103 @@
1
+ import * as fs from 'fs';
2
+ import { debug } from '../../utils/log.js';
3
+ import { getDbPackageName, getStoragePackageName } from './adapter-config.js';
4
+ import { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js';
5
+ /**
6
+ * Main orchestration function
7
+ */ export function updatePackageJson(filePath, options) {
8
+ debug(`[AST] Updating package.json: ${filePath}`);
9
+ // Phase 1: Detection
10
+ const pkg = parsePackageJson(filePath);
11
+ // Phase 2: Transformation
12
+ const transformed = transformPackageJson(pkg, options);
13
+ // Phase 3: Modification
14
+ writePackageJson(filePath, transformed);
15
+ debug('[AST] ✓ package.json updated successfully');
16
+ }
17
+ // Helper functions
18
+ function parsePackageJson(filePath) {
19
+ const content = fs.readFileSync(filePath, 'utf-8');
20
+ return JSON.parse(content);
21
+ }
22
+ /**
23
+ * Transforms the package.json based upon provided options
24
+ */ function transformPackageJson(pkg, options) {
25
+ const transformed = {
26
+ ...pkg
27
+ };
28
+ // Update database adapter
29
+ if (options.databaseAdapter) {
30
+ debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`);
31
+ transformed.dependencies = {
32
+ ...transformed.dependencies
33
+ };
34
+ const removedAdapters = [];
35
+ ALL_DATABASE_ADAPTERS.forEach((adapter)=>{
36
+ const pkgName = getDbPackageName(adapter);
37
+ if (transformed.dependencies[pkgName]) {
38
+ removedAdapters.push(pkgName);
39
+ }
40
+ delete transformed.dependencies[pkgName];
41
+ });
42
+ if (removedAdapters.length > 0) {
43
+ debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`);
44
+ }
45
+ // Add new adapter
46
+ const dbAdapterPackageName = getDbPackageName(options.databaseAdapter);
47
+ const payloadVersion = transformed.dependencies?.payload || '^3.0.0';
48
+ transformed.dependencies[dbAdapterPackageName] = payloadVersion;
49
+ debug(`[AST] Added adapter package: ${dbAdapterPackageName}`);
50
+ }
51
+ // Update storage adapter
52
+ if (options.storageAdapter) {
53
+ debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`);
54
+ transformed.dependencies = {
55
+ ...transformed.dependencies
56
+ };
57
+ const removedAdapters = [];
58
+ ALL_STORAGE_ADAPTERS.forEach((adapter)=>{
59
+ const pkgName = getStoragePackageName(adapter);
60
+ if (pkgName && transformed.dependencies[pkgName]) {
61
+ removedAdapters.push(pkgName);
62
+ }
63
+ if (pkgName) {
64
+ delete transformed.dependencies[pkgName];
65
+ }
66
+ });
67
+ if (removedAdapters.length > 0) {
68
+ debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`);
69
+ }
70
+ // Add new storage adapter (if not localDisk)
71
+ const storagePackageName = getStoragePackageName(options.storageAdapter);
72
+ if (storagePackageName) {
73
+ const payloadVersion = transformed.dependencies?.payload || '^3.0.0';
74
+ transformed.dependencies[storagePackageName] = payloadVersion;
75
+ debug(`[AST] Added storage adapter package: ${storagePackageName}`);
76
+ } else {
77
+ debug(`[AST] Storage adapter is localDisk, no package needed`);
78
+ }
79
+ }
80
+ // Remove sharp
81
+ if (options.removeSharp && transformed.dependencies) {
82
+ transformed.dependencies = {
83
+ ...transformed.dependencies
84
+ };
85
+ if (transformed.dependencies.sharp) {
86
+ delete transformed.dependencies.sharp;
87
+ debug('[AST] Removed sharp dependency');
88
+ } else {
89
+ debug('[AST] Sharp dependency not found (already absent)');
90
+ }
91
+ }
92
+ // Update package name
93
+ if (options.packageName) {
94
+ debug(`[AST] Updated package name to: ${options.packageName}`);
95
+ transformed.name = options.packageName;
96
+ }
97
+ return transformed;
98
+ }
99
+ function writePackageJson(filePath, pkg) {
100
+ fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
101
+ }
102
+
103
+ //# sourceMappingURL=package-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/ast/package-json.ts"],"sourcesContent":["import * as fs from 'fs'\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { getDbPackageName, getStoragePackageName } from './adapter-config.js'\nimport { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js'\n\ntype PackageJsonTransformOptions = {\n databaseAdapter?: DatabaseAdapter\n packageName?: string\n removeSharp?: boolean\n storageAdapter?: StorageAdapter\n}\n\ntype PackageJsonStructure = {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n}\n\n/**\n * Main orchestration function\n */\nexport function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void {\n debug(`[AST] Updating package.json: ${filePath}`)\n\n // Phase 1: Detection\n const pkg = parsePackageJson(filePath)\n\n // Phase 2: Transformation\n const transformed = transformPackageJson(pkg, options)\n\n // Phase 3: Modification\n writePackageJson(filePath, transformed)\n\n debug('[AST] ✓ package.json updated successfully')\n}\n\n// Helper functions\n\nfunction parsePackageJson(filePath: string): PackageJsonStructure {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content)\n}\n\n/**\n * Transforms the package.json based upon provided options\n */\nfunction transformPackageJson(\n pkg: PackageJsonStructure,\n options: PackageJsonTransformOptions,\n): PackageJsonStructure {\n const transformed = { ...pkg }\n\n // Update database adapter\n if (options.databaseAdapter) {\n debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_DATABASE_ADAPTERS.forEach((adapter) => {\n const pkgName = getDbPackageName(adapter)\n if (transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n delete transformed.dependencies![pkgName]\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new adapter\n const dbAdapterPackageName = getDbPackageName(options.databaseAdapter)\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[dbAdapterPackageName] = payloadVersion\n\n debug(`[AST] Added adapter package: ${dbAdapterPackageName}`)\n }\n\n // Update storage adapter\n if (options.storageAdapter) {\n debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_STORAGE_ADAPTERS.forEach((adapter) => {\n const pkgName = getStoragePackageName(adapter)\n if (pkgName && transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n if (pkgName) {\n delete transformed.dependencies![pkgName]\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new storage adapter (if not localDisk)\n const storagePackageName = getStoragePackageName(options.storageAdapter)\n if (storagePackageName) {\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[storagePackageName] = payloadVersion\n debug(`[AST] Added storage adapter package: ${storagePackageName}`)\n } else {\n debug(`[AST] Storage adapter is localDisk, no package needed`)\n }\n }\n\n // Remove sharp\n if (options.removeSharp && transformed.dependencies) {\n transformed.dependencies = { ...transformed.dependencies }\n if (transformed.dependencies.sharp) {\n delete transformed.dependencies.sharp\n debug('[AST] Removed sharp dependency')\n } else {\n debug('[AST] Sharp dependency not found (already absent)')\n }\n }\n\n // Update package name\n if (options.packageName) {\n debug(`[AST] Updated package name to: ${options.packageName}`)\n transformed.name = options.packageName\n }\n\n return transformed\n}\n\nfunction writePackageJson(filePath: string, pkg: PackageJsonStructure): void {\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n')\n}\n"],"names":["fs","debug","getDbPackageName","getStoragePackageName","ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS","updatePackageJson","filePath","options","pkg","parsePackageJson","transformed","transformPackageJson","writePackageJson","content","readFileSync","JSON","parse","databaseAdapter","dependencies","removedAdapters","forEach","adapter","pkgName","push","length","join","dbAdapterPackageName","payloadVersion","payload","storageAdapter","storagePackageName","removeSharp","sharp","packageName","name","writeFileSync","stringify"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { updatePackageJson } from './package-json';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ describe('updatePackageJson', ()=>{
6
+ let tempDir;
7
+ beforeEach(()=>{
8
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'));
9
+ });
10
+ afterEach(()=>{
11
+ fs.rmSync(tempDir, {
12
+ recursive: true,
13
+ force: true
14
+ });
15
+ });
16
+ it('updates database dependencies', ()=>{
17
+ const pkgPath = path.join(tempDir, 'package.json');
18
+ const originalPkg = {
19
+ name: 'test-app',
20
+ dependencies: {
21
+ '@payloadcms/db-mongodb': '^3.0.0',
22
+ payload: '^3.0.0'
23
+ }
24
+ };
25
+ fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
26
+ updatePackageJson(pkgPath, {
27
+ databaseAdapter: 'postgres'
28
+ });
29
+ const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
30
+ expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined();
31
+ expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined();
32
+ });
33
+ it('removes sharp when requested', ()=>{
34
+ const pkgPath = path.join(tempDir, 'package.json');
35
+ const originalPkg = {
36
+ name: 'test-app',
37
+ dependencies: {
38
+ payload: '^3.0.0',
39
+ sharp: '^0.33.0'
40
+ }
41
+ };
42
+ fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
43
+ updatePackageJson(pkgPath, {
44
+ removeSharp: true
45
+ });
46
+ const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
47
+ expect(updated.dependencies.sharp).toBeUndefined();
48
+ });
49
+ it('updates package name', ()=>{
50
+ const pkgPath = path.join(tempDir, 'package.json');
51
+ const originalPkg = {
52
+ name: 'template-name',
53
+ dependencies: {
54
+ payload: '^3.0.0'
55
+ }
56
+ };
57
+ fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
58
+ updatePackageJson(pkgPath, {
59
+ packageName: 'my-new-app'
60
+ });
61
+ const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
62
+ expect(updated.name).toBe('my-new-app');
63
+ });
64
+ });
65
+
66
+ //# sourceMappingURL=package-json.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/ast/package-json.spec.ts"],"sourcesContent":["import { updatePackageJson } from './package-json'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('updatePackageJson', () => {\n let tempDir: string\n\n beforeEach(() => {\n tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'))\n })\n\n afterEach(() => {\n fs.rmSync(tempDir, { recursive: true, force: true })\n })\n\n it('updates database dependencies', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n '@payloadcms/db-mongodb': '^3.0.0',\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n databaseAdapter: 'postgres',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined()\n expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined()\n })\n\n it('removes sharp when requested', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'test-app',\n dependencies: {\n payload: '^3.0.0',\n sharp: '^0.33.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n removeSharp: true,\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.dependencies.sharp).toBeUndefined()\n })\n\n it('updates package name', () => {\n const pkgPath = path.join(tempDir, 'package.json')\n const originalPkg = {\n name: 'template-name',\n dependencies: {\n payload: '^3.0.0',\n },\n }\n fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2))\n\n updatePackageJson(pkgPath, {\n packageName: 'my-new-app',\n })\n\n const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n expect(updated.name).toBe('my-new-app')\n })\n})\n"],"names":["updatePackageJson","fs","path","os","describe","tempDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","it","pkgPath","originalPkg","name","dependencies","payload","writeFileSync","JSON","stringify","databaseAdapter","updated","parse","readFileSync","expect","toBeDefined","toBeUndefined","sharp","removeSharp","packageName","toBe"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,iBAAgB;AAClD,YAAYC,QAAQ,KAAI;AACxB,YAAYC,UAAU,OAAM;AAC5B,YAAYC,QAAQ,KAAI;AAExBC,SAAS,qBAAqB;IAC5B,IAAIC;IAEJC,WAAW;QACTD,UAAUJ,GAAGM,WAAW,CAACL,KAAKM,IAAI,CAACL,GAAGM,MAAM,IAAI;IAClD;IAEAC,UAAU;QACRT,GAAGU,MAAM,CAACN,SAAS;YAAEO,WAAW;YAAMC,OAAO;QAAK;IACpD;IAEAC,GAAG,iCAAiC;QAClC,MAAMC,UAAUb,KAAKM,IAAI,CAACH,SAAS;QACnC,MAAMW,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZ,0BAA0B;gBAC1BC,SAAS;YACX;QACF;QACAlB,GAAGmB,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DhB,kBAAkBe,SAAS;YACzBQ,iBAAiB;QACnB;QAEA,MAAMC,UAAUH,KAAKI,KAAK,CAACxB,GAAGyB,YAAY,CAACX,SAAS;QACpDY,OAAOH,QAAQN,YAAY,CAAC,0BAA0B,EAAEU,WAAW;QACnED,OAAOH,QAAQN,YAAY,CAAC,yBAAyB,EAAEW,aAAa;IACtE;IAEAf,GAAG,gCAAgC;QACjC,MAAMC,UAAUb,KAAKM,IAAI,CAACH,SAAS;QACnC,MAAMW,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;gBACTW,OAAO;YACT;QACF;QACA7B,GAAGmB,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DhB,kBAAkBe,SAAS;YACzBgB,aAAa;QACf;QAEA,MAAMP,UAAUH,KAAKI,KAAK,CAACxB,GAAGyB,YAAY,CAACX,SAAS;QACpDY,OAAOH,QAAQN,YAAY,CAACY,KAAK,EAAED,aAAa;IAClD;IAEAf,GAAG,wBAAwB;QACzB,MAAMC,UAAUb,KAAKM,IAAI,CAACH,SAAS;QACnC,MAAMW,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;YACX;QACF;QACAlB,GAAGmB,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DhB,kBAAkBe,SAAS;YACzBiB,aAAa;QACf;QAEA,MAAMR,UAAUH,KAAKI,KAAK,CAACxB,GAAGyB,YAAY,CAACX,SAAS;QACpDY,OAAOH,QAAQP,IAAI,EAAEgB,IAAI,CAAC;IAC5B;AACF"}
@@ -0,0 +1,23 @@
1
+ import { type SourceFile } from 'ts-morph';
2
+ import type { ConfigureOptions, DatabaseAdapter, DetectionResult, StorageAdapter, TransformationResult, WriteOptions, WriteResult } from './types.js';
3
+ export declare function detectPayloadConfigStructure(sourceFile: SourceFile): DetectionResult;
4
+ export declare function addDatabaseAdapter({ adapter, envVarName, sourceFile, }: {
5
+ adapter: DatabaseAdapter;
6
+ envVarName?: string;
7
+ sourceFile: SourceFile;
8
+ }): TransformationResult;
9
+ export declare function addStorageAdapter({ adapter, sourceFile, }: {
10
+ adapter: StorageAdapter;
11
+ sourceFile: SourceFile;
12
+ }): TransformationResult;
13
+ export declare function removeSharp(sourceFile: SourceFile): TransformationResult;
14
+ /** This shouldn't be necessary once the templates are updated. Can't hurt to keep in, though */
15
+ export declare function removeCommentMarkers(sourceFile: SourceFile): SourceFile;
16
+ /**
17
+ * Validates payload config structure has required elements after transformation.
18
+ * Checks that buildConfig() call exists and has a db property configured.
19
+ */
20
+ export declare function validateStructure(sourceFile: SourceFile): WriteResult;
21
+ export declare function writeTransformedFile(sourceFile: SourceFile, options?: WriteOptions): Promise<WriteResult>;
22
+ export declare function configurePayloadConfig(filePath: string, options?: ConfigureOptions): Promise<WriteResult>;
23
+ //# sourceMappingURL=payload-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-config.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/payload-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,UAAU,EAAc,MAAM,UAAU,CAAA;AAE1E,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,eAAe,EAEf,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACZ,MAAM,YAAY,CAAA;AAWnB,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,UAAU,GAAG,eAAe,CA4JpF;AAED,wBAAgB,kBAAkB,CAAC,EACjC,OAAO,EACP,UAA2B,EAC3B,UAAU,GACX,EAAE;IACD,OAAO,EAAE,eAAe,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,UAAU,CAAA;CACvB,GAAG,oBAAoB,CA+HvB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,UAAU,GACX,EAAE;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,UAAU,EAAE,UAAU,CAAA;CACvB,GAAG,oBAAoB,CA0JvB;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,oBAAoB,CAkExE;AAED,gGAAgG;AAChG,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAoBvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW,CA+BrE;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAsDtB;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAyItB"}