create-payload-app 3.91.0-internal.c1569dc → 4.0.0-beta.0

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 (149) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +5 -0
  3. package/dist/commands.d.ts +4 -0
  4. package/dist/commands.d.ts.map +1 -0
  5. package/dist/commands.js +5 -0
  6. package/dist/commands.js.map +1 -0
  7. package/dist/lib/agent-config.d.ts +12 -0
  8. package/dist/lib/agent-config.d.ts.map +1 -0
  9. package/dist/lib/agent-config.js +15 -0
  10. package/dist/lib/agent-config.js.map +1 -0
  11. package/dist/lib/ast/adapter-config.d.ts.map +1 -1
  12. package/dist/lib/ast/adapter-config.js +0 -10
  13. package/dist/lib/ast/adapter-config.js.map +1 -1
  14. package/dist/lib/ast/package-json.d.ts +9 -0
  15. package/dist/lib/ast/package-json.d.ts.map +1 -1
  16. package/dist/lib/ast/package-json.js +34 -8
  17. package/dist/lib/ast/package-json.js.map +1 -1
  18. package/dist/lib/ast/payload-config.js +1 -1
  19. package/dist/lib/ast/payload-config.js.map +1 -1
  20. package/dist/lib/ast/types.d.ts +3 -3
  21. package/dist/lib/ast/types.d.ts.map +1 -1
  22. package/dist/lib/ast/types.js +0 -1
  23. package/dist/lib/ast/types.js.map +1 -1
  24. package/dist/lib/configure-payload-tsconfig.d.ts +5 -0
  25. package/dist/lib/configure-payload-tsconfig.d.ts.map +1 -0
  26. package/dist/lib/configure-payload-tsconfig.js +26 -0
  27. package/dist/lib/configure-payload-tsconfig.js.map +1 -0
  28. package/dist/lib/create-project.d.ts +1 -2
  29. package/dist/lib/create-project.d.ts.map +1 -1
  30. package/dist/lib/create-project.js +64 -79
  31. package/dist/lib/create-project.js.map +1 -1
  32. package/dist/lib/generate-secret.js +1 -1
  33. package/dist/lib/generate-secret.js.map +1 -1
  34. package/dist/lib/get-package-manager.d.ts +9 -0
  35. package/dist/lib/get-package-manager.d.ts.map +1 -1
  36. package/dist/lib/get-package-manager.js +20 -0
  37. package/dist/lib/get-package-manager.js.map +1 -1
  38. package/dist/lib/init-next.d.ts +6 -1
  39. package/dist/lib/init-next.d.ts.map +1 -1
  40. package/dist/lib/init-next.js +34 -41
  41. package/dist/lib/init-next.js.map +1 -1
  42. package/dist/lib/init-tanstack.d.ts +18 -0
  43. package/dist/lib/init-tanstack.d.ts.map +1 -0
  44. package/dist/lib/init-tanstack.js +149 -0
  45. package/dist/lib/init-tanstack.js.map +1 -0
  46. package/dist/lib/tanstack/detect.d.ts +5 -0
  47. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  48. package/dist/lib/tanstack/detect.js +131 -0
  49. package/dist/lib/tanstack/detect.js.map +1 -0
  50. package/dist/lib/tanstack/prepare.d.ts +23 -0
  51. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  52. package/dist/lib/tanstack/prepare.js +114 -0
  53. package/dist/lib/tanstack/prepare.js.map +1 -0
  54. package/dist/lib/tanstack/template-files.d.ts +50 -0
  55. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  56. package/dist/lib/tanstack/template-files.js +64 -0
  57. package/dist/lib/tanstack/template-files.js.map +1 -0
  58. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  59. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  60. package/dist/lib/tanstack/transform-root-route.js +747 -0
  61. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  62. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  63. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  64. package/dist/lib/tanstack/transform-router.js +301 -0
  65. package/dist/lib/tanstack/transform-router.js.map +1 -0
  66. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  67. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  68. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  69. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  70. package/dist/lib/templates.d.ts.map +1 -1
  71. package/dist/lib/templates.js +11 -5
  72. package/dist/lib/templates.js.map +1 -1
  73. package/dist/lib/update-payload-in-project.d.ts +18 -3
  74. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  75. package/dist/lib/update-payload-in-project.js +102 -21
  76. package/dist/lib/update-payload-in-project.js.map +1 -1
  77. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  78. package/dist/main.d.ts +20 -1
  79. package/dist/main.d.ts.map +1 -1
  80. package/dist/main.js +127 -36
  81. package/dist/main.js.map +1 -1
  82. package/dist/scripts/pack-template-files.js +18 -0
  83. package/dist/scripts/pack-template-files.js.map +1 -1
  84. package/dist/template/src/app/(frontend)/page.tsx +7 -4
  85. package/dist/template/src/app/(frontend)/styles.css +8 -1
  86. package/dist/template/src/app/(payload)/admin/[[...segments]]/not-found.tsx +1 -2
  87. package/dist/template/src/app/(payload)/admin/[[...segments]]/page.tsx +1 -2
  88. package/dist/template/src/app/(payload)/admin/importMap.js +30 -2
  89. package/dist/template/src/app/(payload)/api/[...slug]/route.ts +1 -2
  90. package/dist/template/src/app/(payload)/api/graphql/route.ts +1 -2
  91. package/dist/template/src/app/(payload)/api/graphql-playground/route.ts +1 -2
  92. package/dist/template/src/app/(payload)/custom.css +0 -0
  93. package/dist/template/src/app/(payload)/layout.tsx +9 -4
  94. package/dist/template/src/collections/Folders.ts +16 -0
  95. package/dist/template/src/collections/Media.ts +4 -0
  96. package/dist/template/src/collections/Tags.ts +16 -0
  97. package/dist/template/src/collections/Users.ts +1 -0
  98. package/dist/template/src/payload-types.ts +63 -9
  99. package/dist/template/src/payload.config.ts +14 -4
  100. package/dist/template-tanstack/routes/_payload/admin.$.tsx +25 -0
  101. package/dist/template-tanstack/routes/_payload/admin.index.tsx +25 -0
  102. package/dist/template-tanstack/routes/_payload/api.$.ts +11 -0
  103. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  104. package/dist/template-tanstack/routes/_payload/server.functions.ts +50 -0
  105. package/dist/template-tanstack/routes/_payload.tsx +29 -0
  106. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  107. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  108. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  109. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  110. package/dist/template-tanstack/src/payload.config.ts +38 -0
  111. package/dist/types.d.ts +23 -4
  112. package/dist/types.d.ts.map +1 -1
  113. package/dist/types.js.map +1 -1
  114. package/dist/utils/messages.d.ts +1 -0
  115. package/dist/utils/messages.d.ts.map +1 -1
  116. package/dist/utils/messages.js +10 -6
  117. package/dist/utils/messages.js.map +1 -1
  118. package/dist/utils/resolvePackageVersion.d.ts +35 -0
  119. package/dist/utils/resolvePackageVersion.d.ts.map +1 -0
  120. package/dist/utils/resolvePackageVersion.js +62 -0
  121. package/dist/utils/resolvePackageVersion.js.map +1 -0
  122. package/package.json +8 -8
  123. package/dist/ast-integration.spec.js +0 -132
  124. package/dist/ast-integration.spec.js.map +0 -1
  125. package/dist/lib/ast/package-json.spec.js +0 -67
  126. package/dist/lib/ast/package-json.spec.js.map +0 -1
  127. package/dist/lib/ast/payload-config.spec.js +0 -365
  128. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  129. package/dist/lib/ast/utils.spec.js +0 -226
  130. package/dist/lib/ast/utils.spec.js.map +0 -1
  131. package/dist/lib/create-project.spec.js +0 -190
  132. package/dist/lib/create-project.spec.js.map +0 -1
  133. package/dist/lib/download-skill.d.ts +0 -8
  134. package/dist/lib/download-skill.d.ts.map +0 -1
  135. package/dist/lib/download-skill.js +0 -35
  136. package/dist/lib/download-skill.js.map +0 -1
  137. package/dist/lib/manage-env-files.spec.js +0 -118
  138. package/dist/lib/manage-env-files.spec.js.map +0 -1
  139. package/dist/lib/select-agent.d.ts +0 -16
  140. package/dist/lib/select-agent.d.ts.map +0 -1
  141. package/dist/lib/select-agent.js +0 -67
  142. package/dist/lib/select-agent.js.map +0 -1
  143. package/dist/lib/wrap-next-config.spec.js +0 -167
  144. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  145. package/dist/utils/getLatestPackageVersion.d.ts +0 -17
  146. package/dist/utils/getLatestPackageVersion.d.ts.map +0 -1
  147. package/dist/utils/getLatestPackageVersion.js +0 -20
  148. package/dist/utils/getLatestPackageVersion.js.map +0 -1
  149. /package/dist/{template/src/app/(payload)/custom.scss → template-tanstack/routes/_payload/custom.css} +0 -0
@@ -1,132 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import * as fs from 'fs';
3
- import * as fse from 'fs-extra';
4
- import * as path from 'path';
5
- import * as os from 'os';
6
- import { configurePayloadConfig } from './lib/configure-payload-config';
7
- import { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './lib/ast/adapter-config';
8
- const TEST_CASES = [
9
- {
10
- name: 'blank + mongodb + localDisk',
11
- template: 'blank',
12
- dbType: 'mongodb',
13
- storageAdapter: 'localDisk'
14
- },
15
- {
16
- name: 'blank + postgres + vercelBlobStorage',
17
- template: 'blank',
18
- dbType: 'postgres',
19
- storageAdapter: 'vercelBlobStorage'
20
- },
21
- {
22
- name: 'website + mongodb + s3Storage',
23
- template: 'website',
24
- dbType: 'mongodb',
25
- storageAdapter: 's3Storage'
26
- },
27
- {
28
- name: 'website + postgres + localDisk',
29
- template: 'website',
30
- dbType: 'postgres',
31
- storageAdapter: 'localDisk'
32
- },
33
- {
34
- name: 'ecommerce + mongodb + localDisk',
35
- template: 'ecommerce',
36
- dbType: 'mongodb',
37
- storageAdapter: 'localDisk'
38
- },
39
- {
40
- name: 'ecommerce + postgres + r2Storage',
41
- template: 'ecommerce',
42
- dbType: 'postgres',
43
- storageAdapter: 'r2Storage'
44
- }
45
- ];
46
- describe('AST Integration Tests', ()=>{
47
- let tempDir;
48
- const templatesRoot = path.resolve(__dirname, '../../..', 'templates');
49
- beforeEach(()=>{
50
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-ast-integration-'));
51
- });
52
- afterEach(()=>{
53
- if (tempDir && fs.existsSync(tempDir)) {
54
- fs.rmSync(tempDir, {
55
- recursive: true,
56
- force: true
57
- });
58
- }
59
- });
60
- describe.each(TEST_CASES)('$name', ({ template, dbType, storageAdapter })=>{
61
- it('successfully applies AST transformations', async ()=>{
62
- // Setup: Copy template to temp directory
63
- const templateDir = path.join(templatesRoot, template);
64
- const testProjectDir = path.join(tempDir, template);
65
- if (!fs.existsSync(templateDir)) {
66
- throw new Error(`Template ${template} not found at ${templateDir}`);
67
- }
68
- fse.copySync(templateDir, testProjectDir);
69
- const payloadConfigPath = path.join(testProjectDir, 'src', 'payload.config.ts');
70
- const packageJsonPath = path.join(testProjectDir, 'package.json');
71
- // Verify files exist before transformation
72
- expect(fs.existsSync(payloadConfigPath)).toBe(true);
73
- expect(fs.existsSync(packageJsonPath)).toBe(true);
74
- // Apply transformations
75
- await configurePayloadConfig({
76
- dbType,
77
- storageAdapter,
78
- projectDirOrConfigPath: {
79
- projectDir: testProjectDir
80
- }
81
- });
82
- // Verify payload.config.ts transformations
83
- const configContent = fs.readFileSync(payloadConfigPath, 'utf-8');
84
- // Check database adapter import
85
- const dbConfig = DB_ADAPTER_CONFIG[dbType];
86
- expect(configContent).toContain(`from '${dbConfig.packageName}'`);
87
- expect(configContent).toContain(`import { ${dbConfig.adapterName} }`);
88
- // Check database adapter config
89
- expect(configContent).toMatch(new RegExp(`db:\\s*${dbConfig.adapterName}\\(`));
90
- // Check storage adapter if not localDisk
91
- if (storageAdapter !== 'localDisk') {
92
- const storageConfig = STORAGE_ADAPTER_CONFIG[storageAdapter];
93
- if (storageConfig.packageName && storageConfig.adapterName) {
94
- expect(configContent).toContain(`from '${storageConfig.packageName}'`);
95
- expect(configContent).toContain(`import { ${storageConfig.adapterName} }`);
96
- expect(configContent).toContain(`${storageConfig.adapterName}(`);
97
- }
98
- }
99
- // Check that old mongodb adapter is removed if we switched to postgres
100
- if (dbType === 'postgres') {
101
- expect(configContent).not.toContain('@payloadcms/db-mongodb');
102
- expect(configContent).not.toContain('mongooseAdapter');
103
- }
104
- // Check that plugins array exists if storage adapter was added
105
- if (storageAdapter !== 'localDisk') {
106
- expect(configContent).toContain('plugins:');
107
- }
108
- // Verify package.json transformations
109
- const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
110
- // Check that correct db adapter package is in dependencies
111
- expect(packageJson.dependencies[dbConfig.packageName]).toBeDefined();
112
- // Check that old db adapters are removed
113
- Object.entries(DB_ADAPTER_CONFIG).forEach(([key, config])=>{
114
- if (key !== dbType && config.packageName !== dbConfig.packageName) {
115
- expect(packageJson.dependencies[config.packageName]).toBeUndefined();
116
- }
117
- });
118
- // Note: Storage adapter dependencies are NOT automatically added to package.json
119
- // by configurePayloadConfig - only the payload.config.ts is updated.
120
- // This is expected behavior as storage adapters are typically installed separately.
121
- // Verify file is valid TypeScript (basic syntax check)
122
- expect(configContent).toContain('buildConfig');
123
- expect(configContent).toContain('export default');
124
- // Verify no placeholder comments remain
125
- expect(configContent).not.toContain('database-adapter-import');
126
- expect(configContent).not.toContain('database-adapter-config-start');
127
- expect(configContent).not.toContain('storage-adapter-placeholder');
128
- });
129
- });
130
- });
131
-
132
- //# sourceMappingURL=ast-integration.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ast-integration.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport * 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":["describe","it","expect","beforeEach","afterEach","fs","fse","path","os","configurePayloadConfig","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","TEST_CASES","name","template","dbType","storageAdapter","tempDir","templatesRoot","resolve","__dirname","mkdtempSync","join","tmpdir","existsSync","rmSync","recursive","force","each","templateDir","testProjectDir","Error","copySync","payloadConfigPath","packageJsonPath","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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"}
@@ -1,67 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { updatePackageJson } from './package-json';
3
- import * as fs from 'fs';
4
- import * as path from 'path';
5
- import * as os from 'os';
6
- describe('updatePackageJson', ()=>{
7
- let tempDir;
8
- beforeEach(()=>{
9
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'));
10
- });
11
- afterEach(()=>{
12
- fs.rmSync(tempDir, {
13
- recursive: true,
14
- force: true
15
- });
16
- });
17
- it('updates database dependencies', ()=>{
18
- const pkgPath = path.join(tempDir, 'package.json');
19
- const originalPkg = {
20
- name: 'test-app',
21
- dependencies: {
22
- '@payloadcms/db-mongodb': '^3.0.0',
23
- payload: '^3.0.0'
24
- }
25
- };
26
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
27
- updatePackageJson(pkgPath, {
28
- databaseAdapter: 'postgres'
29
- });
30
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
31
- expect(updated.dependencies['@payloadcms/db-postgres']).toBeDefined();
32
- expect(updated.dependencies['@payloadcms/db-mongodb']).toBeUndefined();
33
- });
34
- it('removes sharp when requested', ()=>{
35
- const pkgPath = path.join(tempDir, 'package.json');
36
- const originalPkg = {
37
- name: 'test-app',
38
- dependencies: {
39
- payload: '^3.0.0',
40
- sharp: '^0.33.0'
41
- }
42
- };
43
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
44
- updatePackageJson(pkgPath, {
45
- removeSharp: true
46
- });
47
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
48
- expect(updated.dependencies.sharp).toBeUndefined();
49
- });
50
- it('updates package name', ()=>{
51
- const pkgPath = path.join(tempDir, 'package.json');
52
- const originalPkg = {
53
- name: 'template-name',
54
- dependencies: {
55
- payload: '^3.0.0'
56
- }
57
- };
58
- fs.writeFileSync(pkgPath, JSON.stringify(originalPkg, null, 2));
59
- updatePackageJson(pkgPath, {
60
- packageName: 'my-new-app'
61
- });
62
- const updated = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
63
- expect(updated.name).toBe('my-new-app');
64
- });
65
- });
66
-
67
- //# sourceMappingURL=package-json.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/lib/ast/package-json.spec.ts"],"sourcesContent":["import { describe, it, expect, beforeEach, afterEach } from 'vitest'\nimport { 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":["describe","it","expect","beforeEach","afterEach","updatePackageJson","fs","path","os","tempDir","mkdtempSync","join","tmpdir","rmSync","recursive","force","pkgPath","originalPkg","name","dependencies","payload","writeFileSync","JSON","stringify","databaseAdapter","updated","parse","readFileSync","toBeDefined","toBeUndefined","sharp","removeSharp","packageName","toBe"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,EAAEC,UAAU,EAAEC,SAAS,QAAQ,SAAQ;AACpE,SAASC,iBAAiB,QAAQ,iBAAgB;AAClD,YAAYC,QAAQ,KAAI;AACxB,YAAYC,UAAU,OAAM;AAC5B,YAAYC,QAAQ,KAAI;AAExBR,SAAS,qBAAqB;IAC5B,IAAIS;IAEJN,WAAW;QACTM,UAAUH,GAAGI,WAAW,CAACH,KAAKI,IAAI,CAACH,GAAGI,MAAM,IAAI;IAClD;IAEAR,UAAU;QACRE,GAAGO,MAAM,CAACJ,SAAS;YAAEK,WAAW;YAAMC,OAAO;QAAK;IACpD;IAEAd,GAAG,iCAAiC;QAClC,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZ,0BAA0B;gBAC1BC,SAAS;YACX;QACF;QACAd,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBQ,iBAAiB;QACnB;QAEA,MAAMC,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQN,YAAY,CAAC,0BAA0B,EAAES,WAAW;QACnE1B,OAAOuB,QAAQN,YAAY,CAAC,yBAAyB,EAAEU,aAAa;IACtE;IAEA5B,GAAG,gCAAgC;QACjC,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;gBACTU,OAAO;YACT;QACF;QACAxB,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBe,aAAa;QACf;QAEA,MAAMN,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQN,YAAY,CAACW,KAAK,EAAED,aAAa;IAClD;IAEA5B,GAAG,wBAAwB;QACzB,MAAMe,UAAUT,KAAKI,IAAI,CAACF,SAAS;QACnC,MAAMQ,cAAc;YAClBC,MAAM;YACNC,cAAc;gBACZC,SAAS;YACX;QACF;QACAd,GAAGe,aAAa,CAACL,SAASM,KAAKC,SAAS,CAACN,aAAa,MAAM;QAE5DZ,kBAAkBW,SAAS;YACzBgB,aAAa;QACf;QAEA,MAAMP,UAAUH,KAAKI,KAAK,CAACpB,GAAGqB,YAAY,CAACX,SAAS;QACpDd,OAAOuB,QAAQP,IAAI,EAAEe,IAAI,CAAC;IAC5B;AACF"}
@@ -1,365 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { Project } from 'ts-morph';
3
- import { addDatabaseAdapter, addStorageAdapter, detectPayloadConfigStructure, removeSharp } from './payload-config';
4
- import * as fs from 'fs';
5
- import * as path from 'path';
6
- import * as os from 'os';
7
- describe('detectPayloadConfigStructure', ()=>{
8
- it('successfully detects buildConfig call', ()=>{
9
- const project = new Project({
10
- useInMemoryFileSystem: true
11
- });
12
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
13
-
14
- export default buildConfig({
15
- db: mongooseAdapter({ url: '' }),
16
- plugins: []
17
- })`);
18
- const result = detectPayloadConfigStructure(sourceFile);
19
- expect(result.success).toBe(true);
20
- expect(result.structures?.buildConfigCall).toBeDefined();
21
- });
22
- it('fails when buildConfig call not found', ()=>{
23
- const project = new Project({
24
- useInMemoryFileSystem: true
25
- });
26
- const sourceFile = project.createSourceFile('payload.config.ts', `export default {}`);
27
- const result = detectPayloadConfigStructure(sourceFile);
28
- expect(result.success).toBe(false);
29
- expect(result.error?.userMessage).toContain('buildConfig');
30
- expect(result.error?.technicalDetails).toContain('CallExpression');
31
- });
32
- it('detects buildConfig in variable declaration', ()=>{
33
- const project = new Project({
34
- useInMemoryFileSystem: true
35
- });
36
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
37
-
38
- const config = buildConfig({
39
- db: mongooseAdapter({ url: '' })
40
- })
41
-
42
- export default config`);
43
- const result = detectPayloadConfigStructure(sourceFile);
44
- expect(result.success).toBe(true);
45
- expect(result.structures?.buildConfigCall).toBeDefined();
46
- });
47
- it('detects import alias edge case', ()=>{
48
- const project = new Project({
49
- useInMemoryFileSystem: true
50
- });
51
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig as createConfig } from 'payload'
52
- import { mongooseAdapter } from '@payloadcms/db-mongodb'
53
-
54
- export default createConfig({
55
- db: mongooseAdapter({ url: '' }),
56
- collections: [],
57
- })`);
58
- const result = detectPayloadConfigStructure(sourceFile);
59
- expect(result.success).toBe(true);
60
- expect(result.edgeCases?.hasImportAlias).toBe(true);
61
- expect(result.structures?.buildConfigCall).toBeDefined();
62
- });
63
- it('detects multiple buildConfig calls', ()=>{
64
- const project = new Project({
65
- useInMemoryFileSystem: true
66
- });
67
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
68
-
69
- const helper = buildConfig({ collections: [] })
70
-
71
- export default buildConfig({
72
- collections: [],
73
- })`);
74
- const result = detectPayloadConfigStructure(sourceFile);
75
- expect(result.success).toBe(true);
76
- expect(result.edgeCases?.multipleBuildConfigCalls).toBe(true);
77
- });
78
- it('detects other Payload imports', ()=>{
79
- const project = new Project({
80
- useInMemoryFileSystem: true
81
- });
82
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig, CollectionConfig } from 'payload'
83
-
84
- export default buildConfig({
85
- collections: [],
86
- })`);
87
- const result = detectPayloadConfigStructure(sourceFile);
88
- expect(result.success).toBe(true);
89
- expect(result.edgeCases?.hasOtherPayloadImports).toBe(true);
90
- });
91
- });
92
- describe('addDatabaseAdapter', ()=>{
93
- it.each([
94
- {
95
- adapter: 'mongodb',
96
- adapterName: 'mongooseAdapter',
97
- packageName: '@payloadcms/db-mongodb'
98
- },
99
- {
100
- adapter: 'postgres',
101
- adapterName: 'postgresAdapter',
102
- packageName: '@payloadcms/db-postgres'
103
- }
104
- ])('adds $adapter adapter with import and config', ({ adapter, adapterName, packageName })=>{
105
- const project = new Project({
106
- useInMemoryFileSystem: true
107
- });
108
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
109
-
110
- export default buildConfig({
111
- collections: []
112
- })`);
113
- const result = addDatabaseAdapter({
114
- sourceFile,
115
- adapter,
116
- envVarName: 'DATABASE_URL'
117
- });
118
- expect(result.success).toBe(true);
119
- expect(result.modified).toBe(true);
120
- expect(result.modifications.length).toBeGreaterThan(0);
121
- const text = sourceFile.getText();
122
- expect(text).toMatch(new RegExp(`import.*${adapterName}.*from.*${packageName.replace('/', '\\/')}`));
123
- expect(text).toContain(`db: ${adapterName}`);
124
- expect(text).toContain('process.env.DATABASE_URL');
125
- });
126
- it('replaces existing db adapter', ()=>{
127
- const project = new Project({
128
- useInMemoryFileSystem: true
129
- });
130
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
131
- import { mongooseAdapter } from '@payloadcms/db-mongodb'
132
-
133
- export default buildConfig({
134
- db: mongooseAdapter({ url: '' }),
135
- collections: []
136
- })`);
137
- const result = addDatabaseAdapter({
138
- sourceFile,
139
- adapter: 'postgres',
140
- envVarName: 'DATABASE_URL'
141
- });
142
- expect(result.success).toBe(true);
143
- const text = sourceFile.getText();
144
- expect(text).toMatch(/import.*postgresAdapter.*from.*@payloadcms\/db-postgres/);
145
- expect(text).toContain('db: postgresAdapter');
146
- expect(text).not.toContain('mongooseAdapter');
147
- expect(text).not.toContain('@payloadcms/db-mongodb');
148
- });
149
- });
150
- describe('addStorageAdapter', ()=>{
151
- it('adds vercelBlobStorage adapter to plugins array', ()=>{
152
- const project = new Project({
153
- useInMemoryFileSystem: true
154
- });
155
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
156
-
157
- export default buildConfig({
158
- plugins: []
159
- })`);
160
- const result = addStorageAdapter({
161
- sourceFile,
162
- adapter: 'vercelBlobStorage'
163
- });
164
- expect(result.success).toBe(true);
165
- expect(result.modified).toBe(true);
166
- const text = sourceFile.getText();
167
- expect(text).toMatch(/import.*vercelBlobStorage.*from.*@payloadcms\/storage-vercel-blob/);
168
- expect(text).toContain('vercelBlobStorage(');
169
- });
170
- it('creates plugins array if missing', ()=>{
171
- const project = new Project({
172
- useInMemoryFileSystem: true
173
- });
174
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
175
-
176
- export default buildConfig({
177
- collections: []
178
- })`);
179
- const result = addStorageAdapter({
180
- sourceFile,
181
- adapter: 'r2Storage'
182
- });
183
- expect(result.success).toBe(true);
184
- const text = sourceFile.getText();
185
- expect(text).toContain('plugins: [');
186
- expect(text).toContain('r2Storage(');
187
- });
188
- it('adds to existing plugins array', ()=>{
189
- const project = new Project({
190
- useInMemoryFileSystem: true
191
- });
192
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
193
-
194
- export default buildConfig({
195
- plugins: [
196
- someOtherPlugin()
197
- ]
198
- })`);
199
- const result = addStorageAdapter({
200
- sourceFile,
201
- adapter: 's3Storage'
202
- });
203
- expect(result.success).toBe(true);
204
- const text = sourceFile.getText();
205
- expect(text).toContain('someOtherPlugin()');
206
- expect(text).toContain('s3Storage(');
207
- });
208
- });
209
- describe('removeSharp', ()=>{
210
- it('removes sharp import and property', ()=>{
211
- const project = new Project({
212
- useInMemoryFileSystem: true
213
- });
214
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
215
- import sharp from 'sharp'
216
-
217
- export default buildConfig({
218
- sharp,
219
- collections: []
220
- })`);
221
- const result = removeSharp(sourceFile);
222
- expect(result.success).toBe(true);
223
- expect(result.modified).toBe(true);
224
- expect(result.modifications.length).toBeGreaterThan(0);
225
- const text = sourceFile.getText();
226
- expect(text).not.toContain("import sharp from 'sharp'");
227
- expect(text).not.toContain('sharp,');
228
- });
229
- it('does nothing if sharp not present', ()=>{
230
- const project = new Project({
231
- useInMemoryFileSystem: true
232
- });
233
- const sourceFile = project.createSourceFile('payload.config.ts', `import { buildConfig } from 'payload'
234
-
235
- export default buildConfig({
236
- collections: []
237
- })`);
238
- const result = removeSharp(sourceFile);
239
- expect(result.success).toBe(true);
240
- expect(result.modified).toBe(false);
241
- });
242
- });
243
- describe('configurePayloadConfig', ()=>{
244
- let tempDir;
245
- beforeEach(()=>{
246
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'payload-test-'));
247
- });
248
- afterEach(()=>{
249
- fs.rmSync(tempDir, {
250
- recursive: true,
251
- force: true
252
- });
253
- });
254
- it('applies all transformations in one call (db + storage)', async ()=>{
255
- const filePath = path.join(tempDir, 'payload.config.ts');
256
- fs.writeFileSync(filePath, `import { buildConfig } from 'payload'
257
-
258
- export default buildConfig({
259
- collections: []
260
- })`);
261
- const { configurePayloadConfig } = await import('./payload-config');
262
- const result = await configurePayloadConfig(filePath, {
263
- db: {
264
- type: 'postgres',
265
- envVarName: 'DATABASE_URL'
266
- },
267
- storage: 'vercelBlobStorage'
268
- });
269
- expect(result.success).toBe(true);
270
- const content = fs.readFileSync(filePath, 'utf-8');
271
- expect(content).toContain('postgresAdapter');
272
- expect(content).toContain('vercelBlobStorage');
273
- expect(content).toContain('DATABASE_URL');
274
- });
275
- it('applies db transformation only', async ()=>{
276
- const filePath = path.join(tempDir, 'payload.config.ts');
277
- fs.writeFileSync(filePath, `import { buildConfig } from 'payload'
278
-
279
- export default buildConfig({
280
- collections: []
281
- })`);
282
- const { configurePayloadConfig } = await import('./payload-config');
283
- const result = await configurePayloadConfig(filePath, {
284
- db: {
285
- type: 'mongodb',
286
- envVarName: 'MONGO_URL'
287
- }
288
- });
289
- expect(result.success).toBe(true);
290
- const content = fs.readFileSync(filePath, 'utf-8');
291
- expect(content).toContain('mongooseAdapter');
292
- expect(content).toContain('MONGO_URL');
293
- });
294
- it('applies removeSharp transformation', async ()=>{
295
- const filePath = path.join(tempDir, 'payload.config.ts');
296
- fs.writeFileSync(filePath, `import { buildConfig } from 'payload'
297
- import sharp from 'sharp'
298
- import { mongooseAdapter } from '@payloadcms/db-mongodb'
299
-
300
- export default buildConfig({
301
- db: mongooseAdapter({ url: '' }),
302
- sharp,
303
- collections: []
304
- })`);
305
- const { configurePayloadConfig } = await import('./payload-config');
306
- const result = await configurePayloadConfig(filePath, {
307
- removeSharp: true
308
- });
309
- expect(result.success).toBe(true);
310
- const content = fs.readFileSync(filePath, 'utf-8');
311
- expect(content).not.toContain("import sharp from 'sharp'");
312
- expect(content).not.toContain('sharp,');
313
- });
314
- it('handles transformation errors gracefully', async ()=>{
315
- const filePath = path.join(tempDir, 'payload.config.ts');
316
- fs.writeFileSync(filePath, `export default {}`);
317
- const { configurePayloadConfig } = await import('./payload-config');
318
- const result = await configurePayloadConfig(filePath, {
319
- db: {
320
- type: 'postgres',
321
- envVarName: 'DATABASE_URL'
322
- }
323
- });
324
- expect(result.success).toBe(false);
325
- expect(result.error?.userMessage).toContain('buildConfig');
326
- });
327
- it('handles file not found error', async ()=>{
328
- const filePath = path.join(tempDir, 'nonexistent.ts');
329
- const { configurePayloadConfig } = await import('./payload-config');
330
- const result = await configurePayloadConfig(filePath, {
331
- db: {
332
- type: 'postgres',
333
- envVarName: 'DATABASE_URL'
334
- }
335
- });
336
- expect(result.success).toBe(false);
337
- expect(result.error).toBeDefined();
338
- });
339
- it('replaces adapter in config file', async ()=>{
340
- const filePath = path.join(tempDir, 'payload.config.ts');
341
- fs.writeFileSync(filePath, `import { buildConfig } from 'payload'
342
- import { mongooseAdapter } from '@payloadcms/db-mongodb'
343
-
344
- export default buildConfig({
345
- db: mongooseAdapter({ url: process.env.DATABASE_URL || '' }),
346
- collections: []
347
- })`);
348
- const { configurePayloadConfig } = await import('./payload-config');
349
- const result = await configurePayloadConfig(filePath, {
350
- db: {
351
- type: 'postgres',
352
- envVarName: 'DATABASE_URL'
353
- }
354
- });
355
- expect(result.success).toBe(true);
356
- // Verify config was updated
357
- const content = fs.readFileSync(filePath, 'utf-8');
358
- expect(content).toContain('postgresAdapter');
359
- expect(content).toContain('@payloadcms/db-postgres');
360
- expect(content).not.toContain('mongooseAdapter');
361
- expect(content).not.toContain('@payloadcms/db-mongodb');
362
- });
363
- });
364
-
365
- //# sourceMappingURL=payload-config.spec.js.map
@@ -1 +0,0 @@
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"}