@payloadcms/figma 0.0.1-alpha.9 → 0.1.0-alpha.1

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 (472) hide show
  1. package/dist/api/control-plane.d.ts +56 -7
  2. package/dist/api/control-plane.js +188 -74
  3. package/dist/api/error-response.d.ts +36 -0
  4. package/dist/api/error-response.js +66 -0
  5. package/dist/api/figma-api.d.ts +24 -3
  6. package/dist/api/figma-api.js +110 -34
  7. package/dist/auth/browser.d.ts +0 -1
  8. package/dist/auth/browser.js +0 -2
  9. package/dist/auth/callback-server.d.ts +19 -8
  10. package/dist/auth/callback-server.js +72 -32
  11. package/dist/auth/credentials.d.ts +20 -0
  12. package/dist/auth/credentials.js +19 -0
  13. package/dist/auth/crypto-utils.d.ts +28 -1
  14. package/dist/auth/crypto-utils.js +132 -23
  15. package/dist/auth/jwt-validator.d.ts +23 -6
  16. package/dist/auth/jwt-validator.js +35 -9
  17. package/dist/auth/oauth-flow.d.ts +19 -4
  18. package/dist/auth/oauth-flow.js +151 -34
  19. package/dist/auth/paste-code.d.ts +33 -0
  20. package/dist/auth/paste-code.js +87 -0
  21. package/dist/auth/pkce.d.ts +0 -1
  22. package/dist/auth/pkce.js +0 -2
  23. package/dist/auth/project-token.d.ts +32 -17
  24. package/dist/auth/project-token.js +176 -68
  25. package/dist/auth/refresh.d.ts +2 -2
  26. package/dist/auth/refresh.js +25 -14
  27. package/dist/auth/token-store-migration.d.ts +57 -0
  28. package/dist/auth/token-store-migration.js +154 -0
  29. package/dist/auth/token-store.d.ts +63 -98
  30. package/dist/auth/token-store.js +405 -124
  31. package/dist/auth/types.d.ts +40 -6
  32. package/dist/auth/types.js +1 -3
  33. package/dist/cli.d.ts +0 -1
  34. package/dist/cli.js +102 -8
  35. package/dist/commands/bootstrap.d.ts +17 -0
  36. package/dist/commands/bootstrap.js +88 -0
  37. package/dist/commands/build-lambda-zip.d.ts +4 -0
  38. package/dist/commands/build-lambda-zip.js +17 -0
  39. package/dist/commands/debug.d.ts +7 -0
  40. package/dist/commands/debug.js +178 -0
  41. package/dist/commands/deploy.d.ts +11 -1
  42. package/dist/commands/deploy.js +193 -153
  43. package/dist/commands/dump-tokens.d.ts +11 -0
  44. package/dist/commands/dump-tokens.js +67 -0
  45. package/dist/commands/env.d.ts +12 -0
  46. package/dist/commands/env.js +86 -0
  47. package/dist/commands/init.d.ts +9 -6
  48. package/dist/commands/init.js +232 -152
  49. package/dist/commands/list-tokens.d.ts +3 -4
  50. package/dist/commands/list-tokens.js +24 -11
  51. package/dist/commands/login.d.ts +8 -2
  52. package/dist/commands/login.js +34 -18
  53. package/dist/commands/logout.d.ts +5 -5
  54. package/dist/commands/logout.js +77 -17
  55. package/dist/commands/upgrade.d.ts +4 -0
  56. package/dist/commands/upgrade.js +329 -0
  57. package/dist/commands/upload-schema.d.ts +8 -0
  58. package/dist/commands/upload-schema.js +91 -0
  59. package/dist/config/oauth.d.ts +17 -12
  60. package/dist/config/oauth.js +38 -39
  61. package/dist/constants.d.ts +63 -19
  62. package/dist/constants.js +158 -20
  63. package/dist/db-content-api/generated/content-api-types.d.ts +8215 -0
  64. package/dist/db-content-api/generated/content-api-types.js +5 -0
  65. package/dist/db-content-api/index.d.ts +40 -0
  66. package/dist/db-content-api/index.js +883 -0
  67. package/dist/db-content-api/temp-utilities/slug.d.ts +1 -0
  68. package/dist/db-content-api/temp-utilities/slug.js +1 -0
  69. package/dist/db-content-api/temp-utilities/sorting.d.ts +2 -0
  70. package/dist/db-content-api/temp-utilities/sorting.js +37 -0
  71. package/dist/db-content-api/temp-utilities/types.d.ts +21 -0
  72. package/dist/db-content-api/temp-utilities/types.js +13 -0
  73. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +38 -0
  74. package/dist/db-content-api/temp-utilities/unwrapDocument.js +62 -0
  75. package/dist/db-content-api/utilities/auth.d.ts +29 -0
  76. package/dist/db-content-api/utilities/auth.js +82 -0
  77. package/dist/db-content-api/utilities/clientVersionHeaders.d.ts +7 -0
  78. package/dist/db-content-api/utilities/clientVersionHeaders.js +15 -0
  79. package/dist/db-content-api/utilities/data/applyDefaults.d.ts +6 -0
  80. package/dist/db-content-api/utilities/data/applyDefaults.js +75 -0
  81. package/dist/db-content-api/utilities/data/atomicOperations.d.ts +16 -0
  82. package/dist/db-content-api/utilities/data/atomicOperations.js +48 -0
  83. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +10 -0
  84. package/dist/db-content-api/utilities/data/castFieldValue.js +66 -0
  85. package/dist/db-content-api/utilities/data/convertRelationshipIds.d.ts +25 -0
  86. package/dist/db-content-api/utilities/data/convertRelationshipIds.js +109 -0
  87. package/dist/db-content-api/utilities/data/index.d.ts +48 -0
  88. package/dist/db-content-api/utilities/data/index.js +315 -0
  89. package/dist/db-content-api/utilities/data/isLocaleMap.d.ts +10 -0
  90. package/dist/db-content-api/utilities/data/isLocaleMap.js +13 -0
  91. package/dist/db-content-api/utilities/data/pointShape.d.ts +3 -0
  92. package/dist/db-content-api/utilities/data/pointShape.js +43 -0
  93. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +11 -0
  94. package/dist/db-content-api/utilities/data/removeVirtualFields.js +52 -0
  95. package/dist/db-content-api/utilities/data/resolveFieldLocalization.d.ts +18 -0
  96. package/dist/db-content-api/utilities/data/resolveFieldLocalization.js +21 -0
  97. package/dist/db-content-api/utilities/data/richTextShape.d.ts +3 -0
  98. package/dist/db-content-api/utilities/data/richTextShape.js +56 -0
  99. package/dist/db-content-api/utilities/data/stripFields.d.ts +47 -0
  100. package/dist/db-content-api/utilities/data/stripFields.js +170 -0
  101. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +22 -0
  102. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +40 -0
  103. package/dist/db-content-api/utilities/data/validateRelationships.d.ts +6 -0
  104. package/dist/db-content-api/utilities/data/validateRelationships.js +107 -0
  105. package/dist/db-content-api/utilities/joins.d.ts +50 -0
  106. package/dist/db-content-api/utilities/joins.js +124 -0
  107. package/dist/db-content-api/utilities/locale/index.d.ts +9 -0
  108. package/dist/db-content-api/utilities/locale/index.js +19 -0
  109. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.d.ts +9 -0
  110. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.js +100 -0
  111. package/dist/db-content-api/utilities/resolveBlocks.d.ts +19 -0
  112. package/dist/db-content-api/utilities/resolveBlocks.js +31 -0
  113. package/dist/db-content-api/utilities/schema/buildDocumentSchema.d.ts +72 -0
  114. package/dist/db-content-api/utilities/schema/buildDocumentSchema.js +264 -0
  115. package/dist/db-content-api/utilities/where.d.ts +9 -0
  116. package/dist/db-content-api/utilities/where.js +95 -0
  117. package/dist/deploy/schedule-extract-plugin.d.ts +10 -0
  118. package/dist/deploy/schedule-extract-plugin.js +32 -0
  119. package/dist/endpoints/health.d.ts +2 -0
  120. package/dist/endpoints/health.js +9 -0
  121. package/dist/endpoints/schema.d.ts +2 -0
  122. package/dist/endpoints/schema.js +27 -0
  123. package/dist/exports/client.d.ts +2 -1
  124. package/dist/exports/client.js +2 -2
  125. package/dist/index.d.ts +2 -2
  126. package/dist/index.js +3 -3
  127. package/dist/lib/download-skill.d.ts +12 -0
  128. package/dist/lib/download-skill.js +77 -0
  129. package/dist/oauth/components/FigmaAvatar/index.d.ts +3 -0
  130. package/dist/oauth/components/FigmaAvatar/index.js +25 -0
  131. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  132. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +4 -0
  133. package/dist/oauth/components/FigmaAvatarCell/index.js +23 -0
  134. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  135. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +8 -0
  136. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +35 -0
  137. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  138. package/dist/oauth/components/LoginButton/iframeAutoLogin.d.ts +81 -0
  139. package/dist/oauth/components/LoginButton/iframeAutoLogin.js +168 -0
  140. package/dist/oauth/components/LoginButton/index.d.ts +0 -1
  141. package/dist/oauth/components/LoginButton/index.js +156 -18
  142. package/dist/oauth/components/LoginButton/index.scss +75 -3
  143. package/dist/oauth/components/LogoutButton/index.d.ts +0 -1
  144. package/dist/oauth/components/LogoutButton/index.js +20 -9
  145. package/dist/oauth/defaults.d.ts +3 -2
  146. package/dist/oauth/defaults.js +79 -12
  147. package/dist/oauth/endpoints/getLoginEndpoint.d.ts +0 -1
  148. package/dist/oauth/endpoints/getLoginEndpoint.js +87 -84
  149. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts +0 -1
  150. package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -6
  151. package/dist/oauth/endpoints/getMetaEndpoint.d.ts +0 -1
  152. package/dist/oauth/endpoints/getMetaEndpoint.js +18 -5
  153. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts +0 -1
  154. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js +11 -4
  155. package/dist/oauth/exports/client.d.ts +0 -1
  156. package/dist/oauth/exports/client.js +0 -2
  157. package/dist/oauth/hooks/afterLogout.d.ts +0 -1
  158. package/dist/oauth/hooks/afterLogout.js +0 -2
  159. package/dist/oauth/hooks/me.d.ts +0 -1
  160. package/dist/oauth/hooks/me.js +0 -2
  161. package/dist/oauth/hooks/refresh.d.ts +0 -1
  162. package/dist/oauth/hooks/refresh.js +2 -3
  163. package/dist/oauth/index.d.ts +0 -1
  164. package/dist/oauth/index.js +27 -7
  165. package/dist/oauth/strategy/index.d.ts +0 -3
  166. package/dist/oauth/strategy/index.js +55 -34
  167. package/dist/oauth/types.d.ts +23 -7
  168. package/dist/oauth/types.js +0 -2
  169. package/dist/oauth/utilities/buildUnauthorizedRedirect.d.ts +14 -0
  170. package/dist/oauth/utilities/buildUnauthorizedRedirect.js +28 -0
  171. package/dist/oauth/utilities/clearCookie.d.ts +0 -1
  172. package/dist/oauth/utilities/clearCookie.js +5 -3
  173. package/dist/oauth/utilities/createCookieOptions.d.ts +0 -1
  174. package/dist/oauth/utilities/createCookieOptions.js +9 -4
  175. package/dist/oauth/utilities/createDebugLogger.d.ts +0 -1
  176. package/dist/oauth/utilities/createDebugLogger.js +0 -2
  177. package/dist/oauth/utilities/establishSession.d.ts +22 -0
  178. package/dist/oauth/utilities/establishSession.js +80 -0
  179. package/dist/oauth/utilities/exchangeCodeForAccessToken.d.ts +23 -0
  180. package/dist/oauth/utilities/exchangeCodeForAccessToken.js +26 -0
  181. package/dist/oauth/utilities/extractOrigin.d.ts +0 -1
  182. package/dist/oauth/utilities/extractOrigin.js +0 -2
  183. package/dist/oauth/utilities/figmaHostnames.d.ts +2 -0
  184. package/dist/oauth/utilities/figmaHostnames.js +24 -0
  185. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts +0 -1
  186. package/dist/oauth/utilities/getAdminCollectionSlug.js +0 -2
  187. package/dist/oauth/utilities/getAuthorizeURL.d.ts +65 -2
  188. package/dist/oauth/utilities/getAuthorizeURL.js +57 -4
  189. package/dist/oauth/utilities/getCookieExpiration.d.ts +0 -1
  190. package/dist/oauth/utilities/getCookieExpiration.js +0 -2
  191. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts +0 -1
  192. package/dist/oauth/utilities/getSecondsFromTokenExp.js +0 -2
  193. package/dist/oauth/utilities/getTokenExp.d.ts +0 -1
  194. package/dist/oauth/utilities/getTokenExp.js +0 -2
  195. package/dist/oauth/utilities/getUsernameField.d.ts +0 -1
  196. package/dist/oauth/utilities/getUsernameField.js +0 -2
  197. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts +0 -1
  198. package/dist/oauth/utilities/hasUserTokenPropsChanged.js +0 -2
  199. package/dist/oauth/utilities/isAbsoluteURL.d.ts +1 -0
  200. package/dist/oauth/utilities/isAbsoluteURL.js +1 -0
  201. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +6 -0
  202. package/dist/oauth/utilities/isDuplicateKeyError.js +12 -0
  203. package/dist/oauth/utilities/mergeHeaders.d.ts +0 -1
  204. package/dist/oauth/utilities/mergeHeaders.js +0 -2
  205. package/dist/oauth/utilities/refreshTokens.d.ts +0 -1
  206. package/dist/oauth/utilities/refreshTokens.js +21 -13
  207. package/dist/oauth/utilities/withPartitionedCookie.d.ts +19 -0
  208. package/dist/oauth/utilities/withPartitionedCookie.js +26 -0
  209. package/dist/oauth/utils/getSearchParam.d.ts +17 -0
  210. package/dist/oauth/utils/getSearchParam.js +22 -0
  211. package/dist/plugin/adapter.d.ts +0 -1
  212. package/dist/plugin/adapter.js +0 -2
  213. package/dist/plugin/auth-preflight.d.ts +7 -0
  214. package/dist/plugin/auth-preflight.js +18 -0
  215. package/dist/plugin/bootstrap-preflight.d.ts +22 -0
  216. package/dist/plugin/bootstrap-preflight.js +43 -0
  217. package/dist/plugin/build-config.d.ts +27 -15
  218. package/dist/plugin/build-config.js +380 -16
  219. package/dist/plugin/dev-cookie-names.d.ts +13 -0
  220. package/dist/plugin/dev-cookie-names.js +17 -0
  221. package/dist/scss.d.js +2 -0
  222. package/dist/storage-content-api/api-types.d.ts +183 -0
  223. package/dist/storage-content-api/api-types.js +4 -0
  224. package/dist/storage-content-api/client-uploads/generate.d.ts +14 -0
  225. package/dist/storage-content-api/client-uploads/generate.js +69 -0
  226. package/dist/storage-content-api/client.d.ts +5 -0
  227. package/dist/storage-content-api/client.js +37 -0
  228. package/dist/storage-content-api/generateURL.d.ts +6 -0
  229. package/dist/storage-content-api/generateURL.js +6 -0
  230. package/dist/storage-content-api/handleDelete.d.ts +7 -0
  231. package/dist/storage-content-api/handleDelete.js +15 -0
  232. package/dist/storage-content-api/handleUpload.d.ts +10 -0
  233. package/dist/storage-content-api/handleUpload.js +162 -0
  234. package/dist/storage-content-api/index.d.ts +4 -0
  235. package/dist/storage-content-api/index.js +37 -0
  236. package/dist/storage-content-api/staticHandler.d.ts +9 -0
  237. package/dist/storage-content-api/staticHandler.js +61 -0
  238. package/dist/storage-content-api/types.d.ts +9 -0
  239. package/dist/storage-content-api/types.js +1 -0
  240. package/dist/storage-content-api/utilities/getSafeFilename.d.ts +11 -0
  241. package/dist/storage-content-api/utilities/getSafeFilename.js +59 -0
  242. package/dist/storage-content-api/utilities/index.d.ts +2 -0
  243. package/dist/storage-content-api/utilities/index.js +2 -0
  244. package/dist/storage-content-api/utilities/parseUploadReference.d.ts +17 -0
  245. package/dist/storage-content-api/utilities/parseUploadReference.js +27 -0
  246. package/dist/templates/.env.example +5 -0
  247. package/dist/templates/README.md +19 -0
  248. package/dist/types/config.d.ts +2 -2
  249. package/dist/types/config.js +0 -4
  250. package/dist/types.d.ts +10 -2
  251. package/dist/types.js +0 -2
  252. package/dist/utils/adapters/nextjs.d.ts +8 -0
  253. package/dist/utils/adapters/nextjs.js +61 -0
  254. package/dist/utils/adapters/nitro.d.ts +8 -0
  255. package/dist/utils/adapters/nitro.js +172 -0
  256. package/dist/utils/adapters/vite.d.ts +9 -0
  257. package/dist/utils/adapters/vite.js +31 -0
  258. package/dist/utils/asset-collection.d.ts +27 -7
  259. package/dist/utils/asset-collection.js +59 -32
  260. package/dist/utils/build-detection.d.ts +5 -12
  261. package/dist/utils/build-detection.js +74 -13
  262. package/dist/utils/build-lambda-zip.d.ts +25 -0
  263. package/dist/utils/build-lambda-zip.js +90 -0
  264. package/dist/utils/cache-bootstrap.d.ts +7 -0
  265. package/dist/utils/cache-bootstrap.js +16 -0
  266. package/dist/utils/config.d.ts +0 -1
  267. package/dist/utils/config.js +1 -3
  268. package/dist/utils/deploy-adapter.d.ts +45 -0
  269. package/dist/utils/deploy-adapter.js +56 -0
  270. package/dist/utils/download-template.d.ts +9 -2
  271. package/dist/utils/download-template.js +24 -20
  272. package/dist/utils/env-management.d.ts +24 -8
  273. package/dist/utils/env-management.js +119 -66
  274. package/dist/utils/format-env-suffix.d.ts +11 -0
  275. package/dist/utils/format-env-suffix.js +11 -0
  276. package/dist/utils/format.d.ts +0 -1
  277. package/dist/utils/format.js +0 -2
  278. package/dist/utils/formatter.d.ts +0 -1
  279. package/dist/utils/formatter.js +23 -13
  280. package/dist/utils/fs-utils.d.ts +12 -0
  281. package/dist/utils/fs-utils.js +55 -0
  282. package/dist/utils/git.d.ts +0 -1
  283. package/dist/utils/git.js +0 -2
  284. package/dist/utils/handle-upgrade.d.ts +8 -0
  285. package/dist/utils/handle-upgrade.js +39 -0
  286. package/dist/utils/is-debug.d.ts +0 -1
  287. package/dist/utils/is-debug.js +0 -2
  288. package/dist/utils/lambda-config.d.ts +3 -2
  289. package/dist/utils/lambda-config.js +75 -80
  290. package/dist/utils/load-payload-config.d.ts +9 -0
  291. package/dist/utils/load-payload-config.js +27 -0
  292. package/dist/utils/log.d.ts +0 -1
  293. package/dist/utils/log.js +0 -2
  294. package/dist/utils/messages.d.ts +1 -3
  295. package/dist/utils/messages.js +47 -13
  296. package/dist/utils/package-manager.d.ts +24 -1
  297. package/dist/utils/package-manager.js +53 -2
  298. package/dist/utils/parse-template-spec.d.ts +11 -0
  299. package/dist/utils/parse-template-spec.js +60 -0
  300. package/dist/utils/payload-config-ast.d.ts +27 -7
  301. package/dist/utils/payload-config-ast.js +106 -60
  302. package/dist/utils/payload-config-finder.d.ts +2 -3
  303. package/dist/utils/payload-config-finder.js +48 -11
  304. package/dist/utils/payload-config-modifier.d.ts +1 -2
  305. package/dist/utils/payload-config-modifier.js +114 -68
  306. package/dist/utils/payload-package-check.d.ts +28 -3
  307. package/dist/utils/payload-package-check.js +90 -31
  308. package/dist/utils/project.d.ts +8 -4
  309. package/dist/utils/project.js +63 -37
  310. package/dist/utils/resolve-environment.d.ts +13 -0
  311. package/dist/utils/resolve-environment.js +29 -0
  312. package/dist/utils/s3-upload.d.ts +7 -3
  313. package/dist/utils/s3-upload.js +44 -9
  314. package/dist/utils/token-display.d.ts +5 -2
  315. package/dist/utils/token-display.js +49 -24
  316. package/dist/utils/typescript-validator.d.ts +0 -1
  317. package/dist/utils/typescript-validator.js +4 -8
  318. package/dist/utils/version-check.d.ts +2 -0
  319. package/dist/utils/version-check.js +43 -0
  320. package/package.json +47 -16
  321. package/dist/api/control-plane.d.ts.map +0 -1
  322. package/dist/api/control-plane.js.map +0 -1
  323. package/dist/api/figma-api.d.ts.map +0 -1
  324. package/dist/api/figma-api.js.map +0 -1
  325. package/dist/auth/browser.d.ts.map +0 -1
  326. package/dist/auth/browser.js.map +0 -1
  327. package/dist/auth/callback-server.d.ts.map +0 -1
  328. package/dist/auth/callback-server.js.map +0 -1
  329. package/dist/auth/crypto-utils.d.ts.map +0 -1
  330. package/dist/auth/crypto-utils.js.map +0 -1
  331. package/dist/auth/jwt-validator.d.ts.map +0 -1
  332. package/dist/auth/jwt-validator.js.map +0 -1
  333. package/dist/auth/oauth-flow.d.ts.map +0 -1
  334. package/dist/auth/oauth-flow.js.map +0 -1
  335. package/dist/auth/pkce.d.ts.map +0 -1
  336. package/dist/auth/pkce.js.map +0 -1
  337. package/dist/auth/project-token.d.ts.map +0 -1
  338. package/dist/auth/project-token.js.map +0 -1
  339. package/dist/auth/refresh.d.ts.map +0 -1
  340. package/dist/auth/refresh.js.map +0 -1
  341. package/dist/auth/token-store.d.ts.map +0 -1
  342. package/dist/auth/token-store.js.map +0 -1
  343. package/dist/auth/types.d.ts.map +0 -1
  344. package/dist/auth/types.js.map +0 -1
  345. package/dist/cli.d.ts.map +0 -1
  346. package/dist/cli.js.map +0 -1
  347. package/dist/commands/deploy.d.ts.map +0 -1
  348. package/dist/commands/deploy.js.map +0 -1
  349. package/dist/commands/init.d.ts.map +0 -1
  350. package/dist/commands/init.js.map +0 -1
  351. package/dist/commands/list-tokens.d.ts.map +0 -1
  352. package/dist/commands/list-tokens.js.map +0 -1
  353. package/dist/commands/login.d.ts.map +0 -1
  354. package/dist/commands/login.js.map +0 -1
  355. package/dist/commands/logout.d.ts.map +0 -1
  356. package/dist/commands/logout.js.map +0 -1
  357. package/dist/config/oauth.d.ts.map +0 -1
  358. package/dist/config/oauth.js.map +0 -1
  359. package/dist/constants.d.ts.map +0 -1
  360. package/dist/constants.js.map +0 -1
  361. package/dist/exports/client.d.ts.map +0 -1
  362. package/dist/exports/client.js.map +0 -1
  363. package/dist/index.d.ts.map +0 -1
  364. package/dist/index.js.map +0 -1
  365. package/dist/oauth/components/LoginButton/index.d.ts.map +0 -1
  366. package/dist/oauth/components/LoginButton/index.js.map +0 -1
  367. package/dist/oauth/components/LogoutButton/index.d.ts.map +0 -1
  368. package/dist/oauth/components/LogoutButton/index.js.map +0 -1
  369. package/dist/oauth/defaults.d.ts.map +0 -1
  370. package/dist/oauth/defaults.js.map +0 -1
  371. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +0 -1
  372. package/dist/oauth/endpoints/getLoginEndpoint.js.map +0 -1
  373. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +0 -1
  374. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +0 -1
  375. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +0 -1
  376. package/dist/oauth/endpoints/getMetaEndpoint.js.map +0 -1
  377. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +0 -1
  378. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +0 -1
  379. package/dist/oauth/exports/client.d.ts.map +0 -1
  380. package/dist/oauth/exports/client.js.map +0 -1
  381. package/dist/oauth/hooks/afterLogout.d.ts.map +0 -1
  382. package/dist/oauth/hooks/afterLogout.js.map +0 -1
  383. package/dist/oauth/hooks/me.d.ts.map +0 -1
  384. package/dist/oauth/hooks/me.js.map +0 -1
  385. package/dist/oauth/hooks/refresh.d.ts.map +0 -1
  386. package/dist/oauth/hooks/refresh.js.map +0 -1
  387. package/dist/oauth/index.d.ts.map +0 -1
  388. package/dist/oauth/index.js.map +0 -1
  389. package/dist/oauth/strategy/index.d.ts.map +0 -1
  390. package/dist/oauth/strategy/index.js.map +0 -1
  391. package/dist/oauth/types.d.ts.map +0 -1
  392. package/dist/oauth/types.js.map +0 -1
  393. package/dist/oauth/utilities/clearCookie.d.ts.map +0 -1
  394. package/dist/oauth/utilities/clearCookie.js.map +0 -1
  395. package/dist/oauth/utilities/createCookieOptions.d.ts.map +0 -1
  396. package/dist/oauth/utilities/createCookieOptions.js.map +0 -1
  397. package/dist/oauth/utilities/createDebugLogger.d.ts.map +0 -1
  398. package/dist/oauth/utilities/createDebugLogger.js.map +0 -1
  399. package/dist/oauth/utilities/extractOrigin.d.ts.map +0 -1
  400. package/dist/oauth/utilities/extractOrigin.js.map +0 -1
  401. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +0 -1
  402. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +0 -1
  403. package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
  404. package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
  405. package/dist/oauth/utilities/getAdminPath.js +0 -9
  406. package/dist/oauth/utilities/getAdminPath.js.map +0 -1
  407. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +0 -1
  408. package/dist/oauth/utilities/getAuthorizeURL.js.map +0 -1
  409. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +0 -1
  410. package/dist/oauth/utilities/getCookieExpiration.js.map +0 -1
  411. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +0 -1
  412. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +0 -1
  413. package/dist/oauth/utilities/getTokenExp.d.ts.map +0 -1
  414. package/dist/oauth/utilities/getTokenExp.js.map +0 -1
  415. package/dist/oauth/utilities/getUsernameField.d.ts.map +0 -1
  416. package/dist/oauth/utilities/getUsernameField.js.map +0 -1
  417. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +0 -1
  418. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +0 -1
  419. package/dist/oauth/utilities/mergeHeaders.d.ts.map +0 -1
  420. package/dist/oauth/utilities/mergeHeaders.js.map +0 -1
  421. package/dist/oauth/utilities/refreshTokens.d.ts.map +0 -1
  422. package/dist/oauth/utilities/refreshTokens.js.map +0 -1
  423. package/dist/plugin/adapter.d.ts.map +0 -1
  424. package/dist/plugin/adapter.js.map +0 -1
  425. package/dist/plugin/build-config.d.ts.map +0 -1
  426. package/dist/plugin/build-config.js.map +0 -1
  427. package/dist/types/config.d.ts.map +0 -1
  428. package/dist/types/config.js.map +0 -1
  429. package/dist/types.d.ts.map +0 -1
  430. package/dist/types.js.map +0 -1
  431. package/dist/utils/asset-collection.d.ts.map +0 -1
  432. package/dist/utils/asset-collection.js.map +0 -1
  433. package/dist/utils/build-detection.d.ts.map +0 -1
  434. package/dist/utils/build-detection.js.map +0 -1
  435. package/dist/utils/config.d.ts.map +0 -1
  436. package/dist/utils/config.js.map +0 -1
  437. package/dist/utils/download-template.d.ts.map +0 -1
  438. package/dist/utils/download-template.js.map +0 -1
  439. package/dist/utils/env-management.d.ts.map +0 -1
  440. package/dist/utils/env-management.js.map +0 -1
  441. package/dist/utils/format.d.ts.map +0 -1
  442. package/dist/utils/format.js.map +0 -1
  443. package/dist/utils/formatter.d.ts.map +0 -1
  444. package/dist/utils/formatter.js.map +0 -1
  445. package/dist/utils/git.d.ts.map +0 -1
  446. package/dist/utils/git.js.map +0 -1
  447. package/dist/utils/is-debug.d.ts.map +0 -1
  448. package/dist/utils/is-debug.js.map +0 -1
  449. package/dist/utils/lambda-config.d.ts.map +0 -1
  450. package/dist/utils/lambda-config.js.map +0 -1
  451. package/dist/utils/log.d.ts.map +0 -1
  452. package/dist/utils/log.js.map +0 -1
  453. package/dist/utils/messages.d.ts.map +0 -1
  454. package/dist/utils/messages.js.map +0 -1
  455. package/dist/utils/package-manager.d.ts.map +0 -1
  456. package/dist/utils/package-manager.js.map +0 -1
  457. package/dist/utils/payload-config-ast.d.ts.map +0 -1
  458. package/dist/utils/payload-config-ast.js.map +0 -1
  459. package/dist/utils/payload-config-finder.d.ts.map +0 -1
  460. package/dist/utils/payload-config-finder.js.map +0 -1
  461. package/dist/utils/payload-config-modifier.d.ts.map +0 -1
  462. package/dist/utils/payload-config-modifier.js.map +0 -1
  463. package/dist/utils/payload-package-check.d.ts.map +0 -1
  464. package/dist/utils/payload-package-check.js.map +0 -1
  465. package/dist/utils/project.d.ts.map +0 -1
  466. package/dist/utils/project.js.map +0 -1
  467. package/dist/utils/s3-upload.d.ts.map +0 -1
  468. package/dist/utils/s3-upload.js.map +0 -1
  469. package/dist/utils/token-display.d.ts.map +0 -1
  470. package/dist/utils/token-display.js.map +0 -1
  471. package/dist/utils/typescript-validator.d.ts.map +0 -1
  472. package/dist/utils/typescript-validator.js.map +0 -1
@@ -0,0 +1,883 @@
1
+ import createClient from 'openapi-fetch';
2
+ import { APIError, createDatabaseAdapter } from 'payload';
3
+ import { v4 as uuid } from 'uuid';
4
+ import { FigmaApiError } from '../api/figma-api.js';
5
+ import { CONTENT_SYSTEM_NOT_FOUND_MESSAGE } from '../constants.js';
6
+ import { getGlobalSlug } from './temp-utilities/slug.js';
7
+ import { addFallbackSort } from './temp-utilities/sorting.js';
8
+ import { unwrapDocument, unwrapFindResponse } from './temp-utilities/unwrapDocument.js';
9
+ import { createAuthMiddleware, createErrorMiddleware } from './utilities/auth.js';
10
+ import { getClientVersionHeaders } from './utilities/clientVersionHeaders.js';
11
+ import { dataToContentAPI, resolveVersionContent } from './utilities/data/index.js';
12
+ import { validateRelationshipIds } from './utilities/data/validateRelationships.js';
13
+ import { convertPayloadJoinsToContentAPI } from './utilities/joins.js';
14
+ import { addFallbackLocale } from './utilities/locale/index.js';
15
+ import { normalizeLocaleInWhere } from './utilities/meta/normalizeLocaleInWhere.js';
16
+ import { buildDocumentSchema } from './utilities/schema/buildDocumentSchema.js';
17
+ import { convertPayloadWhereToContentAPI } from './utilities/where.js';
18
+ /**
19
+ * Heads-up logged locally whenever a job is queued. Queued jobs are executed by Figma's deployed runner, so
20
+ * if a deployed environment exists its runner can pick up anything in the queue. The developer
21
+ * needs to know that a job they just created locally may run on their deployed app instead of their machine.
22
+ */ export const LOCAL_JOB_QUEUE_NOTICE = "A job was queued locally. Queued jobs may be run by Figma's deployed runner, not your local " + 'dev server. If this app has a deployed environment, your deployed app may pick this ' + 'job up and run it against deployed code. If this app has no deployed ' + 'environment, the job will not run automatically. To test job logic against your local ' + 'code, call the function your task runs directly instead of queueing a job. ';
23
+ /**
24
+ * Logs {@link LOCAL_JOB_QUEUE_NOTICE} for every job queued locally: if a deployed
25
+ * environment exists, its runner can pick up anything in the queue. No-op when
26
+ * `notifyLocalJobQueue` is false (i.e. not a local runtime).
27
+ */ export function maybeNotifyLocalJobQueue(adapter, args) {
28
+ if (!adapter.notifyLocalJobQueue) {
29
+ return;
30
+ }
31
+ if (args.collection !== 'payload-jobs') {
32
+ return;
33
+ }
34
+ adapter.payload.logger.warn(LOCAL_JOB_QUEUE_NOTICE);
35
+ }
36
+ async function syncCollections() {
37
+ let existingIds;
38
+ try {
39
+ const { data: response, error, response: httpResponse } = await this.client.GET('/api/v0/content_systems/{contentSystemId}/collections', {
40
+ params: {
41
+ path: {
42
+ contentSystemId: this.contentSystemId
43
+ }
44
+ }
45
+ });
46
+ if (httpResponse.status === 404 || httpResponse.status === 410) {
47
+ throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE);
48
+ }
49
+ if (error) {
50
+ throw createContentAPIError('syncCollections', error, httpResponse.status);
51
+ }
52
+ if (!response) {
53
+ throw new Error('No response from collections endpoint');
54
+ }
55
+ existingIds = new Set(response.data.map((c)=>c.id));
56
+ this.payload.logger.info(`Found ${existingIds.size} existing collections`);
57
+ } catch (error) {
58
+ if (error instanceof Error && error.message === CONTENT_SYSTEM_NOT_FOUND_MESSAGE) {
59
+ throw error;
60
+ }
61
+ if (error instanceof FigmaApiError && (error.statusCode === 404 || error.statusCode === 410)) {
62
+ throw new Error(CONTENT_SYSTEM_NOT_FOUND_MESSAGE);
63
+ }
64
+ this.payload.logger.warn(`Failed to fetch collections, will attempt to create all: ${error.message}`);
65
+ existingIds = new Set();
66
+ }
67
+ for (const collection of this.payload.config.collections){
68
+ if (!existingIds.has(collection.slug)) {
69
+ await createCollection.call(this, collection.slug);
70
+ }
71
+ }
72
+ for (const global of this.payload.config.globals || []){
73
+ const globalId = `_global-${global.slug}`;
74
+ if (!existingIds.has(globalId)) {
75
+ await createCollection.call(this, globalId);
76
+ }
77
+ }
78
+ }
79
+ function init() {
80
+ if (this.auth.mode === 'apiKey') {
81
+ this.payload.logger.info('Using API Key authentication');
82
+ } else if (this.auth.mode === 'tokenStore') {
83
+ this.payload.logger.info('Using TokenStore authentication (local dev)');
84
+ } else {
85
+ this.payload.logger.info('Using Dev JWT authentication (testing)');
86
+ }
87
+ }
88
+ // connect is called after init — once on first startup (hotReload=false) and again on HMR
89
+ // (hotReload=true). Only clear the database on the first startup, never on hot reload.
90
+ async function connect(args) {
91
+ const hotReload = args?.hotReload ?? false;
92
+ if (!hotReload && process.env.PAYLOAD_DROP_DATABASE === 'true') {
93
+ // clearDatabase already calls syncCollections internally after clearing
94
+ await this.clearDatabase();
95
+ return;
96
+ }
97
+ await syncCollections.call(this);
98
+ }
99
+ async function createCollection(collectionId) {
100
+ try {
101
+ const { error, response: httpResponse } = await this.client.POST('/api/v0/content_systems/{contentSystemId}/collections', {
102
+ body: {
103
+ id: collectionId
104
+ },
105
+ params: {
106
+ path: {
107
+ contentSystemId: this.contentSystemId
108
+ }
109
+ }
110
+ });
111
+ if (error) {
112
+ throw createContentAPIError('createCollection', error, httpResponse.status);
113
+ }
114
+ this.payload.logger.info(`Created collection: ${collectionId}`);
115
+ } catch (error) {
116
+ const errorMessage = error.message;
117
+ if (!errorMessage.includes('already exists') && !errorMessage.includes('409')) {
118
+ this.payload.logger.warn(`Failed to create collection ${collectionId}: ${errorMessage}`);
119
+ }
120
+ }
121
+ }
122
+ async function findMany({ collection, joins, limit, locale: localeArg, page, pagination: _pagination, sort, where }) {
123
+ const locale = addFallbackLocale(localeArg, this.payload);
124
+ const normalizedWhere = normalizeLocaleInWhere(where, this.payload, collection, locale);
125
+ const joinClause = convertPayloadJoinsToContentAPI(this.payload, collection, joins);
126
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/documents:find', {
127
+ body: {
128
+ collection,
129
+ contentSystemId: this.contentSystemId,
130
+ join: joinClause,
131
+ limit,
132
+ locale,
133
+ page: page ?? 1,
134
+ schema: this.documentSchema,
135
+ sort: addFallbackSort(sort, this.payload, collection),
136
+ where: convertPayloadWhereToContentAPI(normalizedWhere ?? {})
137
+ }
138
+ });
139
+ if (error) {
140
+ throw createContentAPIError('findMany', error, httpResponse.status);
141
+ }
142
+ if (!response) {
143
+ throw new Error('No response from findMany');
144
+ }
145
+ return unwrapFindResponse(this.payload, response.result, collection, localeArg);
146
+ }
147
+ async function find(args) {
148
+ const collectionConfig = this.payload.config.collections.find((c)=>c.slug === args.collection);
149
+ return findMany.call(this, {
150
+ collection: args.collection,
151
+ joins: args.joins,
152
+ // TODO: FindArgs.limit should be 'number' not 'number | undefined'
153
+ // Payload Core sanitizes limit before calling the adapter when going through findOperation
154
+ // (defaults to 10 or 0 based on pagination), but some callers (e.g. deleteOperation) call
155
+ // db.find() directly without a limit. Default to 0 (unlimited) to avoid the Content API
156
+ // falling back to its own default of 10.
157
+ limit: args.limit ?? 0,
158
+ locale: args.locale,
159
+ page: args.page ?? 1,
160
+ pagination: args.pagination,
161
+ sort: args.sort || collectionConfig?.defaultSort,
162
+ where: args.where
163
+ });
164
+ }
165
+ // TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183
166
+ async function findVersions(args) {
167
+ const sortWithFallback = addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection);
168
+ const whereClause = convertPayloadWhereToContentAPI(args.where ?? {});
169
+ const locale = addFallbackLocale(args.locale, this.payload);
170
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/document_versions:find', {
171
+ body: {
172
+ collection: args.collection,
173
+ contentSystemId: this.contentSystemId,
174
+ // TODO: FindVersionsArgs.limit should be 'number' not 'number | undefined'
175
+ // is sanitized by Payload Core before calling the adapter (defaults to 10 or 0 based on pagination)
176
+ limit: args.limit,
177
+ locale,
178
+ page: args.page ?? 1,
179
+ schema: this.documentSchema,
180
+ sort: sortWithFallback,
181
+ where: whereClause
182
+ }
183
+ });
184
+ if (error) {
185
+ throw createContentAPIError('findVersions', error, httpResponse.status);
186
+ }
187
+ if (!response) {
188
+ throw new Error('No response from findVersions');
189
+ }
190
+ return unwrapFindResponse(this.payload, response.result, args.collection, args.locale);
191
+ }
192
+ async function queryDrafts(args) {
193
+ const versionsResult = await this.findVersions({
194
+ collection: args.collection,
195
+ limit: args.limit,
196
+ locale: args.locale,
197
+ page: args.page,
198
+ pagination: args.pagination,
199
+ sort: args.sort,
200
+ where: {
201
+ ...args.where,
202
+ latest: {
203
+ equals: true
204
+ }
205
+ }
206
+ });
207
+ // queryDrafts returns documents at root level, not nested in 'version'.
208
+ // Only spread version content; version metadata (latest, parent) must not leak.
209
+ const docs = versionsResult.docs.map((versionDoc)=>({
210
+ ...versionDoc.version,
211
+ id: versionDoc.parent
212
+ }));
213
+ return {
214
+ ...versionsResult,
215
+ docs
216
+ };
217
+ }
218
+ async function createVersion(args) {
219
+ const versionContent = dataToContentAPI(this.payload, args.collectionSlug, args.versionData, {
220
+ applyDefaults: true,
221
+ publishedLocale: args.publishedLocale
222
+ });
223
+ // id/globalType aren't v1 schema fields (id rides as versionDoc.parent)
224
+ delete versionContent.id;
225
+ delete versionContent.globalType;
226
+ if (args.autosave) {
227
+ versionContent._payloadAutosave = true;
228
+ }
229
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/document_versions:create', {
230
+ body: {
231
+ collection: args.collectionSlug,
232
+ contentSystemId: this.contentSystemId,
233
+ schema: this.documentSchema,
234
+ versionDoc: {
235
+ createdAt: args.createdAt,
236
+ latest: true,
237
+ parent: String(args.parent),
238
+ updatedAt: args.updatedAt,
239
+ version: versionContent
240
+ }
241
+ }
242
+ });
243
+ if (error) {
244
+ throw createContentAPIError('createVersion', error, httpResponse.status);
245
+ }
246
+ if (!response) {
247
+ throw new Error('No response from createVersion');
248
+ }
249
+ return unwrapDocument({
250
+ collectionSlug: args.collectionSlug,
251
+ doc: response.result,
252
+ payload: this.payload
253
+ });
254
+ }
255
+ async function updateVersion(args) {
256
+ const where = args.where ?? {
257
+ id: {
258
+ equals: args.id
259
+ }
260
+ };
261
+ const locale = addFallbackLocale(args.locale, this.payload);
262
+ const { publishedLocale, version, ...versionMeta } = args.versionData;
263
+ const resolvedVersion = resolveVersionContent(version, versionMeta);
264
+ const versionContent = dataToContentAPI(this.payload, args.collection, resolvedVersion, {
265
+ publishedLocale
266
+ });
267
+ delete versionContent.id;
268
+ delete versionContent.globalType;
269
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/document_versions:update', {
270
+ body: {
271
+ collection: args.collection,
272
+ contentSystemId: this.contentSystemId,
273
+ createOnMissing: false,
274
+ locale,
275
+ schema: this.documentSchema,
276
+ versionDoc: {
277
+ createdAt: versionMeta.createdAt,
278
+ latest: versionMeta.latest,
279
+ parent: versionMeta.parent != null ? String(versionMeta.parent) : undefined,
280
+ updatedAt: versionMeta.updatedAt,
281
+ version: versionContent
282
+ },
283
+ where: convertPayloadWhereToContentAPI(where)
284
+ }
285
+ });
286
+ if (error) {
287
+ throw createContentAPIError('updateVersion', error, httpResponse.status);
288
+ }
289
+ if (!response?.result || !('data' in response.result)) {
290
+ throw new Error('No document data in updateVersion response');
291
+ }
292
+ const doc = response.result.data[0];
293
+ if (!doc) {
294
+ return null;
295
+ }
296
+ return unwrapDocument({
297
+ collectionSlug: args.collection,
298
+ doc,
299
+ locale: args.locale,
300
+ payload: this.payload
301
+ });
302
+ }
303
+ async function deleteVersions(args) {
304
+ if (!args.collection) {
305
+ throw new Error('deleteVersions requires a collection');
306
+ }
307
+ const locale = addFallbackLocale(args.locale, this.payload);
308
+ const { error, response: httpResponse } = await this.client.POST('/api/v1/document_versions:delete', {
309
+ body: {
310
+ collection: args.collection,
311
+ contentSystemId: this.contentSystemId,
312
+ locale,
313
+ schema: this.documentSchema,
314
+ where: convertPayloadWhereToContentAPI(args.where)
315
+ }
316
+ });
317
+ if (error) {
318
+ throw createContentAPIError('deleteVersions', error, httpResponse.status);
319
+ }
320
+ }
321
+ async function findOne(args) {
322
+ const { docs } = await this.find({
323
+ collection: args.collection,
324
+ joins: args.joins,
325
+ limit: 1,
326
+ locale: args.locale,
327
+ pagination: false,
328
+ where: args.where
329
+ });
330
+ return docs[0] ?? null;
331
+ }
332
+ async function findDistinct(args) {
333
+ const locale = addFallbackLocale(args.locale, this.payload);
334
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/documents:findDistinct', {
335
+ body: {
336
+ collection: args.collection,
337
+ contentSystemId: this.contentSystemId,
338
+ distinctBy: args.field,
339
+ limit: args.limit,
340
+ locale,
341
+ page: args.page ?? 1,
342
+ schema: this.documentSchema,
343
+ sort: addFallbackSort(args.sort, this.payload, args.collection),
344
+ where: convertPayloadWhereToContentAPI(args.where ?? {})
345
+ }
346
+ });
347
+ if (error) {
348
+ throw createContentAPIError('findDistinct', error, httpResponse.status);
349
+ }
350
+ const { data, ...pagination } = response.result;
351
+ return {
352
+ ...pagination,
353
+ // Content API returns flat values; Payload expects objects keyed by field name.
354
+ values: data.map((value)=>({
355
+ [args.field]: value
356
+ }))
357
+ };
358
+ }
359
+ async function updateMany(args) {
360
+ const locale = addFallbackLocale(args.locale, this.payload);
361
+ validateRelationshipIds({
362
+ collectionSlug: args.collection,
363
+ data: args.data,
364
+ payload: this.payload
365
+ });
366
+ const { data: contentAPIResponse, error, response: httpResponse } = await this.client.POST('/api/v1/documents:update', {
367
+ body: {
368
+ collection: args.collection,
369
+ contentSystemId: this.contentSystemId,
370
+ createOnMissing: false,
371
+ doc: dataToContentAPI(this.payload, args.collection, args.data),
372
+ environmentName: this.environmentName,
373
+ limit: args.limit,
374
+ locale,
375
+ schema: this.documentSchema,
376
+ sort: addFallbackSort(args.sort || '-updatedAt', this.payload, args.collection),
377
+ where: convertPayloadWhereToContentAPI(args.where)
378
+ }
379
+ });
380
+ if (error) {
381
+ throw createContentAPIError('updateMany', error, httpResponse.status);
382
+ }
383
+ if (!contentAPIResponse) {
384
+ throw new Error('No response from updateMany');
385
+ }
386
+ if (contentAPIResponse.result && 'data' in contentAPIResponse.result) {
387
+ return contentAPIResponse.result.data.map((doc)=>unwrapDocument({
388
+ collectionSlug: args.collection,
389
+ doc,
390
+ locale: args.locale,
391
+ payload: this.payload
392
+ }));
393
+ }
394
+ return null;
395
+ }
396
+ async function updateOne(args) {
397
+ const locale = addFallbackLocale(args.locale, this.payload);
398
+ const where = args.where ?? {
399
+ id: {
400
+ equals: args.id
401
+ }
402
+ };
403
+ validateRelationshipIds({
404
+ collectionSlug: args.collection,
405
+ data: args.data,
406
+ payload: this.payload
407
+ });
408
+ const { data: contentAPIResponse, error, response: httpResponse } = await this.client.POST('/api/v1/documents:update', {
409
+ body: {
410
+ collection: args.collection,
411
+ contentSystemId: this.contentSystemId,
412
+ createOnMissing: false,
413
+ doc: dataToContentAPI(this.payload, args.collection, args.data),
414
+ environmentName: this.environmentName,
415
+ locale,
416
+ schema: this.documentSchema,
417
+ where: convertPayloadWhereToContentAPI(where)
418
+ }
419
+ });
420
+ if (error) {
421
+ throw createContentAPIError('updateOne', error, httpResponse.status);
422
+ }
423
+ if (!contentAPIResponse) {
424
+ throw new Error('No response from updateOne');
425
+ }
426
+ if (!contentAPIResponse.result || !('data' in contentAPIResponse.result)) {
427
+ throw new Error('Unexpected response format from updateOne');
428
+ }
429
+ const doc = contentAPIResponse.result.data[0];
430
+ if (!doc) {
431
+ return null;
432
+ }
433
+ return unwrapDocument({
434
+ collectionSlug: args.collection,
435
+ doc,
436
+ locale: args.locale,
437
+ payload: this.payload
438
+ });
439
+ }
440
+ async function deleteMany(args) {
441
+ const locale = addFallbackLocale(args.req?.locale, this.payload);
442
+ const { error, response: httpResponse } = await this.client.POST('/api/v1/documents:delete', {
443
+ body: {
444
+ collection: args.collection,
445
+ contentSystemId: this.contentSystemId,
446
+ environmentName: this.environmentName,
447
+ locale,
448
+ schema: this.documentSchema,
449
+ where: convertPayloadWhereToContentAPI(args.where)
450
+ }
451
+ });
452
+ if (error) {
453
+ throw createContentAPIError('deleteMany', error, httpResponse.status);
454
+ }
455
+ }
456
+ async function deleteOne(args) {
457
+ const locale = addFallbackLocale(args.req?.locale, this.payload);
458
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/documents:delete', {
459
+ body: {
460
+ collection: args.collection,
461
+ contentSystemId: this.contentSystemId,
462
+ environmentName: this.environmentName,
463
+ locale,
464
+ schema: this.documentSchema,
465
+ where: convertPayloadWhereToContentAPI(args.where)
466
+ }
467
+ });
468
+ if (error) {
469
+ throw createContentAPIError('deleteOne', error, httpResponse.status);
470
+ }
471
+ if (!response?.result || !('data' in response.result)) {
472
+ throw new Error('No document data in deleteOne response');
473
+ }
474
+ const doc = response.result.data[0];
475
+ if (!doc) {
476
+ return null;
477
+ }
478
+ return unwrapDocument({
479
+ collectionSlug: args.collection,
480
+ doc,
481
+ locale: args.req?.locale === null ? undefined : args.req?.locale,
482
+ payload: this.payload
483
+ });
484
+ }
485
+ async function create(args) {
486
+ const isGlobalCollection = args.collection.startsWith('_global-');
487
+ const customIDType = this.payload.collections[args.collection]?.customIDType;
488
+ // See test: "should allow creating docs with payload.db.create with custom ID".
489
+ // TODO: customID is not yet in our installed types. Remove this when it is.
490
+ // When provided (e.g. from payload.db.create), it takes priority over data.id.
491
+ const customID = args.customID;
492
+ let id;
493
+ if (customID != null) {
494
+ id = String(customID);
495
+ } else if ((isGlobalCollection || customIDType || this.allowIDOnCreate) && args.data.id != null && (typeof args.data.id === 'string' || typeof args.data.id === 'number')) {
496
+ id = String(args.data.id);
497
+ } else {
498
+ id = uuid();
499
+ }
500
+ const locale = addFallbackLocale(args.locale, this.payload);
501
+ validateRelationshipIds({
502
+ collectionSlug: args.collection,
503
+ data: args.data,
504
+ payload: this.payload
505
+ });
506
+ const { data: contentAPIResponse, error, response: httpResponse } = await this.client.POST('/api/v1/documents:create', {
507
+ body: {
508
+ collection: args.collection,
509
+ contentSystemId: this.contentSystemId,
510
+ doc: {
511
+ ...dataToContentAPI(this.payload, args.collection, args.data, {
512
+ applyDefaults: true,
513
+ createdAt: true
514
+ }),
515
+ id
516
+ },
517
+ environmentName: this.environmentName,
518
+ locale,
519
+ schema: this.documentSchema
520
+ }
521
+ });
522
+ if (error) {
523
+ throw createContentAPIError('create', error, httpResponse.status);
524
+ }
525
+ if (!contentAPIResponse) {
526
+ throw new Error('No response from create');
527
+ }
528
+ maybeNotifyLocalJobQueue(this, args);
529
+ return unwrapDocument({
530
+ collectionSlug: args.collection,
531
+ doc: contentAPIResponse.result,
532
+ locale: args.locale,
533
+ payload: this.payload
534
+ });
535
+ }
536
+ async function clearDatabase() {
537
+ this.payload.logger.info(`---- CLEARING CONTENT API DATABASE ----`);
538
+ try {
539
+ const response = await fetch(getClearDatabaseUrl(this.url, process.env.FIGMA_CONTENT_API_CUTOVER_STATE), {
540
+ headers: {
541
+ 'Content-Type': 'application/json',
542
+ ...this.clientVersionHeaders
543
+ },
544
+ method: 'POST'
545
+ });
546
+ if (!response.ok) {
547
+ throw new Error(`Content API database reset failed: ${response.status} ${response.statusText}`);
548
+ }
549
+ this.payload.logger.info('---- CONTENT API DATABASE CLEARED ----');
550
+ // Re-sync collections after clearing
551
+ await syncCollections.call(this);
552
+ } catch (error) {
553
+ this.payload.logger.error(`Failed to clear database: ${error.message}`);
554
+ throw error;
555
+ }
556
+ }
557
+ export function getClearDatabaseUrl(url, cutoverState) {
558
+ const clearDatabaseUrl = new URL('/dev/clear-db', url);
559
+ if (cutoverState != null) {
560
+ clearDatabaseUrl.searchParams.set('cutoverState', cutoverState);
561
+ }
562
+ return clearDatabaseUrl.toString();
563
+ }
564
+ async function count(args) {
565
+ const locale = addFallbackLocale(args.locale, this.payload);
566
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/documents:count', {
567
+ body: {
568
+ collection: args.collection,
569
+ contentSystemId: this.contentSystemId,
570
+ locale,
571
+ schema: this.documentSchema,
572
+ where: convertPayloadWhereToContentAPI(args.where)
573
+ }
574
+ });
575
+ if (error) {
576
+ throw createContentAPIError('count', error, httpResponse.status);
577
+ }
578
+ if (!response) {
579
+ throw new Error('No response from count');
580
+ }
581
+ return {
582
+ totalDocs: response.result.count
583
+ };
584
+ }
585
+ async function countVersions(args) {
586
+ const locale = addFallbackLocale(args.locale, this.payload);
587
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/document_versions:count', {
588
+ body: {
589
+ collection: args.collection,
590
+ contentSystemId: this.contentSystemId,
591
+ locale,
592
+ schema: this.documentSchema,
593
+ where: convertPayloadWhereToContentAPI(args.where)
594
+ }
595
+ });
596
+ if (error) {
597
+ throw createContentAPIError('countVersions', error, httpResponse.status);
598
+ }
599
+ if (!response) {
600
+ throw new Error('No response from countVersions');
601
+ }
602
+ return {
603
+ totalDocs: response.result.count
604
+ };
605
+ }
606
+ async function upsert(args) {
607
+ let documentId = args.data.id;
608
+ if (!documentId && args.where && 'id' in args.where) {
609
+ const idClause = args.where.id;
610
+ if (idClause && 'equals' in idClause) {
611
+ documentId = idClause.equals;
612
+ }
613
+ }
614
+ if (!documentId) {
615
+ documentId = uuid();
616
+ }
617
+ const locale = addFallbackLocale(args.locale, this.payload);
618
+ validateRelationshipIds({
619
+ collectionSlug: args.collection,
620
+ data: args.data,
621
+ payload: this.payload
622
+ });
623
+ const { data: contentAPIResponse, error, response: httpResponse } = await this.client.POST('/api/v1/documents:update', {
624
+ body: {
625
+ collection: args.collection,
626
+ contentSystemId: this.contentSystemId,
627
+ createOnMissing: {
628
+ id: documentId
629
+ },
630
+ doc: dataToContentAPI(this.payload, args.collection, args.data, {
631
+ applyDefaults: true,
632
+ createdAt: true
633
+ }),
634
+ environmentName: this.environmentName,
635
+ locale,
636
+ schema: this.documentSchema,
637
+ where: convertPayloadWhereToContentAPI(args.where)
638
+ }
639
+ });
640
+ if (error) {
641
+ throw createContentAPIError('upsert', error, httpResponse.status);
642
+ }
643
+ if (!contentAPIResponse) {
644
+ throw new Error('No response from upsert');
645
+ }
646
+ if (!contentAPIResponse.result || !('data' in contentAPIResponse.result)) {
647
+ throw new Error('Unexpected response format from upsert');
648
+ }
649
+ const doc = contentAPIResponse.result.data[0];
650
+ if (!doc) {
651
+ throw new Error('No document data in upsert response');
652
+ }
653
+ return unwrapDocument({
654
+ collectionSlug: args.collection,
655
+ doc,
656
+ locale: args.locale,
657
+ payload: this.payload
658
+ });
659
+ }
660
+ async function updateJobs(args) {
661
+ const { id, limit, returning, sort, where } = args;
662
+ if (id == null && where == null) {
663
+ throw new Error('updateJobs requires either id or a where clause');
664
+ }
665
+ // Copy data to avoid mutating the caller's object.
666
+ const data = {
667
+ ...args.data
668
+ };
669
+ // Strip log if empty/absent. The content API's deep merge replaces arrays entirely
670
+ // (it does not concatenate), so sending log: [] would wipe existing log entries.
671
+ // Only include log when it carries new content: a non-empty array or a $push operation.
672
+ const log = data.log;
673
+ if (!(Array.isArray(log) && log.length > 0) && !(log && typeof log === 'object' && '$push' in log)) {
674
+ delete data.log;
675
+ }
676
+ const whereClause = id != null ? {
677
+ id: {
678
+ equals: String(id)
679
+ }
680
+ } : where;
681
+ const docData = dataToContentAPI(this.payload, 'payload-jobs', data);
682
+ const sortClause = addFallbackSort(sort || '-updatedAt', this.payload, 'payload-jobs');
683
+ const whereQuery = convertPayloadWhereToContentAPI(whereClause);
684
+ const { data: response, error, response: httpResponse } = await this.client.POST('/api/v1/documents:update', {
685
+ body: {
686
+ collection: 'payload-jobs',
687
+ contentSystemId: this.contentSystemId,
688
+ createOnMissing: false,
689
+ doc: docData,
690
+ environmentName: this.environmentName,
691
+ ...limit != null && {
692
+ limit
693
+ },
694
+ schema: this.documentSchema,
695
+ sort: sortClause,
696
+ where: whereQuery
697
+ }
698
+ });
699
+ if (error) {
700
+ throw createContentAPIError('updateJobs', error, httpResponse.status);
701
+ }
702
+ if (!response) {
703
+ throw new Error('No response from updateJobs');
704
+ }
705
+ if (returning === false) {
706
+ return null;
707
+ }
708
+ if (!response.result || !('data' in response.result)) {
709
+ return [];
710
+ }
711
+ return response.result.data.map((doc)=>unwrapDocument({
712
+ collectionSlug: 'payload-jobs',
713
+ doc,
714
+ payload: this.payload
715
+ }));
716
+ }
717
+ function createGlobal(args) {
718
+ // Globals are singletons identified by their slug. Use upsert so concurrent calls
719
+ // (e.g. handleSchedules processing multiple queueables with the same null jobStats)
720
+ // don't fail with "A record with this field already exists". The deep-merge semantics
721
+ // of the update path are safe here: callers that want a fresh create (first run) get
722
+ // an effective create, and callers that race a prior create get a merge instead.
723
+ return this.upsert({
724
+ collection: getGlobalSlug(args.slug),
725
+ data: {
726
+ ...args.data,
727
+ id: args.slug
728
+ },
729
+ where: {
730
+ id: {
731
+ equals: args.slug
732
+ }
733
+ }
734
+ });
735
+ }
736
+ async function findGlobal(args) {
737
+ const doc = await this.findOne({
738
+ collection: getGlobalSlug(args.slug),
739
+ locale: args.locale,
740
+ where: args.where ?? {}
741
+ });
742
+ if (doc != null) {
743
+ ;
744
+ doc.globalType = args.slug;
745
+ }
746
+ return doc;
747
+ }
748
+ async function updateGlobal(args) {
749
+ // TODO: upsert's `createOnMissing` path generates a new `createdAt` on every call,
750
+ // which overwrites the original timestamp on updates. The fix belongs in the Content API:
751
+ // `createOnMissing` should preserve `createdAt` on updates and only set it on creates.
752
+ return this.upsert({
753
+ collection: getGlobalSlug(args.slug),
754
+ data: args.data,
755
+ where: {
756
+ id: {
757
+ equals: args.slug
758
+ }
759
+ }
760
+ });
761
+ }
762
+ // TODO: remove Omit when this PR is released: https://github.com/payloadcms/payload/pull/15183
763
+ function findGlobalVersions(args) {
764
+ return this.findVersions({
765
+ collection: getGlobalSlug(args.global),
766
+ limit: args.limit,
767
+ locale: args.locale,
768
+ page: args.page,
769
+ pagination: args.pagination,
770
+ sort: args.sort,
771
+ where: args.where
772
+ });
773
+ }
774
+ function createGlobalVersion(args) {
775
+ // For globals, use the globalSlug as the consistent document ID
776
+ // This matches what we do in updateGlobal
777
+ return this.createVersion({
778
+ autosave: args.autosave,
779
+ collectionSlug: getGlobalSlug(args.globalSlug),
780
+ createdAt: args.createdAt,
781
+ parent: args.globalSlug,
782
+ publishedLocale: args.publishedLocale,
783
+ updatedAt: args.updatedAt,
784
+ versionData: args.versionData
785
+ });
786
+ }
787
+ function updateGlobalVersion(args) {
788
+ // UpdateVersion requires either id OR where, not both
789
+ if (args.id !== undefined) {
790
+ return this.updateVersion({
791
+ id: args.id,
792
+ collection: getGlobalSlug(args.global),
793
+ locale: args.locale,
794
+ versionData: args.versionData
795
+ });
796
+ }
797
+ // args.where is guaranteed by Payload when args.id is undefined
798
+ return this.updateVersion({
799
+ collection: getGlobalSlug(args.global),
800
+ locale: args.locale,
801
+ versionData: args.versionData,
802
+ where: args.where
803
+ });
804
+ }
805
+ function countGlobalVersions(args) {
806
+ return this.countVersions({
807
+ collection: getGlobalSlug(args.global),
808
+ locale: args.locale,
809
+ where: args.where
810
+ });
811
+ }
812
+ function createContentAPIError(operation, error, status) {
813
+ return new APIError(`Content API ${operation} error: ${error.message}`, status, {
814
+ code: error.code,
815
+ constraint: error.constraint,
816
+ field: error.field
817
+ });
818
+ }
819
+ export const contentAPIAdapter = (opts)=>({
820
+ name: 'content-api',
821
+ defaultIDType: 'text',
822
+ init: ({ payload })=>{
823
+ const clientVersionHeaders = getClientVersionHeaders();
824
+ const client = createClient({
825
+ baseUrl: opts.url,
826
+ headers: clientVersionHeaders
827
+ });
828
+ const middlewareOpts = {
829
+ auth: opts.auth,
830
+ contentSystemId: opts.contentSystemId,
831
+ logger: payload.logger,
832
+ url: opts.url
833
+ };
834
+ client.use(createAuthMiddleware(middlewareOpts));
835
+ client.use(createErrorMiddleware(middlewareOpts));
836
+ return createDatabaseAdapter({
837
+ name: 'content-api',
838
+ allowIDOnCreate: opts.allowIDOnCreate ?? false,
839
+ auth: opts.auth,
840
+ beginTransaction: ()=>Promise.resolve(null),
841
+ clearDatabase: clearDatabase,
842
+ client,
843
+ clientVersionHeaders,
844
+ commitTransaction: async ()=>{},
845
+ connect: connect,
846
+ contentSystemId: opts.contentSystemId,
847
+ count: count,
848
+ countGlobalVersions: countGlobalVersions,
849
+ countVersions: countVersions,
850
+ create: create,
851
+ createGlobal: createGlobal,
852
+ createGlobalVersion: createGlobalVersion,
853
+ createVersion: createVersion,
854
+ defaultIDType: 'text',
855
+ deleteMany: deleteMany,
856
+ deleteOne: deleteOne,
857
+ deleteVersions: deleteVersions,
858
+ documentSchema: buildDocumentSchema(payload.config),
859
+ environmentName: opts.environmentName,
860
+ find: find,
861
+ findDistinct: findDistinct,
862
+ findGlobal: findGlobal,
863
+ findGlobalVersions: findGlobalVersions,
864
+ findOne: findOne,
865
+ findVersions: findVersions,
866
+ idType: 'uuid',
867
+ init,
868
+ notifyLocalJobQueue: opts.notifyLocalJobQueue,
869
+ packageName: '@payloadcms/db-content-api',
870
+ payload,
871
+ queryDrafts: queryDrafts,
872
+ rollbackTransaction: async ()=>{},
873
+ updateGlobal: updateGlobal,
874
+ updateGlobalVersion: updateGlobalVersion,
875
+ updateJobs: updateJobs,
876
+ updateMany: updateMany,
877
+ updateOne: updateOne,
878
+ updateVersion: updateVersion,
879
+ upsert: upsert,
880
+ url: opts.url
881
+ });
882
+ }
883
+ });