@payloadcms/figma 0.0.1-alpha.8 → 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) 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 +7574 -0
  64. package/dist/db-content-api/generated/content-api-types.js +5 -0
  65. package/dist/db-content-api/index.d.ts +37 -0
  66. package/dist/db-content-api/index.js +938 -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/data/applyDefaults.d.ts +6 -0
  78. package/dist/db-content-api/utilities/data/applyDefaults.js +75 -0
  79. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +10 -0
  80. package/dist/db-content-api/utilities/data/castFieldValue.js +66 -0
  81. package/dist/db-content-api/utilities/data/index.d.ts +48 -0
  82. package/dist/db-content-api/utilities/data/index.js +299 -0
  83. package/dist/db-content-api/utilities/data/pointShape.d.ts +3 -0
  84. package/dist/db-content-api/utilities/data/pointShape.js +43 -0
  85. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +11 -0
  86. package/dist/db-content-api/utilities/data/removeVirtualFields.js +52 -0
  87. package/dist/db-content-api/utilities/data/richTextShape.d.ts +3 -0
  88. package/dist/db-content-api/utilities/data/richTextShape.js +56 -0
  89. package/dist/db-content-api/utilities/data/stripFields.d.ts +47 -0
  90. package/dist/db-content-api/utilities/data/stripFields.js +170 -0
  91. package/dist/db-content-api/utilities/data/transformPublishedLocale.d.ts +22 -0
  92. package/dist/db-content-api/utilities/data/transformPublishedLocale.js +40 -0
  93. package/dist/db-content-api/utilities/data/validateRelationships.d.ts +6 -0
  94. package/dist/db-content-api/utilities/data/validateRelationships.js +100 -0
  95. package/dist/db-content-api/utilities/joins.d.ts +52 -0
  96. package/dist/db-content-api/utilities/joins.js +137 -0
  97. package/dist/db-content-api/utilities/locale/index.d.ts +9 -0
  98. package/dist/db-content-api/utilities/locale/index.js +19 -0
  99. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.d.ts +10 -0
  100. package/dist/db-content-api/utilities/meta/buildLocalizedPaths.js +71 -0
  101. package/dist/db-content-api/utilities/meta/buildMeta.d.ts +41 -0
  102. package/dist/db-content-api/utilities/meta/buildMeta.js +39 -0
  103. package/dist/db-content-api/utilities/meta/buildPathTypes.d.ts +16 -0
  104. package/dist/db-content-api/utilities/meta/buildPathTypes.js +243 -0
  105. package/dist/db-content-api/utilities/meta/buildUniquePaths.d.ts +12 -0
  106. package/dist/db-content-api/utilities/meta/buildUniquePaths.js +60 -0
  107. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.d.ts +9 -0
  108. package/dist/db-content-api/utilities/meta/normalizeLocaleInWhere.js +100 -0
  109. package/dist/db-content-api/utilities/resolveBlocks.d.ts +19 -0
  110. package/dist/db-content-api/utilities/resolveBlocks.js +31 -0
  111. package/dist/db-content-api/utilities/schema/buildDocumentSchema.d.ts +55 -0
  112. package/dist/db-content-api/utilities/schema/buildDocumentSchema.js +182 -0
  113. package/dist/db-content-api/utilities/where.d.ts +19 -0
  114. package/dist/db-content-api/utilities/where.js +106 -0
  115. package/dist/deploy/schedule-extract-plugin.d.ts +10 -0
  116. package/dist/deploy/schedule-extract-plugin.js +32 -0
  117. package/dist/endpoints/health.d.ts +2 -0
  118. package/dist/endpoints/health.js +9 -0
  119. package/dist/endpoints/schema.d.ts +2 -0
  120. package/dist/endpoints/schema.js +27 -0
  121. package/dist/exports/client.d.ts +2 -1
  122. package/dist/exports/client.js +2 -2
  123. package/dist/index.d.ts +2 -2
  124. package/dist/index.js +3 -3
  125. package/dist/lib/download-skill.d.ts +12 -0
  126. package/dist/lib/download-skill.js +77 -0
  127. package/dist/oauth/components/FigmaAvatar/index.d.ts +3 -0
  128. package/dist/oauth/components/FigmaAvatar/index.js +25 -0
  129. package/dist/oauth/components/FigmaAvatar/index.scss +12 -0
  130. package/dist/oauth/components/FigmaAvatarCell/index.d.ts +4 -0
  131. package/dist/oauth/components/FigmaAvatarCell/index.js +23 -0
  132. package/dist/oauth/components/FigmaAvatarCell/index.scss +5 -0
  133. package/dist/oauth/components/FigmaAvatarPlaceholder/index.d.ts +8 -0
  134. package/dist/oauth/components/FigmaAvatarPlaceholder/index.js +35 -0
  135. package/dist/oauth/components/FigmaAvatarPlaceholder/index.scss +28 -0
  136. package/dist/oauth/components/LoginButton/iframeAutoLogin.d.ts +81 -0
  137. package/dist/oauth/components/LoginButton/iframeAutoLogin.js +168 -0
  138. package/dist/oauth/components/LoginButton/index.d.ts +0 -1
  139. package/dist/oauth/components/LoginButton/index.js +156 -18
  140. package/dist/oauth/components/LoginButton/index.scss +75 -3
  141. package/dist/oauth/components/LogoutButton/index.d.ts +0 -1
  142. package/dist/oauth/components/LogoutButton/index.js +20 -9
  143. package/dist/oauth/defaults.d.ts +3 -2
  144. package/dist/oauth/defaults.js +79 -12
  145. package/dist/oauth/endpoints/getLoginEndpoint.d.ts +0 -1
  146. package/dist/oauth/endpoints/getLoginEndpoint.js +87 -84
  147. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts +0 -1
  148. package/dist/oauth/endpoints/getLogoutEndpoint.js +7 -6
  149. package/dist/oauth/endpoints/getMetaEndpoint.d.ts +0 -1
  150. package/dist/oauth/endpoints/getMetaEndpoint.js +18 -5
  151. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts +0 -1
  152. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js +11 -4
  153. package/dist/oauth/exports/client.d.ts +0 -1
  154. package/dist/oauth/exports/client.js +0 -2
  155. package/dist/oauth/hooks/afterLogout.d.ts +0 -1
  156. package/dist/oauth/hooks/afterLogout.js +0 -2
  157. package/dist/oauth/hooks/me.d.ts +0 -1
  158. package/dist/oauth/hooks/me.js +0 -2
  159. package/dist/oauth/hooks/refresh.d.ts +0 -1
  160. package/dist/oauth/hooks/refresh.js +2 -3
  161. package/dist/oauth/index.d.ts +0 -1
  162. package/dist/oauth/index.js +27 -7
  163. package/dist/oauth/strategy/index.d.ts +0 -3
  164. package/dist/oauth/strategy/index.js +55 -34
  165. package/dist/oauth/types.d.ts +23 -7
  166. package/dist/oauth/types.js +0 -2
  167. package/dist/oauth/utilities/buildUnauthorizedRedirect.d.ts +14 -0
  168. package/dist/oauth/utilities/buildUnauthorizedRedirect.js +28 -0
  169. package/dist/oauth/utilities/clearCookie.d.ts +0 -1
  170. package/dist/oauth/utilities/clearCookie.js +5 -3
  171. package/dist/oauth/utilities/createCookieOptions.d.ts +0 -1
  172. package/dist/oauth/utilities/createCookieOptions.js +9 -4
  173. package/dist/oauth/utilities/createDebugLogger.d.ts +0 -1
  174. package/dist/oauth/utilities/createDebugLogger.js +0 -2
  175. package/dist/oauth/utilities/establishSession.d.ts +22 -0
  176. package/dist/oauth/utilities/establishSession.js +80 -0
  177. package/dist/oauth/utilities/exchangeCodeForAccessToken.d.ts +23 -0
  178. package/dist/oauth/utilities/exchangeCodeForAccessToken.js +26 -0
  179. package/dist/oauth/utilities/extractOrigin.d.ts +0 -1
  180. package/dist/oauth/utilities/extractOrigin.js +0 -2
  181. package/dist/oauth/utilities/figmaHostnames.d.ts +2 -0
  182. package/dist/oauth/utilities/figmaHostnames.js +24 -0
  183. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts +0 -1
  184. package/dist/oauth/utilities/getAdminCollectionSlug.js +0 -2
  185. package/dist/oauth/utilities/getAuthorizeURL.d.ts +65 -2
  186. package/dist/oauth/utilities/getAuthorizeURL.js +57 -4
  187. package/dist/oauth/utilities/getCookieExpiration.d.ts +0 -1
  188. package/dist/oauth/utilities/getCookieExpiration.js +0 -2
  189. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts +0 -1
  190. package/dist/oauth/utilities/getSecondsFromTokenExp.js +0 -2
  191. package/dist/oauth/utilities/getTokenExp.d.ts +0 -1
  192. package/dist/oauth/utilities/getTokenExp.js +0 -2
  193. package/dist/oauth/utilities/getUsernameField.d.ts +0 -1
  194. package/dist/oauth/utilities/getUsernameField.js +0 -2
  195. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts +0 -1
  196. package/dist/oauth/utilities/hasUserTokenPropsChanged.js +0 -2
  197. package/dist/oauth/utilities/isAbsoluteURL.d.ts +1 -0
  198. package/dist/oauth/utilities/isAbsoluteURL.js +1 -0
  199. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +6 -0
  200. package/dist/oauth/utilities/isDuplicateKeyError.js +12 -0
  201. package/dist/oauth/utilities/mergeHeaders.d.ts +0 -1
  202. package/dist/oauth/utilities/mergeHeaders.js +0 -2
  203. package/dist/oauth/utilities/refreshTokens.d.ts +0 -1
  204. package/dist/oauth/utilities/refreshTokens.js +21 -13
  205. package/dist/oauth/utilities/withPartitionedCookie.d.ts +19 -0
  206. package/dist/oauth/utilities/withPartitionedCookie.js +26 -0
  207. package/dist/oauth/utils/getSearchParam.d.ts +17 -0
  208. package/dist/oauth/utils/getSearchParam.js +22 -0
  209. package/dist/plugin/adapter.d.ts +0 -1
  210. package/dist/plugin/adapter.js +0 -2
  211. package/dist/plugin/auth-preflight.d.ts +7 -0
  212. package/dist/plugin/auth-preflight.js +18 -0
  213. package/dist/plugin/bootstrap-preflight.d.ts +22 -0
  214. package/dist/plugin/bootstrap-preflight.js +43 -0
  215. package/dist/plugin/build-config.d.ts +27 -15
  216. package/dist/plugin/build-config.js +381 -18
  217. package/dist/plugin/dev-cookie-names.d.ts +13 -0
  218. package/dist/plugin/dev-cookie-names.js +17 -0
  219. package/dist/scss.d.js +2 -0
  220. package/dist/storage-content-api/api-types.d.ts +183 -0
  221. package/dist/storage-content-api/api-types.js +4 -0
  222. package/dist/storage-content-api/client-uploads/generate.d.ts +14 -0
  223. package/dist/storage-content-api/client-uploads/generate.js +69 -0
  224. package/dist/storage-content-api/client.d.ts +5 -0
  225. package/dist/storage-content-api/client.js +37 -0
  226. package/dist/storage-content-api/generateURL.d.ts +6 -0
  227. package/dist/storage-content-api/generateURL.js +6 -0
  228. package/dist/storage-content-api/handleDelete.d.ts +7 -0
  229. package/dist/storage-content-api/handleDelete.js +15 -0
  230. package/dist/storage-content-api/handleUpload.d.ts +10 -0
  231. package/dist/storage-content-api/handleUpload.js +162 -0
  232. package/dist/storage-content-api/index.d.ts +4 -0
  233. package/dist/storage-content-api/index.js +37 -0
  234. package/dist/storage-content-api/staticHandler.d.ts +9 -0
  235. package/dist/storage-content-api/staticHandler.js +61 -0
  236. package/dist/storage-content-api/types.d.ts +9 -0
  237. package/dist/storage-content-api/types.js +1 -0
  238. package/dist/storage-content-api/utilities/getSafeFilename.d.ts +11 -0
  239. package/dist/storage-content-api/utilities/getSafeFilename.js +59 -0
  240. package/dist/storage-content-api/utilities/index.d.ts +2 -0
  241. package/dist/storage-content-api/utilities/index.js +2 -0
  242. package/dist/storage-content-api/utilities/parseUploadReference.d.ts +17 -0
  243. package/dist/storage-content-api/utilities/parseUploadReference.js +27 -0
  244. package/dist/templates/.env.example +5 -0
  245. package/dist/templates/README.md +19 -0
  246. package/dist/types/config.d.ts +2 -2
  247. package/dist/types/config.js +0 -4
  248. package/dist/types.d.ts +10 -2
  249. package/dist/types.js +0 -2
  250. package/dist/utils/adapters/nextjs.d.ts +8 -0
  251. package/dist/utils/adapters/nextjs.js +61 -0
  252. package/dist/utils/adapters/nitro.d.ts +8 -0
  253. package/dist/utils/adapters/nitro.js +172 -0
  254. package/dist/utils/adapters/vite.d.ts +9 -0
  255. package/dist/utils/adapters/vite.js +31 -0
  256. package/dist/utils/asset-collection.d.ts +27 -7
  257. package/dist/utils/asset-collection.js +59 -32
  258. package/dist/utils/build-detection.d.ts +5 -12
  259. package/dist/utils/build-detection.js +74 -13
  260. package/dist/utils/build-lambda-zip.d.ts +25 -0
  261. package/dist/utils/build-lambda-zip.js +90 -0
  262. package/dist/utils/cache-bootstrap.d.ts +7 -0
  263. package/dist/utils/cache-bootstrap.js +16 -0
  264. package/dist/utils/config.d.ts +0 -1
  265. package/dist/utils/config.js +1 -3
  266. package/dist/utils/deploy-adapter.d.ts +45 -0
  267. package/dist/utils/deploy-adapter.js +56 -0
  268. package/dist/utils/download-template.d.ts +9 -2
  269. package/dist/utils/download-template.js +24 -20
  270. package/dist/utils/env-management.d.ts +24 -8
  271. package/dist/utils/env-management.js +119 -66
  272. package/dist/utils/format-env-suffix.d.ts +11 -0
  273. package/dist/utils/format-env-suffix.js +11 -0
  274. package/dist/utils/format.d.ts +0 -1
  275. package/dist/utils/format.js +0 -2
  276. package/dist/utils/formatter.d.ts +0 -1
  277. package/dist/utils/formatter.js +23 -13
  278. package/dist/utils/fs-utils.d.ts +12 -0
  279. package/dist/utils/fs-utils.js +55 -0
  280. package/dist/utils/git.d.ts +0 -1
  281. package/dist/utils/git.js +0 -2
  282. package/dist/utils/handle-upgrade.d.ts +8 -0
  283. package/dist/utils/handle-upgrade.js +39 -0
  284. package/dist/utils/is-debug.d.ts +0 -1
  285. package/dist/utils/is-debug.js +0 -2
  286. package/dist/utils/lambda-config.d.ts +3 -2
  287. package/dist/utils/lambda-config.js +75 -80
  288. package/dist/utils/load-payload-config.d.ts +9 -0
  289. package/dist/utils/load-payload-config.js +27 -0
  290. package/dist/utils/log.d.ts +0 -1
  291. package/dist/utils/log.js +0 -2
  292. package/dist/utils/messages.d.ts +1 -3
  293. package/dist/utils/messages.js +47 -13
  294. package/dist/utils/package-manager.d.ts +24 -1
  295. package/dist/utils/package-manager.js +53 -2
  296. package/dist/utils/parse-template-spec.d.ts +11 -0
  297. package/dist/utils/parse-template-spec.js +60 -0
  298. package/dist/utils/payload-config-ast.d.ts +27 -7
  299. package/dist/utils/payload-config-ast.js +106 -60
  300. package/dist/utils/payload-config-finder.d.ts +2 -3
  301. package/dist/utils/payload-config-finder.js +48 -11
  302. package/dist/utils/payload-config-modifier.d.ts +1 -2
  303. package/dist/utils/payload-config-modifier.js +114 -68
  304. package/dist/utils/payload-package-check.d.ts +28 -3
  305. package/dist/utils/payload-package-check.js +90 -31
  306. package/dist/utils/project.d.ts +8 -4
  307. package/dist/utils/project.js +63 -37
  308. package/dist/utils/resolve-environment.d.ts +13 -0
  309. package/dist/utils/resolve-environment.js +29 -0
  310. package/dist/utils/s3-upload.d.ts +7 -3
  311. package/dist/utils/s3-upload.js +44 -9
  312. package/dist/utils/token-display.d.ts +5 -2
  313. package/dist/utils/token-display.js +49 -24
  314. package/dist/utils/typescript-validator.d.ts +0 -1
  315. package/dist/utils/typescript-validator.js +4 -8
  316. package/dist/utils/version-check.d.ts +2 -0
  317. package/dist/utils/version-check.js +43 -0
  318. package/package.json +47 -16
  319. package/dist/api/control-plane.d.ts.map +0 -1
  320. package/dist/api/control-plane.js.map +0 -1
  321. package/dist/api/figma-api.d.ts.map +0 -1
  322. package/dist/api/figma-api.js.map +0 -1
  323. package/dist/auth/browser.d.ts.map +0 -1
  324. package/dist/auth/browser.js.map +0 -1
  325. package/dist/auth/callback-server.d.ts.map +0 -1
  326. package/dist/auth/callback-server.js.map +0 -1
  327. package/dist/auth/crypto-utils.d.ts.map +0 -1
  328. package/dist/auth/crypto-utils.js.map +0 -1
  329. package/dist/auth/jwt-validator.d.ts.map +0 -1
  330. package/dist/auth/jwt-validator.js.map +0 -1
  331. package/dist/auth/oauth-flow.d.ts.map +0 -1
  332. package/dist/auth/oauth-flow.js.map +0 -1
  333. package/dist/auth/pkce.d.ts.map +0 -1
  334. package/dist/auth/pkce.js.map +0 -1
  335. package/dist/auth/project-token.d.ts.map +0 -1
  336. package/dist/auth/project-token.js.map +0 -1
  337. package/dist/auth/refresh.d.ts.map +0 -1
  338. package/dist/auth/refresh.js.map +0 -1
  339. package/dist/auth/token-store.d.ts.map +0 -1
  340. package/dist/auth/token-store.js.map +0 -1
  341. package/dist/auth/types.d.ts.map +0 -1
  342. package/dist/auth/types.js.map +0 -1
  343. package/dist/cli.d.ts.map +0 -1
  344. package/dist/cli.js.map +0 -1
  345. package/dist/commands/deploy.d.ts.map +0 -1
  346. package/dist/commands/deploy.js.map +0 -1
  347. package/dist/commands/init.d.ts.map +0 -1
  348. package/dist/commands/init.js.map +0 -1
  349. package/dist/commands/list-tokens.d.ts.map +0 -1
  350. package/dist/commands/list-tokens.js.map +0 -1
  351. package/dist/commands/login.d.ts.map +0 -1
  352. package/dist/commands/login.js.map +0 -1
  353. package/dist/commands/logout.d.ts.map +0 -1
  354. package/dist/commands/logout.js.map +0 -1
  355. package/dist/config/oauth.d.ts.map +0 -1
  356. package/dist/config/oauth.js.map +0 -1
  357. package/dist/constants.d.ts.map +0 -1
  358. package/dist/constants.js.map +0 -1
  359. package/dist/exports/client.d.ts.map +0 -1
  360. package/dist/exports/client.js.map +0 -1
  361. package/dist/index.d.ts.map +0 -1
  362. package/dist/index.js.map +0 -1
  363. package/dist/oauth/components/LoginButton/index.d.ts.map +0 -1
  364. package/dist/oauth/components/LoginButton/index.js.map +0 -1
  365. package/dist/oauth/components/LogoutButton/index.d.ts.map +0 -1
  366. package/dist/oauth/components/LogoutButton/index.js.map +0 -1
  367. package/dist/oauth/defaults.d.ts.map +0 -1
  368. package/dist/oauth/defaults.js.map +0 -1
  369. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +0 -1
  370. package/dist/oauth/endpoints/getLoginEndpoint.js.map +0 -1
  371. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +0 -1
  372. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +0 -1
  373. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +0 -1
  374. package/dist/oauth/endpoints/getMetaEndpoint.js.map +0 -1
  375. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +0 -1
  376. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +0 -1
  377. package/dist/oauth/exports/client.d.ts.map +0 -1
  378. package/dist/oauth/exports/client.js.map +0 -1
  379. package/dist/oauth/hooks/afterLogout.d.ts.map +0 -1
  380. package/dist/oauth/hooks/afterLogout.js.map +0 -1
  381. package/dist/oauth/hooks/me.d.ts.map +0 -1
  382. package/dist/oauth/hooks/me.js.map +0 -1
  383. package/dist/oauth/hooks/refresh.d.ts.map +0 -1
  384. package/dist/oauth/hooks/refresh.js.map +0 -1
  385. package/dist/oauth/index.d.ts.map +0 -1
  386. package/dist/oauth/index.js.map +0 -1
  387. package/dist/oauth/strategy/index.d.ts.map +0 -1
  388. package/dist/oauth/strategy/index.js.map +0 -1
  389. package/dist/oauth/types.d.ts.map +0 -1
  390. package/dist/oauth/types.js.map +0 -1
  391. package/dist/oauth/utilities/clearCookie.d.ts.map +0 -1
  392. package/dist/oauth/utilities/clearCookie.js.map +0 -1
  393. package/dist/oauth/utilities/createCookieOptions.d.ts.map +0 -1
  394. package/dist/oauth/utilities/createCookieOptions.js.map +0 -1
  395. package/dist/oauth/utilities/createDebugLogger.d.ts.map +0 -1
  396. package/dist/oauth/utilities/createDebugLogger.js.map +0 -1
  397. package/dist/oauth/utilities/extractOrigin.d.ts.map +0 -1
  398. package/dist/oauth/utilities/extractOrigin.js.map +0 -1
  399. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +0 -1
  400. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +0 -1
  401. package/dist/oauth/utilities/getAdminPath.d.ts +0 -8
  402. package/dist/oauth/utilities/getAdminPath.d.ts.map +0 -1
  403. package/dist/oauth/utilities/getAdminPath.js +0 -9
  404. package/dist/oauth/utilities/getAdminPath.js.map +0 -1
  405. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +0 -1
  406. package/dist/oauth/utilities/getAuthorizeURL.js.map +0 -1
  407. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +0 -1
  408. package/dist/oauth/utilities/getCookieExpiration.js.map +0 -1
  409. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +0 -1
  410. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +0 -1
  411. package/dist/oauth/utilities/getTokenExp.d.ts.map +0 -1
  412. package/dist/oauth/utilities/getTokenExp.js.map +0 -1
  413. package/dist/oauth/utilities/getUsernameField.d.ts.map +0 -1
  414. package/dist/oauth/utilities/getUsernameField.js.map +0 -1
  415. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +0 -1
  416. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +0 -1
  417. package/dist/oauth/utilities/mergeHeaders.d.ts.map +0 -1
  418. package/dist/oauth/utilities/mergeHeaders.js.map +0 -1
  419. package/dist/oauth/utilities/refreshTokens.d.ts.map +0 -1
  420. package/dist/oauth/utilities/refreshTokens.js.map +0 -1
  421. package/dist/plugin/adapter.d.ts.map +0 -1
  422. package/dist/plugin/adapter.js.map +0 -1
  423. package/dist/plugin/build-config.d.ts.map +0 -1
  424. package/dist/plugin/build-config.js.map +0 -1
  425. package/dist/types/config.d.ts.map +0 -1
  426. package/dist/types/config.js.map +0 -1
  427. package/dist/types.d.ts.map +0 -1
  428. package/dist/types.js.map +0 -1
  429. package/dist/utils/asset-collection.d.ts.map +0 -1
  430. package/dist/utils/asset-collection.js.map +0 -1
  431. package/dist/utils/build-detection.d.ts.map +0 -1
  432. package/dist/utils/build-detection.js.map +0 -1
  433. package/dist/utils/config.d.ts.map +0 -1
  434. package/dist/utils/config.js.map +0 -1
  435. package/dist/utils/download-template.d.ts.map +0 -1
  436. package/dist/utils/download-template.js.map +0 -1
  437. package/dist/utils/env-management.d.ts.map +0 -1
  438. package/dist/utils/env-management.js.map +0 -1
  439. package/dist/utils/format.d.ts.map +0 -1
  440. package/dist/utils/format.js.map +0 -1
  441. package/dist/utils/formatter.d.ts.map +0 -1
  442. package/dist/utils/formatter.js.map +0 -1
  443. package/dist/utils/git.d.ts.map +0 -1
  444. package/dist/utils/git.js.map +0 -1
  445. package/dist/utils/is-debug.d.ts.map +0 -1
  446. package/dist/utils/is-debug.js.map +0 -1
  447. package/dist/utils/lambda-config.d.ts.map +0 -1
  448. package/dist/utils/lambda-config.js.map +0 -1
  449. package/dist/utils/log.d.ts.map +0 -1
  450. package/dist/utils/log.js.map +0 -1
  451. package/dist/utils/messages.d.ts.map +0 -1
  452. package/dist/utils/messages.js.map +0 -1
  453. package/dist/utils/package-manager.d.ts.map +0 -1
  454. package/dist/utils/package-manager.js.map +0 -1
  455. package/dist/utils/payload-config-ast.d.ts.map +0 -1
  456. package/dist/utils/payload-config-ast.js.map +0 -1
  457. package/dist/utils/payload-config-finder.d.ts.map +0 -1
  458. package/dist/utils/payload-config-finder.js.map +0 -1
  459. package/dist/utils/payload-config-modifier.d.ts.map +0 -1
  460. package/dist/utils/payload-config-modifier.js.map +0 -1
  461. package/dist/utils/payload-package-check.d.ts.map +0 -1
  462. package/dist/utils/payload-package-check.js.map +0 -1
  463. package/dist/utils/project.d.ts.map +0 -1
  464. package/dist/utils/project.js.map +0 -1
  465. package/dist/utils/s3-upload.d.ts.map +0 -1
  466. package/dist/utils/s3-upload.js.map +0 -1
  467. package/dist/utils/token-display.d.ts.map +0 -1
  468. package/dist/utils/token-display.js.map +0 -1
  469. package/dist/utils/typescript-validator.d.ts.map +0 -1
  470. package/dist/utils/typescript-validator.js.map +0 -1
@@ -1,5 +1,20 @@
1
+ import { parseCookies } from 'payload';
1
2
  import { v4 as uuid } from 'uuid';
2
3
  import { hasUserTokenPropsChanged } from './utilities/hasUserTokenPropsChanged.js';
4
+ import { isDuplicateKeyError } from './utilities/isDuplicateKeyError.js';
5
+ export const DEFAULT_USER_INFO_COOKIE_NAME = 'figma-user-info';
6
+ function getFigmaUserInfo(headers, cookieName) {
7
+ try {
8
+ const cookies = parseCookies(headers);
9
+ const encoded = cookies.get(cookieName);
10
+ if (!encoded) {
11
+ return null;
12
+ }
13
+ return JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
3
18
  export const defaultScope = [
4
19
  'openid',
5
20
  'profile',
@@ -14,7 +29,7 @@ export const defaultUsernameField = {
14
29
  },
15
30
  unique: true
16
31
  };
17
- export const defaultVerify = ({ collection, strategyName, usernameField })=>async ({ payload, token })=>{
32
+ export const defaultVerify = ({ collection, strategyName, userInfoCookieName = DEFAULT_USER_INFO_COOKIE_NAME, usernameField })=>async ({ headers, payload, token })=>{
18
33
  let tokenUsername = 'preferred_username';
19
34
  if (usernameField.name !== 'preferredUsername') {
20
35
  tokenUsername = usernameField.name;
@@ -24,6 +39,16 @@ export const defaultVerify = ({ collection, strategyName, usernameField })=>asyn
24
39
  user: null
25
40
  };
26
41
  }
42
+ const figmaUserInfo = getFigmaUserInfo(headers, userInfoCookieName);
43
+ let responseHeaders;
44
+ // Clear the cookie after reading
45
+ if (figmaUserInfo) {
46
+ responseHeaders = new Headers();
47
+ // SameSite=None; Secure; Partitioned so the clear matches the attributes
48
+ // the cookie was set with (establishSession) and actually removes it in the
49
+ // cross-site Make iframe.
50
+ responseHeaders.append('Set-Cookie', `${userInfoCookieName}=; Max-Age=0; Path=/; Secure; SameSite=None; Partitioned`);
51
+ }
27
52
  let user = null;
28
53
  const depth = typeof collection.auth === 'object' ? collection.auth.depth : undefined;
29
54
  try {
@@ -40,13 +65,19 @@ export const defaultVerify = ({ collection, strategyName, usernameField })=>asyn
40
65
  });
41
66
  if (results.docs.length > 0) {
42
67
  user = results.docs[0];
43
- // Update user with new token data
44
- if (hasUserTokenPropsChanged(user, token)) {
68
+ // Check if update needed (token changed OR figma info missing/changed)
69
+ const userWithFigma = user;
70
+ const needsFigmaUpdate = figmaUserInfo && (userWithFigma.figmaHandle !== figmaUserInfo.handle || userWithFigma.figmaImageUrl !== figmaUserInfo.img_url);
71
+ if (hasUserTokenPropsChanged(user, token) || needsFigmaUpdate) {
45
72
  user = await payload.update({
46
73
  id: user.id,
47
74
  collection: collection.slug,
48
75
  data: {
49
- ...token
76
+ ...token,
77
+ ...figmaUserInfo && {
78
+ figmaHandle: figmaUserInfo.handle,
79
+ figmaImageUrl: figmaUserInfo.img_url
80
+ }
50
81
  },
51
82
  depth
52
83
  });
@@ -55,16 +86,43 @@ export const defaultVerify = ({ collection, strategyName, usernameField })=>asyn
55
86
  const newUser = {
56
87
  email: token.preferredUsername || token.email,
57
88
  [usernameField.name]: token[tokenUsername],
58
- ...token
89
+ ...token,
90
+ ...figmaUserInfo && {
91
+ figmaHandle: figmaUserInfo.handle,
92
+ figmaImageUrl: figmaUserInfo.img_url
93
+ }
59
94
  };
60
95
  if (typeof collection.auth === 'object' && !collection.auth.disableLocalStrategy) {
61
96
  newUser.password = uuid();
62
97
  }
63
- user = await payload.create({
64
- collection: collection.slug,
65
- data: newUser,
66
- depth
67
- });
98
+ try {
99
+ user = await payload.create({
100
+ collection: collection.slug,
101
+ data: newUser,
102
+ depth,
103
+ overrideAccess: true
104
+ });
105
+ } catch (createErr) {
106
+ // Race condition: if unique constraint violation, user was created by concurrent request
107
+ if (isDuplicateKeyError(createErr)) {
108
+ const retryResults = await payload.find({
109
+ collection: collection.slug,
110
+ depth,
111
+ limit: 1,
112
+ pagination: false,
113
+ where: {
114
+ [usernameField.name]: {
115
+ equals: token[tokenUsername]
116
+ }
117
+ }
118
+ });
119
+ if (retryResults.docs.length > 0) {
120
+ user = retryResults.docs[0];
121
+ }
122
+ } else {
123
+ throw createErr;
124
+ }
125
+ }
68
126
  }
69
127
  } catch (err) {
70
128
  payload.logger.error({
@@ -72,6 +130,7 @@ export const defaultVerify = ({ collection, strategyName, usernameField })=>asyn
72
130
  msg: 'Error verifying user from defaultVerify.'
73
131
  });
74
132
  return {
133
+ responseHeaders,
75
134
  user: null
76
135
  };
77
136
  }
@@ -79,13 +138,21 @@ export const defaultVerify = ({ collection, strategyName, usernameField })=>asyn
79
138
  user.collection = collection.slug;
80
139
  user._strategy = strategyName;
81
140
  user.exp = token.exp;
141
+ // userGroups/makePermission are virtual (never persisted). Surface the live
142
+ // JWT claims on the authenticated user for this request so access control
143
+ // and self-reads see current values. Claims are snake_case on the wire; the
144
+ // collection fields are camelCase. The field afterRead hooks
145
+ // (see build-config.ts) read these back off req.user.
146
+ const userWithFigmaClaims = user;
147
+ userWithFigmaClaims.userGroups = Array.isArray(token.user_groups) ? token.user_groups : undefined;
148
+ userWithFigmaClaims.makePermission = token.make_permission === 'edit' || token.make_permission === 'view' ? token.make_permission : undefined;
82
149
  return {
150
+ responseHeaders,
83
151
  user
84
152
  };
85
153
  }
86
154
  return {
155
+ responseHeaders,
87
156
  user: null
88
157
  };
89
158
  };
90
-
91
- //# sourceMappingURL=defaults.js.map
@@ -10,4 +10,3 @@ interface Args {
10
10
  }
11
11
  export declare const getLoginEndpoint: ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy, }: Args) => Endpoint;
12
12
  export {};
13
- //# sourceMappingURL=getLoginEndpoint.d.ts.map
@@ -1,16 +1,17 @@
1
- import { APIError, generateCookie, parseCookies } from 'payload';
2
- import { getSafeRedirect } from 'payload/shared';
3
- import { getProjectToken } from '../../api/figma-api.js';
4
- import { createCookieOptions } from '../utilities/createCookieOptions.js';
1
+ import { APIError, parseCookies } from 'payload';
2
+ import { formatAdminURL, getSafeRedirect } from 'payload/shared';
3
+ import { FigmaApiError } from '../../api/figma-api.js';
4
+ import { buildUnauthorizedRedirect } from '../utilities/buildUnauthorizedRedirect.js';
5
5
  import { createDebugLogger } from '../utilities/createDebugLogger.js';
6
+ import { establishSession } from '../utilities/establishSession.js';
7
+ import { exchangeCodeForAccessToken } from '../utilities/exchangeCodeForAccessToken.js';
6
8
  import { extractOrigin } from '../utilities/extractOrigin.js';
7
- import { getAdminPath } from '../utilities/getAdminPath.js';
8
- import { getCookieExpiration } from '../utilities/getCookieExpiration.js';
9
- const isAbsoluteURL = (url)=>/^[a-z][a-z\d+.-]*:/.test(url);
9
+ import { buildCsrfCookieClearHeader, OAUTH_STATE_CSRF_COOKIE_NAME } from '../utilities/getAuthorizeURL.js';
10
+ import { isAbsoluteURL } from '../utilities/isAbsoluteURL.js';
10
11
  export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy })=>({
11
12
  handler: async (req)=>{
12
13
  const { config } = req.payload;
13
- const adminPath = getAdminPath(config);
14
+ const adminRoute = config.routes?.admin || '/admin';
14
15
  try {
15
16
  await strategy.ensureMeta();
16
17
  const path = req.pathname;
@@ -37,9 +38,26 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
37
38
  }
38
39
  const stateRaw = jsonBody.state;
39
40
  const state = JSON.parse(Buffer.from(stateRaw, 'base64').toString('utf-8'));
40
- const redirectDestination = state.serverURL || pluginOptions.redirectServerURL || config.serverURL;
41
- let failedRedirect = `${redirectDestination}${adminPath}/login`;
42
- let redirectToUse = `${redirectDestination}${adminPath}`;
41
+ // Resolve the post-login redirect base. This MUST match the precedence
42
+ // used when the OAuth `redirect_uri` is minted at `/meta`
43
+ // (`getAuthorizeURL`: redirectServerURL → config.serverURL →
44
+ // state.serverURL). `state.serverURL` is the iframe's untrusted
45
+ // `window.location.origin` (a `/meta` query param), so it must rank
46
+ // LAST: trusting it first lets the redirect target diverge from the
47
+ // server-configured origin — in the Make preview that origin is http
48
+ // (mixed content) and, more visibly, it isn't in Payload's auto-derived
49
+ // `config.csrf` allowlist (sanitizeConfig pushes `config.serverURL`),
50
+ // so the CSRF origin check below 403s the callback.
51
+ const redirectServerURL = pluginOptions.redirectServerURL || config.serverURL || state.serverURL;
52
+ let failedRedirect = formatAdminURL({
53
+ adminRoute,
54
+ path: '/login',
55
+ serverURL: redirectServerURL
56
+ });
57
+ let redirectToUse = formatAdminURL({
58
+ adminRoute,
59
+ serverURL: redirectServerURL
60
+ });
43
61
  if (state.redirect) {
44
62
  redirectToUse = state.redirect;
45
63
  }
@@ -93,6 +111,16 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
93
111
  req.payload.logger.error('Signature mismatch. Failing login and redirecting.');
94
112
  return Response.redirect(failedRedirect);
95
113
  }
114
+ // Verify CSRF cookie matches the nonce baked into state at /meta time.
115
+ // This is the browser-binding required by RFC 6749 §10.12 — without
116
+ // it, an attacker who mints (code, state) via /meta + consent could
117
+ // replay them into a victim's browser by URL.
118
+ const cookies = parseCookies(req.headers);
119
+ const cookieCsrf = cookies.get(OAUTH_STATE_CSRF_COOKIE_NAME);
120
+ if (!cookieCsrf || cookieCsrf !== state.csrf) {
121
+ req.payload.logger.error('CSRF cookie mismatch. Failing login and redirecting.');
122
+ return Response.redirect(failedRedirect);
123
+ }
96
124
  if (!strategy.meta?.token_endpoint) {
97
125
  debugLogger.error({
98
126
  msg: `No metadata was obtained from the identity provider. Failing login and redirecting.`,
@@ -121,57 +149,26 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
121
149
  });
122
150
  return Response.redirect(failedRedirect);
123
151
  }
124
- const body = {
125
- client_id: strategy.clientID,
126
- code,
127
- code_verifier: req.payload.decrypt(state.verifier),
128
- grant_type: 'authorization_code',
129
- redirect_uri: `${redirectDestination}${config?.routes?.api || '/api'}/${collection.slug}/${endpointSlug}/login`
130
- };
152
+ const redirectUri = formatAdminURL({
153
+ apiRoute: config.routes?.api || '/api',
154
+ path: `/${collection.slug}/${endpointSlug}/login`,
155
+ serverURL: redirectServerURL
156
+ });
131
157
  debugLogger.info({
132
158
  msg: 'Exchanging code for access token',
133
- path,
134
- requestBody: body
159
+ path
135
160
  });
136
- if (strategy.clientSecret) {
137
- body.client_secret = strategy.clientSecret;
138
- }
139
- const tokenRes = await fetch(strategy.meta?.token_endpoint, {
140
- body: new URLSearchParams(body),
141
- headers: {
142
- 'Content-Type': 'application/x-www-form-urlencoded'
143
- },
144
- method: 'POST'
145
- }).then((r)=>r.json());
146
- debugLogger.info({
147
- msg: 'Token Response',
148
- path,
149
- tokenRes
161
+ const tokenRes = await exchangeCodeForAccessToken({
162
+ code,
163
+ codeVerifier: req.payload.decrypt(state.verifier),
164
+ redirectUri,
165
+ strategy
150
166
  });
151
- const { access_token, error, error_description, expires_in: refreshTokenExpires } = tokenRes;
152
167
  debugLogger.info({
153
- msg: 'tokenResss',
154
- tokenRes
155
- });
156
- // Swap for project token
157
- const project_token = await getProjectToken(tokenRes.access_token, 'someproject');
158
- const refresh_token = access_token;
159
- // Store project token as access_token
160
- const token = project_token.token;
161
- const expiresIn = project_token.expiresAt;
162
- if (!token) {
163
- const errMsg = `No ${collectionOptions.token || 'access_token'} was returned from the identity provider.`;
164
- req.payload.logger.error({
165
- msg: errMsg,
166
- path
167
- });
168
- throw new APIError(errMsg);
169
- }
170
- const cookieOptions = createCookieOptions({
171
- collection,
172
- headers: req.headers,
173
- pluginOptions
168
+ msg: 'Received token response',
169
+ path
174
170
  });
171
+ const { access_token, error, error_description, expires_in: refreshTokenExpires } = tokenRes;
175
172
  if (error) {
176
173
  req.payload.logger.error('Error swapping access code with access token:');
177
174
  req.payload.logger.error({
@@ -180,42 +177,50 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
180
177
  });
181
178
  return Response.redirect(failedRedirect);
182
179
  }
183
- // get the payloadRedirect cookie value
184
- const cookies = parseCookies(req.headers);
185
- const payloadRedirect = 'payloadRedirect' in cookies ? cookies.payloadRedirect : '';
180
+ if (!access_token) {
181
+ const errMsg = 'No access_token was returned from the identity provider.';
182
+ req.payload.logger.error({
183
+ msg: errMsg,
184
+ path
185
+ });
186
+ throw new APIError(errMsg);
187
+ }
188
+ const payloadRedirect = cookies.get('payloadRedirect') ?? '';
186
189
  if (!req.responseHeaders) {
187
190
  req.responseHeaders = new Headers();
188
191
  }
192
+ // Clear the CSRF cookie now that the flow has completed — the nonce
193
+ // is single-use; leaving it around lets a replay try again.
194
+ req.responseHeaders.append('Set-Cookie', buildCsrfCookieClearHeader());
189
195
  if (payloadRedirect) {
190
196
  if (isAbsoluteURL(payloadRedirect)) {
191
197
  redirectToUse = payloadRedirect;
192
198
  } else {
193
199
  redirectToUse += payloadRedirect;
194
200
  }
195
- req.responseHeaders.append('Set-Cookie', `payloadRedirect=${redirectToUse}; Max-Age=0; Path=/;`);
196
- }
197
- if (refresh_token && !collectionOptions.usePayloadJWT) {
198
- debugLogger.info('Setting refresh token cookie');
199
- const refreshCookie = generateCookie({
200
- returnCookieAsObject: false,
201
- ...cookieOptions,
202
- name: `${strategy.cookieName}-refresh`,
203
- value: refresh_token,
204
- // Default to 1 year if no expiration
205
- expires: getCookieExpiration(cookieOptions?.expires ?? refreshTokenExpires ?? 31_556_952)
201
+ req.responseHeaders.append('Set-Cookie', // Match the attributes the cookie was set with so the clear removes it
202
+ // in the cross-site Make iframe.
203
+ `payloadRedirect=${redirectToUse}; Max-Age=0; Path=/; Secure; SameSite=None; Partitioned`);
204
+ }
205
+ try {
206
+ await establishSession({
207
+ accessToken: access_token,
208
+ collection,
209
+ collectionOptions,
210
+ debugLogger,
211
+ environmentId: config.custom.figma.environmentId,
212
+ pluginOptions,
213
+ refreshTokenExpiresIn: refreshTokenExpires,
214
+ req,
215
+ strategy
206
216
  });
207
- req.responseHeaders.append('Set-Cookie', refreshCookie);
208
- }
209
- const tokenExpires = cookieOptions?.expires ? getCookieExpiration(cookieOptions.expires) : new Date(expiresIn) // Project token uses epoch time
210
- ;
211
- const tokenCookie = generateCookie({
212
- ...cookieOptions,
213
- name: strategy.cookieName,
214
- expires: tokenExpires,
215
- returnCookieAsObject: false,
216
- value: token
217
- });
218
- req.responseHeaders.append('Set-Cookie', tokenCookie);
217
+ } catch (err) {
218
+ // The admin-token endpoint returns 403 when the user cannot access this environment.
219
+ if (err instanceof FigmaApiError && err.statusCode === 403) {
220
+ return buildUnauthorizedRedirect(config);
221
+ }
222
+ throw err;
223
+ }
219
224
  return Response.redirect(redirectToUse);
220
225
  } catch (err) {
221
226
  req.payload.logger.error({
@@ -233,5 +238,3 @@ export const getLoginEndpoint = ({ collection, collectionOptions, endpointSlug,
233
238
  method: collectionOptions.authorizationURLParams?.response_mode === 'query' ? 'get' : 'post',
234
239
  path: `/${endpointSlug}/login`
235
240
  });
236
-
237
- //# sourceMappingURL=getLoginEndpoint.js.map
@@ -9,4 +9,3 @@ interface Args {
9
9
  }
10
10
  export declare const getLogoutEndpoint: ({ collection, endpointSlug, pluginOptions, strategy, }: Args) => Endpoint;
11
11
  export {};
12
- //# sourceMappingURL=getLogoutEndpoint.d.ts.map
@@ -1,9 +1,9 @@
1
1
  import jwt from 'jsonwebtoken';
2
2
  import { parseCookies } from 'payload';
3
+ import { formatAdminURL } from 'payload/shared';
3
4
  import { clearCookie } from '../utilities/clearCookie.js';
4
5
  import { createCookieOptions } from '../utilities/createCookieOptions.js';
5
6
  import { createDebugLogger } from '../utilities/createDebugLogger.js';
6
- import { getAdminPath } from '../utilities/getAdminPath.js';
7
7
  export const getLogoutEndpoint = ({ collection, endpointSlug, pluginOptions, strategy })=>({
8
8
  handler: async (req)=>{
9
9
  const debugLogger = createDebugLogger(req.payload, pluginOptions.debug);
@@ -23,12 +23,15 @@ export const getLogoutEndpoint = ({ collection, endpointSlug, pluginOptions, str
23
23
  }
24
24
  try {
25
25
  await strategy.ensureMeta();
26
- const baseRedirectDestination = pluginOptions.redirectServerURL || config.serverURL;
27
- let successfulLogoutRedirectDest = `${baseRedirectDestination}${getAdminPath(config)}`;
26
+ const redirectServerlURL = pluginOptions.redirectServerURL || config.serverURL;
27
+ let successfulLogoutRedirectDest = formatAdminURL({
28
+ adminRoute: config.routes?.admin || '/admin',
29
+ serverURL: redirectServerlURL
30
+ });
28
31
  if (typeof req.query.redirect === 'string') {
29
32
  successfulLogoutRedirectDest = req.query.redirect;
30
33
  }
31
- if (!baseRedirectDestination && !req.query.redirect) {
34
+ if (!redirectServerlURL && !req.query.redirect) {
32
35
  debugLogger.error({
33
36
  msg: 'No redirect URL provided',
34
37
  path: req.pathname
@@ -95,5 +98,3 @@ export const getLogoutEndpoint = ({ collection, endpointSlug, pluginOptions, str
95
98
  method: 'get',
96
99
  path: `/${endpointSlug}/logout`
97
100
  });
98
-
99
- //# sourceMappingURL=getLogoutEndpoint.js.map
@@ -10,4 +10,3 @@ interface Args {
10
10
  }
11
11
  export declare const getMetaEndpoint: ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy, }: Args) => Endpoint;
12
12
  export {};
13
- //# sourceMappingURL=getMetaEndpoint.d.ts.map
@@ -1,10 +1,18 @@
1
- import { getAuthorizeURL } from '../utilities/getAuthorizeURL.js';
1
+ import { parseCookies } from 'payload';
2
+ import { buildCsrfCookieHeader, getAuthorizeURL, OAUTH_STATE_CSRF_COOKIE_NAME } from '../utilities/getAuthorizeURL.js';
2
3
  export const getMetaEndpoint = ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy })=>({
3
4
  handler: async (req)=>{
4
- const authorizeURL = await getAuthorizeURL({
5
+ // Reuse the CSRF nonce from the existing cookie if one is set. Makes
6
+ // `/meta` idempotent: a second call from the same browser (Strict Mode
7
+ // re-mount, retry, multi-tab) returns the SAME state.csrf, so the
8
+ // cookie never has to change after the first call — no last-write-wins
9
+ // race between the cookie and the iframe's already-captured state.
10
+ const existingCsrfNonce = parseCookies(req.headers).get(OAUTH_STATE_CSRF_COOKIE_NAME);
11
+ const { authorizeURL, csrfNonce, params } = await getAuthorizeURL({
5
12
  collection,
6
13
  collectionOptions,
7
14
  endpointSlug,
15
+ existingCsrfNonce,
8
16
  failedRedirect: req.query.failedRedirect,
9
17
  payload: req.payload,
10
18
  pluginOptions,
@@ -12,8 +20,15 @@ export const getMetaEndpoint = ({ collection, collectionOptions, endpointSlug, p
12
20
  serverURLOverride: req.query.serverURL,
13
21
  strategy
14
22
  });
23
+ if (!req.responseHeaders) {
24
+ req.responseHeaders = new Headers();
25
+ }
26
+ // Always re-emit Set-Cookie — when reusing, this just refreshes Max-Age
27
+ // so long-lived tabs don't expire the cookie mid-consent.
28
+ req.responseHeaders.append('Set-Cookie', buildCsrfCookieHeader(csrfNonce));
15
29
  return Response.json({
16
- authorizeURL
30
+ authorizeURL,
31
+ params
17
32
  }, {
18
33
  status: 200
19
34
  });
@@ -21,5 +36,3 @@ export const getMetaEndpoint = ({ collection, collectionOptions, endpointSlug, p
21
36
  method: 'get',
22
37
  path: `/${endpointSlug}/meta`
23
38
  });
24
-
25
- //# sourceMappingURL=getMetaEndpoint.js.map
@@ -10,4 +10,3 @@ interface Args {
10
10
  }
11
11
  export declare const getRedirectToLoginEndpoint: ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy, }: Args) => Endpoint;
12
12
  export {};
13
- //# sourceMappingURL=getRedirectToLoginEndpoint.d.ts.map
@@ -1,10 +1,15 @@
1
- import { getAuthorizeURL } from '../utilities/getAuthorizeURL.js';
1
+ import { parseCookies } from 'payload';
2
+ import { buildCsrfCookieHeader, getAuthorizeURL, OAUTH_STATE_CSRF_COOKIE_NAME } from '../utilities/getAuthorizeURL.js';
2
3
  export const getRedirectToLoginEndpoint = ({ collection, collectionOptions, endpointSlug, pluginOptions, strategy })=>({
3
4
  handler: async (req)=>{
4
- const authorizeURL = await getAuthorizeURL({
5
+ // Reuse the CSRF nonce from the existing cookie if one is set. See
6
+ // getMetaEndpoint.ts for the idempotency rationale.
7
+ const existingCsrfNonce = parseCookies(req.headers).get(OAUTH_STATE_CSRF_COOKIE_NAME);
8
+ const { authorizeURL, csrfNonce } = await getAuthorizeURL({
5
9
  collection,
6
10
  collectionOptions,
7
11
  endpointSlug,
12
+ existingCsrfNonce,
8
13
  failedRedirect: req.query.failedRedirect,
9
14
  payload: req.payload,
10
15
  pluginOptions,
@@ -12,10 +17,12 @@ export const getRedirectToLoginEndpoint = ({ collection, collectionOptions, endp
12
17
  serverURLOverride: req.query.serverURL,
13
18
  strategy
14
19
  });
20
+ if (!req.responseHeaders) {
21
+ req.responseHeaders = new Headers();
22
+ }
23
+ req.responseHeaders.append('Set-Cookie', buildCsrfCookieHeader(csrfNonce));
15
24
  return Response.redirect(authorizeURL);
16
25
  },
17
26
  method: 'get',
18
27
  path: `/${endpointSlug}/login`
19
28
  });
20
-
21
- //# sourceMappingURL=getRedirectToLoginEndpoint.js.map
@@ -1,3 +1,2 @@
1
1
  export { DefaultLoginButton } from '../components/LoginButton/index.jsx';
2
2
  export { LogoutButton } from '../components/LogoutButton/index.jsx';
3
- //# sourceMappingURL=client.d.ts.map
@@ -1,4 +1,2 @@
1
1
  export { DefaultLoginButton } from '../components/LoginButton/index.jsx';
2
2
  export { LogoutButton } from '../components/LogoutButton/index.jsx';
3
-
4
- //# sourceMappingURL=client.js.map
@@ -5,4 +5,3 @@ export declare const getAfterLogout: ({ collection, cookieName, pluginOptions, }
5
5
  cookieName: string;
6
6
  pluginOptions: PluginOptions;
7
7
  }) => CollectionAfterLogoutHook;
8
- //# sourceMappingURL=afterLogout.d.ts.map
@@ -23,5 +23,3 @@ export const getAfterLogout = ({ collection, cookieName, pluginOptions })=>({ re
23
23
  req
24
24
  });
25
25
  };
26
-
27
- //# sourceMappingURL=afterLogout.js.map
@@ -2,4 +2,3 @@ import { type CollectionMeHook } from 'payload';
2
2
  export declare const getMeHook: ({ cookieName }: {
3
3
  cookieName: string;
4
4
  }) => CollectionMeHook;
5
- //# sourceMappingURL=me.d.ts.map
@@ -51,5 +51,3 @@ export const getMeHook = ({ cookieName })=>// eslint-disable-next-line @typescri
51
51
  }
52
52
  return undefined;
53
53
  };
54
-
55
- //# sourceMappingURL=me.js.map
@@ -5,4 +5,3 @@ export declare const getRefreshHook: ({ pluginOptions, strategy, }: {
5
5
  pluginOptions: PluginOptions;
6
6
  strategy: Strategy;
7
7
  }) => CollectionRefreshHook;
8
- //# sourceMappingURL=refresh.d.ts.map
@@ -6,6 +6,7 @@ import { getCookieExpiration } from '../utilities/getCookieExpiration.js';
6
6
  import { getTokenExp } from '../utilities/getTokenExp.js';
7
7
  import { mergeHeaders } from '../utilities/mergeHeaders.js';
8
8
  import { refreshTokens } from '../utilities/refreshTokens.js';
9
+ import { withPartitionedCookie } from '../utilities/withPartitionedCookie.js';
9
10
  export const getRefreshHook = ({ pluginOptions, strategy })=>async ({ args, user })=>{
10
11
  if (!args.req.responseHeaders) {
11
12
  args.req.responseHeaders = new Headers();
@@ -47,7 +48,7 @@ export const getRefreshHook = ({ pluginOptions, strategy })=>async ({ args, user
47
48
  }) ?? 31_556_952),
48
49
  value: refreshedToken
49
50
  });
50
- args.req.responseHeaders.append('Set-Cookie', refreshCookie);
51
+ args.req.responseHeaders.append('Set-Cookie', withPartitionedCookie(refreshCookie));
51
52
  const newDecoded = jwt.decode(refreshedToken);
52
53
  strategy.debugLog('usePayloadJWT: true - Received new refresh token', {
53
54
  newDecoded,
@@ -87,5 +88,3 @@ export const getRefreshHook = ({ pluginOptions, strategy })=>async ({ args, user
87
88
  }
88
89
  return undefined;
89
90
  };
90
-
91
- //# sourceMappingURL=refresh.js.map
@@ -1,4 +1,3 @@
1
1
  import type { Plugin } from 'payload';
2
2
  import type { PluginOptions } from './types.js';
3
3
  export declare const oAuth2Plugin: (pluginOptions: PluginOptions) => Plugin;
4
- //# sourceMappingURL=index.d.ts.map