@payloadcms/figma 0.0.1-alpha.6 → 0.0.1-alpha.60

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 (352) hide show
  1. package/dist/api/control-plane.d.ts +52 -6
  2. package/dist/api/control-plane.js +174 -72
  3. package/dist/api/figma-api.d.ts +22 -1
  4. package/dist/api/figma-api.js +78 -25
  5. package/dist/auth/callback-server.js +2 -1
  6. package/dist/auth/credentials.d.ts +21 -0
  7. package/dist/auth/credentials.js +21 -0
  8. package/dist/auth/crypto-utils.d.ts +6 -0
  9. package/dist/auth/crypto-utils.js +16 -14
  10. package/dist/auth/jwt-validator.d.ts +2 -1
  11. package/dist/auth/jwt-validator.js +2 -2
  12. package/dist/auth/oauth-flow.d.ts +17 -3
  13. package/dist/auth/oauth-flow.js +63 -16
  14. package/dist/auth/project-token.js +16 -11
  15. package/dist/auth/refresh.d.ts +2 -1
  16. package/dist/auth/refresh.js +25 -12
  17. package/dist/auth/token-store.d.ts +42 -1
  18. package/dist/auth/token-store.js +118 -14
  19. package/dist/auth/types.d.ts +17 -4
  20. package/dist/cli.js +68 -5
  21. package/dist/commands/build-lambda-zip.d.ts +5 -0
  22. package/dist/commands/build-lambda-zip.js +19 -0
  23. package/dist/commands/debug.d.ts +8 -0
  24. package/dist/commands/debug.js +176 -0
  25. package/dist/commands/deploy.d.ts +9 -0
  26. package/dist/commands/deploy.js +178 -151
  27. package/dist/commands/env.d.ts +13 -0
  28. package/dist/commands/env.js +88 -0
  29. package/dist/commands/init.d.ts +3 -5
  30. package/dist/commands/init.js +165 -148
  31. package/dist/commands/list-tokens.d.ts +3 -3
  32. package/dist/commands/list-tokens.js +22 -7
  33. package/dist/commands/login.d.ts +8 -1
  34. package/dist/commands/login.js +33 -15
  35. package/dist/commands/logout.d.ts +5 -4
  36. package/dist/commands/logout.js +56 -13
  37. package/dist/commands/upgrade.d.ts +5 -0
  38. package/dist/commands/upgrade.js +331 -0
  39. package/dist/config/oauth.d.ts +4 -14
  40. package/dist/config/oauth.js +18 -40
  41. package/dist/constants.d.ts +44 -19
  42. package/dist/constants.js +73 -20
  43. package/dist/db-content-api/README.md +98 -0
  44. package/dist/db-content-api/generated/content-api-types.d.ts +3972 -0
  45. package/dist/db-content-api/generated/content-api-types.js +7 -0
  46. package/dist/db-content-api/index.d.ts +21 -0
  47. package/dist/db-content-api/index.js +787 -0
  48. package/dist/db-content-api/temp-utilities/slug.d.ts +2 -0
  49. package/dist/db-content-api/temp-utilities/slug.js +3 -0
  50. package/dist/db-content-api/temp-utilities/sorting.d.ts +3 -0
  51. package/dist/db-content-api/temp-utilities/sorting.js +39 -0
  52. package/dist/db-content-api/temp-utilities/types.d.ts +22 -0
  53. package/dist/db-content-api/temp-utilities/types.js +15 -0
  54. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +39 -0
  55. package/dist/db-content-api/temp-utilities/unwrapDocument.js +59 -0
  56. package/dist/db-content-api/utilities/auth.d.ts +30 -0
  57. package/dist/db-content-api/utilities/auth.js +81 -0
  58. package/dist/db-content-api/utilities/data/applyDefaults.d.ts +7 -0
  59. package/dist/db-content-api/utilities/data/applyDefaults.js +59 -0
  60. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +11 -0
  61. package/dist/db-content-api/utilities/data/castFieldValue.js +68 -0
  62. package/dist/db-content-api/utilities/data/index.d.ts +49 -0
  63. package/dist/db-content-api/utilities/data/index.js +284 -0
  64. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +12 -0
  65. package/dist/db-content-api/utilities/data/removeVirtualFields.js +54 -0
  66. package/dist/db-content-api/utilities/data/stripFields.d.ts +48 -0
  67. package/dist/db-content-api/utilities/data/stripFields.js +195 -0
  68. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +23 -0
  69. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +42 -0
  70. package/dist/db-content-api/utilities/joins.d.ts +55 -0
  71. package/dist/db-content-api/utilities/joins.js +135 -0
  72. package/dist/db-content-api/utilities/locale/index.d.ts +10 -0
  73. package/dist/db-content-api/utilities/locale/index.js +21 -0
  74. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts +11 -0
  75. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +74 -0
  76. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +42 -0
  77. package/dist/db-content-api/utilities/meta/buildMeta.js +41 -0
  78. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +17 -0
  79. package/dist/db-content-api/utilities/meta/buildPathTypes.js +244 -0
  80. package/dist/db-content-api/utilities/meta/buildUniquePaths.d.ts +13 -0
  81. package/dist/db-content-api/utilities/meta/buildUniquePaths.js +62 -0
  82. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.d.ts +10 -0
  83. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.js +102 -0
  84. package/dist/db-content-api/utilities/where.d.ts +20 -0
  85. package/dist/db-content-api/utilities/where.js +104 -0
  86. package/dist/deploy/schedule-extract-plugin.d.ts +11 -0
  87. package/dist/deploy/schedule-extract-plugin.js +34 -0
  88. package/dist/endpoints/health.d.ts +3 -0
  89. package/dist/endpoints/health.js +11 -0
  90. package/dist/endpoints/schema.d.ts +3 -0
  91. package/dist/endpoints/schema.js +29 -0
  92. package/dist/exports/client.d.ts +3 -0
  93. package/dist/exports/client.js +3 -0
  94. package/dist/index.d.ts +2 -1
  95. package/dist/index.js +3 -1
  96. package/dist/oauth/components/FigmaAvatar/index.d.ts +4 -0
  97. package/dist/oauth/components/FigmaAvatar/index.js +27 -0
  98. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  99. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +5 -0
  100. package/dist/oauth/components/FigmaAvatarCell/index.js +25 -0
  101. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  102. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +9 -0
  103. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +37 -0
  104. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  105. package/dist/oauth/components/LoginButton/index.js +50 -6
  106. package/dist/oauth/components/LoginButton/index.scss +50 -3
  107. package/dist/oauth/components/LogoutButton/index.js +5 -4
  108. package/dist/oauth/defaults.js +67 -10
  109. package/dist/oauth/endpoints/getLoginEndpoint.js +77 -24
  110. package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -4
  111. package/dist/oauth/index.js +40 -13
  112. package/dist/oauth/strategy/index.d.ts +0 -2
  113. package/dist/oauth/strategy/index.js +40 -17
  114. package/dist/oauth/types.d.ts +6 -6
  115. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +7 -0
  116. package/dist/oauth/utilities/isDuplicateKeyError.js +14 -0
  117. package/dist/oauth/utilities/refreshTokens.js +6 -3
  118. package/dist/plugin/build-config.d.ts +18 -15
  119. package/dist/plugin/build-config.js +213 -18
  120. package/dist/storage-content-api/api-types.d.ts +168 -0
  121. package/dist/storage-content-api/api-types.js +6 -0
  122. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts +9 -0
  123. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js +42 -0
  124. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts +13 -0
  125. package/dist/storage-content-api/client-uploads/generateSignedURL.js +39 -0
  126. package/dist/storage-content-api/client.d.ts +6 -0
  127. package/dist/storage-content-api/client.js +36 -0
  128. package/dist/storage-content-api/generateURL.d.ts +7 -0
  129. package/dist/storage-content-api/generateURL.js +8 -0
  130. package/dist/storage-content-api/handleDelete.d.ts +8 -0
  131. package/dist/storage-content-api/handleDelete.js +17 -0
  132. package/dist/storage-content-api/handleUpload.d.ts +11 -0
  133. package/dist/storage-content-api/handleUpload.js +144 -0
  134. package/dist/storage-content-api/index.d.ts +5 -0
  135. package/dist/storage-content-api/index.js +31 -0
  136. package/dist/storage-content-api/staticHandler.d.ts +10 -0
  137. package/dist/storage-content-api/staticHandler.js +56 -0
  138. package/dist/storage-content-api/types.d.ts +10 -0
  139. package/dist/storage-content-api/types.js +3 -0
  140. package/dist/storage-content-api/utilities/getSafeFilename.d.ts +12 -0
  141. package/dist/storage-content-api/utilities/getSafeFilename.js +61 -0
  142. package/dist/storage-content-api/utilities/index.d.ts +2 -0
  143. package/dist/storage-content-api/utilities/index.js +3 -0
  144. package/dist/templates/.env.example +5 -0
  145. package/dist/templates/README.md +19 -0
  146. package/dist/types/config.d.ts +2 -1
  147. package/dist/types/config.js +0 -2
  148. package/dist/types.d.ts +8 -1
  149. package/dist/utils/adapters/nextjs.d.ts +9 -0
  150. package/dist/utils/adapters/nextjs.js +64 -0
  151. package/dist/utils/adapters/nitro.d.ts +9 -0
  152. package/dist/utils/adapters/nitro.js +169 -0
  153. package/dist/utils/adapters/vite.d.ts +10 -0
  154. package/dist/utils/adapters/vite.js +33 -0
  155. package/dist/utils/asset-collection.d.ts +27 -6
  156. package/dist/utils/asset-collection.js +59 -30
  157. package/dist/utils/build-detection.d.ts +5 -11
  158. package/dist/utils/build-detection.js +74 -11
  159. package/dist/utils/build-lambda-zip.d.ts +14 -0
  160. package/dist/utils/build-lambda-zip.js +81 -0
  161. package/dist/utils/cache-bootstrap.d.ts +8 -0
  162. package/dist/utils/cache-bootstrap.js +18 -0
  163. package/dist/utils/config.js +1 -1
  164. package/dist/utils/deploy-adapter.d.ts +40 -0
  165. package/dist/utils/deploy-adapter.js +58 -0
  166. package/dist/utils/download-template.js +3 -2
  167. package/dist/utils/env-management.d.ts +24 -7
  168. package/dist/utils/env-management.js +119 -64
  169. package/dist/utils/format-env-suffix.d.ts +12 -0
  170. package/dist/utils/format-env-suffix.js +13 -0
  171. package/dist/utils/formatter.js +23 -11
  172. package/dist/utils/fs-utils.d.ts +6 -0
  173. package/dist/utils/fs-utils.js +27 -0
  174. package/dist/utils/handle-upgrade.d.ts +9 -0
  175. package/dist/utils/handle-upgrade.js +41 -0
  176. package/dist/utils/lambda-config.d.ts +3 -1
  177. package/dist/utils/lambda-config.js +87 -79
  178. package/dist/utils/messages.d.ts +1 -2
  179. package/dist/utils/messages.js +29 -11
  180. package/dist/utils/package-manager.d.ts +24 -0
  181. package/dist/utils/package-manager.js +53 -0
  182. package/dist/utils/payload-config-ast.d.ts +27 -6
  183. package/dist/utils/payload-config-ast.js +84 -54
  184. package/dist/utils/payload-config-finder.d.ts +2 -2
  185. package/dist/utils/payload-config-finder.js +48 -9
  186. package/dist/utils/payload-config-modifier.d.ts +1 -1
  187. package/dist/utils/payload-config-modifier.js +70 -11
  188. package/dist/utils/payload-package-check.d.ts +12 -1
  189. package/dist/utils/payload-package-check.js +63 -5
  190. package/dist/utils/project.d.ts +3 -2
  191. package/dist/utils/project.js +29 -15
  192. package/dist/utils/resolve-environment.d.ts +14 -0
  193. package/dist/utils/resolve-environment.js +31 -0
  194. package/dist/utils/s3-upload.d.ts +7 -2
  195. package/dist/utils/s3-upload.js +39 -6
  196. package/dist/utils/token-display.js +11 -5
  197. package/dist/utils/typescript-validator.js +4 -6
  198. package/dist/utils/version-check.d.ts +3 -0
  199. package/dist/utils/version-check.js +38 -0
  200. package/package.json +29 -11
  201. package/dist/api/control-plane.d.ts.map +0 -1
  202. package/dist/api/control-plane.js.map +0 -1
  203. package/dist/api/figma-api.d.ts.map +0 -1
  204. package/dist/api/figma-api.js.map +0 -1
  205. package/dist/auth/browser.d.ts.map +0 -1
  206. package/dist/auth/browser.js.map +0 -1
  207. package/dist/auth/callback-server.d.ts.map +0 -1
  208. package/dist/auth/callback-server.js.map +0 -1
  209. package/dist/auth/crypto-utils.d.ts.map +0 -1
  210. package/dist/auth/crypto-utils.js.map +0 -1
  211. package/dist/auth/jwt-validator.d.ts.map +0 -1
  212. package/dist/auth/jwt-validator.js.map +0 -1
  213. package/dist/auth/oauth-flow.d.ts.map +0 -1
  214. package/dist/auth/oauth-flow.js.map +0 -1
  215. package/dist/auth/pkce.d.ts.map +0 -1
  216. package/dist/auth/pkce.js.map +0 -1
  217. package/dist/auth/project-token.d.ts.map +0 -1
  218. package/dist/auth/project-token.js.map +0 -1
  219. package/dist/auth/refresh.d.ts.map +0 -1
  220. package/dist/auth/refresh.js.map +0 -1
  221. package/dist/auth/token-store.d.ts.map +0 -1
  222. package/dist/auth/token-store.js.map +0 -1
  223. package/dist/auth/types.d.ts.map +0 -1
  224. package/dist/auth/types.js.map +0 -1
  225. package/dist/cli.d.ts.map +0 -1
  226. package/dist/cli.js.map +0 -1
  227. package/dist/commands/deploy.d.ts.map +0 -1
  228. package/dist/commands/deploy.js.map +0 -1
  229. package/dist/commands/init.d.ts.map +0 -1
  230. package/dist/commands/init.js.map +0 -1
  231. package/dist/commands/list-tokens.d.ts.map +0 -1
  232. package/dist/commands/list-tokens.js.map +0 -1
  233. package/dist/commands/login.d.ts.map +0 -1
  234. package/dist/commands/login.js.map +0 -1
  235. package/dist/commands/logout.d.ts.map +0 -1
  236. package/dist/commands/logout.js.map +0 -1
  237. package/dist/config/oauth.d.ts.map +0 -1
  238. package/dist/config/oauth.js.map +0 -1
  239. package/dist/constants.d.ts.map +0 -1
  240. package/dist/constants.js.map +0 -1
  241. package/dist/exports/client.d.ts.map +0 -1
  242. package/dist/exports/client.js.map +0 -1
  243. package/dist/index.d.ts.map +0 -1
  244. package/dist/index.js.map +0 -1
  245. package/dist/oauth/components/LoginButton/index.d.ts.map +0 -1
  246. package/dist/oauth/components/LoginButton/index.js.map +0 -1
  247. package/dist/oauth/components/LogoutButton/index.d.ts.map +0 -1
  248. package/dist/oauth/components/LogoutButton/index.js.map +0 -1
  249. package/dist/oauth/defaults.d.ts.map +0 -1
  250. package/dist/oauth/defaults.js.map +0 -1
  251. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +0 -1
  252. package/dist/oauth/endpoints/getLoginEndpoint.js.map +0 -1
  253. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +0 -1
  254. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +0 -1
  255. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +0 -1
  256. package/dist/oauth/endpoints/getMetaEndpoint.js.map +0 -1
  257. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +0 -1
  258. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +0 -1
  259. package/dist/oauth/exports/client.d.ts.map +0 -1
  260. package/dist/oauth/exports/client.js.map +0 -1
  261. package/dist/oauth/hooks/afterLogout.d.ts.map +0 -1
  262. package/dist/oauth/hooks/afterLogout.js.map +0 -1
  263. package/dist/oauth/hooks/me.d.ts.map +0 -1
  264. package/dist/oauth/hooks/me.js.map +0 -1
  265. package/dist/oauth/hooks/refresh.d.ts.map +0 -1
  266. package/dist/oauth/hooks/refresh.js.map +0 -1
  267. package/dist/oauth/index.d.ts.map +0 -1
  268. package/dist/oauth/index.js.map +0 -1
  269. package/dist/oauth/strategy/index.d.ts.map +0 -1
  270. package/dist/oauth/strategy/index.js.map +0 -1
  271. package/dist/oauth/types.d.ts.map +0 -1
  272. package/dist/oauth/types.js.map +0 -1
  273. package/dist/oauth/utilities/clearCookie.d.ts.map +0 -1
  274. package/dist/oauth/utilities/clearCookie.js.map +0 -1
  275. package/dist/oauth/utilities/createCookieOptions.d.ts.map +0 -1
  276. package/dist/oauth/utilities/createCookieOptions.js.map +0 -1
  277. package/dist/oauth/utilities/createDebugLogger.d.ts.map +0 -1
  278. package/dist/oauth/utilities/createDebugLogger.js.map +0 -1
  279. package/dist/oauth/utilities/extractOrigin.d.ts.map +0 -1
  280. package/dist/oauth/utilities/extractOrigin.js.map +0 -1
  281. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +0 -1
  282. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +0 -1
  283. package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
  284. package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
  285. package/dist/oauth/utilities/getAdminPath.js +0 -9
  286. package/dist/oauth/utilities/getAdminPath.js.map +0 -1
  287. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +0 -1
  288. package/dist/oauth/utilities/getAuthorizeURL.js.map +0 -1
  289. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +0 -1
  290. package/dist/oauth/utilities/getCookieExpiration.js.map +0 -1
  291. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +0 -1
  292. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +0 -1
  293. package/dist/oauth/utilities/getTokenExp.d.ts.map +0 -1
  294. package/dist/oauth/utilities/getTokenExp.js.map +0 -1
  295. package/dist/oauth/utilities/getUsernameField.d.ts.map +0 -1
  296. package/dist/oauth/utilities/getUsernameField.js.map +0 -1
  297. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +0 -1
  298. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +0 -1
  299. package/dist/oauth/utilities/mergeHeaders.d.ts.map +0 -1
  300. package/dist/oauth/utilities/mergeHeaders.js.map +0 -1
  301. package/dist/oauth/utilities/refreshTokens.d.ts.map +0 -1
  302. package/dist/oauth/utilities/refreshTokens.js.map +0 -1
  303. package/dist/plugin/adapter.d.ts.map +0 -1
  304. package/dist/plugin/adapter.js.map +0 -1
  305. package/dist/plugin/build-config.d.ts.map +0 -1
  306. package/dist/plugin/build-config.js.map +0 -1
  307. package/dist/types/config.d.ts.map +0 -1
  308. package/dist/types/config.js.map +0 -1
  309. package/dist/types.d.ts.map +0 -1
  310. package/dist/types.js.map +0 -1
  311. package/dist/utils/asset-collection.d.ts.map +0 -1
  312. package/dist/utils/asset-collection.js.map +0 -1
  313. package/dist/utils/build-detection.d.ts.map +0 -1
  314. package/dist/utils/build-detection.js.map +0 -1
  315. package/dist/utils/config.d.ts.map +0 -1
  316. package/dist/utils/config.js.map +0 -1
  317. package/dist/utils/download-template.d.ts.map +0 -1
  318. package/dist/utils/download-template.js.map +0 -1
  319. package/dist/utils/env-management.d.ts.map +0 -1
  320. package/dist/utils/env-management.js.map +0 -1
  321. package/dist/utils/format.d.ts.map +0 -1
  322. package/dist/utils/format.js.map +0 -1
  323. package/dist/utils/formatter.d.ts.map +0 -1
  324. package/dist/utils/formatter.js.map +0 -1
  325. package/dist/utils/git.d.ts.map +0 -1
  326. package/dist/utils/git.js.map +0 -1
  327. package/dist/utils/is-debug.d.ts.map +0 -1
  328. package/dist/utils/is-debug.js.map +0 -1
  329. package/dist/utils/lambda-config.d.ts.map +0 -1
  330. package/dist/utils/lambda-config.js.map +0 -1
  331. package/dist/utils/log.d.ts.map +0 -1
  332. package/dist/utils/log.js.map +0 -1
  333. package/dist/utils/messages.d.ts.map +0 -1
  334. package/dist/utils/messages.js.map +0 -1
  335. package/dist/utils/package-manager.d.ts.map +0 -1
  336. package/dist/utils/package-manager.js.map +0 -1
  337. package/dist/utils/payload-config-ast.d.ts.map +0 -1
  338. package/dist/utils/payload-config-ast.js.map +0 -1
  339. package/dist/utils/payload-config-finder.d.ts.map +0 -1
  340. package/dist/utils/payload-config-finder.js.map +0 -1
  341. package/dist/utils/payload-config-modifier.d.ts.map +0 -1
  342. package/dist/utils/payload-config-modifier.js.map +0 -1
  343. package/dist/utils/payload-package-check.d.ts.map +0 -1
  344. package/dist/utils/payload-package-check.js.map +0 -1
  345. package/dist/utils/project.d.ts.map +0 -1
  346. package/dist/utils/project.js.map +0 -1
  347. package/dist/utils/s3-upload.d.ts.map +0 -1
  348. package/dist/utils/s3-upload.js.map +0 -1
  349. package/dist/utils/token-display.d.ts.map +0 -1
  350. package/dist/utils/token-display.js.map +0 -1
  351. package/dist/utils/typescript-validator.d.ts.map +0 -1
  352. package/dist/utils/typescript-validator.js.map +0 -1
@@ -1,23 +1,34 @@
1
1
  import fs from 'fs/promises';
2
2
  import path from 'path';
3
3
  /**
4
- * Detect if a valid Lambda-ready build exists
5
- *
6
- * Checks for:
7
- * - .next/standalone/server.js (required for Lambda)
8
- * - .next/BUILD_ID (Next.js build identifier)
9
- *
10
- * @param projectPath - Path to project root
11
- * @returns Build info if valid build found, null otherwise
4
+ * Detect a valid build across supported frameworks.
5
+ * Tries NextJS, then Nitro, then Vite. Returns the first match.
12
6
  */ export async function detectBuild(projectPath) {
7
+ // Try NextJS first
8
+ const nextjsBuild = await detectNextjsBuild(projectPath);
9
+ if (nextjsBuild) {
10
+ return nextjsBuild;
11
+ }
12
+ // Try Nitro
13
+ const nitroBuild = await detectNitroBuild(projectPath);
14
+ if (nitroBuild) {
15
+ return nitroBuild;
16
+ }
17
+ // Try Vite
18
+ const viteBuild = await detectViteBuild(projectPath);
19
+ if (viteBuild) {
20
+ return viteBuild;
21
+ }
22
+ return null;
23
+ }
24
+ /**
25
+ * Detect NextJS standalone build (.next/standalone/server.js + .next/BUILD_ID)
26
+ */ async function detectNextjsBuild(projectPath) {
13
27
  try {
14
- // Check for .next/standalone/server.js
15
28
  const serverPath = path.join(projectPath, '.next', 'standalone', 'server.js');
16
29
  const serverStat = await fs.stat(serverPath);
17
- // Check for .next/BUILD_ID
18
30
  const buildIdPath = path.join(projectPath, '.next', 'BUILD_ID');
19
31
  const buildId = (await fs.readFile(buildIdPath, 'utf-8')).trim();
20
- // Check for lambda.zip
21
32
  const lambdaZipPath = path.join(projectPath, 'lambda.zip');
22
33
  let hasLambdaZip = false;
23
34
  try {
@@ -36,6 +47,58 @@ import path from 'path';
36
47
  return null;
37
48
  }
38
49
  }
50
+ /**
51
+ * Detect Nitro build (.output/server/index.mjs)
52
+ * Build ID parsed from .output/nitro.json date field, or mtime of index.mjs
53
+ */ async function detectNitroBuild(projectPath) {
54
+ try {
55
+ const indexPath = path.join(projectPath, '.output', 'server', 'index.mjs');
56
+ const indexStat = await fs.stat(indexPath);
57
+ let buildId = indexStat.mtime.toISOString();
58
+ try {
59
+ const nitroJsonPath = path.join(projectPath, '.output', 'nitro.json');
60
+ const nitroJson = JSON.parse(await fs.readFile(nitroJsonPath, 'utf-8'));
61
+ if (nitroJson.date) {
62
+ buildId = nitroJson.date;
63
+ }
64
+ } catch {
65
+ // nitro.json missing or unparseable — fall back to mtime
66
+ }
67
+ const lambdaZipPath = path.join(projectPath, 'lambda.zip');
68
+ let hasLambdaZip = false;
69
+ try {
70
+ await fs.stat(lambdaZipPath);
71
+ hasLambdaZip = true;
72
+ } catch {
73
+ hasLambdaZip = false;
74
+ }
75
+ return {
76
+ buildId,
77
+ hasLambdaZip,
78
+ path: '.output',
79
+ timestamp: indexStat.mtime
80
+ };
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+ /**
86
+ * Detect Vite build (dist/index.html)
87
+ * Build ID is mtime of index.html as ISO string. No server, so hasLambdaZip is always false.
88
+ */ async function detectViteBuild(projectPath) {
89
+ try {
90
+ const indexPath = path.join(projectPath, 'dist', 'index.html');
91
+ const indexStat = await fs.stat(indexPath);
92
+ return {
93
+ buildId: indexStat.mtime.toISOString(),
94
+ hasLambdaZip: false,
95
+ path: 'dist',
96
+ timestamp: indexStat.mtime
97
+ };
98
+ } catch {
99
+ return null;
100
+ }
101
+ }
39
102
  /**
40
103
  * Get the build command from package.json
41
104
  *
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Build Lambda deployment zip using pure Node.js
3
+ *
4
+ * Cross-platform replacement for build_for_lambda.sh:
5
+ * 1. Copies .next/static to .next/standalone/.next/static
6
+ * 2. Copies run.sh to .next/standalone/run.sh
7
+ * 3. Copies public/ to .next/standalone/public/ (if exists)
8
+ * 4. Creates lambda.zip from .next/standalone/
9
+ *
10
+ * @param projectPath - Path to project root
11
+ * @throws Error if standalone directory missing or zip creation fails
12
+ */
13
+ export declare function buildLambdaZip(projectPath: string): Promise<void>;
14
+ //# sourceMappingURL=build-lambda-zip.d.ts.map
@@ -0,0 +1,81 @@
1
+ import archiver from 'archiver';
2
+ import { createWriteStream } from 'fs';
3
+ import fs from 'fs/promises';
4
+ import path from 'path';
5
+ /**
6
+ * Build Lambda deployment zip using pure Node.js
7
+ *
8
+ * Cross-platform replacement for build_for_lambda.sh:
9
+ * 1. Copies .next/static to .next/standalone/.next/static
10
+ * 2. Copies run.sh to .next/standalone/run.sh
11
+ * 3. Copies public/ to .next/standalone/public/ (if exists)
12
+ * 4. Creates lambda.zip from .next/standalone/
13
+ *
14
+ * @param projectPath - Path to project root
15
+ * @throws Error if standalone directory missing or zip creation fails
16
+ */ export async function buildLambdaZip(projectPath) {
17
+ const standalonePath = path.join(projectPath, '.next', 'standalone');
18
+ const staticPath = path.join(projectPath, '.next', 'static');
19
+ const publicPath = path.join(projectPath, 'public');
20
+ const runShPath = path.join(projectPath, 'run.sh');
21
+ const zipPath = path.join(projectPath, 'lambda.zip');
22
+ if (!await isDirectory(standalonePath)) {
23
+ throw new Error('Standalone build not found at .next/standalone. ' + 'Ensure next.config has output: "standalone" and run build first.');
24
+ }
25
+ if (await isDirectory(staticPath)) {
26
+ const destStatic = path.join(standalonePath, '.next', 'static');
27
+ await copyDirectory(staticPath, destStatic);
28
+ }
29
+ try {
30
+ await fs.copyFile(runShPath, path.join(standalonePath, 'run.sh'));
31
+ } catch {
32
+ // run.sh may not exist in all setups
33
+ }
34
+ if (await isDirectory(publicPath)) {
35
+ const destPublic = path.join(standalonePath, 'public');
36
+ await copyDirectory(publicPath, destPublic);
37
+ }
38
+ await createZip(standalonePath, zipPath);
39
+ }
40
+ async function isDirectory(dirPath) {
41
+ try {
42
+ const stats = await fs.stat(dirPath);
43
+ return stats.isDirectory();
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ async function copyDirectory(src, dest) {
49
+ await fs.mkdir(dest, {
50
+ recursive: true
51
+ });
52
+ const entries = await fs.readdir(src, {
53
+ withFileTypes: true
54
+ });
55
+ for (const entry of entries){
56
+ const srcPath = path.join(src, entry.name);
57
+ const destPath = path.join(dest, entry.name);
58
+ if (entry.isDirectory()) {
59
+ await copyDirectory(srcPath, destPath);
60
+ } else {
61
+ await fs.copyFile(srcPath, destPath);
62
+ }
63
+ }
64
+ }
65
+ function createZip(sourceDir, zipPath) {
66
+ return new Promise((resolve, reject)=>{
67
+ const output = createWriteStream(zipPath);
68
+ const archive = archiver('zip', {
69
+ zlib: {
70
+ level: 9
71
+ }
72
+ });
73
+ output.on('close', ()=>resolve());
74
+ archive.on('error', (err)=>reject(err));
75
+ archive.pipe(output);
76
+ archive.directory(sourceDir, false);
77
+ void archive.finalize();
78
+ });
79
+ }
80
+
81
+ //# sourceMappingURL=build-lambda-zip.js.map
@@ -0,0 +1,8 @@
1
+ import type { BootstrapInfo } from '../api/control-plane.js';
2
+ import type { TokenStore } from '../auth/token-store.js';
3
+ /**
4
+ * Cache bootstrap data for all environments in the local encrypted store.
5
+ * Called from init, env, and build-config to keep the store populated.
6
+ */
7
+ export declare function cacheAllEnvironments(tokenStore: TokenStore, projectId: string, bootstrapInfo: BootstrapInfo): void;
8
+ //# sourceMappingURL=cache-bootstrap.d.ts.map
@@ -0,0 +1,18 @@
1
+ import * as log from './log.js';
2
+ /**
3
+ * Cache bootstrap data for all environments in the local encrypted store.
4
+ * Called from init, env, and build-config to keep the store populated.
5
+ */ export function cacheAllEnvironments(tokenStore, projectId, bootstrapInfo) {
6
+ const { oauthCredentials } = bootstrapInfo;
7
+ for (const env of bootstrapInfo.environments){
8
+ tokenStore.setBootstrapData(projectId, env.name, {
9
+ contentSystemId: env.contentSystemId,
10
+ oauthClientId: oauthCredentials.oauthClientId,
11
+ oauthClientSecret: oauthCredentials.oauthClientSecret,
12
+ tenantInstanceId: env.tenantInstanceId
13
+ });
14
+ }
15
+ log.debug(`Cached bootstrap data for environments: ${bootstrapInfo.environments.map((e)=>e.name).join(', ')}`);
16
+ }
17
+
18
+ //# sourceMappingURL=cache-bootstrap.js.map
@@ -19,7 +19,7 @@ const GITIGNORE_FILENAME = '.gitignore';
19
19
  }
20
20
  }
21
21
  // Parse existing entries
22
- const existingLines = existingContent.split('\n').filter((line)=>line.trim());
22
+ const existingLines = existingContent.split(/\r?\n/).filter((line)=>line.trim());
23
23
  const existingSet = new Set(existingLines);
24
24
  // Add new entries that don't exist
25
25
  const newEntries = entries.filter((entry)=>!existingSet.has(entry));
@@ -0,0 +1,40 @@
1
+ export interface PageCollection {
2
+ /** S3 key → relative filesystem path from project root */
3
+ pathMap: Record<string, string>;
4
+ /** Route → S3 upload keys for that route (e.g., { "/products": ["products.html", "products.rsc"] }) */
5
+ routeAssetMap: Record<string, string[]>;
6
+ /** Route paths for the manifest pages array (e.g., ["/products", "/blog"]) */
7
+ routes: string[];
8
+ /** S3 keys to upload (e.g., ["products.html", "products.rsc", "products.meta"]) */
9
+ uploadKeys: string[];
10
+ }
11
+ export interface AssetCollection {
12
+ /** S3 key → relative filesystem path from project root */
13
+ pathMap: Record<string, string>;
14
+ /** Route paths for the manifest assets array (e.g., ["/favicon.ico"]) */
15
+ routes: string[];
16
+ /** S3 keys to upload (same as routes for assets, without leading slash) */
17
+ uploadKeys: string[];
18
+ }
19
+ export type AdapterName = 'nextjs' | 'nitro' | 'vite';
20
+ export interface DeployAdapter {
21
+ collectAssets(projectPath: string): Promise<AssetCollection>;
22
+ collectPages(projectPath: string): Promise<PageCollection>;
23
+ /** SPA fallback path (e.g., "/index.html"). Undefined for SSR/SSG apps. */
24
+ fallback?: string;
25
+ name: AdapterName;
26
+ /** Assembles and zips the server bundle. Returns path to zip, or null if no server (e.g., Vite SPA). */
27
+ prepareLambdaBundle(projectPath: string): Promise<null | string>;
28
+ }
29
+ /**
30
+ * Auto-detect the framework adapter based on build output.
31
+ *
32
+ * - .next/ exists → nextjs
33
+ * - .output/nitro.json exists → nitro
34
+ * - dist/index.html exists (no .next/, no .output/) → vite
35
+ *
36
+ * @param projectPath - Path to project root
37
+ * @param override - Explicit adapter name from --adapter flag
38
+ */
39
+ export declare function detectAdapter(projectPath: string, override?: AdapterName): Promise<DeployAdapter>;
40
+ //# sourceMappingURL=deploy-adapter.d.ts.map
@@ -0,0 +1,58 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ /**
4
+ * Auto-detect the framework adapter based on build output.
5
+ *
6
+ * - .next/ exists → nextjs
7
+ * - .output/nitro.json exists → nitro
8
+ * - dist/index.html exists (no .next/, no .output/) → vite
9
+ *
10
+ * @param projectPath - Path to project root
11
+ * @param override - Explicit adapter name from --adapter flag
12
+ */ export async function detectAdapter(projectPath, override) {
13
+ if (override) {
14
+ return loadAdapter(override);
15
+ }
16
+ const hasNext = await exists(path.join(projectPath, '.next'));
17
+ const hasNitro = await exists(path.join(projectPath, '.output', 'nitro.json'));
18
+ const hasViteDist = await exists(path.join(projectPath, 'dist', 'index.html'));
19
+ if (hasNext) {
20
+ return loadAdapter('nextjs');
21
+ }
22
+ if (hasNitro) {
23
+ return loadAdapter('nitro');
24
+ }
25
+ if (hasViteDist) {
26
+ return loadAdapter('vite');
27
+ }
28
+ throw new Error('Could not detect framework. Expected .next/ (NextJS), .output/nitro.json (Nitro), or dist/index.html (Vite). ' + 'Use --adapter to specify explicitly.');
29
+ }
30
+ async function loadAdapter(name) {
31
+ switch(name){
32
+ case 'nextjs':
33
+ {
34
+ const mod = await import('./adapters/nextjs.js');
35
+ return mod.nextjsAdapter;
36
+ }
37
+ case 'nitro':
38
+ {
39
+ const mod = await import('./adapters/nitro.js');
40
+ return mod.nitroAdapter;
41
+ }
42
+ case 'vite':
43
+ {
44
+ const mod = await import('./adapters/vite.js');
45
+ return mod.viteAdapter;
46
+ }
47
+ }
48
+ }
49
+ async function exists(filePath) {
50
+ try {
51
+ await fs.stat(filePath);
52
+ return true;
53
+ } catch {
54
+ return false;
55
+ }
56
+ }
57
+
58
+ //# sourceMappingURL=deploy-adapter.js.map
@@ -11,7 +11,8 @@ import { x } from 'tar';
11
11
  this.name = 'TemplateDownloadError';
12
12
  }
13
13
  }
14
- const BRANCH_OR_TAG = 'main';
14
+ const BRANCH_OR_TAG = 'v3.79.1';
15
+ /** GitHub strips the 'v' prefix in tarball directory names */ const TARBALL_PREFIX = `payload-${BRANCH_OR_TAG.replace(/^v/, '')}`;
15
16
  const TEMPLATE_NAME = 'blank';
16
17
  const MAX_RETRIES = 3;
17
18
  const INITIAL_RETRY_DELAY = 1000 // 1 second
@@ -43,7 +44,7 @@ const INITIAL_RETRY_DELAY = 1000 // 1 second
43
44
  * Single attempt to download template (extracted for retry logic)
44
45
  */ async function downloadTemplateAttempt(projectDir) {
45
46
  const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${BRANCH_OR_TAG}`;
46
- const filter = `payload-${BRANCH_OR_TAG}/templates/${TEMPLATE_NAME}/`;
47
+ const filter = `${TARBALL_PREFIX}/templates/${TEMPLATE_NAME}/`;
47
48
  try {
48
49
  // Ensure target directory exists
49
50
  await fs.mkdir(projectDir, {
@@ -1,16 +1,33 @@
1
1
  /**
2
- * Generate a cryptographically secure secret for PAYLOAD_SECRET
2
+ * Get an environment variable value from .env file (async)
3
3
  *
4
- * @returns 24-character hexadecimal string
4
+ * @param projectPath - Path to project directory
5
+ * @param key - Environment variable name to retrieve
6
+ * @returns The value if found, null otherwise
7
+ */
8
+ export declare function getEnvVar(projectPath: string, key: string): Promise<null | string>;
9
+ /**
10
+ * Get an environment variable value from .env file (sync)
11
+ *
12
+ * @param projectPath - Path to project directory
13
+ * @param key - Environment variable name to retrieve
14
+ * @returns The value if found, null otherwise
5
15
  */
6
- export declare function generateSecret(): string;
16
+ export declare function getEnvVarSync(projectPath: string, key: string): null | string;
7
17
  /**
8
- * Manage environment files for a new project
18
+ * Add or update an environment variable in .env file
9
19
  *
10
- * Creates .env from .env.example (if exists) and populates PAYLOAD_SECRET
20
+ * @param projectPath - Path to project directory
21
+ * @param key - Environment variable name
22
+ * @param value - Environment variable value
23
+ */
24
+ export declare function addOrUpdateEnvVar(projectPath: string, key: string, value: string): Promise<void>;
25
+ /**
26
+ * Remove an environment variable from .env file
11
27
  *
12
28
  * @param projectPath - Path to project directory
13
- * @returns The generated payload secret
29
+ * @param key - Environment variable name to remove
30
+ * @returns true if key was found and removed, false otherwise
14
31
  */
15
- export declare function manageEnvFiles(projectPath: string): Promise<string>;
32
+ export declare function removeEnvVar(projectPath: string, key: string): Promise<boolean>;
16
33
  //# sourceMappingURL=env-management.d.ts.map
@@ -1,97 +1,152 @@
1
- import { randomBytes } from 'crypto';
2
1
  import fs from 'fs/promises';
2
+ import fsSync from 'node:fs';
3
3
  import path from 'path';
4
4
  /**
5
- * Generate a cryptographically secure secret for PAYLOAD_SECRET
6
- *
7
- * @returns 24-character hexadecimal string
8
- */ export function generateSecret() {
9
- return randomBytes(32).toString('hex').slice(0, 24);
10
- }
11
- /**
12
- * Sanitize and process environment file contents
13
- *
14
- * @param contents - Raw .env file contents
15
- * @param payloadSecret - Secret to use for PAYLOAD_SECRET
16
- * @returns Processed .env contents
17
- */ function sanitizeEnv(contents, payloadSecret) {
18
- const lines = contents.split('\n');
19
- const seenKeys = new Set();
20
- const processedLines = [];
5
+ * Parse .env file contents and extract value for a key
6
+ */ function parseEnvValue(contents, key) {
7
+ const lines = contents.split(/\r?\n/);
21
8
  for (const line of lines){
22
9
  // Skip empty lines and comments
23
10
  if (!line.trim() || line.trim().startsWith('#')) {
24
- processedLines.push(line);
25
11
  continue;
26
12
  }
27
13
  // Skip lines without =
28
14
  if (!line.includes('=')) {
29
- processedLines.push(line);
30
15
  continue;
31
16
  }
32
- const [key] = line.split('=');
33
- const trimmedKey = key.trim();
34
- // Skip duplicate keys
35
- if (seenKeys.has(trimmedKey)) {
36
- continue;
37
- }
38
- seenKeys.add(trimmedKey);
39
- // Replace PAYLOAD_SECRET with actual value
40
- if (trimmedKey === 'PAYLOAD_SECRET' || trimmedKey === 'PAYLOAD_SECRET_KEY') {
41
- processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`);
42
- } else {
43
- processedLines.push(line);
17
+ const equalsIndex = line.indexOf('=');
18
+ const lineKey = line.substring(0, equalsIndex).trim();
19
+ if (lineKey === key) {
20
+ return line.substring(equalsIndex + 1);
44
21
  }
45
22
  }
46
- // Add PAYLOAD_SECRET if not present
47
- if (!seenKeys.has('PAYLOAD_SECRET') && !seenKeys.has('PAYLOAD_SECRET_KEY')) {
48
- processedLines.push(`PAYLOAD_SECRET=${payloadSecret}`);
23
+ return null;
24
+ }
25
+ /**
26
+ * Get an environment variable value from .env file (async)
27
+ *
28
+ * @param projectPath - Path to project directory
29
+ * @param key - Environment variable name to retrieve
30
+ * @returns The value if found, null otherwise
31
+ */ export async function getEnvVar(projectPath, key) {
32
+ const envPath = path.join(projectPath, '.env');
33
+ try {
34
+ const contents = await fs.readFile(envPath, 'utf-8');
35
+ return parseEnvValue(contents, key);
36
+ } catch {
37
+ // File doesn't exist or can't be read
38
+ return null;
49
39
  }
50
- return processedLines.join('\n');
51
40
  }
52
41
  /**
53
- * Manage environment files for a new project
42
+ * Get an environment variable value from .env file (sync)
54
43
  *
55
- * Creates .env from .env.example (if exists) and populates PAYLOAD_SECRET
44
+ * @param projectPath - Path to project directory
45
+ * @param key - Environment variable name to retrieve
46
+ * @returns The value if found, null otherwise
47
+ */ export function getEnvVarSync(projectPath, key) {
48
+ const envPath = path.join(projectPath, '.env');
49
+ try {
50
+ const contents = fsSync.readFileSync(envPath, 'utf-8');
51
+ return parseEnvValue(contents, key);
52
+ } catch {
53
+ // File doesn't exist or can't be read
54
+ return null;
55
+ }
56
+ }
57
+ /**
58
+ * Add or update an environment variable in .env file
56
59
  *
57
60
  * @param projectPath - Path to project directory
58
- * @returns The generated payload secret
59
- */ export async function manageEnvFiles(projectPath) {
60
- const payloadSecret = generateSecret();
61
- const envExamplePath = path.join(projectPath, '.env.example');
61
+ * @param key - Environment variable name
62
+ * @param value - Environment variable value
63
+ */ export async function addOrUpdateEnvVar(projectPath, key, value) {
62
64
  const envPath = path.join(projectPath, '.env');
63
65
  try {
64
- // Check if .env.example exists
65
- let envExampleContents = '';
66
- try {
67
- envExampleContents = await fs.readFile(envExamplePath, 'utf-8');
68
- } catch {
69
- // No .env.example, create minimal .env
70
- envExampleContents = '';
71
- }
72
- // Check if .env already exists
66
+ let contents = '';
73
67
  let envExists = false;
68
+ // Try to read existing .env file
74
69
  try {
75
- await fs.access(envPath);
70
+ contents = await fs.readFile(envPath, 'utf-8');
76
71
  envExists = true;
77
72
  } catch {
78
- // .env doesn't exist
73
+ // .env doesn't exist, will create it
79
74
  }
80
- if (!envExists) {
81
- // Create .env from .env.example
82
- const sanitized = sanitizeEnv(envExampleContents, payloadSecret);
83
- await fs.writeFile(envPath, sanitized, 'utf-8');
84
- } else {
85
- // Update existing .env if it doesn't have PAYLOAD_SECRET
86
- const existingContents = await fs.readFile(envPath, 'utf-8');
87
- if (!existingContents.includes('PAYLOAD_SECRET=') && !existingContents.includes('PAYLOAD_SECRET_KEY=')) {
88
- const sanitized = sanitizeEnv(existingContents, payloadSecret);
89
- await fs.writeFile(envPath, sanitized, 'utf-8');
75
+ const lines = contents.split(/\r?\n/);
76
+ const seenKeys = new Set();
77
+ const processedLines = [];
78
+ let keyUpdated = false;
79
+ for (const line of lines){
80
+ // Skip empty lines at start if file didn't exist
81
+ if (!envExists && !line.trim()) {
82
+ continue;
83
+ }
84
+ // Preserve empty lines and comments
85
+ if (!line.trim() || line.trim().startsWith('#')) {
86
+ processedLines.push(line);
87
+ continue;
88
+ }
89
+ // Skip lines without =
90
+ if (!line.includes('=')) {
91
+ processedLines.push(line);
92
+ continue;
93
+ }
94
+ const [lineKey] = line.split('=');
95
+ const trimmedKey = lineKey.trim();
96
+ // Skip duplicate keys (keep first occurrence)
97
+ if (seenKeys.has(trimmedKey)) {
98
+ continue;
99
+ }
100
+ seenKeys.add(trimmedKey);
101
+ // Update or keep the line
102
+ if (trimmedKey === key) {
103
+ processedLines.push(`${key}=${value}`);
104
+ keyUpdated = true;
105
+ } else {
106
+ processedLines.push(line);
90
107
  }
91
108
  }
92
- return payloadSecret;
109
+ // Add key if not present
110
+ if (!keyUpdated) {
111
+ processedLines.push(`${key}=${value}`);
112
+ }
113
+ await fs.writeFile(envPath, processedLines.join('\n'), 'utf-8');
93
114
  } catch (error) {
94
- throw new Error(`Failed to manage environment files: ${error instanceof Error ? error.message : 'Unknown error'}`);
115
+ throw new Error(`Failed to update .env file: ${error instanceof Error ? error.message : 'Unknown error'}`);
116
+ }
117
+ }
118
+ /**
119
+ * Remove an environment variable from .env file
120
+ *
121
+ * @param projectPath - Path to project directory
122
+ * @param key - Environment variable name to remove
123
+ * @returns true if key was found and removed, false otherwise
124
+ */ export async function removeEnvVar(projectPath, key) {
125
+ const envPath = path.join(projectPath, '.env');
126
+ try {
127
+ const contents = await fs.readFile(envPath, 'utf-8');
128
+ const lines = contents.split(/\r?\n/);
129
+ const filteredLines = [];
130
+ let found = false;
131
+ for (const line of lines){
132
+ if (line.trim() && !line.trim().startsWith('#') && line.includes('=')) {
133
+ const equalsIndex = line.indexOf('=');
134
+ const lineKey = line.substring(0, equalsIndex).trim();
135
+ if (lineKey === key) {
136
+ found = true;
137
+ continue;
138
+ }
139
+ }
140
+ filteredLines.push(line);
141
+ }
142
+ if (found) {
143
+ // Collapse consecutive blank lines and trim leading/trailing blank lines
144
+ const collapsed = filteredLines.join('\n').replace(/\n{3,}/g, '\n\n').replace(/^\n+/, '');
145
+ await fs.writeFile(envPath, collapsed, 'utf-8');
146
+ }
147
+ return found;
148
+ } catch {
149
+ return false;
95
150
  }
96
151
  }
97
152
 
@@ -0,0 +1,12 @@
1
+ import type { Environment } from '../constants.js';
2
+ /**
3
+ * Format environment suffix for user-facing messages.
4
+ * Returns empty string for production (default), suffix for other environments.
5
+ *
6
+ * @param env - The environment
7
+ * @param prefix - Prefix before environment name (default: ' to ')
8
+ * @param suffix - Suffix after environment name (default: '')
9
+ * @returns Formatted string or empty string for production
10
+ */
11
+ export declare function formatEnvSuffix(env: Environment, prefix?: string, suffix?: string): string;
12
+ //# sourceMappingURL=format-env-suffix.d.ts.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Format environment suffix for user-facing messages.
3
+ * Returns empty string for production (default), suffix for other environments.
4
+ *
5
+ * @param env - The environment
6
+ * @param prefix - Prefix before environment name (default: ' to ')
7
+ * @param suffix - Suffix after environment name (default: '')
8
+ * @returns Formatted string or empty string for production
9
+ */ export function formatEnvSuffix(env, prefix = ' to ', suffix = '') {
10
+ return env !== 'production' ? `${prefix}${env}${suffix}` : '';
11
+ }
12
+
13
+ //# sourceMappingURL=format-env-suffix.js.map