@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,27 @@
1
+ import crypto from 'crypto';
2
+ import { configToJSONSchema } from 'payload';
3
+ export const schema = {
4
+ handler: (req)=>{
5
+ if (!req.user) {
6
+ return Response.json({
7
+ error: 'Unauthorized'
8
+ }, {
9
+ status: 401
10
+ });
11
+ }
12
+ const format = req.query?.format;
13
+ const { jsonSchema } = configToJSONSchema(req.payload.config);
14
+ const hash = crypto.createHash('sha256').update(JSON.stringify(jsonSchema)).digest('hex');
15
+ if (format === 'hash') {
16
+ return Response.json({
17
+ hash
18
+ });
19
+ }
20
+ return Response.json({
21
+ hash,
22
+ schema: jsonSchema
23
+ });
24
+ },
25
+ method: 'get',
26
+ path: '/figma/schema'
27
+ };
@@ -1,3 +1,4 @@
1
+ export { FigmaAvatar } from '../oauth/components/FigmaAvatar/index.js';
2
+ export { FigmaAvatarCell } from '../oauth/components/FigmaAvatarCell/index.js';
1
3
  export { DefaultLoginButton } from '../oauth/components/LoginButton/index.js';
2
4
  export { LogoutButton } from '../oauth/components/LogoutButton/index.js';
3
- //# sourceMappingURL=client.d.ts.map
@@ -1,4 +1,4 @@
1
+ export { FigmaAvatar } from '../oauth/components/FigmaAvatar/index.js';
2
+ export { FigmaAvatarCell } from '../oauth/components/FigmaAvatarCell/index.js';
1
3
  export { DefaultLoginButton } from '../oauth/components/LoginButton/index.js';
2
4
  export { LogoutButton } from '../oauth/components/LogoutButton/index.js';
3
-
4
- //# sourceMappingURL=client.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
+ export { contentAPIAdapter } from './db-content-api/index.js';
1
2
  export { figmaContentSystem } from './plugin/adapter.js';
2
3
  export type { FigmaContentSystemOptions } from './plugin/adapter.js';
3
- export { buildConfig } from './plugin/build-config.js';
4
+ export { buildFigmaConfig } from './plugin/build-config.js';
4
5
  export type { FigmaConfig } from './plugin/build-config.js';
5
- //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
+ // Export contentAPIAdapter for testing use cases
2
+ export { contentAPIAdapter } from './db-content-api/index.js';
1
3
  // Export database adapter for advanced use cases
2
4
  export { figmaContentSystem } from './plugin/adapter.js';
3
5
  // Export buildConfig wrapper and its config type
4
- export { buildConfig } from './plugin/build-config.js';
5
-
6
- //# sourceMappingURL=index.js.map
6
+ export { buildFigmaConfig } from './plugin/build-config.js';
@@ -0,0 +1,12 @@
1
+ export type DownloadSkillResult = {
2
+ detail?: string;
3
+ ok: false;
4
+ reason: 'already-installed' | 'empty-extract' | 'error' | 'fetch-failed';
5
+ } | {
6
+ ok: true;
7
+ };
8
+ export declare function downloadSkill(args: {
9
+ branch?: string;
10
+ debug?: boolean;
11
+ projectDir: string;
12
+ }): Promise<DownloadSkillResult>;
@@ -0,0 +1,77 @@
1
+ import fs from 'fs/promises';
2
+ import { Readable } from 'node:stream';
3
+ import { pipeline } from 'node:stream/promises';
4
+ import path from 'path';
5
+ import { x } from 'tar';
6
+ export async function downloadSkill(args) {
7
+ const { branch = 'main', debug, projectDir } = args;
8
+ const destDir = path.join(projectDir, '.claude', 'skills', 'payload');
9
+ if (await pathExists(path.join(destDir, 'SKILL.md'))) {
10
+ return {
11
+ ok: false,
12
+ reason: 'already-installed'
13
+ };
14
+ }
15
+ const url = `https://codeload.github.com/payloadcms/payload/tar.gz/${branch}`;
16
+ const filter = `payload-${branch.replace(/^v/, '').replaceAll('/', '-')}/tools/claude-plugin/skills/payload/`;
17
+ if (debug) {
18
+ // eslint-disable-next-line no-console
19
+ console.log(`[download-skill] url=${url} dest=${destDir}`);
20
+ }
21
+ try {
22
+ const res = await fetch(url);
23
+ if (!res.ok) {
24
+ return {
25
+ detail: `${res.status} ${res.statusText}`,
26
+ ok: false,
27
+ reason: 'fetch-failed'
28
+ };
29
+ }
30
+ if (!res.body) {
31
+ return {
32
+ detail: 'empty response body',
33
+ ok: false,
34
+ reason: 'fetch-failed'
35
+ };
36
+ }
37
+ await fs.mkdir(destDir, {
38
+ recursive: true
39
+ });
40
+ await pipeline(Readable.from(res.body), x({
41
+ cwd: destDir,
42
+ filter: (p)=>p.includes(filter),
43
+ strip: filter.split('/').length - 1
44
+ }));
45
+ if (!await pathExists(path.join(destDir, 'SKILL.md'))) {
46
+ await fs.rm(destDir, {
47
+ force: true,
48
+ recursive: true
49
+ });
50
+ return {
51
+ ok: false,
52
+ reason: 'empty-extract'
53
+ };
54
+ }
55
+ return {
56
+ ok: true
57
+ };
58
+ } catch (err) {
59
+ await fs.rm(destDir, {
60
+ force: true,
61
+ recursive: true
62
+ }).catch(()=>{});
63
+ return {
64
+ detail: err instanceof Error ? err.message : String(err),
65
+ ok: false,
66
+ reason: 'error'
67
+ };
68
+ }
69
+ }
70
+ async function pathExists(p) {
71
+ try {
72
+ await fs.access(p);
73
+ return true;
74
+ } catch {
75
+ return false;
76
+ }
77
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+ import './index.scss';
3
+ export declare const FigmaAvatar: React.FC;
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useAuth } from '@payloadcms/ui';
4
+ import { useState } from 'react';
5
+ import { FigmaAvatarPlaceholder, isValidImageUrl } from '../FigmaAvatarPlaceholder/index.js';
6
+ import './index.scss';
7
+ const baseClass = 'figma-avatar';
8
+ export const FigmaAvatar = ()=>{
9
+ const { user } = useAuth();
10
+ const [hasError, setHasError] = useState(false);
11
+ const figmaImageUrl = user?.figmaImageUrl;
12
+ if (!figmaImageUrl || hasError || !isValidImageUrl(figmaImageUrl)) {
13
+ return /*#__PURE__*/ _jsx(FigmaAvatarPlaceholder, {
14
+ size: 25
15
+ });
16
+ }
17
+ return /*#__PURE__*/ _jsx("img", {
18
+ alt: "Profile",
19
+ className: `${baseClass}__image`,
20
+ height: 25,
21
+ onError: ()=>setHasError(true),
22
+ src: figmaImageUrl,
23
+ width: 25
24
+ });
25
+ };
@@ -0,0 +1,12 @@
1
+ @layer payload-default {
2
+ .figma-avatar {
3
+ &__image {
4
+ border-radius: 50%;
5
+ border: 1px solid var(--theme-elevation-200);
6
+
7
+ &:hover {
8
+ border-color: var(--theme-elevation-600);
9
+ }
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,4 @@
1
+ import type { DefaultCellComponentProps } from 'payload';
2
+ import type React from 'react';
3
+ import './index.scss';
4
+ export declare const FigmaAvatarCell: React.FC<DefaultCellComponentProps>;
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { FigmaAvatarPlaceholder, isValidImageUrl } from '../FigmaAvatarPlaceholder/index.js';
5
+ import './index.scss';
6
+ const baseClass = 'figma-avatar-cell';
7
+ export const FigmaAvatarCell = ({ cellData })=>{
8
+ const [hasError, setHasError] = useState(false);
9
+ const figmaImageUrl = cellData;
10
+ if (!figmaImageUrl || hasError || !isValidImageUrl(figmaImageUrl)) {
11
+ return /*#__PURE__*/ _jsx(FigmaAvatarPlaceholder, {
12
+ size: 20
13
+ });
14
+ }
15
+ return /*#__PURE__*/ _jsx("img", {
16
+ alt: "Avatar",
17
+ className: `${baseClass}__image`,
18
+ height: 20,
19
+ onError: ()=>setHasError(true),
20
+ src: figmaImageUrl,
21
+ width: 20
22
+ });
23
+ };
@@ -0,0 +1,5 @@
1
+ .figma-avatar-cell {
2
+ &__image {
3
+ border-radius: 50%;
4
+ }
5
+ }
@@ -0,0 +1,8 @@
1
+ import type React from 'react';
2
+ import './index.scss';
3
+ type FigmaAvatarPlaceholderProps = {
4
+ size?: number;
5
+ };
6
+ export declare const FigmaAvatarPlaceholder: React.FC<FigmaAvatarPlaceholderProps>;
7
+ export declare function isValidImageUrl(url: string): boolean;
8
+ export {};
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import './index.scss';
3
+ const baseClass = 'figma-avatar-placeholder';
4
+ export const FigmaAvatarPlaceholder = ({ size = 25 })=>/*#__PURE__*/ _jsxs("svg", {
5
+ className: baseClass,
6
+ height: size,
7
+ viewBox: "0 0 25 25",
8
+ width: size,
9
+ children: [
10
+ /*#__PURE__*/ _jsx("circle", {
11
+ className: `${baseClass}__bg`,
12
+ cx: "12.5",
13
+ cy: "12.5",
14
+ r: "11.5"
15
+ }),
16
+ /*#__PURE__*/ _jsx("circle", {
17
+ className: `${baseClass}__head`,
18
+ cx: "12.5",
19
+ cy: "10",
20
+ r: "4"
21
+ }),
22
+ /*#__PURE__*/ _jsx("path", {
23
+ className: `${baseClass}__body`,
24
+ d: "M12.5 15c-4 0-7 2-7 4.5v1h14v-1c0-2.5-3-4.5-7-4.5z"
25
+ })
26
+ ]
27
+ });
28
+ export function isValidImageUrl(url) {
29
+ try {
30
+ const parsed = new URL(url);
31
+ return parsed.protocol === 'https:' || parsed.protocol === 'http:';
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
@@ -0,0 +1,28 @@
1
+ @layer payload-default {
2
+ .figma-avatar-placeholder {
3
+ &__bg {
4
+ fill: var(--theme-elevation-50);
5
+ stroke: var(--theme-elevation-200);
6
+ stroke-width: 1px;
7
+ }
8
+
9
+ &__head,
10
+ &__body {
11
+ fill: var(--theme-elevation-200);
12
+ }
13
+
14
+ &:hover {
15
+ .figma-avatar-placeholder {
16
+ &__bg {
17
+ fill: var(--theme-elevation-200);
18
+ stroke: var(--theme-elevation-600);
19
+ }
20
+
21
+ &__head,
22
+ &__body {
23
+ fill: var(--theme-elevation-600);
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,81 @@
1
+ export interface CmsOAuthCodeMessage {
2
+ code: string;
3
+ state: string;
4
+ }
5
+ /**
6
+ * Validate the shape of a message received from the parent window. Accepts
7
+ * `{ type: 'cms-oauth-code', code: string, state: string }`. Returns null
8
+ * for anything else. The handler additionally verifies `state` matches the
9
+ * value the iframe sent on its outbound `mint-cms-oauth-code` request.
10
+ */
11
+ export declare const parseCmsOAuthCodeMessage: (data: unknown) => CmsOAuthCodeMessage | null;
12
+ export interface ParentOriginSignals {
13
+ /**
14
+ * `ancestorOrigins[0]`: immediate embedder origin. `undefined` where the
15
+ * browser lacks `Location.ancestorOrigins`.
16
+ */
17
+ ancestorOrigin: null | string | undefined;
18
+ /** `window.location.origin` — this iframe's own origin. */
19
+ ownOrigin: null | string | undefined;
20
+ /** `document.referrer`. */
21
+ referrer: null | string | undefined;
22
+ }
23
+ /**
24
+ * Resolve the exact origin for `window.parent.postMessage`, or `null` if we
25
+ * can't establish a trusted embedder (caller must then NOT post). We never
26
+ * target `'*'`: the payload embeds PKCE material in `state`.
27
+ *
28
+ * 1. `ancestorOrigin` present (browser-set, unspoofable): trust iff Figma,
29
+ * else `null` — no fall-through to weaker signals.
30
+ * 2. No `ancestorOrigins`: fall back to `referrer`, but only if
31
+ * it's a Figma origin and not our own. (Payload's `/admin` -> `/admin/login`
32
+ * 307 leaves `referrer` as our own origin, never the embedder.)
33
+ * 3. Otherwise `null`.
34
+ */
35
+ export declare const resolveParentTargetOrigin: ({ ancestorOrigin, ownOrigin, referrer, }: ParentOriginSignals) => null | string;
36
+ export interface IframeAutoLoginDeps {
37
+ doFetch: typeof fetch;
38
+ /**
39
+ * URL of the plugin's `/meta` endpoint. The iframe fetches this on setup
40
+ * to get the OAuth params (`client_id`, `redirect_uri`, `scope`,
41
+ * `code_challenge`, `state`, etc.) it forwards to the parent so the
42
+ * parent can mint a code via Sinatra.
43
+ */
44
+ metaUrl: string;
45
+ navigate: (url: string) => void;
46
+ /**
47
+ * Called on known synchronous failure paths so the host UI can render a
48
+ * manual fallback (e.g. surface the regular login button) instead of
49
+ * leaving the user on a blank screen. Not called on cleanup-driven
50
+ * aborts. Silent failures (parent never responds) are not detected here;
51
+ * the host is expected to apply its own timeout.
52
+ */
53
+ onFailed?: () => void;
54
+ /**
55
+ * Exact origin for `postMessage`, from `resolveParentTargetOrigin`. `null`
56
+ * means no trusted embedder: don't post, trigger `onFailed`. Never `'*'`.
57
+ */
58
+ parentTargetOrigin: null | string;
59
+ postMessageToParent: (message: unknown, targetOrigin: string) => void;
60
+ win: Pick<Window, 'addEventListener' | 'removeEventListener'>;
61
+ }
62
+ /**
63
+ * Wire up the iframe auto-login flow:
64
+ * 1. Fetch the plugin's `/meta` endpoint to get the OAuth params for this
65
+ * flow — same params the regular `/admin/login` button would have used.
66
+ * 2. postMessage to the parent window:
67
+ * { type: 'mint-cms-oauth-code', client_id, redirect_uri, scope,
68
+ * code_challenge, code_challenge_method, state }
69
+ * The parent uses these to mint a code via Sinatra, then echoes `state`
70
+ * back so we can correlate response to request.
71
+ * 3. Listen for the parent's response.
72
+ * 4. On a valid Figma-origin response whose `state` matches what we sent,
73
+ * navigate to `${redirect_uri}?code=${code}&state=${state}` — the same
74
+ * URL shape the IdP uses when it 302s back into the manual flow.
75
+ * 5. `/sso/login` GET handler validates state.sig + PKCE verifier, exchanges
76
+ * the code, sets session cookies, and 302s to `/admin`.
77
+ *
78
+ * Returns a cleanup function that removes the listener and aborts the meta
79
+ * fetch — designed to be returned directly from a React useEffect.
80
+ */
81
+ export declare const setupIframeAutoLogin: (deps: IframeAutoLoginDeps) => (() => void);
@@ -0,0 +1,168 @@
1
+ import { isFigmaOrigin } from '../../utilities/figmaHostnames.js';
2
+ /**
3
+ * Validate the shape of a message received from the parent window. Accepts
4
+ * `{ type: 'cms-oauth-code', code: string, state: string }`. Returns null
5
+ * for anything else. The handler additionally verifies `state` matches the
6
+ * value the iframe sent on its outbound `mint-cms-oauth-code` request.
7
+ */ export const parseCmsOAuthCodeMessage = (data)=>{
8
+ if (!data || typeof data !== 'object') {
9
+ return null;
10
+ }
11
+ const obj = data;
12
+ if (obj.type !== 'cms-oauth-code') {
13
+ return null;
14
+ }
15
+ if (typeof obj.code !== 'string' || obj.code.length === 0) {
16
+ return null;
17
+ }
18
+ if (typeof obj.state !== 'string' || obj.state.length === 0) {
19
+ return null;
20
+ }
21
+ return {
22
+ code: obj.code,
23
+ state: obj.state
24
+ };
25
+ };
26
+ /**
27
+ * Resolve the exact origin for `window.parent.postMessage`, or `null` if we
28
+ * can't establish a trusted embedder (caller must then NOT post). We never
29
+ * target `'*'`: the payload embeds PKCE material in `state`.
30
+ *
31
+ * 1. `ancestorOrigin` present (browser-set, unspoofable): trust iff Figma,
32
+ * else `null` — no fall-through to weaker signals.
33
+ * 2. No `ancestorOrigins`: fall back to `referrer`, but only if
34
+ * it's a Figma origin and not our own. (Payload's `/admin` -> `/admin/login`
35
+ * 307 leaves `referrer` as our own origin, never the embedder.)
36
+ * 3. Otherwise `null`.
37
+ */ export const resolveParentTargetOrigin = ({ ancestorOrigin, ownOrigin, referrer })=>{
38
+ if (ancestorOrigin != null) {
39
+ return isFigmaOrigin(ancestorOrigin) ? ancestorOrigin : null;
40
+ }
41
+ if (referrer) {
42
+ try {
43
+ const candidate = new URL(referrer).origin;
44
+ if (candidate !== ownOrigin && isFigmaOrigin(candidate)) {
45
+ return candidate;
46
+ }
47
+ } catch {
48
+ // unparseable referrer — fall through
49
+ }
50
+ }
51
+ return null;
52
+ };
53
+ /**
54
+ * Wire up the iframe auto-login flow:
55
+ * 1. Fetch the plugin's `/meta` endpoint to get the OAuth params for this
56
+ * flow — same params the regular `/admin/login` button would have used.
57
+ * 2. postMessage to the parent window:
58
+ * { type: 'mint-cms-oauth-code', client_id, redirect_uri, scope,
59
+ * code_challenge, code_challenge_method, state }
60
+ * The parent uses these to mint a code via Sinatra, then echoes `state`
61
+ * back so we can correlate response to request.
62
+ * 3. Listen for the parent's response.
63
+ * 4. On a valid Figma-origin response whose `state` matches what we sent,
64
+ * navigate to `${redirect_uri}?code=${code}&state=${state}` — the same
65
+ * URL shape the IdP uses when it 302s back into the manual flow.
66
+ * 5. `/sso/login` GET handler validates state.sig + PKCE verifier, exchanges
67
+ * the code, sets session cookies, and 302s to `/admin`.
68
+ *
69
+ * Returns a cleanup function that removes the listener and aborts the meta
70
+ * fetch — designed to be returned directly from a React useEffect.
71
+ */ export const setupIframeAutoLogin = (deps)=>{
72
+ const abortController = new AbortController();
73
+ // `flow` is captured atomically from the /meta response. Either both
74
+ // `redirectUri` and `state` are set (after the async fetch completes
75
+ // successfully), or it's null. Bundling them prevents handleMessage
76
+ // from using a half-populated state — e.g. an empty `redirectUri`
77
+ // producing a relative-URL navigation.
78
+ let flow = null;
79
+ const handleMessage = (event)=>{
80
+ // Parse first so we only log rejections for messages that were *intended*
81
+ // to be `cms-oauth-code`. Unrelated postMessages (browser extensions,
82
+ // devtools, etc.) return silently with no log noise.
83
+ const parsed = parseCmsOAuthCodeMessage(event.data);
84
+ if (!parsed) {
85
+ return;
86
+ }
87
+ if (!isFigmaOrigin(event.origin)) {
88
+ // eslint-disable-next-line no-console -- surface why auto-login didn't fire
89
+ console.error(`[payload iframe auto-login] rejected cms-oauth-code: origin "${event.origin}" is not in the Figma allowlist`);
90
+ return;
91
+ }
92
+ if (flow === null) {
93
+ // eslint-disable-next-line no-console -- surface why auto-login didn't fire
94
+ console.error('[payload iframe auto-login] rejected cms-oauth-code: message arrived before /meta resolved, so no expected state to compare against');
95
+ return;
96
+ }
97
+ if (parsed.state !== flow.state) {
98
+ // eslint-disable-next-line no-console -- surface why auto-login didn't fire
99
+ console.error('[payload iframe auto-login] rejected cms-oauth-code: state mismatch — the parent did not echo back the state the iframe sent');
100
+ return;
101
+ }
102
+ // /sso/login expects the same URL shape the IdP would have produced:
103
+ // ${redirect_uri}?code=…&state=…
104
+ deps.navigate(`${flow.redirectUri}?code=${encodeURIComponent(parsed.code)}&state=${encodeURIComponent(parsed.state)}`);
105
+ };
106
+ deps.win.addEventListener('message', handleMessage);
107
+ void (async ()=>{
108
+ try {
109
+ const metaRes = await deps.doFetch(deps.metaUrl, {
110
+ signal: abortController.signal
111
+ });
112
+ if (!metaRes.ok) {
113
+ // eslint-disable-next-line no-console -- surface auto-login failures to dev tools
114
+ console.warn(`[payload iframe auto-login] meta endpoint responded ${metaRes.status}`);
115
+ deps.onFailed?.();
116
+ return;
117
+ }
118
+ const meta = await metaRes.json();
119
+ const clientId = meta.params?.client_id;
120
+ const codeChallenge = meta.params?.code_challenge;
121
+ const codeChallengeMethod = meta.params?.code_challenge_method;
122
+ const redirect = meta.params?.redirect_uri;
123
+ const scope = meta.params?.scope;
124
+ const state = meta.params?.state;
125
+ if (typeof clientId !== 'string' || typeof codeChallenge !== 'string' || typeof codeChallengeMethod !== 'string' || typeof redirect !== 'string' || typeof scope !== 'string' || typeof state !== 'string') {
126
+ // eslint-disable-next-line no-console -- surface auto-login failures to dev tools
127
+ console.warn('[payload iframe auto-login] meta response missing required params');
128
+ deps.onFailed?.();
129
+ return;
130
+ }
131
+ if (abortController.signal.aborted) {
132
+ return;
133
+ }
134
+ // No trusted embedder origin: refuse to post (don't broadcast PKCE-bearing
135
+ // `state` to '*'). See `resolveParentTargetOrigin`.
136
+ if (deps.parentTargetOrigin === null) {
137
+ // eslint-disable-next-line no-console -- surface auto-login failures to dev tools
138
+ console.warn('[payload iframe auto-login] could not determine a trusted parent origin — falling back to manual login');
139
+ deps.onFailed?.();
140
+ return;
141
+ }
142
+ flow = {
143
+ redirectUri: redirect,
144
+ state
145
+ };
146
+ deps.postMessageToParent({
147
+ type: 'mint-cms-oauth-code',
148
+ client_id: clientId,
149
+ code_challenge: codeChallenge,
150
+ code_challenge_method: codeChallengeMethod,
151
+ redirect_uri: redirect,
152
+ scope,
153
+ state
154
+ }, deps.parentTargetOrigin);
155
+ } catch (err) {
156
+ if (abortController.signal.aborted) {
157
+ return;
158
+ }
159
+ // eslint-disable-next-line no-console -- surface auto-login failures to dev tools
160
+ console.warn('[payload iframe auto-login] failed to fetch meta', err);
161
+ deps.onFailed?.();
162
+ }
163
+ })();
164
+ return ()=>{
165
+ deps.win.removeEventListener('message', handleMessage);
166
+ abortController.abort();
167
+ };
168
+ };
@@ -6,4 +6,3 @@ type DefaultLoginButtonProps = {
6
6
  };
7
7
  export declare const DefaultLoginButton: React.FC<DefaultLoginButtonProps>;
8
8
  export {};
9
- //# sourceMappingURL=index.d.ts.map