create-payload-app 4.0.0-internal.5b1e7cd → 4.0.0-internal.5e065b3

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 (153) 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/configure-pnpm-builds.d.ts +20 -0
  29. package/dist/lib/configure-pnpm-builds.d.ts.map +1 -0
  30. package/dist/lib/configure-pnpm-builds.js +100 -0
  31. package/dist/lib/configure-pnpm-builds.js.map +1 -0
  32. package/dist/lib/create-project.d.ts +1 -2
  33. package/dist/lib/create-project.d.ts.map +1 -1
  34. package/dist/lib/create-project.js +69 -79
  35. package/dist/lib/create-project.js.map +1 -1
  36. package/dist/lib/generate-secret.js +1 -1
  37. package/dist/lib/generate-secret.js.map +1 -1
  38. package/dist/lib/get-package-manager.d.ts +9 -0
  39. package/dist/lib/get-package-manager.d.ts.map +1 -1
  40. package/dist/lib/get-package-manager.js +20 -0
  41. package/dist/lib/get-package-manager.js.map +1 -1
  42. package/dist/lib/init-next.d.ts +6 -1
  43. package/dist/lib/init-next.d.ts.map +1 -1
  44. package/dist/lib/init-next.js +39 -41
  45. package/dist/lib/init-next.js.map +1 -1
  46. package/dist/lib/init-tanstack.d.ts +18 -0
  47. package/dist/lib/init-tanstack.d.ts.map +1 -0
  48. package/dist/lib/init-tanstack.js +149 -0
  49. package/dist/lib/init-tanstack.js.map +1 -0
  50. package/dist/lib/tanstack/detect.d.ts +5 -0
  51. package/dist/lib/tanstack/detect.d.ts.map +1 -0
  52. package/dist/lib/tanstack/detect.js +131 -0
  53. package/dist/lib/tanstack/detect.js.map +1 -0
  54. package/dist/lib/tanstack/prepare.d.ts +23 -0
  55. package/dist/lib/tanstack/prepare.d.ts.map +1 -0
  56. package/dist/lib/tanstack/prepare.js +114 -0
  57. package/dist/lib/tanstack/prepare.js.map +1 -0
  58. package/dist/lib/tanstack/template-files.d.ts +50 -0
  59. package/dist/lib/tanstack/template-files.d.ts.map +1 -0
  60. package/dist/lib/tanstack/template-files.js +64 -0
  61. package/dist/lib/tanstack/template-files.js.map +1 -0
  62. package/dist/lib/tanstack/transform-root-route.d.ts +7 -0
  63. package/dist/lib/tanstack/transform-root-route.d.ts.map +1 -0
  64. package/dist/lib/tanstack/transform-root-route.js +747 -0
  65. package/dist/lib/tanstack/transform-root-route.js.map +1 -0
  66. package/dist/lib/tanstack/transform-router.d.ts +5 -0
  67. package/dist/lib/tanstack/transform-router.d.ts.map +1 -0
  68. package/dist/lib/tanstack/transform-router.js +301 -0
  69. package/dist/lib/tanstack/transform-router.js.map +1 -0
  70. package/dist/lib/tanstack/transform-vite-config.d.ts +14 -0
  71. package/dist/lib/tanstack/transform-vite-config.d.ts.map +1 -0
  72. package/dist/lib/tanstack/transform-vite-config.js +576 -0
  73. package/dist/lib/tanstack/transform-vite-config.js.map +1 -0
  74. package/dist/lib/templates.d.ts.map +1 -1
  75. package/dist/lib/templates.js +6 -0
  76. package/dist/lib/templates.js.map +1 -1
  77. package/dist/lib/update-payload-in-project.d.ts +18 -3
  78. package/dist/lib/update-payload-in-project.d.ts.map +1 -1
  79. package/dist/lib/update-payload-in-project.js +102 -21
  80. package/dist/lib/update-payload-in-project.js.map +1 -1
  81. package/dist/lib/wrap-next-config.d.ts.map +1 -1
  82. package/dist/main.d.ts +20 -1
  83. package/dist/main.d.ts.map +1 -1
  84. package/dist/main.js +126 -35
  85. package/dist/main.js.map +1 -1
  86. package/dist/scripts/pack-template-files.js +18 -0
  87. package/dist/scripts/pack-template-files.js.map +1 -1
  88. package/dist/template/src/app/(frontend)/page.tsx +5 -2
  89. package/dist/template/src/app/(frontend)/styles.css +8 -1
  90. package/dist/template/src/app/(payload)/admin/[[...segments]]/not-found.tsx +1 -2
  91. package/dist/template/src/app/(payload)/admin/[[...segments]]/page.tsx +1 -2
  92. package/dist/template/src/app/(payload)/admin/importMap.js +30 -2
  93. package/dist/template/src/app/(payload)/api/[...slug]/route.ts +1 -2
  94. package/dist/template/src/app/(payload)/api/graphql/route.ts +1 -2
  95. package/dist/template/src/app/(payload)/api/graphql-playground/route.ts +1 -2
  96. package/dist/template/src/app/(payload)/custom.css +0 -0
  97. package/dist/template/src/app/(payload)/layout.tsx +9 -4
  98. package/dist/template/src/collections/Folders.ts +16 -0
  99. package/dist/template/src/collections/Media.ts +4 -0
  100. package/dist/template/src/collections/Tags.ts +16 -0
  101. package/dist/template/src/collections/Users.ts +1 -0
  102. package/dist/template/src/payload-types.ts +63 -9
  103. package/dist/template/src/payload.config.ts +14 -4
  104. package/dist/template-tanstack/routes/_payload/admin.$.tsx +11 -0
  105. package/dist/template-tanstack/routes/_payload/admin.index.tsx +11 -0
  106. package/dist/template-tanstack/routes/_payload/api.$.ts +11 -0
  107. package/dist/template-tanstack/routes/_payload/importMap.js +32 -0
  108. package/dist/template-tanstack/routes/_payload/server.functions.ts +50 -0
  109. package/dist/template-tanstack/routes/_payload.tsx +29 -0
  110. package/dist/template-tanstack/src/collections/Folders.ts +16 -0
  111. package/dist/template-tanstack/src/collections/Media.ts +20 -0
  112. package/dist/template-tanstack/src/collections/Tags.ts +16 -0
  113. package/dist/template-tanstack/src/collections/Users.ts +14 -0
  114. package/dist/template-tanstack/src/payload.config.ts +38 -0
  115. package/dist/types.d.ts +23 -4
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/utils/messages.d.ts +1 -0
  119. package/dist/utils/messages.d.ts.map +1 -1
  120. package/dist/utils/messages.js +9 -6
  121. package/dist/utils/messages.js.map +1 -1
  122. package/dist/utils/resolvePackageVersion.d.ts +29 -0
  123. package/dist/utils/resolvePackageVersion.d.ts.map +1 -0
  124. package/dist/utils/resolvePackageVersion.js +41 -0
  125. package/dist/utils/resolvePackageVersion.js.map +1 -0
  126. package/package.json +9 -9
  127. package/dist/ast-integration.spec.js +0 -132
  128. package/dist/ast-integration.spec.js.map +0 -1
  129. package/dist/lib/ast/package-json.spec.js +0 -67
  130. package/dist/lib/ast/package-json.spec.js.map +0 -1
  131. package/dist/lib/ast/payload-config.spec.js +0 -365
  132. package/dist/lib/ast/payload-config.spec.js.map +0 -1
  133. package/dist/lib/ast/utils.spec.js +0 -226
  134. package/dist/lib/ast/utils.spec.js.map +0 -1
  135. package/dist/lib/create-project.spec.js +0 -190
  136. package/dist/lib/create-project.spec.js.map +0 -1
  137. package/dist/lib/download-skill.d.ts +0 -8
  138. package/dist/lib/download-skill.d.ts.map +0 -1
  139. package/dist/lib/download-skill.js +0 -35
  140. package/dist/lib/download-skill.js.map +0 -1
  141. package/dist/lib/manage-env-files.spec.js +0 -118
  142. package/dist/lib/manage-env-files.spec.js.map +0 -1
  143. package/dist/lib/select-agent.d.ts +0 -16
  144. package/dist/lib/select-agent.d.ts.map +0 -1
  145. package/dist/lib/select-agent.js +0 -67
  146. package/dist/lib/select-agent.js.map +0 -1
  147. package/dist/lib/wrap-next-config.spec.js +0 -167
  148. package/dist/lib/wrap-next-config.spec.js.map +0 -1
  149. package/dist/utils/getLatestPackageVersion.d.ts +0 -17
  150. package/dist/utils/getLatestPackageVersion.d.ts.map +0 -1
  151. package/dist/utils/getLatestPackageVersion.js +0 -20
  152. package/dist/utils/getLatestPackageVersion.js.map +0 -1
  153. /package/dist/{template/src/app/(payload)/custom.scss → template-tanstack/routes/_payload/custom.css} +0 -0
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2018-2025 Payload CMS, Inc. <info@payloadcms.com>
3
+ Copyright (c) 2018-2026 Payload CMS, LLC <info@payloadcms.com>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
package/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  CLI for easily starting new Payload project
4
4
 
5
+ When run without a project name inside a compatible existing Next.js, TanStack Start, or
6
+ conventional TanStack Router project, the CLI initializes Payload in the current project.
7
+ Router-only projects are converted to TanStack Start after confirmation.
8
+
5
9
  ## Usage
6
10
 
7
11
  ```text
@@ -20,6 +24,7 @@ CLI for easily starting new Payload project
20
24
  Available templates:
21
25
 
22
26
  blank Blank Template
27
+ blank-tanstack Blank TanStack Start Template
23
28
  website Website Template
24
29
  ecommerce E-commerce Template
25
30
  plugin Template for creating a Payload plugin
@@ -0,0 +1,4 @@
1
+ export { getNextAppDetails, initNext } from './lib/init-next.js';
2
+ export { initTanStack } from './lib/init-tanstack.js';
3
+ export { getTanStackAppDetails } from './lib/tanstack/detect.js';
4
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { getNextAppDetails, initNext } from './lib/init-next.js';
2
+ export { initTanStack } from './lib/init-tanstack.js';
3
+ export { getTanStackAppDetails } from './lib/tanstack/detect.js';
4
+
5
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands.ts"],"sourcesContent":["export { getNextAppDetails, initNext } from './lib/init-next.js'\nexport { initTanStack } from './lib/init-tanstack.js'\nexport { getTanStackAppDetails } from './lib/tanstack/detect.js'\n"],"names":["getNextAppDetails","initNext","initTanStack","getTanStackAppDetails"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,QAAQ,QAAQ,qBAAoB;AAChE,SAASC,YAAY,QAAQ,yBAAwB;AACrD,SAASC,qBAAqB,QAAQ,2BAA0B"}
@@ -0,0 +1,12 @@
1
+ type AgentConfigFile = {
2
+ content: string;
3
+ fileName: 'AGENTS.md';
4
+ };
5
+ /**
6
+ * Builds the agent config files written at project root. They point agents at the skill
7
+ * bundled with the installed `payload` package, so guidance always matches the installed
8
+ * version. `AGENTS.md` is the single source read by Claude Code, Cursor, and Copilot.
9
+ */
10
+ export declare function buildAgentConfigFiles(): AgentConfigFile[];
11
+ export {};
12
+ //# sourceMappingURL=agent-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-config.d.ts","sourceRoot":"","sources":["../../src/lib/agent-config.ts"],"names":[],"mappings":"AAGA,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,WAAW,CAAA;CACtB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,EAAE,CAOzD"}
@@ -0,0 +1,15 @@
1
+ /** Where the skill ships inside a consumer's installed dependencies. */ const SKILL_PATH = 'node_modules/payload/skills/payload';
2
+ /**
3
+ * Builds the agent config files written at project root. They point agents at the skill
4
+ * bundled with the installed `payload` package, so guidance always matches the installed
5
+ * version. `AGENTS.md` is the single source read by Claude Code, Cursor, and Copilot.
6
+ */ export function buildAgentConfigFiles() {
7
+ return [
8
+ {
9
+ content: `# AI Agent\n\nFor any Payload-related work, reference the skill at \`${SKILL_PATH}/SKILL.md\`.\n`,
10
+ fileName: 'AGENTS.md'
11
+ }
12
+ ];
13
+ }
14
+
15
+ //# sourceMappingURL=agent-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/agent-config.ts"],"sourcesContent":["/** Where the skill ships inside a consumer's installed dependencies. */\nconst SKILL_PATH = 'node_modules/payload/skills/payload'\n\ntype AgentConfigFile = {\n content: string\n fileName: 'AGENTS.md'\n}\n\n/**\n * Builds the agent config files written at project root. They point agents at the skill\n * bundled with the installed `payload` package, so guidance always matches the installed\n * version. `AGENTS.md` is the single source read by Claude Code, Cursor, and Copilot.\n */\nexport function buildAgentConfigFiles(): AgentConfigFile[] {\n return [\n {\n content: `# AI Agent\\n\\nFor any Payload-related work, reference the skill at \\`${SKILL_PATH}/SKILL.md\\`.\\n`,\n fileName: 'AGENTS.md',\n },\n ]\n}\n"],"names":["SKILL_PATH","buildAgentConfigFiles","content","fileName"],"mappings":"AAAA,sEAAsE,GACtE,MAAMA,aAAa;AAOnB;;;;CAIC,GACD,OAAO,SAASC;IACd,OAAO;QACL;YACEC,SAAS,CAAC,qEAAqE,EAAEF,WAAW,cAAc,CAAC;YAC3GG,UAAU;QACZ;KACD;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter-config.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/adapter-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,IAAI,GAAG,MAAM,CAAA;IACnC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CA0CnE,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,oBAAoB,CAwEtE,CAAA;AAEV;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E"}
1
+ {"version":3,"file":"adapter-config.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/adapter-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEjE,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IAC1C,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;IAC1B,cAAc,EAAE,MAAM,IAAI,GAAG,MAAM,CAAA;IACnC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAA;CAC3B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,eAAe,EAAE,qBAAqB,CA0CnE,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,oBAAoB,CA8DtE,CAAA;AAEV;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,MAAM,CAE5E"}
@@ -100,16 +100,6 @@
100
100
  })`,
101
101
  packageName: '@payloadcms/storage-s3'
102
102
  },
103
- uploadthingStorage: {
104
- adapterName: 'uploadthingStorage',
105
- configTemplate: ()=>`uploadthingStorage({
106
- collections: {
107
- media: true,
108
- },
109
- token: process.env.UPLOADTHING_SECRET || '',
110
- })`,
111
- packageName: '@payloadcms/storage-uploadthing'
112
- },
113
103
  vercelBlobStorage: {
114
104
  adapterName: 'vercelBlobStorage',
115
105
  configTemplate: ()=>`vercelBlobStorage({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/adapter-config.ts"],"sourcesContent":["/**\n * Centralized adapter configuration\n * Shared across all AST transformation and test files\n */\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nexport type DatabaseAdapterConfig = {\n adapterName: string\n configTemplate: (envVar: string) => string\n packageName: string\n}\n\nexport type StorageAdapterConfig = {\n adapterName: null | string\n configTemplate: () => null | string\n packageName: null | string\n}\n\n/**\n * Database adapter configurations\n */\nexport const DB_ADAPTER_CONFIG: Record<DatabaseAdapter, DatabaseAdapterConfig> = {\n 'd1-sqlite': {\n adapterName: 'sqliteD1Adapter',\n configTemplate: () => `sqliteD1Adapter({\n binding: cloudflare.env.D1,\n})`,\n packageName: '@payloadcms/db-d1-sqlite',\n },\n mongodb: {\n adapterName: 'mongooseAdapter',\n configTemplate: (envVar: string) => `mongooseAdapter({\n url: process.env.${envVar} || '',\n})`,\n packageName: '@payloadcms/db-mongodb',\n },\n postgres: {\n adapterName: 'postgresAdapter',\n configTemplate: (envVar: string) => `postgresAdapter({\n pool: {\n connectionString: process.env.${envVar} || '',\n },\n})`,\n packageName: '@payloadcms/db-postgres',\n },\n sqlite: {\n adapterName: 'sqliteAdapter',\n configTemplate: () => `sqliteAdapter({\n client: {\n url: process.env.DATABASE_URL || '',\n },\n})`,\n packageName: '@payloadcms/db-sqlite',\n },\n 'vercel-postgres': {\n adapterName: 'vercelPostgresAdapter',\n configTemplate: () => `vercelPostgresAdapter({\n pool: {\n connectionString: process.env.POSTGRES_URL || '',\n },\n})`,\n packageName: '@payloadcms/db-vercel-postgres',\n },\n} as const\n\n/**\n * Storage adapter configurations\n */\nexport const STORAGE_ADAPTER_CONFIG: Record<StorageAdapter, StorageAdapterConfig> = {\n azureStorage: {\n adapterName: 'azureStorage',\n configTemplate: () => `azureStorage({\n collections: {\n media: true,\n },\n connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING || '',\n containerName: process.env.AZURE_STORAGE_CONTAINER_NAME || '',\n })`,\n packageName: '@payloadcms/storage-azure',\n },\n gcsStorage: {\n adapterName: 'gcsStorage',\n configTemplate: () => `gcsStorage({\n collections: {\n media: true,\n },\n bucket: process.env.GCS_BUCKET || '',\n })`,\n packageName: '@payloadcms/storage-gcs',\n },\n localDisk: {\n adapterName: null,\n configTemplate: () => null,\n packageName: null,\n },\n r2Storage: {\n adapterName: 'r2Storage',\n configTemplate: () => `r2Storage({\n bucket: cloudflare.env.R2,\n collections: { media: true },\n })`,\n packageName: '@payloadcms/storage-r2',\n },\n s3Storage: {\n adapterName: 's3Storage',\n configTemplate: () => `s3Storage({\n collections: {\n media: true,\n },\n bucket: process.env.S3_BUCKET || '',\n config: {\n credentials: {\n accessKeyId: process.env.S3_ACCESS_KEY_ID || '',\n secretAccessKey: process.env.S3_SECRET_ACCESS_KEY || '',\n },\n region: process.env.S3_REGION || '',\n },\n })`,\n packageName: '@payloadcms/storage-s3',\n },\n uploadthingStorage: {\n adapterName: 'uploadthingStorage',\n configTemplate: () => `uploadthingStorage({\n collections: {\n media: true,\n },\n token: process.env.UPLOADTHING_SECRET || '',\n })`,\n packageName: '@payloadcms/storage-uploadthing',\n },\n vercelBlobStorage: {\n adapterName: 'vercelBlobStorage',\n configTemplate: () => `vercelBlobStorage({\n collections: {\n media: true,\n },\n token: process.env.BLOB_READ_WRITE_TOKEN || '',\n })`,\n packageName: '@payloadcms/storage-vercel-blob',\n },\n} as const\n\n/**\n * Helper to get database adapter package name\n */\nexport function getDbPackageName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get database adapter name\n */\nexport function getDbAdapterName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].adapterName\n}\n\n/**\n * Helper to get storage adapter package name\n */\nexport function getStoragePackageName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get storage adapter name\n */\nexport function getStorageAdapterName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].adapterName\n}\n"],"names":["DB_ADAPTER_CONFIG","adapterName","configTemplate","packageName","mongodb","envVar","postgres","sqlite","STORAGE_ADAPTER_CONFIG","azureStorage","gcsStorage","localDisk","r2Storage","s3Storage","uploadthingStorage","vercelBlobStorage","getDbPackageName","adapter","getDbAdapterName","getStoragePackageName","getStorageAdapterName"],"mappings":"AAAA;;;CAGC,GAgBD;;CAEC,GACD,OAAO,MAAMA,oBAAoE;IAC/E,aAAa;QACXC,aAAa;QACbC,gBAAgB,IAAM,CAAC;;EAEzB,CAAC;QACCC,aAAa;IACf;IACAC,SAAS;QACPH,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;mBACtB,EAAEA,OAAO;EAC1B,CAAC;QACCF,aAAa;IACf;IACAG,UAAU;QACRL,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;;kCAEP,EAAEA,OAAO;;EAEzC,CAAC;QACCF,aAAa;IACf;IACAI,QAAQ;QACNN,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;IACA,mBAAmB;QACjBF,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,MAAMK,yBAAuE;IAClFC,cAAc;QACZR,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;IAMvB,CAAC;QACDC,aAAa;IACf;IACAO,YAAY;QACVT,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;IACAQ,WAAW;QACTV,aAAa;QACbC,gBAAgB,IAAM;QACtBC,aAAa;IACf;IACAS,WAAW;QACTX,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;IAGvB,CAAC;QACDC,aAAa;IACf;IACAU,WAAW;QACTZ,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;;;;;;;IAYvB,CAAC;QACDC,aAAa;IACf;IACAW,oBAAoB;QAClBb,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;IACAY,mBAAmB;QACjBd,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,SAASa,iBAAiBC,OAAwB;IACvD,OAAOjB,iBAAiB,CAACiB,QAAQ,CAACd,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASe,iBAAiBD,OAAwB;IACvD,OAAOjB,iBAAiB,CAACiB,QAAQ,CAAChB,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASkB,sBAAsBF,OAAuB;IAC3D,OAAOT,sBAAsB,CAACS,QAAQ,CAACd,WAAW;AACpD;AAEA;;CAEC,GACD,OAAO,SAASiB,sBAAsBH,OAAuB;IAC3D,OAAOT,sBAAsB,CAACS,QAAQ,CAAChB,WAAW;AACpD"}
1
+ {"version":3,"sources":["../../../src/lib/ast/adapter-config.ts"],"sourcesContent":["/**\n * Centralized adapter configuration\n * Shared across all AST transformation and test files\n */\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nexport type DatabaseAdapterConfig = {\n adapterName: string\n configTemplate: (envVar: string) => string\n packageName: string\n}\n\nexport type StorageAdapterConfig = {\n adapterName: null | string\n configTemplate: () => null | string\n packageName: null | string\n}\n\n/**\n * Database adapter configurations\n */\nexport const DB_ADAPTER_CONFIG: Record<DatabaseAdapter, DatabaseAdapterConfig> = {\n 'd1-sqlite': {\n adapterName: 'sqliteD1Adapter',\n configTemplate: () => `sqliteD1Adapter({\n binding: cloudflare.env.D1,\n})`,\n packageName: '@payloadcms/db-d1-sqlite',\n },\n mongodb: {\n adapterName: 'mongooseAdapter',\n configTemplate: (envVar: string) => `mongooseAdapter({\n url: process.env.${envVar} || '',\n})`,\n packageName: '@payloadcms/db-mongodb',\n },\n postgres: {\n adapterName: 'postgresAdapter',\n configTemplate: (envVar: string) => `postgresAdapter({\n pool: {\n connectionString: process.env.${envVar} || '',\n },\n})`,\n packageName: '@payloadcms/db-postgres',\n },\n sqlite: {\n adapterName: 'sqliteAdapter',\n configTemplate: () => `sqliteAdapter({\n client: {\n url: process.env.DATABASE_URL || '',\n },\n})`,\n packageName: '@payloadcms/db-sqlite',\n },\n 'vercel-postgres': {\n adapterName: 'vercelPostgresAdapter',\n configTemplate: () => `vercelPostgresAdapter({\n pool: {\n connectionString: process.env.POSTGRES_URL || '',\n },\n})`,\n packageName: '@payloadcms/db-vercel-postgres',\n },\n} as const\n\n/**\n * Storage adapter configurations\n */\nexport const STORAGE_ADAPTER_CONFIG: Record<StorageAdapter, StorageAdapterConfig> = {\n azureStorage: {\n adapterName: 'azureStorage',\n configTemplate: () => `azureStorage({\n collections: {\n media: true,\n },\n connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING || '',\n containerName: process.env.AZURE_STORAGE_CONTAINER_NAME || '',\n })`,\n packageName: '@payloadcms/storage-azure',\n },\n gcsStorage: {\n adapterName: 'gcsStorage',\n configTemplate: () => `gcsStorage({\n collections: {\n media: true,\n },\n bucket: process.env.GCS_BUCKET || '',\n })`,\n packageName: '@payloadcms/storage-gcs',\n },\n localDisk: {\n adapterName: null,\n configTemplate: () => null,\n packageName: null,\n },\n r2Storage: {\n adapterName: 'r2Storage',\n configTemplate: () => `r2Storage({\n bucket: cloudflare.env.R2,\n collections: { media: true },\n })`,\n packageName: '@payloadcms/storage-r2',\n },\n s3Storage: {\n adapterName: 's3Storage',\n configTemplate: () => `s3Storage({\n collections: {\n media: true,\n },\n bucket: process.env.S3_BUCKET || '',\n config: {\n credentials: {\n accessKeyId: process.env.S3_ACCESS_KEY_ID || '',\n secretAccessKey: process.env.S3_SECRET_ACCESS_KEY || '',\n },\n region: process.env.S3_REGION || '',\n },\n })`,\n packageName: '@payloadcms/storage-s3',\n },\n vercelBlobStorage: {\n adapterName: 'vercelBlobStorage',\n configTemplate: () => `vercelBlobStorage({\n collections: {\n media: true,\n },\n token: process.env.BLOB_READ_WRITE_TOKEN || '',\n })`,\n packageName: '@payloadcms/storage-vercel-blob',\n },\n} as const\n\n/**\n * Helper to get database adapter package name\n */\nexport function getDbPackageName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get database adapter name\n */\nexport function getDbAdapterName(adapter: DatabaseAdapter): string {\n return DB_ADAPTER_CONFIG[adapter].adapterName\n}\n\n/**\n * Helper to get storage adapter package name\n */\nexport function getStoragePackageName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].packageName\n}\n\n/**\n * Helper to get storage adapter name\n */\nexport function getStorageAdapterName(adapter: StorageAdapter): null | string {\n return STORAGE_ADAPTER_CONFIG[adapter].adapterName\n}\n"],"names":["DB_ADAPTER_CONFIG","adapterName","configTemplate","packageName","mongodb","envVar","postgres","sqlite","STORAGE_ADAPTER_CONFIG","azureStorage","gcsStorage","localDisk","r2Storage","s3Storage","vercelBlobStorage","getDbPackageName","adapter","getDbAdapterName","getStoragePackageName","getStorageAdapterName"],"mappings":"AAAA;;;CAGC,GAgBD;;CAEC,GACD,OAAO,MAAMA,oBAAoE;IAC/E,aAAa;QACXC,aAAa;QACbC,gBAAgB,IAAM,CAAC;;EAEzB,CAAC;QACCC,aAAa;IACf;IACAC,SAAS;QACPH,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;mBACtB,EAAEA,OAAO;EAC1B,CAAC;QACCF,aAAa;IACf;IACAG,UAAU;QACRL,aAAa;QACbC,gBAAgB,CAACG,SAAmB,CAAC;;kCAEP,EAAEA,OAAO;;EAEzC,CAAC;QACCF,aAAa;IACf;IACAI,QAAQ;QACNN,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;IACA,mBAAmB;QACjBF,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;EAIzB,CAAC;QACCC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,MAAMK,yBAAuE;IAClFC,cAAc;QACZR,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;IAMvB,CAAC;QACDC,aAAa;IACf;IACAO,YAAY;QACVT,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;IACAQ,WAAW;QACTV,aAAa;QACbC,gBAAgB,IAAM;QACtBC,aAAa;IACf;IACAS,WAAW;QACTX,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;IAGvB,CAAC;QACDC,aAAa;IACf;IACAU,WAAW;QACTZ,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;;;;;;;;IAYvB,CAAC;QACDC,aAAa;IACf;IACAW,mBAAmB;QACjBb,aAAa;QACbC,gBAAgB,IAAM,CAAC;;;;;IAKvB,CAAC;QACDC,aAAa;IACf;AACF,EAAU;AAEV;;CAEC,GACD,OAAO,SAASY,iBAAiBC,OAAwB;IACvD,OAAOhB,iBAAiB,CAACgB,QAAQ,CAACb,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASc,iBAAiBD,OAAwB;IACvD,OAAOhB,iBAAiB,CAACgB,QAAQ,CAACf,WAAW;AAC/C;AAEA;;CAEC,GACD,OAAO,SAASiB,sBAAsBF,OAAuB;IAC3D,OAAOR,sBAAsB,CAACQ,QAAQ,CAACb,WAAW;AACpD;AAEA;;CAEC,GACD,OAAO,SAASgB,sBAAsBH,OAAuB;IAC3D,OAAOR,sBAAsB,CAACQ,QAAQ,CAACf,WAAW;AACpD"}
@@ -1,7 +1,9 @@
1
1
  import type { DatabaseAdapter, StorageAdapter } from './types.js';
2
2
  type PackageJsonTransformOptions = {
3
+ addDependencies?: Record<string, string>;
3
4
  databaseAdapter?: DatabaseAdapter;
4
5
  packageName?: string;
6
+ removeDependencies?: string[];
5
7
  removeSharp?: boolean;
6
8
  storageAdapter?: StorageAdapter;
7
9
  };
@@ -9,5 +11,12 @@ type PackageJsonTransformOptions = {
9
11
  * Main orchestration function
10
12
  */
11
13
  export declare function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void;
14
+ export declare function preparePackageJson({ filePath, options, }: {
15
+ filePath: string;
16
+ options: PackageJsonTransformOptions;
17
+ }): {
18
+ content: string;
19
+ filePath: string;
20
+ };
12
21
  export {};
13
22
  //# sourceMappingURL=package-json.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/package-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMjE,KAAK,2BAA2B,GAAG;IACjC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAa9F"}
1
+ {"version":3,"file":"package-json.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/package-json.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAMjE,KAAK,2BAA2B,GAAG;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC,CAAA;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,CAO9F;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,2BAA2B,CAAA;CACrC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAQxC"}
@@ -6,13 +6,20 @@ import { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js';
6
6
  * Main orchestration function
7
7
  */ export function updatePackageJson(filePath, options) {
8
8
  debug(`[AST] Updating package.json: ${filePath}`);
9
- // Phase 1: Detection
9
+ const prepared = preparePackageJson({
10
+ filePath,
11
+ options
12
+ });
13
+ fs.writeFileSync(prepared.filePath, prepared.content);
14
+ debug('[AST] ✓ package.json updated successfully');
15
+ }
16
+ export function preparePackageJson({ filePath, options }) {
10
17
  const pkg = parsePackageJson(filePath);
11
- // Phase 2: Transformation
12
18
  const transformed = transformPackageJson(pkg, options);
13
- // Phase 3: Modification
14
- writePackageJson(filePath, transformed);
15
- debug('[AST] ✓ package.json updated successfully');
19
+ return {
20
+ content: `${JSON.stringify(transformed, null, 2)}\n`,
21
+ filePath
22
+ };
16
23
  }
17
24
  // Helper functions
18
25
  function parsePackageJson(filePath) {
@@ -89,6 +96,28 @@ function parsePackageJson(filePath) {
89
96
  debug('[AST] Sharp dependency not found (already absent)');
90
97
  }
91
98
  }
99
+ if (options.addDependencies) {
100
+ transformed.dependencies = {
101
+ ...transformed.dependencies,
102
+ ...options.addDependencies
103
+ };
104
+ }
105
+ if (options.removeDependencies) {
106
+ for (const dependencyGroup of [
107
+ 'dependencies',
108
+ 'devDependencies'
109
+ ]){
110
+ if (!transformed[dependencyGroup]) {
111
+ continue;
112
+ }
113
+ transformed[dependencyGroup] = {
114
+ ...transformed[dependencyGroup]
115
+ };
116
+ for (const packageName of options.removeDependencies){
117
+ delete transformed[dependencyGroup][packageName];
118
+ }
119
+ }
120
+ }
92
121
  // Update package name
93
122
  if (options.packageName) {
94
123
  debug(`[AST] Updated package name to: ${options.packageName}`);
@@ -96,8 +125,5 @@ function parsePackageJson(filePath) {
96
125
  }
97
126
  return transformed;
98
127
  }
99
- function writePackageJson(filePath, pkg) {
100
- fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\n');
101
- }
102
128
 
103
129
  //# sourceMappingURL=package-json.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/package-json.ts"],"sourcesContent":["import * as fs from 'fs'\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { getDbPackageName, getStoragePackageName } from './adapter-config.js'\nimport { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js'\n\ntype PackageJsonTransformOptions = {\n databaseAdapter?: DatabaseAdapter\n packageName?: string\n removeSharp?: boolean\n storageAdapter?: StorageAdapter\n}\n\ntype PackageJsonStructure = {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n}\n\n/**\n * Main orchestration function\n */\nexport function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void {\n debug(`[AST] Updating package.json: ${filePath}`)\n\n // Phase 1: Detection\n const pkg = parsePackageJson(filePath)\n\n // Phase 2: Transformation\n const transformed = transformPackageJson(pkg, options)\n\n // Phase 3: Modification\n writePackageJson(filePath, transformed)\n\n debug('[AST] ✓ package.json updated successfully')\n}\n\n// Helper functions\n\nfunction parsePackageJson(filePath: string): PackageJsonStructure {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content)\n}\n\n/**\n * Transforms the package.json based upon provided options\n */\nfunction transformPackageJson(\n pkg: PackageJsonStructure,\n options: PackageJsonTransformOptions,\n): PackageJsonStructure {\n const transformed = { ...pkg }\n\n // Update database adapter\n if (options.databaseAdapter) {\n debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_DATABASE_ADAPTERS.forEach((adapter) => {\n const pkgName = getDbPackageName(adapter)\n if (transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n delete transformed.dependencies![pkgName]\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new adapter\n const dbAdapterPackageName = getDbPackageName(options.databaseAdapter)\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[dbAdapterPackageName] = payloadVersion\n\n debug(`[AST] Added adapter package: ${dbAdapterPackageName}`)\n }\n\n // Update storage adapter\n if (options.storageAdapter) {\n debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_STORAGE_ADAPTERS.forEach((adapter) => {\n const pkgName = getStoragePackageName(adapter)\n if (pkgName && transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n if (pkgName) {\n delete transformed.dependencies![pkgName]\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new storage adapter (if not localDisk)\n const storagePackageName = getStoragePackageName(options.storageAdapter)\n if (storagePackageName) {\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[storagePackageName] = payloadVersion\n debug(`[AST] Added storage adapter package: ${storagePackageName}`)\n } else {\n debug(`[AST] Storage adapter is localDisk, no package needed`)\n }\n }\n\n // Remove sharp\n if (options.removeSharp && transformed.dependencies) {\n transformed.dependencies = { ...transformed.dependencies }\n if (transformed.dependencies.sharp) {\n delete transformed.dependencies.sharp\n debug('[AST] Removed sharp dependency')\n } else {\n debug('[AST] Sharp dependency not found (already absent)')\n }\n }\n\n // Update package name\n if (options.packageName) {\n debug(`[AST] Updated package name to: ${options.packageName}`)\n transformed.name = options.packageName\n }\n\n return transformed\n}\n\nfunction writePackageJson(filePath: string, pkg: PackageJsonStructure): void {\n fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + '\\n')\n}\n"],"names":["fs","debug","getDbPackageName","getStoragePackageName","ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS","updatePackageJson","filePath","options","pkg","parsePackageJson","transformed","transformPackageJson","writePackageJson","content","readFileSync","JSON","parse","databaseAdapter","dependencies","removedAdapters","forEach","adapter","pkgName","push","length","join","dbAdapterPackageName","payloadVersion","payload","storageAdapter","storagePackageName","removeSharp","sharp","packageName","name","writeFileSync","stringify"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/lib/ast/package-json.ts"],"sourcesContent":["import * as fs from 'fs'\n\nimport type { DatabaseAdapter, StorageAdapter } from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { getDbPackageName, getStoragePackageName } from './adapter-config.js'\nimport { ALL_DATABASE_ADAPTERS, ALL_STORAGE_ADAPTERS } from './types.js'\n\ntype PackageJsonTransformOptions = {\n addDependencies?: Record<string, string>\n databaseAdapter?: DatabaseAdapter\n packageName?: string\n removeDependencies?: string[]\n removeSharp?: boolean\n storageAdapter?: StorageAdapter\n}\n\ntype PackageJsonStructure = {\n [key: string]: unknown\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n name?: string\n}\n\n/**\n * Main orchestration function\n */\nexport function updatePackageJson(filePath: string, options: PackageJsonTransformOptions): void {\n debug(`[AST] Updating package.json: ${filePath}`)\n\n const prepared = preparePackageJson({ filePath, options })\n fs.writeFileSync(prepared.filePath, prepared.content)\n\n debug('[AST] ✓ package.json updated successfully')\n}\n\nexport function preparePackageJson({\n filePath,\n options,\n}: {\n filePath: string\n options: PackageJsonTransformOptions\n}): { content: string; filePath: string } {\n const pkg = parsePackageJson(filePath)\n const transformed = transformPackageJson(pkg, options)\n\n return {\n content: `${JSON.stringify(transformed, null, 2)}\\n`,\n filePath,\n }\n}\n\n// Helper functions\n\nfunction parsePackageJson(filePath: string): PackageJsonStructure {\n const content = fs.readFileSync(filePath, 'utf-8')\n return JSON.parse(content)\n}\n\n/**\n * Transforms the package.json based upon provided options\n */\nfunction transformPackageJson(\n pkg: PackageJsonStructure,\n options: PackageJsonTransformOptions,\n): PackageJsonStructure {\n const transformed = { ...pkg }\n\n // Update database adapter\n if (options.databaseAdapter) {\n debug(`[AST] Updating package.json database adapter to: ${options.databaseAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_DATABASE_ADAPTERS.forEach((adapter) => {\n const pkgName = getDbPackageName(adapter)\n if (transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n delete transformed.dependencies![pkgName]\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new adapter\n const dbAdapterPackageName = getDbPackageName(options.databaseAdapter)\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[dbAdapterPackageName] = payloadVersion\n\n debug(`[AST] Added adapter package: ${dbAdapterPackageName}`)\n }\n\n // Update storage adapter\n if (options.storageAdapter) {\n debug(`[AST] Updating package.json storage adapter to: ${options.storageAdapter}`)\n\n transformed.dependencies = { ...transformed.dependencies }\n\n const removedAdapters: string[] = []\n ALL_STORAGE_ADAPTERS.forEach((adapter) => {\n const pkgName = getStoragePackageName(adapter)\n if (pkgName && transformed.dependencies![pkgName]) {\n removedAdapters.push(pkgName)\n }\n if (pkgName) {\n delete transformed.dependencies![pkgName]\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old storage adapter packages: ${removedAdapters.join(', ')}`)\n }\n\n // Add new storage adapter (if not localDisk)\n const storagePackageName = getStoragePackageName(options.storageAdapter)\n if (storagePackageName) {\n const payloadVersion = transformed.dependencies?.payload || '^3.0.0'\n transformed.dependencies[storagePackageName] = payloadVersion\n debug(`[AST] Added storage adapter package: ${storagePackageName}`)\n } else {\n debug(`[AST] Storage adapter is localDisk, no package needed`)\n }\n }\n\n // Remove sharp\n if (options.removeSharp && transformed.dependencies) {\n transformed.dependencies = { ...transformed.dependencies }\n if (transformed.dependencies.sharp) {\n delete transformed.dependencies.sharp\n debug('[AST] Removed sharp dependency')\n } else {\n debug('[AST] Sharp dependency not found (already absent)')\n }\n }\n\n if (options.addDependencies) {\n transformed.dependencies = {\n ...transformed.dependencies,\n ...options.addDependencies,\n }\n }\n\n if (options.removeDependencies) {\n for (const dependencyGroup of ['dependencies', 'devDependencies'] as const) {\n if (!transformed[dependencyGroup]) {\n continue\n }\n\n transformed[dependencyGroup] = { ...transformed[dependencyGroup] }\n for (const packageName of options.removeDependencies) {\n delete transformed[dependencyGroup][packageName]\n }\n }\n }\n\n // Update package name\n if (options.packageName) {\n debug(`[AST] Updated package name to: ${options.packageName}`)\n transformed.name = options.packageName\n }\n\n return transformed\n}\n"],"names":["fs","debug","getDbPackageName","getStoragePackageName","ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS","updatePackageJson","filePath","options","prepared","preparePackageJson","writeFileSync","content","pkg","parsePackageJson","transformed","transformPackageJson","JSON","stringify","readFileSync","parse","databaseAdapter","dependencies","removedAdapters","forEach","adapter","pkgName","push","length","join","dbAdapterPackageName","payloadVersion","payload","storageAdapter","storagePackageName","removeSharp","sharp","addDependencies","removeDependencies","dependencyGroup","packageName","name"],"mappings":"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"}
@@ -107,7 +107,7 @@ export function detectPayloadConfigStructure(sourceFile) {
107
107
  },
108
108
  importSources: {
109
109
  dbAdapter: dbAdapterImportInfo,
110
- storageAdapters: storageAdapterImports.length > 0 ? storageAdapterImports : undefined
110
+ storage: storageAdapterImports.length > 0 ? storageAdapterImports : undefined
111
111
  },
112
112
  sourceFile,
113
113
  structures: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/payload-config.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport path from 'path'\nimport { Project, QuoteKind, type SourceFile, SyntaxKind } from 'ts-morph'\n\nimport type {\n ConfigureOptions,\n DatabaseAdapter,\n DetectionResult,\n Modification,\n StorageAdapter,\n TransformationResult,\n WriteOptions,\n WriteResult,\n} from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './adapter-config.js'\nimport {\n addImportDeclaration,\n cleanupOrphanedImports,\n formatError,\n removeImportDeclaration,\n} from './utils.js'\n\nexport function detectPayloadConfigStructure(sourceFile: SourceFile): DetectionResult {\n debug(`[AST] Detecting payload config structure in ${sourceFile.getFilePath()}`)\n\n // First find the actual name being used (might be aliased)\n const payloadImport = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === 'payload')\n\n const buildConfigImportSpec = payloadImport\n ?.getNamedImports()\n .find((spec) => spec.getName() === 'buildConfig')\n\n const aliasNode = buildConfigImportSpec?.getAliasNode()\n const buildConfigName = aliasNode ? aliasNode.getText() : 'buildConfig'\n\n debug(`[AST] Looking for function call: ${buildConfigName}`)\n\n // Find buildConfig call expression (using actual name in code)\n const buildConfigCall = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n if (!buildConfigCall) {\n debug(`[AST] ✗ ${buildConfigName} call not found`)\n return {\n error: formatError({\n actual: `No ${buildConfigName} call found in file`,\n context: 'buildConfig call',\n expected: `export default ${buildConfigName}({ ... })`,\n technicalDetails: `Could not find CallExpression with identifier \"${buildConfigName}\"`,\n }),\n success: false,\n }\n }\n\n debug(`[AST] ✓ ${buildConfigName} call found`)\n\n // Get import statements\n const importStatements = sourceFile.getImportDeclarations()\n debug(`[AST] Found ${importStatements.length} import statements`)\n\n // Find db property if it exists\n const configObject = buildConfigCall.getArguments()[0]\n let dbProperty\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n dbProperty = configObject\n .asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n .getProperty('db')\n ?.asKind(SyntaxKind.PropertyAssignment)\n }\n\n debug(`[AST] db property: ${dbProperty ? '✓ found' : '✗ not found'}`)\n\n // Find plugins array if it exists\n let pluginsArray\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const pluginsProperty = objLiteral.getProperty('plugins')\n\n // Handle PropertyAssignment (e.g., plugins: [...])\n const propertyAssignment = pluginsProperty?.asKind(SyntaxKind.PropertyAssignment)\n if (propertyAssignment) {\n const initializer = propertyAssignment.getInitializer()\n if (initializer?.getKind() === SyntaxKind.ArrayLiteralExpression) {\n pluginsArray = initializer.asKind(SyntaxKind.ArrayLiteralExpression)\n }\n }\n // For ShorthandPropertyAssignment (e.g., plugins), we can't get the array directly\n // but we'll detect it in addStorageAdapter\n }\n\n debug(`[AST] plugins array: ${pluginsArray ? '✓ found' : '✗ not found'}`)\n\n // Find all buildConfig calls for edge case detection (using actual name)\n const allBuildConfigCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n const hasImportAlias = !!aliasNode\n\n // Check for other Payload imports\n const payloadImports = payloadImport?.getNamedImports() || []\n const hasOtherPayloadImports =\n payloadImports.length > 1 || payloadImports.some((imp) => imp.getName() !== 'buildConfig')\n\n // Track database adapter imports\n let dbAdapterImportInfo\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n dbAdapterImportInfo = {\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n }\n break\n }\n }\n\n // Track storage adapter imports\n const storageAdapterImports = []\n for (const [, config] of Object.entries(STORAGE_ADAPTER_CONFIG)) {\n if (!config.packageName || !config.adapterName) {\n continue\n }\n\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n storageAdapterImports.push({\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n })\n }\n }\n\n const needsManualIntervention = hasImportAlias || allBuildConfigCalls.length > 2\n\n debug(\n `[AST] Edge cases: alias=${hasImportAlias}, multiple=${allBuildConfigCalls.length > 1}, otherImports=${hasOtherPayloadImports}, manual=${needsManualIntervention}`,\n )\n\n return {\n edgeCases: {\n hasImportAlias,\n hasOtherPayloadImports,\n multipleBuildConfigCalls: allBuildConfigCalls.length > 1,\n needsManualIntervention,\n },\n importSources: {\n dbAdapter: dbAdapterImportInfo,\n storageAdapters: storageAdapterImports.length > 0 ? storageAdapterImports : undefined,\n },\n sourceFile,\n structures: {\n buildConfigCall,\n dbProperty,\n importStatements,\n pluginsArray,\n },\n success: true,\n }\n}\n\nexport function addDatabaseAdapter({\n adapter,\n envVarName = 'DATABASE_URL',\n sourceFile,\n}: {\n adapter: DatabaseAdapter\n envVarName?: string\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding database adapter: ${adapter} (envVar: ${envVarName})`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall, dbProperty } = detection.structures\n const config = DB_ADAPTER_CONFIG[adapter]\n\n // Remove old db adapter imports and track position for replacement\n const oldAdapters = Object.values(DB_ADAPTER_CONFIG)\n const removedAdapters: string[] = []\n let importInsertIndex: number | undefined\n oldAdapters.forEach((oldConfig) => {\n if (oldConfig.packageName !== config.packageName) {\n const { removedIndex } = removeImportDeclaration({\n moduleSpecifier: oldConfig.packageName,\n sourceFile,\n })\n if (removedIndex !== undefined) {\n // Use the first removed adapter's position\n if (importInsertIndex === undefined) {\n importInsertIndex = removedIndex\n }\n removedAdapters.push(oldConfig.packageName)\n modifications.push({\n type: 'import-removed',\n description: `Removed import from '${oldConfig.packageName}'`,\n })\n }\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter imports: ${removedAdapters.join(', ')}`)\n }\n\n // Add new import at the position of the removed one (or default position)\n addImportDeclaration({\n insertIndex: importInsertIndex,\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n\n // Add special imports for specific adapters\n if (adapter === 'd1-sqlite') {\n debug('[AST] Adding special import: ./db/migrations')\n addImportDeclaration({\n defaultImport: 'migrations',\n moduleSpecifier: './db/migrations',\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: migrations from './db/migrations'`,\n })\n }\n\n // Get config object\n const configObject = buildConfigCall.getArguments()[0]\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'database adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n const newDbCode = `db: ${config.configTemplate(envVarName)}`\n\n if (dbProperty) {\n // Replace existing db property\n // NOTE: Using replaceWithText() instead of remove() + insertPropertyAssignment()\n // to avoid double comma issues. When remove() is called, ts-morph doesn't always\n // clean up trailing commas correctly, which can result in syntax like \"},,\" when\n // inserting a new property at that position. replaceWithText() preserves the\n // surrounding punctuation correctly.\n debug(`[AST] Replacing existing db property`)\n dbProperty.replaceWithText(newDbCode)\n modifications.push({\n type: 'property-added',\n description: `Replaced db property with ${adapter} adapter`,\n })\n } else {\n // No existing db property - insert at end\n const insertIndex = objLiteral.getProperties().length\n debug(`[AST] Adding db property at index ${insertIndex}`)\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'db',\n initializer: config.configTemplate(envVarName),\n })\n modifications.push({\n type: 'property-added',\n description: `Added db property with ${adapter} adapter`,\n })\n }\n\n debug(`[AST] ✓ Database adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function addStorageAdapter({\n adapter,\n sourceFile,\n}: {\n adapter: StorageAdapter\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding storage adapter: ${adapter}`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const config = STORAGE_ADAPTER_CONFIG[adapter]\n\n // Local disk doesn't need any imports or plugins\n if (adapter === 'localDisk') {\n debug('[AST] localDisk storage adapter - no imports or plugins needed')\n return {\n modifications: [],\n modified: false,\n success: true,\n }\n }\n\n // Add import\n if (config.packageName && config.adapterName) {\n addImportDeclaration({\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'storage adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n // Find or create plugins array\n const pluginsPropertyRaw = objLiteral.getProperty('plugins')\n let pluginsProperty = pluginsPropertyRaw?.asKind(SyntaxKind.PropertyAssignment)\n\n // Check if it's a shorthand property (e.g., `plugins` referencing an imported variable)\n const shorthandProperty = pluginsPropertyRaw?.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n if (shorthandProperty) {\n debug('[AST] Found shorthand plugins property, converting to long form with spread')\n // Get the identifier name (usually 'plugins')\n const identifierName = shorthandProperty.getName()\n\n // Find insert position before removing\n const allProperties = objLiteral.getProperties()\n const insertIndex = allProperties.indexOf(shorthandProperty)\n\n // Remove the shorthand property\n shorthandProperty.remove()\n\n // Create new property with spread operator: plugins: [...plugins, newAdapter]\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'plugins',\n initializer: `[...${identifierName}]`,\n })\n\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Converted shorthand plugins property to array with spread syntax`,\n })\n } else if (!pluginsProperty) {\n debug('[AST] Creating new plugins array')\n // Create plugins array\n objLiteral.addPropertyAssignment({\n name: 'plugins',\n initializer: '[]',\n })\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Created plugins array`,\n })\n } else {\n debug('[AST] Reusing existing plugins array')\n }\n\n if (!pluginsProperty) {\n return {\n error: formatError({\n actual: 'Failed to create or find plugins property',\n context: 'storage adapter configuration',\n expected: 'plugins array property',\n technicalDetails: 'Could not create or access plugins property',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const initializer = pluginsProperty.getInitializer()\n if (!initializer || initializer.getKind() !== SyntaxKind.ArrayLiteralExpression) {\n return {\n error: formatError({\n actual: 'plugins property is not an array',\n context: 'storage adapter configuration',\n expected: 'plugins: [...]',\n technicalDetails: 'plugins property must be an array literal expression',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const pluginsArray = initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n\n // Add storage adapter call\n const configText = config.configTemplate()\n if (configText) {\n pluginsArray.addElement(configText)\n modifications.push({\n type: 'property-added',\n description: `Added ${adapter} to plugins array`,\n })\n }\n\n debug(`[AST] ✓ Storage adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function removeSharp(sourceFile: SourceFile): TransformationResult {\n debug('[AST] Removing sharp import and property')\n\n const modifications: Modification[] = []\n\n // Remove import\n const { removedIndex } = removeImportDeclaration({ moduleSpecifier: 'sharp', sourceFile })\n if (removedIndex !== undefined) {\n modifications.push({\n type: 'import-removed',\n description: `Removed import from 'sharp'`,\n })\n }\n\n // Find and remove sharp property from buildConfig\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n // If detection failed but we removed import, still count as partial success\n if (modifications.length > 0) {\n return {\n modifications,\n modified: true,\n success: true,\n warnings: ['Could not detect config structure to remove sharp property'],\n }\n }\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n warnings: ['buildConfig has no object literal argument - could not remove sharp property'],\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const sharpProperty = objLiteral.getProperty('sharp')\n\n if (sharpProperty) {\n sharpProperty.remove()\n modifications.push({\n type: 'property-removed',\n description: `Removed sharp property from config`,\n })\n debug('[AST] ✓ Sharp property removed from config')\n } else {\n debug('[AST] Sharp property not found (already absent)')\n }\n\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n }\n}\n\n/** This shouldn't be necessary once the templates are updated. Can't hurt to keep in, though */\nexport function removeCommentMarkers(sourceFile: SourceFile): SourceFile {\n // Get the full text and replace comment markers\n let text = sourceFile.getFullText()\n\n // Remove inline comment markers from imports\n text = text.replace(/\\s*\\/\\/\\s*database-adapter-import\\s*$/gm, '')\n text = text.replace(/\\s*\\/\\/\\s*storage-adapter-import-placeholder\\s*$/gm, '')\n\n // Remove standalone comment lines\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-start\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-end\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*storage-adapter-placeholder\\s*\\n/gm, '')\n\n // Also remove the placeholder line from template (storage-adapter-import-placeholder at top)\n text = text.replace(/^\\/\\/\\s*storage-adapter-import-placeholder\\s*\\n/gm, '')\n\n // Replace the entire source file content\n sourceFile.replaceWithText(text)\n\n return sourceFile\n}\n\n/**\n * Validates payload config structure has required elements after transformation.\n * Checks that buildConfig() call exists and has a db property configured.\n */\nexport function validateStructure(sourceFile: SourceFile): WriteResult {\n debug('[AST] Validating payload config structure')\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success) {\n debug('[AST] ✗ Validation failed: detection unsuccessful')\n return {\n error: detection.error,\n success: false,\n }\n }\n\n const { structures } = detection\n\n // Validate db property exists\n if (!structures?.dbProperty) {\n debug('[AST] ✗ Validation failed: db property missing')\n return {\n error: formatError({\n actual: 'No db property found',\n context: 'database configuration',\n expected: 'buildConfig must have a db property',\n technicalDetails: 'PropertyAssignment with name \"db\" not found in buildConfig object',\n }),\n success: false,\n }\n }\n\n debug('[AST] ✓ Validation passed')\n return { success: true }\n}\n\nexport async function writeTransformedFile(\n sourceFile: SourceFile,\n options: WriteOptions = {},\n): Promise<WriteResult> {\n const { formatWithPrettier = true, validateStructure: shouldValidate = true } = options\n\n debug(`[AST] Writing transformed file: ${sourceFile.getFilePath()}`)\n\n // Validate if requested\n if (shouldValidate) {\n const validation = validateStructure(sourceFile)\n if (!validation.success) {\n return validation\n }\n }\n\n // Get file path and save to disk\n const filePath = sourceFile.getFilePath()\n\n // Format with ts-morph before saving (fixes trailing commas, indentation)\n debug('[AST] Formatting with ts-morph')\n sourceFile.formatText()\n\n // Write file\n debug('[AST] Writing file to disk')\n await sourceFile.save()\n\n // Format with prettier if requested\n if (formatWithPrettier) {\n debug('[AST] Running prettier formatting via CLI')\n try {\n // Detect project directory (go up from file until we find package.json or use dirname)\n const projectDir = path.dirname(filePath)\n\n // Run prettier via CLI (avoids Jest/ESM compatibility issues)\n const prettierCmd = `npx prettier --write \"${filePath}\"`\n\n debug(`[AST] Executing: ${prettierCmd}`)\n execSync(prettierCmd, {\n cwd: projectDir,\n stdio: 'pipe', // Suppress output\n })\n debug('[AST] ✓ Prettier formatting successful')\n } catch (error) {\n // Log but don't fail if prettier fails (might not be installed)\n debug(\n `[AST] ⚠ Prettier formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n debug('[AST] Continuing with unformatted output')\n }\n } else {\n debug('[AST] Skipping prettier formatting (disabled)')\n }\n\n debug('[AST] ✓ File written successfully')\n\n return { success: true }\n}\n\nexport async function configurePayloadConfig(\n filePath: string,\n options: ConfigureOptions = {},\n): Promise<WriteResult> {\n debug(`[AST] Configuring payload config: ${filePath}`)\n debug(\n `[AST] Options: db=${options.db?.type}, storage=${options.storage}, removeSharp=${options.removeSharp}`,\n )\n\n const allModifications: Modification[] = []\n const allWarnings: string[] = []\n\n try {\n // Create Project and load source file with proper settings\n const project = new Project({\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n },\n })\n let sourceFile = project.addSourceFileAtPath(filePath)\n\n // Run detection\n const detection = detectPayloadConfigStructure(sourceFile)\n if (!detection.success) {\n return detection\n }\n\n // Apply transformations based on options\n if (options.db) {\n debug('[AST] Applying database adapter transformation')\n const result = addDatabaseAdapter({\n adapter: options.db.type,\n envVarName: options.db.envVarName,\n sourceFile,\n })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.storage) {\n debug('[AST] Applying storage adapter transformation')\n const result = addStorageAdapter({ adapter: options.storage, sourceFile })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.removeSharp) {\n debug('[AST] Applying sharp removal')\n const result = removeSharp(sourceFile)\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n // Remove comment markers from template\n sourceFile = removeCommentMarkers(sourceFile)\n\n // Cleanup orphaned imports after all transformations\n debug('[AST] Cleaning up orphaned imports')\n\n // Cleanup database adapter imports if db was removed\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n if (options.db && config.packageName !== DB_ADAPTER_CONFIG[options.db.type].packageName) {\n const cleanup = cleanupOrphanedImports({\n importNames: [config.adapterName],\n moduleSpecifier: config.packageName,\n sourceFile,\n })\n if (cleanup.removed.length > 0) {\n cleanup.removed.forEach((importName) => {\n allModifications.push({\n type: 'import-removed',\n description: `Cleaned up unused import '${importName}' from '${config.packageName}'`,\n })\n })\n }\n }\n }\n\n // Log summary of modifications\n if (allModifications.length > 0) {\n debug(`[AST] Applied ${allModifications.length} modification(s):`)\n allModifications.forEach((mod) => {\n debug(`[AST] - ${mod.type}: ${mod.description}`)\n })\n }\n\n if (allWarnings.length > 0) {\n debug(`[AST] ${allWarnings.length} warning(s):`)\n allWarnings.forEach((warning) => {\n debug(`[AST] - ${warning}`)\n })\n }\n\n // Write transformed file with validation and formatting\n return await writeTransformedFile(sourceFile, {\n formatWithPrettier: options.formatWithPrettier,\n validateStructure: options.validateStructure ?? true,\n })\n } catch (error) {\n debug(`[AST] ✗ Configuration failed: ${error instanceof Error ? error.message : String(error)}`)\n return {\n error: formatError({\n actual: error instanceof Error ? error.message : String(error),\n context: 'configurePayloadConfig',\n expected: 'Successful file transformation',\n technicalDetails: error instanceof Error ? error.stack || error.message : String(error),\n }),\n success: false,\n }\n }\n}\n"],"names":["execSync","path","Project","QuoteKind","SyntaxKind","debug","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","addImportDeclaration","cleanupOrphanedImports","formatError","removeImportDeclaration","detectPayloadConfigStructure","sourceFile","getFilePath","payloadImport","getImportDeclarations","find","imp","getModuleSpecifierValue","buildConfigImportSpec","getNamedImports","spec","getName","aliasNode","getAliasNode","buildConfigName","getText","buildConfigCall","getDescendantsOfKind","CallExpression","call","expression","getExpression","error","actual","context","expected","technicalDetails","success","importStatements","length","configObject","getArguments","dbProperty","getKind","ObjectLiteralExpression","asKindOrThrow","getProperty","asKind","PropertyAssignment","pluginsArray","objLiteral","pluginsProperty","propertyAssignment","initializer","getInitializer","ArrayLiteralExpression","allBuildConfigCalls","filter","hasImportAlias","payloadImports","hasOtherPayloadImports","some","dbAdapterImportInfo","config","Object","entries","importDecl","packageName","namedImports","hasOtherImports","importDeclaration","storageAdapterImports","adapterName","push","needsManualIntervention","edgeCases","multipleBuildConfigCalls","importSources","dbAdapter","storageAdapters","undefined","structures","addDatabaseAdapter","adapter","envVarName","modifications","detection","modified","oldAdapters","values","removedAdapters","importInsertIndex","forEach","oldConfig","removedIndex","moduleSpecifier","type","description","join","insertIndex","defaultImport","newDbCode","configTemplate","replaceWithText","getProperties","insertPropertyAssignment","name","addStorageAdapter","pluginsPropertyRaw","shorthandProperty","ShorthandPropertyAssignment","identifierName","allProperties","indexOf","remove","addPropertyAssignment","configText","addElement","removeSharp","warnings","sharpProperty","removeCommentMarkers","text","getFullText","replace","validateStructure","writeTransformedFile","options","formatWithPrettier","shouldValidate","validation","filePath","formatText","save","projectDir","dirname","prettierCmd","cwd","stdio","Error","message","configurePayloadConfig","db","storage","allModifications","allWarnings","project","manipulationSettings","quoteKind","Single","addSourceFileAtPath","result","cleanup","importNames","removed","importName","mod","warning","String","stack"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,OAAOC,UAAU,OAAM;AACvB,SAASC,OAAO,EAAEC,SAAS,EAAmBC,UAAU,QAAQ,WAAU;AAa1E,SAASC,KAAK,QAAQ,qBAAoB;AAC1C,SAASC,iBAAiB,EAAEC,sBAAsB,QAAQ,sBAAqB;AAC/E,SACEC,oBAAoB,EACpBC,sBAAsB,EACtBC,WAAW,EACXC,uBAAuB,QAClB,aAAY;AAEnB,OAAO,SAASC,6BAA6BC,UAAsB;IACjER,MAAM,CAAC,4CAA4C,EAAEQ,WAAWC,WAAW,IAAI;IAE/E,2DAA2D;IAC3D,MAAMC,gBAAgBF,WACnBG,qBAAqB,GACrBC,IAAI,CAAC,CAACC,MAAQA,IAAIC,uBAAuB,OAAO;IAEnD,MAAMC,wBAAwBL,eAC1BM,kBACDJ,KAAK,CAACK,OAASA,KAAKC,OAAO,OAAO;IAErC,MAAMC,YAAYJ,uBAAuBK;IACzC,MAAMC,kBAAkBF,YAAYA,UAAUG,OAAO,KAAK;IAE1DtB,MAAM,CAAC,iCAAiC,EAAEqB,iBAAiB;IAE3D,+DAA+D;IAC/D,MAAME,kBAAkBf,WACrBgB,oBAAoB,CAACzB,WAAW0B,cAAc,EAC9Cb,IAAI,CAAC,CAACc;QACL,MAAMC,aAAaD,KAAKE,aAAa;QACrC,OAAOD,WAAWL,OAAO,OAAOD;IAClC;IAEF,IAAI,CAACE,iBAAiB;QACpBvB,MAAM,CAAC,QAAQ,EAAEqB,gBAAgB,eAAe,CAAC;QACjD,OAAO;YACLQ,OAAOxB,YAAY;gBACjByB,QAAQ,CAAC,GAAG,EAAET,gBAAgB,mBAAmB,CAAC;gBAClDU,SAAS;gBACTC,UAAU,CAAC,eAAe,EAAEX,gBAAgB,SAAS,CAAC;gBACtDY,kBAAkB,CAAC,+CAA+C,EAAEZ,gBAAgB,CAAC,CAAC;YACxF;YACAa,SAAS;QACX;IACF;IAEAlC,MAAM,CAAC,QAAQ,EAAEqB,gBAAgB,WAAW,CAAC;IAE7C,wBAAwB;IACxB,MAAMc,mBAAmB3B,WAAWG,qBAAqB;IACzDX,MAAM,CAAC,YAAY,EAAEmC,iBAAiBC,MAAM,CAAC,kBAAkB,CAAC;IAEhE,gCAAgC;IAChC,MAAMC,eAAed,gBAAgBe,YAAY,EAAE,CAAC,EAAE;IACtD,IAAIC;IACJ,IAAIF,gBAAgBA,aAAaG,OAAO,OAAOzC,WAAW0C,uBAAuB,EAAE;QACjFF,aAAaF,aACVK,aAAa,CAAC3C,WAAW0C,uBAAuB,EAChDE,WAAW,CAAC,OACXC,OAAO7C,WAAW8C,kBAAkB;IAC1C;IAEA7C,MAAM,CAAC,mBAAmB,EAAEuC,aAAa,YAAY,eAAe;IAEpE,kCAAkC;IAClC,IAAIO;IACJ,IAAIT,gBAAgBA,aAAaG,OAAO,OAAOzC,WAAW0C,uBAAuB,EAAE;QACjF,MAAMM,aAAaV,aAAaK,aAAa,CAAC3C,WAAW0C,uBAAuB;QAChF,MAAMO,kBAAkBD,WAAWJ,WAAW,CAAC;QAE/C,mDAAmD;QACnD,MAAMM,qBAAqBD,iBAAiBJ,OAAO7C,WAAW8C,kBAAkB;QAChF,IAAII,oBAAoB;YACtB,MAAMC,cAAcD,mBAAmBE,cAAc;YACrD,IAAID,aAAaV,cAAczC,WAAWqD,sBAAsB,EAAE;gBAChEN,eAAeI,YAAYN,MAAM,CAAC7C,WAAWqD,sBAAsB;YACrE;QACF;IACA,mFAAmF;IACnF,2CAA2C;IAC7C;IAEApD,MAAM,CAAC,qBAAqB,EAAE8C,eAAe,YAAY,eAAe;IAExE,yEAAyE;IACzE,MAAMO,sBAAsB7C,WACzBgB,oBAAoB,CAACzB,WAAW0B,cAAc,EAC9C6B,MAAM,CAAC,CAAC5B;QACP,MAAMC,aAAaD,KAAKE,aAAa;QACrC,OAAOD,WAAWL,OAAO,OAAOD;IAClC;IAEF,MAAMkC,iBAAiB,CAAC,CAACpC;IAEzB,kCAAkC;IAClC,MAAMqC,iBAAiB9C,eAAeM,qBAAqB,EAAE;IAC7D,MAAMyC,yBACJD,eAAepB,MAAM,GAAG,KAAKoB,eAAeE,IAAI,CAAC,CAAC7C,MAAQA,IAAIK,OAAO,OAAO;IAE9E,iCAAiC;IACjC,IAAIyC;IACJ,KAAK,MAAM,GAAGC,OAAO,IAAIC,OAAOC,OAAO,CAAC7D,mBAAoB;QAC1D,MAAM8D,aAAavD,WAChBG,qBAAqB,GACrBC,IAAI,CAAC,CAACC,MAAQA,IAAIC,uBAAuB,OAAO8C,OAAOI,WAAW;QAErE,IAAID,YAAY;YACd,MAAME,eAAeF,WAAW/C,eAAe;YAC/C2C,sBAAsB;gBACpBO,iBAAiBD,aAAa7B,MAAM,GAAG;gBACvC+B,mBAAmBJ;gBACnBC,aAAaJ,OAAOI,WAAW;YACjC;YACA;QACF;IACF;IAEA,gCAAgC;IAChC,MAAMI,wBAAwB,EAAE;IAChC,KAAK,MAAM,GAAGR,OAAO,IAAIC,OAAOC,OAAO,CAAC5D,wBAAyB;QAC/D,IAAI,CAAC0D,OAAOI,WAAW,IAAI,CAACJ,OAAOS,WAAW,EAAE;YAC9C;QACF;QAEA,MAAMN,aAAavD,WAChBG,qBAAqB,GACrBC,IAAI,CAAC,CAACC,MAAQA,IAAIC,uBAAuB,OAAO8C,OAAOI,WAAW;QAErE,IAAID,YAAY;YACd,MAAME,eAAeF,WAAW/C,eAAe;YAC/CoD,sBAAsBE,IAAI,CAAC;gBACzBJ,iBAAiBD,aAAa7B,MAAM,GAAG;gBACvC+B,mBAAmBJ;gBACnBC,aAAaJ,OAAOI,WAAW;YACjC;QACF;IACF;IAEA,MAAMO,0BAA0BhB,kBAAkBF,oBAAoBjB,MAAM,GAAG;IAE/EpC,MACE,CAAC,wBAAwB,EAAEuD,eAAe,WAAW,EAAEF,oBAAoBjB,MAAM,GAAG,EAAE,eAAe,EAAEqB,uBAAuB,SAAS,EAAEc,yBAAyB;IAGpK,OAAO;QACLC,WAAW;YACTjB;YACAE;YACAgB,0BAA0BpB,oBAAoBjB,MAAM,GAAG;YACvDmC;QACF;QACAG,eAAe;YACbC,WAAWhB;YACXiB,iBAAiBR,sBAAsBhC,MAAM,GAAG,IAAIgC,wBAAwBS;QAC9E;QACArE;QACAsE,YAAY;YACVvD;YACAgB;YACAJ;YACAW;QACF;QACAZ,SAAS;IACX;AACF;AAEA,OAAO,SAAS6C,mBAAmB,EACjCC,OAAO,EACPC,aAAa,cAAc,EAC3BzE,UAAU,EAKX;IACCR,MAAM,CAAC,+BAA+B,EAAEgF,QAAQ,UAAU,EAAEC,WAAW,CAAC,CAAC;IAEzE,MAAMC,gBAAgC,EAAE;IAExC,MAAMC,YAAY5E,6BAA6BC;IAE/C,IAAI,CAAC2E,UAAUjD,OAAO,IAAI,CAACiD,UAAUL,UAAU,EAAE;QAC/C,OAAO;YACLjD,OAAOsD,UAAUtD,KAAK;YACtBqD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAM,EAAEX,eAAe,EAAEgB,UAAU,EAAE,GAAG4C,UAAUL,UAAU;IAC5D,MAAMlB,SAAS3D,iBAAiB,CAAC+E,QAAQ;IAEzC,mEAAmE;IACnE,MAAMK,cAAcxB,OAAOyB,MAAM,CAACrF;IAClC,MAAMsF,kBAA4B,EAAE;IACpC,IAAIC;IACJH,YAAYI,OAAO,CAAC,CAACC;QACnB,IAAIA,UAAU1B,WAAW,KAAKJ,OAAOI,WAAW,EAAE;YAChD,MAAM,EAAE2B,YAAY,EAAE,GAAGrF,wBAAwB;gBAC/CsF,iBAAiBF,UAAU1B,WAAW;gBACtCxD;YACF;YACA,IAAImF,iBAAiBd,WAAW;gBAC9B,2CAA2C;gBAC3C,IAAIW,sBAAsBX,WAAW;oBACnCW,oBAAoBG;gBACtB;gBACAJ,gBAAgBjB,IAAI,CAACoB,UAAU1B,WAAW;gBAC1CkB,cAAcZ,IAAI,CAAC;oBACjBuB,MAAM;oBACNC,aAAa,CAAC,qBAAqB,EAAEJ,UAAU1B,WAAW,CAAC,CAAC,CAAC;gBAC/D;YACF;QACF;IACF;IAEA,IAAIuB,gBAAgBnD,MAAM,GAAG,GAAG;QAC9BpC,MAAM,CAAC,mCAAmC,EAAEuF,gBAAgBQ,IAAI,CAAC,OAAO;IAC1E;IAEA,0EAA0E;IAC1E5F,qBAAqB;QACnB6F,aAAaR;QACbI,iBAAiBhC,OAAOI,WAAW;QACnCC,cAAc;YAACL,OAAOS,WAAW;SAAC;QAClC7D;IACF;IACA0E,cAAcZ,IAAI,CAAC;QACjBuB,MAAM;QACNC,aAAa,CAAC,gBAAgB,EAAElC,OAAOS,WAAW,CAAC,SAAS,EAAET,OAAOI,WAAW,CAAC,CAAC,CAAC;IACrF;IAEA,4CAA4C;IAC5C,IAAIgB,YAAY,aAAa;QAC3BhF,MAAM;QACNG,qBAAqB;YACnB8F,eAAe;YACfL,iBAAiB;YACjBpF;QACF;QACA0E,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,+CAA+C,CAAC;QAChE;IACF;IAEA,oBAAoB;IACpB,MAAMzD,eAAed,gBAAgBe,YAAY,EAAE,CAAC,EAAE;IACtD,IAAI,CAACD,gBAAgBA,aAAaG,OAAO,OAAOzC,WAAW0C,uBAAuB,EAAE;QAClF,OAAO;YACLZ,OAAOxB,YAAY;gBACjByB,QAAQ;gBACRC,SAAS;gBACTC,UAAU;gBACVC,kBAAkB;YACpB;YACAiD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAMa,aAAaV,aAAaK,aAAa,CAAC3C,WAAW0C,uBAAuB;IAEhF,MAAMyD,YAAY,CAAC,IAAI,EAAEtC,OAAOuC,cAAc,CAAClB,aAAa;IAE5D,IAAI1C,YAAY;QACd,+BAA+B;QAC/B,iFAAiF;QACjF,iFAAiF;QACjF,iFAAiF;QACjF,6EAA6E;QAC7E,qCAAqC;QACrCvC,MAAM,CAAC,oCAAoC,CAAC;QAC5CuC,WAAW6D,eAAe,CAACF;QAC3BhB,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,0BAA0B,EAAEd,QAAQ,QAAQ,CAAC;QAC7D;IACF,OAAO;QACL,0CAA0C;QAC1C,MAAMgB,cAAcjD,WAAWsD,aAAa,GAAGjE,MAAM;QACrDpC,MAAM,CAAC,kCAAkC,EAAEgG,aAAa;QACxDjD,WAAWuD,wBAAwB,CAACN,aAAa;YAC/CO,MAAM;YACNrD,aAAaU,OAAOuC,cAAc,CAAClB;QACrC;QACAC,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,uBAAuB,EAAEd,QAAQ,QAAQ,CAAC;QAC1D;IACF;IAEAhF,MAAM,CAAC,yBAAyB,EAAEgF,QAAQ,mBAAmB,CAAC;IAE9D,OAAO;QACLE;QACAE,UAAU;QACVlD,SAAS;IACX;AACF;AAEA,OAAO,SAASsE,kBAAkB,EAChCxB,OAAO,EACPxE,UAAU,EAIX;IACCR,MAAM,CAAC,8BAA8B,EAAEgF,SAAS;IAEhD,MAAME,gBAAgC,EAAE;IAExC,MAAMC,YAAY5E,6BAA6BC;IAE/C,IAAI,CAAC2E,UAAUjD,OAAO,IAAI,CAACiD,UAAUL,UAAU,EAAE;QAC/C,OAAO;YACLjD,OAAOsD,UAAUtD,KAAK;YACtBqD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAM0B,SAAS1D,sBAAsB,CAAC8E,QAAQ;IAE9C,iDAAiD;IACjD,IAAIA,YAAY,aAAa;QAC3BhF,MAAM;QACN,OAAO;YACLkF,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,aAAa;IACb,IAAI0B,OAAOI,WAAW,IAAIJ,OAAOS,WAAW,EAAE;QAC5ClE,qBAAqB;YACnByF,iBAAiBhC,OAAOI,WAAW;YACnCC,cAAc;gBAACL,OAAOS,WAAW;aAAC;YAClC7D;QACF;QACA0E,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,gBAAgB,EAAElC,OAAOS,WAAW,CAAC,SAAS,EAAET,OAAOI,WAAW,CAAC,CAAC,CAAC;QACrF;IACF;IAEA,MAAM,EAAEzC,eAAe,EAAE,GAAG4D,UAAUL,UAAU;IAChD,MAAMzC,eAAed,gBAAgBe,YAAY,EAAE,CAAC,EAAE;IAEtD,IAAI,CAACD,gBAAgBA,aAAaG,OAAO,OAAOzC,WAAW0C,uBAAuB,EAAE;QAClF,OAAO;YACLZ,OAAOxB,YAAY;gBACjByB,QAAQ;gBACRC,SAAS;gBACTC,UAAU;gBACVC,kBAAkB;YACpB;YACAiD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAMa,aAAaV,aAAaK,aAAa,CAAC3C,WAAW0C,uBAAuB;IAEhF,+BAA+B;IAC/B,MAAMgE,qBAAqB1D,WAAWJ,WAAW,CAAC;IAClD,IAAIK,kBAAkByD,oBAAoB7D,OAAO7C,WAAW8C,kBAAkB;IAE9E,wFAAwF;IACxF,MAAM6D,oBAAoBD,oBAAoB7D,OAAO7C,WAAW4G,2BAA2B;IAE3F,IAAID,mBAAmB;QACrB1G,MAAM;QACN,8CAA8C;QAC9C,MAAM4G,iBAAiBF,kBAAkBxF,OAAO;QAEhD,uCAAuC;QACvC,MAAM2F,gBAAgB9D,WAAWsD,aAAa;QAC9C,MAAML,cAAca,cAAcC,OAAO,CAACJ;QAE1C,gCAAgC;QAChCA,kBAAkBK,MAAM;QAExB,8EAA8E;QAC9EhE,WAAWuD,wBAAwB,CAACN,aAAa;YAC/CO,MAAM;YACNrD,aAAa,CAAC,IAAI,EAAE0D,eAAe,CAAC,CAAC;QACvC;QAEA5D,kBAAkBD,WAAWJ,WAAW,CAAC,YAAYC,OAAO7C,WAAW8C,kBAAkB;QACzFqC,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,gEAAgE,CAAC;QACjF;IACF,OAAO,IAAI,CAAC9C,iBAAiB;QAC3BhD,MAAM;QACN,uBAAuB;QACvB+C,WAAWiE,qBAAqB,CAAC;YAC/BT,MAAM;YACNrD,aAAa;QACf;QACAF,kBAAkBD,WAAWJ,WAAW,CAAC,YAAYC,OAAO7C,WAAW8C,kBAAkB;QACzFqC,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,qBAAqB,CAAC;QACtC;IACF,OAAO;QACL9F,MAAM;IACR;IAEA,IAAI,CAACgD,iBAAiB;QACpB,OAAO;YACLnB,OAAOxB,YAAY;gBACjByB,QAAQ;gBACRC,SAAS;gBACTC,UAAU;gBACVC,kBAAkB;YACpB;YACAiD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAMgB,cAAcF,gBAAgBG,cAAc;IAClD,IAAI,CAACD,eAAeA,YAAYV,OAAO,OAAOzC,WAAWqD,sBAAsB,EAAE;QAC/E,OAAO;YACLvB,OAAOxB,YAAY;gBACjByB,QAAQ;gBACRC,SAAS;gBACTC,UAAU;gBACVC,kBAAkB;YACpB;YACAiD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAMY,eAAeI,YAAYR,aAAa,CAAC3C,WAAWqD,sBAAsB;IAEhF,2BAA2B;IAC3B,MAAM6D,aAAarD,OAAOuC,cAAc;IACxC,IAAIc,YAAY;QACdnE,aAAaoE,UAAU,CAACD;QACxB/B,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,MAAM,EAAEd,QAAQ,iBAAiB,CAAC;QAClD;IACF;IAEAhF,MAAM,CAAC,wBAAwB,EAAEgF,QAAQ,mBAAmB,CAAC;IAE7D,OAAO;QACLE;QACAE,UAAU;QACVlD,SAAS;IACX;AACF;AAEA,OAAO,SAASiF,YAAY3G,UAAsB;IAChDR,MAAM;IAEN,MAAMkF,gBAAgC,EAAE;IAExC,gBAAgB;IAChB,MAAM,EAAES,YAAY,EAAE,GAAGrF,wBAAwB;QAAEsF,iBAAiB;QAASpF;IAAW;IACxF,IAAImF,iBAAiBd,WAAW;QAC9BK,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,2BAA2B,CAAC;QAC5C;IACF;IAEA,kDAAkD;IAClD,MAAMX,YAAY5E,6BAA6BC;IAE/C,IAAI,CAAC2E,UAAUjD,OAAO,IAAI,CAACiD,UAAUL,UAAU,EAAE;QAC/C,4EAA4E;QAC5E,IAAII,cAAc9C,MAAM,GAAG,GAAG;YAC5B,OAAO;gBACL8C;gBACAE,UAAU;gBACVlD,SAAS;gBACTkF,UAAU;oBAAC;iBAA6D;YAC1E;QACF;QACA,OAAO;YACLvF,OAAOsD,UAAUtD,KAAK;YACtBqD,eAAe,EAAE;YACjBE,UAAU;YACVlD,SAAS;QACX;IACF;IAEA,MAAM,EAAEX,eAAe,EAAE,GAAG4D,UAAUL,UAAU;IAChD,MAAMzC,eAAed,gBAAgBe,YAAY,EAAE,CAAC,EAAE;IAEtD,IAAI,CAACD,gBAAgBA,aAAaG,OAAO,OAAOzC,WAAW0C,uBAAuB,EAAE;QAClF,OAAO;YACLyC;YACAE,UAAUF,cAAc9C,MAAM,GAAG;YACjCF,SAAS;YACTkF,UAAU;gBAAC;aAA+E;QAC5F;IACF;IAEA,MAAMrE,aAAaV,aAAaK,aAAa,CAAC3C,WAAW0C,uBAAuB;IAChF,MAAM4E,gBAAgBtE,WAAWJ,WAAW,CAAC;IAE7C,IAAI0E,eAAe;QACjBA,cAAcN,MAAM;QACpB7B,cAAcZ,IAAI,CAAC;YACjBuB,MAAM;YACNC,aAAa,CAAC,kCAAkC,CAAC;QACnD;QACA9F,MAAM;IACR,OAAO;QACLA,MAAM;IACR;IAEA,OAAO;QACLkF;QACAE,UAAUF,cAAc9C,MAAM,GAAG;QACjCF,SAAS;IACX;AACF;AAEA,8FAA8F,GAC9F,OAAO,SAASoF,qBAAqB9G,UAAsB;IACzD,gDAAgD;IAChD,IAAI+G,OAAO/G,WAAWgH,WAAW;IAEjC,6CAA6C;IAC7CD,OAAOA,KAAKE,OAAO,CAAC,2CAA2C;IAC/DF,OAAOA,KAAKE,OAAO,CAAC,sDAAsD;IAE1E,kCAAkC;IAClCF,OAAOA,KAAKE,OAAO,CAAC,mDAAmD;IACvEF,OAAOA,KAAKE,OAAO,CAAC,iDAAiD;IACrEF,OAAOA,KAAKE,OAAO,CAAC,iDAAiD;IAErE,6FAA6F;IAC7FF,OAAOA,KAAKE,OAAO,CAAC,qDAAqD;IAEzE,yCAAyC;IACzCjH,WAAW4F,eAAe,CAACmB;IAE3B,OAAO/G;AACT;AAEA;;;CAGC,GACD,OAAO,SAASkH,kBAAkBlH,UAAsB;IACtDR,MAAM;IAEN,MAAMmF,YAAY5E,6BAA6BC;IAE/C,IAAI,CAAC2E,UAAUjD,OAAO,EAAE;QACtBlC,MAAM;QACN,OAAO;YACL6B,OAAOsD,UAAUtD,KAAK;YACtBK,SAAS;QACX;IACF;IAEA,MAAM,EAAE4C,UAAU,EAAE,GAAGK;IAEvB,8BAA8B;IAC9B,IAAI,CAACL,YAAYvC,YAAY;QAC3BvC,MAAM;QACN,OAAO;YACL6B,OAAOxB,YAAY;gBACjByB,QAAQ;gBACRC,SAAS;gBACTC,UAAU;gBACVC,kBAAkB;YACpB;YACAC,SAAS;QACX;IACF;IAEAlC,MAAM;IACN,OAAO;QAAEkC,SAAS;IAAK;AACzB;AAEA,OAAO,eAAeyF,qBACpBnH,UAAsB,EACtBoH,UAAwB,CAAC,CAAC;IAE1B,MAAM,EAAEC,qBAAqB,IAAI,EAAEH,mBAAmBI,iBAAiB,IAAI,EAAE,GAAGF;IAEhF5H,MAAM,CAAC,gCAAgC,EAAEQ,WAAWC,WAAW,IAAI;IAEnE,wBAAwB;IACxB,IAAIqH,gBAAgB;QAClB,MAAMC,aAAaL,kBAAkBlH;QACrC,IAAI,CAACuH,WAAW7F,OAAO,EAAE;YACvB,OAAO6F;QACT;IACF;IAEA,iCAAiC;IACjC,MAAMC,WAAWxH,WAAWC,WAAW;IAEvC,0EAA0E;IAC1ET,MAAM;IACNQ,WAAWyH,UAAU;IAErB,aAAa;IACbjI,MAAM;IACN,MAAMQ,WAAW0H,IAAI;IAErB,oCAAoC;IACpC,IAAIL,oBAAoB;QACtB7H,MAAM;QACN,IAAI;YACF,uFAAuF;YACvF,MAAMmI,aAAavI,KAAKwI,OAAO,CAACJ;YAEhC,8DAA8D;YAC9D,MAAMK,cAAc,CAAC,sBAAsB,EAAEL,SAAS,CAAC,CAAC;YAExDhI,MAAM,CAAC,iBAAiB,EAAEqI,aAAa;YACvC1I,SAAS0I,aAAa;gBACpBC,KAAKH;gBACLI,OAAO;YACT;YACAvI,MAAM;QACR,EAAE,OAAO6B,OAAO;YACd,gEAAgE;YAChE7B,MACE,CAAC,oCAAoC,EAAE6B,iBAAiB2G,QAAQ3G,MAAM4G,OAAO,GAAG,iBAAiB;YAEnGzI,MAAM;QACR;IACF,OAAO;QACLA,MAAM;IACR;IAEAA,MAAM;IAEN,OAAO;QAAEkC,SAAS;IAAK;AACzB;AAEA,OAAO,eAAewG,uBACpBV,QAAgB,EAChBJ,UAA4B,CAAC,CAAC;IAE9B5H,MAAM,CAAC,kCAAkC,EAAEgI,UAAU;IACrDhI,MACE,CAAC,kBAAkB,EAAE4H,QAAQe,EAAE,EAAE9C,KAAK,UAAU,EAAE+B,QAAQgB,OAAO,CAAC,cAAc,EAAEhB,QAAQT,WAAW,EAAE;IAGzG,MAAM0B,mBAAmC,EAAE;IAC3C,MAAMC,cAAwB,EAAE;IAEhC,IAAI;QACF,2DAA2D;QAC3D,MAAMC,UAAU,IAAIlJ,QAAQ;YAC1BmJ,sBAAsB;gBACpBC,WAAWnJ,UAAUoJ,MAAM;YAC7B;QACF;QACA,IAAI1I,aAAauI,QAAQI,mBAAmB,CAACnB;QAE7C,gBAAgB;QAChB,MAAM7C,YAAY5E,6BAA6BC;QAC/C,IAAI,CAAC2E,UAAUjD,OAAO,EAAE;YACtB,OAAOiD;QACT;QAEA,yCAAyC;QACzC,IAAIyC,QAAQe,EAAE,EAAE;YACd3I,MAAM;YACN,MAAMoJ,SAASrE,mBAAmB;gBAChCC,SAAS4C,QAAQe,EAAE,CAAC9C,IAAI;gBACxBZ,YAAY2C,QAAQe,EAAE,CAAC1D,UAAU;gBACjCzE;YACF;YAEA,IAAI,CAAC4I,OAAOlH,OAAO,EAAE;gBACnB,OAAO;oBACLL,OAAOuH,OAAOvH,KAAK;oBACnBK,SAAS;gBACX;YACF;YAEA2G,iBAAiBvE,IAAI,IAAI8E,OAAOlE,aAAa;YAC7C,IAAIkE,OAAOhC,QAAQ,EAAE;gBACnB0B,YAAYxE,IAAI,IAAI8E,OAAOhC,QAAQ;YACrC;QACF;QAEA,IAAIQ,QAAQgB,OAAO,EAAE;YACnB5I,MAAM;YACN,MAAMoJ,SAAS5C,kBAAkB;gBAAExB,SAAS4C,QAAQgB,OAAO;gBAAEpI;YAAW;YAExE,IAAI,CAAC4I,OAAOlH,OAAO,EAAE;gBACnB,OAAO;oBACLL,OAAOuH,OAAOvH,KAAK;oBACnBK,SAAS;gBACX;YACF;YAEA2G,iBAAiBvE,IAAI,IAAI8E,OAAOlE,aAAa;YAC7C,IAAIkE,OAAOhC,QAAQ,EAAE;gBACnB0B,YAAYxE,IAAI,IAAI8E,OAAOhC,QAAQ;YACrC;QACF;QAEA,IAAIQ,QAAQT,WAAW,EAAE;YACvBnH,MAAM;YACN,MAAMoJ,SAASjC,YAAY3G;YAE3B,IAAI,CAAC4I,OAAOlH,OAAO,EAAE;gBACnB,OAAO;oBACLL,OAAOuH,OAAOvH,KAAK;oBACnBK,SAAS;gBACX;YACF;YAEA2G,iBAAiBvE,IAAI,IAAI8E,OAAOlE,aAAa;YAC7C,IAAIkE,OAAOhC,QAAQ,EAAE;gBACnB0B,YAAYxE,IAAI,IAAI8E,OAAOhC,QAAQ;YACrC;QACF;QAEA,uCAAuC;QACvC5G,aAAa8G,qBAAqB9G;QAElC,qDAAqD;QACrDR,MAAM;QAEN,qDAAqD;QACrD,KAAK,MAAM,GAAG4D,OAAO,IAAIC,OAAOC,OAAO,CAAC7D,mBAAoB;YAC1D,IAAI2H,QAAQe,EAAE,IAAI/E,OAAOI,WAAW,KAAK/D,iBAAiB,CAAC2H,QAAQe,EAAE,CAAC9C,IAAI,CAAC,CAAC7B,WAAW,EAAE;gBACvF,MAAMqF,UAAUjJ,uBAAuB;oBACrCkJ,aAAa;wBAAC1F,OAAOS,WAAW;qBAAC;oBACjCuB,iBAAiBhC,OAAOI,WAAW;oBACnCxD;gBACF;gBACA,IAAI6I,QAAQE,OAAO,CAACnH,MAAM,GAAG,GAAG;oBAC9BiH,QAAQE,OAAO,CAAC9D,OAAO,CAAC,CAAC+D;wBACvBX,iBAAiBvE,IAAI,CAAC;4BACpBuB,MAAM;4BACNC,aAAa,CAAC,0BAA0B,EAAE0D,WAAW,QAAQ,EAAE5F,OAAOI,WAAW,CAAC,CAAC,CAAC;wBACtF;oBACF;gBACF;YACF;QACF;QAEA,+BAA+B;QAC/B,IAAI6E,iBAAiBzG,MAAM,GAAG,GAAG;YAC/BpC,MAAM,CAAC,cAAc,EAAE6I,iBAAiBzG,MAAM,CAAC,iBAAiB,CAAC;YACjEyG,iBAAiBpD,OAAO,CAAC,CAACgE;gBACxBzJ,MAAM,CAAC,UAAU,EAAEyJ,IAAI5D,IAAI,CAAC,EAAE,EAAE4D,IAAI3D,WAAW,EAAE;YACnD;QACF;QAEA,IAAIgD,YAAY1G,MAAM,GAAG,GAAG;YAC1BpC,MAAM,CAAC,MAAM,EAAE8I,YAAY1G,MAAM,CAAC,YAAY,CAAC;YAC/C0G,YAAYrD,OAAO,CAAC,CAACiE;gBACnB1J,MAAM,CAAC,UAAU,EAAE0J,SAAS;YAC9B;QACF;QAEA,wDAAwD;QACxD,OAAO,MAAM/B,qBAAqBnH,YAAY;YAC5CqH,oBAAoBD,QAAQC,kBAAkB;YAC9CH,mBAAmBE,QAAQF,iBAAiB,IAAI;QAClD;IACF,EAAE,OAAO7F,OAAO;QACd7B,MAAM,CAAC,8BAA8B,EAAE6B,iBAAiB2G,QAAQ3G,MAAM4G,OAAO,GAAGkB,OAAO9H,QAAQ;QAC/F,OAAO;YACLA,OAAOxB,YAAY;gBACjByB,QAAQD,iBAAiB2G,QAAQ3G,MAAM4G,OAAO,GAAGkB,OAAO9H;gBACxDE,SAAS;gBACTC,UAAU;gBACVC,kBAAkBJ,iBAAiB2G,QAAQ3G,MAAM+H,KAAK,IAAI/H,MAAM4G,OAAO,GAAGkB,OAAO9H;YACnF;YACAK,SAAS;QACX;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/lib/ast/payload-config.ts"],"sourcesContent":["import { execSync } from 'child_process'\nimport path from 'path'\nimport { Project, QuoteKind, type SourceFile, SyntaxKind } from 'ts-morph'\n\nimport type {\n ConfigureOptions,\n DatabaseAdapter,\n DetectionResult,\n Modification,\n StorageAdapter,\n TransformationResult,\n WriteOptions,\n WriteResult,\n} from './types.js'\n\nimport { debug } from '../../utils/log.js'\nimport { DB_ADAPTER_CONFIG, STORAGE_ADAPTER_CONFIG } from './adapter-config.js'\nimport {\n addImportDeclaration,\n cleanupOrphanedImports,\n formatError,\n removeImportDeclaration,\n} from './utils.js'\n\nexport function detectPayloadConfigStructure(sourceFile: SourceFile): DetectionResult {\n debug(`[AST] Detecting payload config structure in ${sourceFile.getFilePath()}`)\n\n // First find the actual name being used (might be aliased)\n const payloadImport = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === 'payload')\n\n const buildConfigImportSpec = payloadImport\n ?.getNamedImports()\n .find((spec) => spec.getName() === 'buildConfig')\n\n const aliasNode = buildConfigImportSpec?.getAliasNode()\n const buildConfigName = aliasNode ? aliasNode.getText() : 'buildConfig'\n\n debug(`[AST] Looking for function call: ${buildConfigName}`)\n\n // Find buildConfig call expression (using actual name in code)\n const buildConfigCall = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n if (!buildConfigCall) {\n debug(`[AST] ✗ ${buildConfigName} call not found`)\n return {\n error: formatError({\n actual: `No ${buildConfigName} call found in file`,\n context: 'buildConfig call',\n expected: `export default ${buildConfigName}({ ... })`,\n technicalDetails: `Could not find CallExpression with identifier \"${buildConfigName}\"`,\n }),\n success: false,\n }\n }\n\n debug(`[AST] ✓ ${buildConfigName} call found`)\n\n // Get import statements\n const importStatements = sourceFile.getImportDeclarations()\n debug(`[AST] Found ${importStatements.length} import statements`)\n\n // Find db property if it exists\n const configObject = buildConfigCall.getArguments()[0]\n let dbProperty\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n dbProperty = configObject\n .asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n .getProperty('db')\n ?.asKind(SyntaxKind.PropertyAssignment)\n }\n\n debug(`[AST] db property: ${dbProperty ? '✓ found' : '✗ not found'}`)\n\n // Find plugins array if it exists\n let pluginsArray\n if (configObject && configObject.getKind() === SyntaxKind.ObjectLiteralExpression) {\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const pluginsProperty = objLiteral.getProperty('plugins')\n\n // Handle PropertyAssignment (e.g., plugins: [...])\n const propertyAssignment = pluginsProperty?.asKind(SyntaxKind.PropertyAssignment)\n if (propertyAssignment) {\n const initializer = propertyAssignment.getInitializer()\n if (initializer?.getKind() === SyntaxKind.ArrayLiteralExpression) {\n pluginsArray = initializer.asKind(SyntaxKind.ArrayLiteralExpression)\n }\n }\n // For ShorthandPropertyAssignment (e.g., plugins), we can't get the array directly\n // but we'll detect it in addStorageAdapter\n }\n\n debug(`[AST] plugins array: ${pluginsArray ? '✓ found' : '✗ not found'}`)\n\n // Find all buildConfig calls for edge case detection (using actual name)\n const allBuildConfigCalls = sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((call) => {\n const expression = call.getExpression()\n return expression.getText() === buildConfigName\n })\n\n const hasImportAlias = !!aliasNode\n\n // Check for other Payload imports\n const payloadImports = payloadImport?.getNamedImports() || []\n const hasOtherPayloadImports =\n payloadImports.length > 1 || payloadImports.some((imp) => imp.getName() !== 'buildConfig')\n\n // Track database adapter imports\n let dbAdapterImportInfo\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n dbAdapterImportInfo = {\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n }\n break\n }\n }\n\n // Track storage adapter imports\n const storageAdapterImports = []\n for (const [, config] of Object.entries(STORAGE_ADAPTER_CONFIG)) {\n if (!config.packageName || !config.adapterName) {\n continue\n }\n\n const importDecl = sourceFile\n .getImportDeclarations()\n .find((imp) => imp.getModuleSpecifierValue() === config.packageName)\n\n if (importDecl) {\n const namedImports = importDecl.getNamedImports()\n storageAdapterImports.push({\n hasOtherImports: namedImports.length > 1,\n importDeclaration: importDecl,\n packageName: config.packageName,\n })\n }\n }\n\n const needsManualIntervention = hasImportAlias || allBuildConfigCalls.length > 2\n\n debug(\n `[AST] Edge cases: alias=${hasImportAlias}, multiple=${allBuildConfigCalls.length > 1}, otherImports=${hasOtherPayloadImports}, manual=${needsManualIntervention}`,\n )\n\n return {\n edgeCases: {\n hasImportAlias,\n hasOtherPayloadImports,\n multipleBuildConfigCalls: allBuildConfigCalls.length > 1,\n needsManualIntervention,\n },\n importSources: {\n dbAdapter: dbAdapterImportInfo,\n storage: storageAdapterImports.length > 0 ? storageAdapterImports : undefined,\n },\n sourceFile,\n structures: {\n buildConfigCall,\n dbProperty,\n importStatements,\n pluginsArray,\n },\n success: true,\n }\n}\n\nexport function addDatabaseAdapter({\n adapter,\n envVarName = 'DATABASE_URL',\n sourceFile,\n}: {\n adapter: DatabaseAdapter\n envVarName?: string\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding database adapter: ${adapter} (envVar: ${envVarName})`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall, dbProperty } = detection.structures\n const config = DB_ADAPTER_CONFIG[adapter]\n\n // Remove old db adapter imports and track position for replacement\n const oldAdapters = Object.values(DB_ADAPTER_CONFIG)\n const removedAdapters: string[] = []\n let importInsertIndex: number | undefined\n oldAdapters.forEach((oldConfig) => {\n if (oldConfig.packageName !== config.packageName) {\n const { removedIndex } = removeImportDeclaration({\n moduleSpecifier: oldConfig.packageName,\n sourceFile,\n })\n if (removedIndex !== undefined) {\n // Use the first removed adapter's position\n if (importInsertIndex === undefined) {\n importInsertIndex = removedIndex\n }\n removedAdapters.push(oldConfig.packageName)\n modifications.push({\n type: 'import-removed',\n description: `Removed import from '${oldConfig.packageName}'`,\n })\n }\n }\n })\n\n if (removedAdapters.length > 0) {\n debug(`[AST] Removed old adapter imports: ${removedAdapters.join(', ')}`)\n }\n\n // Add new import at the position of the removed one (or default position)\n addImportDeclaration({\n insertIndex: importInsertIndex,\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n\n // Add special imports for specific adapters\n if (adapter === 'd1-sqlite') {\n debug('[AST] Adding special import: ./db/migrations')\n addImportDeclaration({\n defaultImport: 'migrations',\n moduleSpecifier: './db/migrations',\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: migrations from './db/migrations'`,\n })\n }\n\n // Get config object\n const configObject = buildConfigCall.getArguments()[0]\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'database adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n const newDbCode = `db: ${config.configTemplate(envVarName)}`\n\n if (dbProperty) {\n // Replace existing db property\n // NOTE: Using replaceWithText() instead of remove() + insertPropertyAssignment()\n // to avoid double comma issues. When remove() is called, ts-morph doesn't always\n // clean up trailing commas correctly, which can result in syntax like \"},,\" when\n // inserting a new property at that position. replaceWithText() preserves the\n // surrounding punctuation correctly.\n debug(`[AST] Replacing existing db property`)\n dbProperty.replaceWithText(newDbCode)\n modifications.push({\n type: 'property-added',\n description: `Replaced db property with ${adapter} adapter`,\n })\n } else {\n // No existing db property - insert at end\n const insertIndex = objLiteral.getProperties().length\n debug(`[AST] Adding db property at index ${insertIndex}`)\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'db',\n initializer: config.configTemplate(envVarName),\n })\n modifications.push({\n type: 'property-added',\n description: `Added db property with ${adapter} adapter`,\n })\n }\n\n debug(`[AST] ✓ Database adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function addStorageAdapter({\n adapter,\n sourceFile,\n}: {\n adapter: StorageAdapter\n sourceFile: SourceFile\n}): TransformationResult {\n debug(`[AST] Adding storage adapter: ${adapter}`)\n\n const modifications: Modification[] = []\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const config = STORAGE_ADAPTER_CONFIG[adapter]\n\n // Local disk doesn't need any imports or plugins\n if (adapter === 'localDisk') {\n debug('[AST] localDisk storage adapter - no imports or plugins needed')\n return {\n modifications: [],\n modified: false,\n success: true,\n }\n }\n\n // Add import\n if (config.packageName && config.adapterName) {\n addImportDeclaration({\n moduleSpecifier: config.packageName,\n namedImports: [config.adapterName],\n sourceFile,\n })\n modifications.push({\n type: 'import-added',\n description: `Added import: { ${config.adapterName} } from '${config.packageName}'`,\n })\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n error: formatError({\n actual: 'buildConfig has no object literal argument',\n context: 'storage adapter configuration',\n expected: 'buildConfig({ ... })',\n technicalDetails: 'buildConfig call must have an object literal as first argument',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\n // Find or create plugins array\n const pluginsPropertyRaw = objLiteral.getProperty('plugins')\n let pluginsProperty = pluginsPropertyRaw?.asKind(SyntaxKind.PropertyAssignment)\n\n // Check if it's a shorthand property (e.g., `plugins` referencing an imported variable)\n const shorthandProperty = pluginsPropertyRaw?.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n if (shorthandProperty) {\n debug('[AST] Found shorthand plugins property, converting to long form with spread')\n // Get the identifier name (usually 'plugins')\n const identifierName = shorthandProperty.getName()\n\n // Find insert position before removing\n const allProperties = objLiteral.getProperties()\n const insertIndex = allProperties.indexOf(shorthandProperty)\n\n // Remove the shorthand property\n shorthandProperty.remove()\n\n // Create new property with spread operator: plugins: [...plugins, newAdapter]\n objLiteral.insertPropertyAssignment(insertIndex, {\n name: 'plugins',\n initializer: `[...${identifierName}]`,\n })\n\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Converted shorthand plugins property to array with spread syntax`,\n })\n } else if (!pluginsProperty) {\n debug('[AST] Creating new plugins array')\n // Create plugins array\n objLiteral.addPropertyAssignment({\n name: 'plugins',\n initializer: '[]',\n })\n pluginsProperty = objLiteral.getProperty('plugins')?.asKind(SyntaxKind.PropertyAssignment)\n modifications.push({\n type: 'property-added',\n description: `Created plugins array`,\n })\n } else {\n debug('[AST] Reusing existing plugins array')\n }\n\n if (!pluginsProperty) {\n return {\n error: formatError({\n actual: 'Failed to create or find plugins property',\n context: 'storage adapter configuration',\n expected: 'plugins array property',\n technicalDetails: 'Could not create or access plugins property',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const initializer = pluginsProperty.getInitializer()\n if (!initializer || initializer.getKind() !== SyntaxKind.ArrayLiteralExpression) {\n return {\n error: formatError({\n actual: 'plugins property is not an array',\n context: 'storage adapter configuration',\n expected: 'plugins: [...]',\n technicalDetails: 'plugins property must be an array literal expression',\n }),\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const pluginsArray = initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n\n // Add storage adapter call\n const configText = config.configTemplate()\n if (configText) {\n pluginsArray.addElement(configText)\n modifications.push({\n type: 'property-added',\n description: `Added ${adapter} to plugins array`,\n })\n }\n\n debug(`[AST] ✓ Storage adapter ${adapter} added successfully`)\n\n return {\n modifications,\n modified: true,\n success: true,\n }\n}\n\nexport function removeSharp(sourceFile: SourceFile): TransformationResult {\n debug('[AST] Removing sharp import and property')\n\n const modifications: Modification[] = []\n\n // Remove import\n const { removedIndex } = removeImportDeclaration({ moduleSpecifier: 'sharp', sourceFile })\n if (removedIndex !== undefined) {\n modifications.push({\n type: 'import-removed',\n description: `Removed import from 'sharp'`,\n })\n }\n\n // Find and remove sharp property from buildConfig\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success || !detection.structures) {\n // If detection failed but we removed import, still count as partial success\n if (modifications.length > 0) {\n return {\n modifications,\n modified: true,\n success: true,\n warnings: ['Could not detect config structure to remove sharp property'],\n }\n }\n return {\n error: detection.error,\n modifications: [],\n modified: false,\n success: false,\n }\n }\n\n const { buildConfigCall } = detection.structures\n const configObject = buildConfigCall.getArguments()[0]\n\n if (!configObject || configObject.getKind() !== SyntaxKind.ObjectLiteralExpression) {\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n warnings: ['buildConfig has no object literal argument - could not remove sharp property'],\n }\n }\n\n const objLiteral = configObject.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n const sharpProperty = objLiteral.getProperty('sharp')\n\n if (sharpProperty) {\n sharpProperty.remove()\n modifications.push({\n type: 'property-removed',\n description: `Removed sharp property from config`,\n })\n debug('[AST] ✓ Sharp property removed from config')\n } else {\n debug('[AST] Sharp property not found (already absent)')\n }\n\n return {\n modifications,\n modified: modifications.length > 0,\n success: true,\n }\n}\n\n/** This shouldn't be necessary once the templates are updated. Can't hurt to keep in, though */\nexport function removeCommentMarkers(sourceFile: SourceFile): SourceFile {\n // Get the full text and replace comment markers\n let text = sourceFile.getFullText()\n\n // Remove inline comment markers from imports\n text = text.replace(/\\s*\\/\\/\\s*database-adapter-import\\s*$/gm, '')\n text = text.replace(/\\s*\\/\\/\\s*storage-adapter-import-placeholder\\s*$/gm, '')\n\n // Remove standalone comment lines\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-start\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*database-adapter-config-end\\s*\\n/gm, '')\n text = text.replace(/^\\s*\\/\\/\\s*storage-adapter-placeholder\\s*\\n/gm, '')\n\n // Also remove the placeholder line from template (storage-adapter-import-placeholder at top)\n text = text.replace(/^\\/\\/\\s*storage-adapter-import-placeholder\\s*\\n/gm, '')\n\n // Replace the entire source file content\n sourceFile.replaceWithText(text)\n\n return sourceFile\n}\n\n/**\n * Validates payload config structure has required elements after transformation.\n * Checks that buildConfig() call exists and has a db property configured.\n */\nexport function validateStructure(sourceFile: SourceFile): WriteResult {\n debug('[AST] Validating payload config structure')\n\n const detection = detectPayloadConfigStructure(sourceFile)\n\n if (!detection.success) {\n debug('[AST] ✗ Validation failed: detection unsuccessful')\n return {\n error: detection.error,\n success: false,\n }\n }\n\n const { structures } = detection\n\n // Validate db property exists\n if (!structures?.dbProperty) {\n debug('[AST] ✗ Validation failed: db property missing')\n return {\n error: formatError({\n actual: 'No db property found',\n context: 'database configuration',\n expected: 'buildConfig must have a db property',\n technicalDetails: 'PropertyAssignment with name \"db\" not found in buildConfig object',\n }),\n success: false,\n }\n }\n\n debug('[AST] ✓ Validation passed')\n return { success: true }\n}\n\nexport async function writeTransformedFile(\n sourceFile: SourceFile,\n options: WriteOptions = {},\n): Promise<WriteResult> {\n const { formatWithPrettier = true, validateStructure: shouldValidate = true } = options\n\n debug(`[AST] Writing transformed file: ${sourceFile.getFilePath()}`)\n\n // Validate if requested\n if (shouldValidate) {\n const validation = validateStructure(sourceFile)\n if (!validation.success) {\n return validation\n }\n }\n\n // Get file path and save to disk\n const filePath = sourceFile.getFilePath()\n\n // Format with ts-morph before saving (fixes trailing commas, indentation)\n debug('[AST] Formatting with ts-morph')\n sourceFile.formatText()\n\n // Write file\n debug('[AST] Writing file to disk')\n await sourceFile.save()\n\n // Format with prettier if requested\n if (formatWithPrettier) {\n debug('[AST] Running prettier formatting via CLI')\n try {\n // Detect project directory (go up from file until we find package.json or use dirname)\n const projectDir = path.dirname(filePath)\n\n // Run prettier via CLI (avoids Jest/ESM compatibility issues)\n const prettierCmd = `npx prettier --write \"${filePath}\"`\n\n debug(`[AST] Executing: ${prettierCmd}`)\n execSync(prettierCmd, {\n cwd: projectDir,\n stdio: 'pipe', // Suppress output\n })\n debug('[AST] ✓ Prettier formatting successful')\n } catch (error) {\n // Log but don't fail if prettier fails (might not be installed)\n debug(\n `[AST] ⚠ Prettier formatting failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n )\n debug('[AST] Continuing with unformatted output')\n }\n } else {\n debug('[AST] Skipping prettier formatting (disabled)')\n }\n\n debug('[AST] ✓ File written successfully')\n\n return { success: true }\n}\n\nexport async function configurePayloadConfig(\n filePath: string,\n options: ConfigureOptions = {},\n): Promise<WriteResult> {\n debug(`[AST] Configuring payload config: ${filePath}`)\n debug(\n `[AST] Options: db=${options.db?.type}, storage=${options.storage}, removeSharp=${options.removeSharp}`,\n )\n\n const allModifications: Modification[] = []\n const allWarnings: string[] = []\n\n try {\n // Create Project and load source file with proper settings\n const project = new Project({\n manipulationSettings: {\n quoteKind: QuoteKind.Single,\n },\n })\n let sourceFile = project.addSourceFileAtPath(filePath)\n\n // Run detection\n const detection = detectPayloadConfigStructure(sourceFile)\n if (!detection.success) {\n return detection\n }\n\n // Apply transformations based on options\n if (options.db) {\n debug('[AST] Applying database adapter transformation')\n const result = addDatabaseAdapter({\n adapter: options.db.type,\n envVarName: options.db.envVarName,\n sourceFile,\n })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.storage) {\n debug('[AST] Applying storage adapter transformation')\n const result = addStorageAdapter({ adapter: options.storage, sourceFile })\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n if (options.removeSharp) {\n debug('[AST] Applying sharp removal')\n const result = removeSharp(sourceFile)\n\n if (!result.success) {\n return {\n error: result.error,\n success: false,\n }\n }\n\n allModifications.push(...result.modifications)\n if (result.warnings) {\n allWarnings.push(...result.warnings)\n }\n }\n\n // Remove comment markers from template\n sourceFile = removeCommentMarkers(sourceFile)\n\n // Cleanup orphaned imports after all transformations\n debug('[AST] Cleaning up orphaned imports')\n\n // Cleanup database adapter imports if db was removed\n for (const [, config] of Object.entries(DB_ADAPTER_CONFIG)) {\n if (options.db && config.packageName !== DB_ADAPTER_CONFIG[options.db.type].packageName) {\n const cleanup = cleanupOrphanedImports({\n importNames: [config.adapterName],\n moduleSpecifier: config.packageName,\n sourceFile,\n })\n if (cleanup.removed.length > 0) {\n cleanup.removed.forEach((importName) => {\n allModifications.push({\n type: 'import-removed',\n description: `Cleaned up unused import '${importName}' from '${config.packageName}'`,\n })\n })\n }\n }\n }\n\n // Log summary of modifications\n if (allModifications.length > 0) {\n debug(`[AST] Applied ${allModifications.length} modification(s):`)\n allModifications.forEach((mod) => {\n debug(`[AST] - ${mod.type}: ${mod.description}`)\n })\n }\n\n if (allWarnings.length > 0) {\n debug(`[AST] ${allWarnings.length} warning(s):`)\n allWarnings.forEach((warning) => {\n debug(`[AST] - ${warning}`)\n })\n }\n\n // Write transformed file with validation and formatting\n return await writeTransformedFile(sourceFile, {\n formatWithPrettier: options.formatWithPrettier,\n validateStructure: options.validateStructure ?? true,\n })\n } catch (error) {\n debug(`[AST] ✗ Configuration failed: ${error instanceof Error ? error.message : String(error)}`)\n return {\n error: formatError({\n actual: error instanceof Error ? error.message : String(error),\n context: 'configurePayloadConfig',\n expected: 'Successful file transformation',\n technicalDetails: error instanceof Error ? error.stack || error.message : String(error),\n }),\n success: false,\n }\n }\n}\n"],"names":["execSync","path","Project","QuoteKind","SyntaxKind","debug","DB_ADAPTER_CONFIG","STORAGE_ADAPTER_CONFIG","addImportDeclaration","cleanupOrphanedImports","formatError","removeImportDeclaration","detectPayloadConfigStructure","sourceFile","getFilePath","payloadImport","getImportDeclarations","find","imp","getModuleSpecifierValue","buildConfigImportSpec","getNamedImports","spec","getName","aliasNode","getAliasNode","buildConfigName","getText","buildConfigCall","getDescendantsOfKind","CallExpression","call","expression","getExpression","error","actual","context","expected","technicalDetails","success","importStatements","length","configObject","getArguments","dbProperty","getKind","ObjectLiteralExpression","asKindOrThrow","getProperty","asKind","PropertyAssignment","pluginsArray","objLiteral","pluginsProperty","propertyAssignment","initializer","getInitializer","ArrayLiteralExpression","allBuildConfigCalls","filter","hasImportAlias","payloadImports","hasOtherPayloadImports","some","dbAdapterImportInfo","config","Object","entries","importDecl","packageName","namedImports","hasOtherImports","importDeclaration","storageAdapterImports","adapterName","push","needsManualIntervention","edgeCases","multipleBuildConfigCalls","importSources","dbAdapter","storage","undefined","structures","addDatabaseAdapter","adapter","envVarName","modifications","detection","modified","oldAdapters","values","removedAdapters","importInsertIndex","forEach","oldConfig","removedIndex","moduleSpecifier","type","description","join","insertIndex","defaultImport","newDbCode","configTemplate","replaceWithText","getProperties","insertPropertyAssignment","name","addStorageAdapter","pluginsPropertyRaw","shorthandProperty","ShorthandPropertyAssignment","identifierName","allProperties","indexOf","remove","addPropertyAssignment","configText","addElement","removeSharp","warnings","sharpProperty","removeCommentMarkers","text","getFullText","replace","validateStructure","writeTransformedFile","options","formatWithPrettier","shouldValidate","validation","filePath","formatText","save","projectDir","dirname","prettierCmd","cwd","stdio","Error","message","configurePayloadConfig","db","allModifications","allWarnings","project","manipulationSettings","quoteKind","Single","addSourceFileAtPath","result","cleanup","importNames","removed","importName","mod","warning","String","stack"],"mappings":"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"}
@@ -49,7 +49,7 @@ export type DetectionResult = {
49
49
  packageName: string;
50
50
  };
51
51
  /** Current storage adapter import info */
52
- storageAdapters?: Array<{
52
+ storage?: Array<{
53
53
  hasOtherImports: boolean;
54
54
  importDeclaration: ImportDeclaration;
55
55
  packageName: string;
@@ -94,8 +94,8 @@ export type ModificationResult = {
94
94
  warnings?: string[];
95
95
  };
96
96
  export type DatabaseAdapter = (typeof ALL_DATABASE_ADAPTERS)[number];
97
- export declare const ALL_DATABASE_ADAPTERS: readonly ["mongodb", "postgres", "sqlite", "vercel-postgres", "d1-sqlite"];
98
- export declare const ALL_STORAGE_ADAPTERS: readonly ["azureStorage", "gcsStorage", "localDisk", "r2Storage", "s3Storage", "uploadthingStorage", "vercelBlobStorage"];
97
+ export declare const ALL_DATABASE_ADAPTERS: readonly ['mongodb', 'postgres', 'sqlite', 'vercel-postgres', 'd1-sqlite'];
98
+ export declare const ALL_STORAGE_ADAPTERS: readonly ['azureStorage', 'gcsStorage', 'localDisk', 'r2Storage', 's3Storage', 'vercelBlobStorage'];
99
99
  export type StorageAdapter = (typeof ALL_STORAGE_ADAPTERS)[number];
100
100
  export type TransformOptions = {
101
101
  databaseAdapter?: {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/ast/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACX,MAAM,UAAU,CAAA;AAGjB,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,OAAO,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,eAAe,EAAE,cAAc,CAAA;IAC/B,UAAU,CAAC,EAAE,kBAAkB,CAAA;IAC/B,gBAAgB,EAAE,iBAAiB,EAAE,CAAA;IACrC,YAAY,CAAC,EAAE,sBAAsB,CAAA;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,sBAAsB;IACtB,SAAS,CAAC,EAAE;QACV,gEAAgE;QAChE,cAAc,EAAE,OAAO,CAAA;QACvB,2DAA2D;QAC3D,sBAAsB,EAAE,OAAO,CAAA;QAC/B,+CAA+C;QAC/C,wBAAwB,EAAE,OAAO,CAAA;QACjC,iEAAiE;QACjE,uBAAuB,EAAE,OAAO,CAAA;KACjC,CAAA;IACD,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,6BAA6B;IAC7B,aAAa,CAAC,EAAE;QACd,2CAA2C;QAC3C,SAAS,CAAC,EAAE;YACV,eAAe,EAAE,OAAO,CAAA;YACxB,iBAAiB,EAAE,iBAAiB,CAAA;YACpC,WAAW,EAAE,MAAM,CAAA;SACpB,CAAA;QACD,0CAA0C;QAC1C,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,eAAe,EAAE,OAAO,CAAA;YACxB,iBAAiB,EAAE,iBAAiB,CAAA;YACpC,WAAW,EAAE,MAAM,CAAA;SACpB,CAAC,CAAA;KACH,CAAA;IACD,4BAA4B;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,uBAAuB,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE;QACT,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,IAAI,EACA,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,CAAA;CACvB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,YAAY,EAAE,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpE,eAAO,MAAM,qBAAqB,YAChC,SAAS,EACT,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,WAAW,CACH,CAAA;AAEV,eAAO,MAAM,oBAAoB,YAC/B,cAAc,EACd,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,mBAAmB,CACX,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAElE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,CAAC,EAAE;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,eAAe,CAAA;KACtB,CAAA;IACD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,cAAc,CAAC,EAAE;QACf,IAAI,EAAE,cAAc,CAAA;KACrB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,CAAC,EAAE;QACH,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,IAAI,EAAE,eAAe,CAAA;KACtB,CAAA;IACD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB,GAAG,YAAY,CAAA"}
@@ -11,7 +11,6 @@ export const ALL_STORAGE_ADAPTERS = [
11
11
  'localDisk',
12
12
  'r2Storage',
13
13
  's3Storage',
14
- 'uploadthingStorage',
15
14
  'vercelBlobStorage'
16
15
  ];
17
16
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/ast/types.ts"],"sourcesContent":["import type {\n ArrayLiteralExpression,\n CallExpression,\n ImportDeclaration,\n PropertyAssignment,\n SourceFile,\n} from 'ts-morph'\n\n// Result types for import utility functions\nexport type ImportRemovalResult = {\n removedIndex?: number\n sourceFile: SourceFile\n}\n\nexport type NamedImportRemovalResult = {\n fullyRemoved: boolean\n index?: number\n sourceFile: SourceFile\n}\n\nexport type ImportCleanupResult = {\n kept: string[]\n removed: string[]\n sourceFile: SourceFile\n}\n\nexport type DetectionError = {\n debugInfo?: Record<string, unknown>\n technicalDetails: string\n userMessage: string\n}\n\nexport type PayloadConfigStructures = {\n buildConfigCall: CallExpression\n dbProperty?: PropertyAssignment\n importStatements: ImportDeclaration[]\n pluginsArray?: ArrayLiteralExpression\n}\n\n/**\n * Detection result with edge case tracking and import source information\n */\nexport type DetectionResult = {\n /** Edge case flags */\n edgeCases?: {\n /** Import uses an alias (e.g., import { buildConfig as bc }) */\n hasImportAlias: boolean\n /** Other Payload imports exist (e.g., CollectionConfig) */\n hasOtherPayloadImports: boolean\n /** Multiple buildConfig calls found in file */\n multipleBuildConfigCalls: boolean\n /** Needs manual intervention (can't be automatically handled) */\n needsManualIntervention: boolean\n }\n error?: DetectionError\n /** Import source tracking */\n importSources?: {\n /** Current database adapter import info */\n dbAdapter?: {\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }\n /** Current storage adapter import info */\n storageAdapters?: Array<{\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }>\n }\n /** Source file reference */\n sourceFile?: SourceFile\n /** Detected structures */\n structures?: PayloadConfigStructures\n success: boolean\n}\n\n/**\n * Tracks a single modification made to the AST\n */\nexport type Modification = {\n description: string\n location?: {\n column: number\n line: number\n }\n type:\n | 'function-renamed'\n | 'import-added'\n | 'import-modified'\n | 'import-removed'\n | 'property-added'\n | 'property-removed'\n}\n\n/**\n * Result of transformation operations\n */\nexport type TransformationResult = {\n error?: DetectionError\n modifications: Modification[]\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Final result after writing to disk\n */\nexport type ModificationResult = {\n error?: DetectionError\n filePath: string\n formatted?: boolean\n modifications: Modification[]\n success: boolean\n warnings?: string[]\n}\nexport type DatabaseAdapter = (typeof ALL_DATABASE_ADAPTERS)[number]\n\nexport const ALL_DATABASE_ADAPTERS = [\n 'mongodb',\n 'postgres',\n 'sqlite',\n 'vercel-postgres',\n 'd1-sqlite',\n] as const\n\nexport const ALL_STORAGE_ADAPTERS = [\n 'azureStorage',\n 'gcsStorage',\n 'localDisk',\n 'r2Storage',\n 's3Storage',\n 'uploadthingStorage',\n 'vercelBlobStorage',\n] as const\n\nexport type StorageAdapter = (typeof ALL_STORAGE_ADAPTERS)[number]\n\nexport type TransformOptions = {\n databaseAdapter?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storageAdapter?: {\n type: StorageAdapter\n }\n}\n\nexport type WriteOptions = {\n formatWithPrettier?: boolean\n validateStructure?: boolean\n}\n\nexport type WriteResult = {\n error?: DetectionError\n success: boolean\n}\n\nexport type ConfigureOptions = {\n db?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storage?: StorageAdapter\n} & WriteOptions\n"],"names":["ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS"],"mappings":"AAuHA,OAAO,MAAMA,wBAAwB;IACnC;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,uBAAuB;IAClC;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAS"}
1
+ {"version":3,"sources":["../../../src/lib/ast/types.ts"],"sourcesContent":["import type {\n ArrayLiteralExpression,\n CallExpression,\n ImportDeclaration,\n PropertyAssignment,\n SourceFile,\n} from 'ts-morph'\n\n// Result types for import utility functions\nexport type ImportRemovalResult = {\n removedIndex?: number\n sourceFile: SourceFile\n}\n\nexport type NamedImportRemovalResult = {\n fullyRemoved: boolean\n index?: number\n sourceFile: SourceFile\n}\n\nexport type ImportCleanupResult = {\n kept: string[]\n removed: string[]\n sourceFile: SourceFile\n}\n\nexport type DetectionError = {\n debugInfo?: Record<string, unknown>\n technicalDetails: string\n userMessage: string\n}\n\nexport type PayloadConfigStructures = {\n buildConfigCall: CallExpression\n dbProperty?: PropertyAssignment\n importStatements: ImportDeclaration[]\n pluginsArray?: ArrayLiteralExpression\n}\n\n/**\n * Detection result with edge case tracking and import source information\n */\nexport type DetectionResult = {\n /** Edge case flags */\n edgeCases?: {\n /** Import uses an alias (e.g., import { buildConfig as bc }) */\n hasImportAlias: boolean\n /** Other Payload imports exist (e.g., CollectionConfig) */\n hasOtherPayloadImports: boolean\n /** Multiple buildConfig calls found in file */\n multipleBuildConfigCalls: boolean\n /** Needs manual intervention (can't be automatically handled) */\n needsManualIntervention: boolean\n }\n error?: DetectionError\n /** Import source tracking */\n importSources?: {\n /** Current database adapter import info */\n dbAdapter?: {\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }\n /** Current storage adapter import info */\n storage?: Array<{\n hasOtherImports: boolean\n importDeclaration: ImportDeclaration\n packageName: string\n }>\n }\n /** Source file reference */\n sourceFile?: SourceFile\n /** Detected structures */\n structures?: PayloadConfigStructures\n success: boolean\n}\n\n/**\n * Tracks a single modification made to the AST\n */\nexport type Modification = {\n description: string\n location?: {\n column: number\n line: number\n }\n type:\n | 'function-renamed'\n | 'import-added'\n | 'import-modified'\n | 'import-removed'\n | 'property-added'\n | 'property-removed'\n}\n\n/**\n * Result of transformation operations\n */\nexport type TransformationResult = {\n error?: DetectionError\n modifications: Modification[]\n modified: boolean\n success: boolean\n warnings?: string[]\n}\n\n/**\n * Final result after writing to disk\n */\nexport type ModificationResult = {\n error?: DetectionError\n filePath: string\n formatted?: boolean\n modifications: Modification[]\n success: boolean\n warnings?: string[]\n}\nexport type DatabaseAdapter = (typeof ALL_DATABASE_ADAPTERS)[number]\n\nexport const ALL_DATABASE_ADAPTERS = [\n 'mongodb',\n 'postgres',\n 'sqlite',\n 'vercel-postgres',\n 'd1-sqlite',\n] as const\n\nexport const ALL_STORAGE_ADAPTERS = [\n 'azureStorage',\n 'gcsStorage',\n 'localDisk',\n 'r2Storage',\n 's3Storage',\n 'vercelBlobStorage',\n] as const\n\nexport type StorageAdapter = (typeof ALL_STORAGE_ADAPTERS)[number]\n\nexport type TransformOptions = {\n databaseAdapter?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storageAdapter?: {\n type: StorageAdapter\n }\n}\n\nexport type WriteOptions = {\n formatWithPrettier?: boolean\n validateStructure?: boolean\n}\n\nexport type WriteResult = {\n error?: DetectionError\n success: boolean\n}\n\nexport type ConfigureOptions = {\n db?: {\n envVarName?: string\n type: DatabaseAdapter\n }\n removeSharp?: boolean\n storage?: StorageAdapter\n} & WriteOptions\n"],"names":["ALL_DATABASE_ADAPTERS","ALL_STORAGE_ADAPTERS"],"mappings":"AAuHA,OAAO,MAAMA,wBAAwB;IACnC;IACA;IACA;IACA;IACA;CACD,CAAS;AAEV,OAAO,MAAMC,uBAAuB;IAClC;IACA;IACA;IACA;IACA;IACA;CACD,CAAS"}
@@ -0,0 +1,5 @@
1
+ export declare function configurePayloadTsConfig({ configPath, payloadConfigPath, }: {
2
+ configPath: string;
3
+ payloadConfigPath: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=configure-payload-tsconfig.d.ts.map