create-payload-app 4.0.0-canary.30 → 4.0.0-canary.32
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.
|
@@ -264,6 +264,7 @@ export default buildConfig({
|
|
|
264
264
|
type: 'postgres',
|
|
265
265
|
envVarName: 'DATABASE_URL'
|
|
266
266
|
},
|
|
267
|
+
formatWithPrettier: false,
|
|
267
268
|
storage: 'vercelBlobStorage'
|
|
268
269
|
});
|
|
269
270
|
expect(result.success).toBe(true);
|
|
@@ -284,7 +285,8 @@ export default buildConfig({
|
|
|
284
285
|
db: {
|
|
285
286
|
type: 'mongodb',
|
|
286
287
|
envVarName: 'MONGO_URL'
|
|
287
|
-
}
|
|
288
|
+
},
|
|
289
|
+
formatWithPrettier: false
|
|
288
290
|
});
|
|
289
291
|
expect(result.success).toBe(true);
|
|
290
292
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
@@ -304,6 +306,7 @@ export default buildConfig({
|
|
|
304
306
|
})`);
|
|
305
307
|
const { configurePayloadConfig } = await import('./payload-config');
|
|
306
308
|
const result = await configurePayloadConfig(filePath, {
|
|
309
|
+
formatWithPrettier: false,
|
|
307
310
|
removeSharp: true
|
|
308
311
|
});
|
|
309
312
|
expect(result.success).toBe(true);
|
|
@@ -350,7 +353,8 @@ export default buildConfig({
|
|
|
350
353
|
db: {
|
|
351
354
|
type: 'postgres',
|
|
352
355
|
envVarName: 'DATABASE_URL'
|
|
353
|
-
}
|
|
356
|
+
},
|
|
357
|
+
formatWithPrettier: false
|
|
354
358
|
});
|
|
355
359
|
expect(result.success).toBe(true);
|
|
356
360
|
// Verify config was updated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/ast/payload-config.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { Project } from 'ts-morph'\nimport {\n addDatabaseAdapter,\n addStorageAdapter,\n detectPayloadConfigStructure,\n removeSharp,\n} from './payload-config'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('detectPayloadConfigStructure', () => {\n it('successfully detects buildConfig call', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n plugins: []\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('fails when buildConfig call not found', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('payload.config.ts', `export default {}`)\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n expect(result.error?.technicalDetails).toContain('CallExpression')\n })\n\n it('detects buildConfig in variable declaration', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst config = buildConfig({\n db: mongooseAdapter({ url: '' })\n})\n\nexport default config`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects import alias edge case', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig as createConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default createConfig({\n db: mongooseAdapter({ url: '' }),\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasImportAlias).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects multiple buildConfig calls', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst helper = buildConfig({ collections: [] })\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.multipleBuildConfigCalls).toBe(true)\n })\n\n it('detects other Payload imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig, CollectionConfig } from 'payload'\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasOtherPayloadImports).toBe(true)\n })\n})\n\ndescribe('addDatabaseAdapter', () => {\n it.each([\n {\n adapter: 'mongodb' as const,\n adapterName: 'mongooseAdapter',\n packageName: '@payloadcms/db-mongodb',\n },\n {\n adapter: 'postgres' as const,\n adapterName: 'postgresAdapter',\n packageName: '@payloadcms/db-postgres',\n },\n ])('adds $adapter adapter with import and config', ({ adapter, adapterName, packageName }) => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter,\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n\n const text = sourceFile.getText()\n expect(text).toMatch(\n new RegExp(`import.*${adapterName}.*from.*${packageName.replace('/', '\\\\/')}`),\n )\n expect(text).toContain(`db: ${adapterName}`)\n expect(text).toContain('process.env.DATABASE_URL')\n })\n\n it('replaces existing db adapter', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter: 'postgres',\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*postgresAdapter.*from.*@payloadcms\\/db-postgres/)\n expect(text).toContain('db: postgresAdapter')\n expect(text).not.toContain('mongooseAdapter')\n expect(text).not.toContain('@payloadcms/db-mongodb')\n })\n})\n\ndescribe('addStorageAdapter', () => {\n it('adds vercelBlobStorage adapter to plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'vercelBlobStorage' })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*vercelBlobStorage.*from.*@payloadcms\\/storage-vercel-blob/)\n expect(text).toContain('vercelBlobStorage(')\n })\n\n it('creates plugins array if missing', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'r2Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('plugins: [')\n expect(text).toContain('r2Storage(')\n })\n\n it('adds to existing plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: [\n someOtherPlugin()\n ]\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 's3Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('someOtherPlugin()')\n expect(text).toContain('s3Storage(')\n })\n})\n\ndescribe('removeSharp', () => {\n it('removes sharp import and property', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\n\nexport default buildConfig({\n sharp,\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n const text = sourceFile.getText()\n expect(text).not.toContain(\"import sharp from 'sharp'\")\n expect(text).not.toContain('sharp,')\n })\n\n it('does nothing if sharp not present', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(false)\n })\n})\n\ndescribe('configurePayloadConfig', () => {\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('applies all transformations in one call (db + storage)', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n storage: 'vercelBlobStorage',\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('vercelBlobStorage')\n expect(content).toContain('DATABASE_URL')\n })\n\n it('applies db transformation only', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'mongodb', envVarName: 'MONGO_URL' },\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('mongooseAdapter')\n expect(content).toContain('MONGO_URL')\n })\n\n it('applies removeSharp transformation', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n sharp,\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n removeSharp: true,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).not.toContain(\"import sharp from 'sharp'\")\n expect(content).not.toContain('sharp,')\n })\n\n it('handles transformation errors gracefully', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `export default {}`, // Invalid structure\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n })\n\n it('handles file not found error', async () => {\n const filePath = path.join(tempDir, 'nonexistent.ts')\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error).toBeDefined()\n })\n\n it('replaces adapter in config file', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: process.env.DATABASE_URL || '' }),\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(true)\n\n // Verify config was updated\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('@payloadcms/db-postgres')\n expect(content).not.toContain('mongooseAdapter')\n expect(content).not.toContain('@payloadcms/db-mongodb')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","Project","addDatabaseAdapter","addStorageAdapter","detectPayloadConfigStructure","removeSharp","fs","path","os","project","useInMemoryFileSystem","sourceFile","createSourceFile","result","success","toBe","structures","buildConfigCall","toBeDefined","error","userMessage","toContain","technicalDetails","edgeCases","hasImportAlias","multipleBuildConfigCalls","hasOtherPayloadImports","each","adapter","adapterName","packageName","envVarName","modified","modifications","length","toBeGreaterThan","text","getText","toMatch","RegExp","replace","not","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","filePath","writeFileSync","configurePayloadConfig","db","type","storage","content","readFileSync"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,SAAS,QAAQ,SAAQ;AACpE,SAASC,OAAO,QAAQ,WAAU;AAClC,SACEC,kBAAkB,EAClBC,iBAAiB,EACjBC,4BAA4B,EAC5BC,WAAW,QACN,mBAAkB;AACzB,YAAYC,QAAQ,KAAI;AACxB,YAAYC,UAAU,OAAM;AAC5B,YAAYC,QAAQ,KAAI;AAExBZ,SAAS,gCAAgC;IACvCC,GAAG,yCAAyC;QAC1C,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;EAKL,CAAC;QAGC,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOG,UAAU,EAAEC,iBAAiBC,WAAW;IACxD;IAEArB,GAAG,yCAAyC;QAC1C,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CAAC,qBAAqB,CAAC,iBAAiB,CAAC;QAEpF,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOM,KAAK,EAAEC,aAAaC,SAAS,CAAC;QAC5CvB,OAAOe,OAAOM,KAAK,EAAEG,kBAAkBD,SAAS,CAAC;IACnD;IAEAxB,GAAG,+CAA+C;QAChD,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;qBAMc,CAAC;QAGlB,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOG,UAAU,EAAEC,iBAAiBC,WAAW;IACxD;IAEArB,GAAG,kCAAkC;QACnC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOU,SAAS,EAAEC,gBAAgBT,IAAI,CAAC;QAC9CjB,OAAOe,OAAOG,UAAU,EAAEC,iBAAiBC,WAAW;IACxD;IAEArB,GAAG,sCAAsC;QACvC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOU,SAAS,EAAEE,0BAA0BV,IAAI,CAAC;IAC1D;IAEAlB,GAAG,iCAAiC;QAClC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;EAIL,CAAC;QAGC,MAAMC,SAAST,6BAA6BO;QAE5Cb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOU,SAAS,EAAEG,wBAAwBX,IAAI,CAAC;IACxD;AACF;AAEAnB,SAAS,sBAAsB;IAC7BC,GAAG8B,IAAI,CAAC;QACN;YACEC,SAAS;YACTC,aAAa;YACbC,aAAa;QACf;QACA;YACEF,SAAS;YACTC,aAAa;YACbC,aAAa;QACf;KACD,EAAE,gDAAgD,CAAC,EAAEF,OAAO,EAAEC,WAAW,EAAEC,WAAW,EAAE;QACvF,MAAMrB,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;EAIL,CAAC;QAGC,MAAMC,SAASX,mBAAmB;YAChCS;YACAiB;YACAG,YAAY;QACd;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOmB,QAAQ,EAAEjB,IAAI,CAAC;QAC7BjB,OAAOe,OAAOoB,aAAa,CAACC,MAAM,EAAEC,eAAe,CAAC;QAEpD,MAAMC,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAME,OAAO,CAClB,IAAIC,OAAO,CAAC,QAAQ,EAAEV,YAAY,QAAQ,EAAEC,YAAYU,OAAO,CAAC,KAAK,QAAQ;QAE/E1C,OAAOsC,MAAMf,SAAS,CAAC,CAAC,IAAI,EAAEQ,aAAa;QAC3C/B,OAAOsC,MAAMf,SAAS,CAAC;IACzB;IAEAxB,GAAG,gCAAgC;QACjC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAMC,SAASX,mBAAmB;YAChCS;YACAiB,SAAS;YACTG,YAAY;QACd;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5B,MAAMqB,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAME,OAAO,CAAC;QACrBxC,OAAOsC,MAAMf,SAAS,CAAC;QACvBvB,OAAOsC,MAAMK,GAAG,CAACpB,SAAS,CAAC;QAC3BvB,OAAOsC,MAAMK,GAAG,CAACpB,SAAS,CAAC;IAC7B;AACF;AAEAzB,SAAS,qBAAqB;IAC5BC,GAAG,mDAAmD;QACpD,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;EAIL,CAAC;QAGC,MAAMC,SAASV,kBAAkB;YAAEQ;YAAYiB,SAAS;QAAoB;QAE5E9B,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOmB,QAAQ,EAAEjB,IAAI,CAAC;QAC7B,MAAMqB,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAME,OAAO,CAAC;QACrBxC,OAAOsC,MAAMf,SAAS,CAAC;IACzB;IAEAxB,GAAG,oCAAoC;QACrC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;EAIL,CAAC;QAGC,MAAMC,SAASV,kBAAkB;YAAEQ;YAAYiB,SAAS;QAAY;QAEpE9B,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5B,MAAMqB,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAMf,SAAS,CAAC;QACvBvB,OAAOsC,MAAMf,SAAS,CAAC;IACzB;IAEAxB,GAAG,kCAAkC;QACnC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAMC,SAASV,kBAAkB;YAAEQ;YAAYiB,SAAS;QAAY;QAEpE9B,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5B,MAAMqB,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAMf,SAAS,CAAC;QACvBvB,OAAOsC,MAAMf,SAAS,CAAC;IACzB;AACF;AAEAzB,SAAS,eAAe;IACtBC,GAAG,qCAAqC;QACtC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAMC,SAASR,YAAYM;QAE3Bb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOmB,QAAQ,EAAEjB,IAAI,CAAC;QAC7BjB,OAAOe,OAAOoB,aAAa,CAACC,MAAM,EAAEC,eAAe,CAAC;QACpD,MAAMC,OAAOzB,WAAW0B,OAAO;QAC/BvC,OAAOsC,MAAMK,GAAG,CAACpB,SAAS,CAAC;QAC3BvB,OAAOsC,MAAMK,GAAG,CAACpB,SAAS,CAAC;IAC7B;IAEAxB,GAAG,qCAAqC;QACtC,MAAMY,UAAU,IAAIR,QAAQ;YAAES,uBAAuB;QAAK;QAC1D,MAAMC,aAAaF,QAAQG,gBAAgB,CACzC,qBACA,CAAC;;;;EAIL,CAAC;QAGC,MAAMC,SAASR,YAAYM;QAE3Bb,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOmB,QAAQ,EAAEjB,IAAI,CAAC;IAC/B;AACF;AAEAnB,SAAS,0BAA0B;IACjC,IAAI8C;IAEJ3C,WAAW;QACT2C,UAAUpC,GAAGqC,WAAW,CAACpC,KAAKqC,IAAI,CAACpC,GAAGqC,MAAM,IAAI;IAClD;IAEA7C,UAAU;QACRM,GAAGwC,MAAM,CAACJ,SAAS;YAAEK,WAAW;YAAMC,OAAO;QAAK;IACpD;IAEAnD,GAAG,0DAA0D;QAC3D,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QACpCpC,GAAG4C,aAAa,CACdD,UACA,CAAC;;;;EAIL,CAAC;QAGC,MAAM,EAAEE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpDG,IAAI;gBAAEC,MAAM;gBAAYtB,YAAY;YAAe;YACnDuB,SAAS;QACX;QAEAxD,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAE5B,MAAMwC,UAAUjD,GAAGkD,YAAY,CAACP,UAAU;QAC1CnD,OAAOyD,SAASlC,SAAS,CAAC;QAC1BvB,OAAOyD,SAASlC,SAAS,CAAC;QAC1BvB,OAAOyD,SAASlC,SAAS,CAAC;IAC5B;IAEAxB,GAAG,kCAAkC;QACnC,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QACpCpC,GAAG4C,aAAa,CACdD,UACA,CAAC;;;;EAIL,CAAC;QAGC,MAAM,EAAEE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpDG,IAAI;gBAAEC,MAAM;gBAAWtB,YAAY;YAAY;QACjD;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAE5B,MAAMwC,UAAUjD,GAAGkD,YAAY,CAACP,UAAU;QAC1CnD,OAAOyD,SAASlC,SAAS,CAAC;QAC1BvB,OAAOyD,SAASlC,SAAS,CAAC;IAC5B;IAEAxB,GAAG,sCAAsC;QACvC,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QACpCpC,GAAG4C,aAAa,CACdD,UACA,CAAC;;;;;;;;EAQL,CAAC;QAGC,MAAM,EAAEE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpD5C,aAAa;QACf;QAEAP,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAE5B,MAAMwC,UAAUjD,GAAGkD,YAAY,CAACP,UAAU;QAC1CnD,OAAOyD,SAASd,GAAG,CAACpB,SAAS,CAAC;QAC9BvB,OAAOyD,SAASd,GAAG,CAACpB,SAAS,CAAC;IAChC;IAEAxB,GAAG,4CAA4C;QAC7C,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QACpCpC,GAAG4C,aAAa,CACdD,UACA,CAAC,iBAAiB,CAAC;QAGrB,MAAM,EAAEE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpDG,IAAI;gBAAEC,MAAM;gBAAYtB,YAAY;YAAe;QACrD;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOM,KAAK,EAAEC,aAAaC,SAAS,CAAC;IAC9C;IAEAxB,GAAG,gCAAgC;QACjC,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QAEpC,MAAM,EAAES,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpDG,IAAI;gBAAEC,MAAM;gBAAYtB,YAAY;YAAe;QACrD;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAC5BjB,OAAOe,OAAOM,KAAK,EAAED,WAAW;IAClC;IAEArB,GAAG,mCAAmC;QACpC,MAAMoD,WAAW1C,KAAKqC,IAAI,CAACF,SAAS;QACpCpC,GAAG4C,aAAa,CACdD,UACA,CAAC;;;;;;EAML,CAAC;QAGC,MAAM,EAAEE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC;QAChD,MAAMtC,SAAS,MAAMsC,uBAAuBF,UAAU;YACpDG,IAAI;gBAAEC,MAAM;gBAAYtB,YAAY;YAAe;QACrD;QAEAjC,OAAOe,OAAOC,OAAO,EAAEC,IAAI,CAAC;QAE5B,4BAA4B;QAC5B,MAAMwC,UAAUjD,GAAGkD,YAAY,CAACP,UAAU;QAC1CnD,OAAOyD,SAASlC,SAAS,CAAC;QAC1BvB,OAAOyD,SAASlC,SAAS,CAAC;QAC1BvB,OAAOyD,SAASd,GAAG,CAACpB,SAAS,CAAC;QAC9BvB,OAAOyD,SAASd,GAAG,CAACpB,SAAS,CAAC;IAChC;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/ast/payload-config.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { Project } from 'ts-morph'\nimport {\n addDatabaseAdapter,\n addStorageAdapter,\n detectPayloadConfigStructure,\n removeSharp,\n} from './payload-config'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\ndescribe('detectPayloadConfigStructure', () => {\n it('successfully detects buildConfig call', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n plugins: []\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('fails when buildConfig call not found', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile('payload.config.ts', `export default {}`)\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n expect(result.error?.technicalDetails).toContain('CallExpression')\n })\n\n it('detects buildConfig in variable declaration', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst config = buildConfig({\n db: mongooseAdapter({ url: '' })\n})\n\nexport default config`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects import alias edge case', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig as createConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default createConfig({\n db: mongooseAdapter({ url: '' }),\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasImportAlias).toBe(true)\n expect(result.structures?.buildConfigCall).toBeDefined()\n })\n\n it('detects multiple buildConfig calls', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nconst helper = buildConfig({ collections: [] })\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.multipleBuildConfigCalls).toBe(true)\n })\n\n it('detects other Payload imports', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig, CollectionConfig } from 'payload'\n\nexport default buildConfig({\n collections: [],\n})`,\n )\n\n const result = detectPayloadConfigStructure(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.edgeCases?.hasOtherPayloadImports).toBe(true)\n })\n})\n\ndescribe('addDatabaseAdapter', () => {\n it.each([\n {\n adapter: 'mongodb' as const,\n adapterName: 'mongooseAdapter',\n packageName: '@payloadcms/db-mongodb',\n },\n {\n adapter: 'postgres' as const,\n adapterName: 'postgresAdapter',\n packageName: '@payloadcms/db-postgres',\n },\n ])('adds $adapter adapter with import and config', ({ adapter, adapterName, packageName }) => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter,\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n\n const text = sourceFile.getText()\n expect(text).toMatch(\n new RegExp(`import.*${adapterName}.*from.*${packageName.replace('/', '\\\\/')}`),\n )\n expect(text).toContain(`db: ${adapterName}`)\n expect(text).toContain('process.env.DATABASE_URL')\n })\n\n it('replaces existing db adapter', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n collections: []\n})`,\n )\n\n const result = addDatabaseAdapter({\n sourceFile,\n adapter: 'postgres',\n envVarName: 'DATABASE_URL',\n })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*postgresAdapter.*from.*@payloadcms\\/db-postgres/)\n expect(text).toContain('db: postgresAdapter')\n expect(text).not.toContain('mongooseAdapter')\n expect(text).not.toContain('@payloadcms/db-mongodb')\n })\n})\n\ndescribe('addStorageAdapter', () => {\n it('adds vercelBlobStorage adapter to plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'vercelBlobStorage' })\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n const text = sourceFile.getText()\n expect(text).toMatch(/import.*vercelBlobStorage.*from.*@payloadcms\\/storage-vercel-blob/)\n expect(text).toContain('vercelBlobStorage(')\n })\n\n it('creates plugins array if missing', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 'r2Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('plugins: [')\n expect(text).toContain('r2Storage(')\n })\n\n it('adds to existing plugins array', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n plugins: [\n someOtherPlugin()\n ]\n})`,\n )\n\n const result = addStorageAdapter({ sourceFile, adapter: 's3Storage' })\n\n expect(result.success).toBe(true)\n const text = sourceFile.getText()\n expect(text).toContain('someOtherPlugin()')\n expect(text).toContain('s3Storage(')\n })\n})\n\ndescribe('removeSharp', () => {\n it('removes sharp import and property', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\n\nexport default buildConfig({\n sharp,\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(true)\n expect(result.modifications.length).toBeGreaterThan(0)\n const text = sourceFile.getText()\n expect(text).not.toContain(\"import sharp from 'sharp'\")\n expect(text).not.toContain('sharp,')\n })\n\n it('does nothing if sharp not present', () => {\n const project = new Project({ useInMemoryFileSystem: true })\n const sourceFile = project.createSourceFile(\n 'payload.config.ts',\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const result = removeSharp(sourceFile)\n\n expect(result.success).toBe(true)\n expect(result.modified).toBe(false)\n })\n})\n\ndescribe('configurePayloadConfig', () => {\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('applies all transformations in one call (db + storage)', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n formatWithPrettier: false,\n storage: 'vercelBlobStorage',\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('vercelBlobStorage')\n expect(content).toContain('DATABASE_URL')\n })\n\n it('applies db transformation only', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\n\nexport default buildConfig({\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'mongodb', envVarName: 'MONGO_URL' },\n formatWithPrettier: false,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('mongooseAdapter')\n expect(content).toContain('MONGO_URL')\n })\n\n it('applies removeSharp transformation', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport sharp from 'sharp'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: '' }),\n sharp,\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n formatWithPrettier: false,\n removeSharp: true,\n })\n\n expect(result.success).toBe(true)\n\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).not.toContain(\"import sharp from 'sharp'\")\n expect(content).not.toContain('sharp,')\n })\n\n it('handles transformation errors gracefully', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `export default {}`, // Invalid structure\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error?.userMessage).toContain('buildConfig')\n })\n\n it('handles file not found error', async () => {\n const filePath = path.join(tempDir, 'nonexistent.ts')\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n })\n\n expect(result.success).toBe(false)\n expect(result.error).toBeDefined()\n })\n\n it('replaces adapter in config file', async () => {\n const filePath = path.join(tempDir, 'payload.config.ts')\n fs.writeFileSync(\n filePath,\n `import { buildConfig } from 'payload'\nimport { mongooseAdapter } from '@payloadcms/db-mongodb'\n\nexport default buildConfig({\n db: mongooseAdapter({ url: process.env.DATABASE_URL || '' }),\n collections: []\n})`,\n )\n\n const { configurePayloadConfig } = await import('./payload-config')\n const result = await configurePayloadConfig(filePath, {\n db: { type: 'postgres', envVarName: 'DATABASE_URL' },\n formatWithPrettier: false,\n })\n\n expect(result.success).toBe(true)\n\n // Verify config was updated\n const content = fs.readFileSync(filePath, 'utf-8')\n expect(content).toContain('postgresAdapter')\n expect(content).toContain('@payloadcms/db-postgres')\n expect(content).not.toContain('mongooseAdapter')\n expect(content).not.toContain('@payloadcms/db-mongodb')\n })\n})\n"],"names":["describe","it","expect","beforeEach","afterEach","Project","addDatabaseAdapter","addStorageAdapter","detectPayloadConfigStructure","removeSharp","fs","path","os","project","useInMemoryFileSystem","sourceFile","createSourceFile","result","success","toBe","structures","buildConfigCall","toBeDefined","error","userMessage","toContain","technicalDetails","edgeCases","hasImportAlias","multipleBuildConfigCalls","hasOtherPayloadImports","each","adapter","adapterName","packageName","envVarName","modified","modifications","length","toBeGreaterThan","text","getText","toMatch","RegExp","replace","not","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","filePath","writeFileSync","configurePayloadConfig","db","type","formatWithPrettier","storage","content","readFileSync"],"mappings":"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"}
|