@payloadcms/figma 0.0.1-alpha.1 → 0.0.1-alpha.11

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 (316) hide show
  1. package/dist/api/control-plane.d.ts.map +1 -1
  2. package/dist/api/control-plane.js +11 -16
  3. package/dist/api/control-plane.js.map +1 -1
  4. package/dist/api/figma-api.js +3 -3
  5. package/dist/api/figma-api.js.map +1 -1
  6. package/dist/auth/jwt-validator.js.map +1 -1
  7. package/dist/auth/oauth-flow.d.ts.map +1 -1
  8. package/dist/auth/oauth-flow.js +3 -6
  9. package/dist/auth/oauth-flow.js.map +1 -1
  10. package/dist/auth/project-token.d.ts.map +1 -1
  11. package/dist/auth/project-token.js +1 -4
  12. package/dist/auth/project-token.js.map +1 -1
  13. package/dist/auth/refresh.d.ts.map +1 -1
  14. package/dist/auth/refresh.js +19 -28
  15. package/dist/auth/refresh.js.map +1 -1
  16. package/dist/auth/types.d.ts +1 -1
  17. package/dist/auth/types.d.ts.map +1 -1
  18. package/dist/auth/types.js.map +1 -1
  19. package/dist/cli.js +1 -3
  20. package/dist/cli.js.map +1 -1
  21. package/dist/commands/deploy.d.ts.map +1 -1
  22. package/dist/commands/deploy.js +17 -10
  23. package/dist/commands/deploy.js.map +1 -1
  24. package/dist/commands/init.d.ts +4 -0
  25. package/dist/commands/init.d.ts.map +1 -1
  26. package/dist/commands/init.js +21 -85
  27. package/dist/commands/init.js.map +1 -1
  28. package/dist/commands/list-tokens.d.ts +1 -1
  29. package/dist/commands/list-tokens.d.ts.map +1 -1
  30. package/dist/commands/list-tokens.js +6 -5
  31. package/dist/commands/list-tokens.js.map +1 -1
  32. package/dist/commands/login.d.ts +2 -11
  33. package/dist/commands/login.d.ts.map +1 -1
  34. package/dist/commands/login.js +4 -7
  35. package/dist/commands/login.js.map +1 -1
  36. package/dist/commands/logout.d.ts +1 -1
  37. package/dist/commands/logout.js +1 -1
  38. package/dist/commands/logout.js.map +1 -1
  39. package/dist/db-adapter.d.ts +17 -0
  40. package/dist/db-adapter.d.ts.map +1 -0
  41. package/dist/db-adapter.js +757 -0
  42. package/dist/db-adapter.js.map +1 -0
  43. package/dist/endpoints/health.d.ts +3 -0
  44. package/dist/endpoints/health.d.ts.map +1 -0
  45. package/dist/endpoints/health.js +11 -0
  46. package/dist/endpoints/health.js.map +1 -0
  47. package/dist/exports/client.d.ts +3 -0
  48. package/dist/exports/client.d.ts.map +1 -0
  49. package/dist/exports/client.js +4 -0
  50. package/dist/exports/client.js.map +1 -0
  51. package/dist/oauth/components/LoginButton/index.d.ts +9 -0
  52. package/dist/oauth/components/LoginButton/index.d.ts.map +1 -0
  53. package/dist/oauth/components/LoginButton/index.js +52 -0
  54. package/dist/oauth/components/LoginButton/index.js.map +1 -0
  55. package/dist/oauth/components/LoginButton/index.scss +10 -0
  56. package/dist/oauth/components/LogoutButton/index.d.ts +7 -0
  57. package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -0
  58. package/dist/oauth/components/LogoutButton/index.js +67 -0
  59. package/dist/oauth/components/LogoutButton/index.js.map +1 -0
  60. package/dist/oauth/components/LogoutButton/index.scss +10 -0
  61. package/dist/oauth/defaults.d.ts +10 -0
  62. package/dist/oauth/defaults.d.ts.map +1 -0
  63. package/dist/oauth/defaults.js +91 -0
  64. package/dist/oauth/defaults.js.map +1 -0
  65. package/dist/oauth/endpoints/getLoginEndpoint.d.ts +13 -0
  66. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -0
  67. package/dist/oauth/endpoints/getLoginEndpoint.js +237 -0
  68. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -0
  69. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts +12 -0
  70. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +1 -0
  71. package/dist/oauth/endpoints/getLogoutEndpoint.js +99 -0
  72. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +1 -0
  73. package/dist/oauth/endpoints/getMetaEndpoint.d.ts +13 -0
  74. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +1 -0
  75. package/dist/oauth/endpoints/getMetaEndpoint.js +25 -0
  76. package/dist/oauth/endpoints/getMetaEndpoint.js.map +1 -0
  77. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts +13 -0
  78. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +1 -0
  79. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js +21 -0
  80. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +1 -0
  81. package/dist/oauth/exports/client.d.ts +3 -0
  82. package/dist/oauth/exports/client.d.ts.map +1 -0
  83. package/dist/oauth/exports/client.js +4 -0
  84. package/dist/oauth/exports/client.js.map +1 -0
  85. package/dist/oauth/hooks/afterLogout.d.ts +8 -0
  86. package/dist/oauth/hooks/afterLogout.d.ts.map +1 -0
  87. package/dist/oauth/hooks/afterLogout.js +27 -0
  88. package/dist/oauth/hooks/afterLogout.js.map +1 -0
  89. package/dist/oauth/hooks/me.d.ts +5 -0
  90. package/dist/oauth/hooks/me.d.ts.map +1 -0
  91. package/dist/oauth/hooks/me.js +55 -0
  92. package/dist/oauth/hooks/me.js.map +1 -0
  93. package/dist/oauth/hooks/refresh.d.ts +8 -0
  94. package/dist/oauth/hooks/refresh.d.ts.map +1 -0
  95. package/dist/oauth/hooks/refresh.js +91 -0
  96. package/dist/oauth/hooks/refresh.js.map +1 -0
  97. package/dist/oauth/index.d.ts +4 -0
  98. package/dist/oauth/index.d.ts.map +1 -0
  99. package/dist/oauth/index.js +222 -0
  100. package/dist/oauth/index.js.map +1 -0
  101. package/dist/oauth/strategy/index.d.ts +54 -0
  102. package/dist/oauth/strategy/index.d.ts.map +1 -0
  103. package/dist/oauth/strategy/index.js +280 -0
  104. package/dist/oauth/strategy/index.js.map +1 -0
  105. package/dist/oauth/types.d.ts +192 -0
  106. package/dist/oauth/types.d.ts.map +1 -0
  107. package/dist/oauth/types.js +3 -0
  108. package/dist/oauth/types.js.map +1 -0
  109. package/dist/oauth/utilities/clearCookie.d.ts +9 -0
  110. package/dist/oauth/utilities/clearCookie.d.ts.map +1 -0
  111. package/dist/oauth/utilities/clearCookie.js +21 -0
  112. package/dist/oauth/utilities/clearCookie.js.map +1 -0
  113. package/dist/oauth/utilities/createCookieOptions.d.ts +10 -0
  114. package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -0
  115. package/dist/oauth/utilities/createCookieOptions.js +42 -0
  116. package/dist/oauth/utilities/createCookieOptions.js.map +1 -0
  117. package/dist/oauth/utilities/createDebugLogger.d.ts +4 -0
  118. package/dist/oauth/utilities/createDebugLogger.d.ts.map +1 -0
  119. package/dist/oauth/utilities/createDebugLogger.js +16 -0
  120. package/dist/oauth/utilities/createDebugLogger.js.map +1 -0
  121. package/dist/oauth/utilities/extractOrigin.d.ts +2 -0
  122. package/dist/oauth/utilities/extractOrigin.d.ts.map +1 -0
  123. package/dist/oauth/utilities/extractOrigin.js +12 -0
  124. package/dist/oauth/utilities/extractOrigin.js.map +1 -0
  125. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts +3 -0
  126. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +1 -0
  127. package/dist/oauth/utilities/getAdminCollectionSlug.js +18 -0
  128. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +1 -0
  129. package/dist/oauth/utilities/getAdminPath.d.ts +8 -0
  130. package/dist/oauth/utilities/getAdminPath.d.ts.map +1 -0
  131. package/dist/oauth/utilities/getAdminPath.js +9 -0
  132. package/dist/oauth/utilities/getAdminPath.js.map +1 -0
  133. package/dist/oauth/utilities/getAuthorizeURL.d.ts +17 -0
  134. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +1 -0
  135. package/dist/oauth/utilities/getAuthorizeURL.js +45 -0
  136. package/dist/oauth/utilities/getAuthorizeURL.js.map +1 -0
  137. package/dist/oauth/utilities/getCookieExpiration.d.ts +4 -0
  138. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +1 -0
  139. package/dist/oauth/utilities/getCookieExpiration.js +11 -0
  140. package/dist/oauth/utilities/getCookieExpiration.js.map +1 -0
  141. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts +2 -0
  142. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +1 -0
  143. package/dist/oauth/utilities/getSecondsFromTokenExp.js +7 -0
  144. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +1 -0
  145. package/dist/oauth/utilities/getTokenExp.d.ts +6 -0
  146. package/dist/oauth/utilities/getTokenExp.d.ts.map +1 -0
  147. package/dist/oauth/utilities/getTokenExp.js +20 -0
  148. package/dist/oauth/utilities/getTokenExp.js.map +1 -0
  149. package/dist/oauth/utilities/getUsernameField.d.ts +9 -0
  150. package/dist/oauth/utilities/getUsernameField.d.ts.map +1 -0
  151. package/dist/oauth/utilities/getUsernameField.js +20 -0
  152. package/dist/oauth/utilities/getUsernameField.js.map +1 -0
  153. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts +8 -0
  154. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +1 -0
  155. package/dist/oauth/utilities/hasUserTokenPropsChanged.js +25 -0
  156. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +1 -0
  157. package/dist/oauth/utilities/mergeHeaders.d.ts +2 -0
  158. package/dist/oauth/utilities/mergeHeaders.d.ts.map +1 -0
  159. package/dist/oauth/utilities/mergeHeaders.js +37 -0
  160. package/dist/oauth/utilities/mergeHeaders.js.map +1 -0
  161. package/dist/oauth/utilities/refreshTokens.d.ts +16 -0
  162. package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -0
  163. package/dist/oauth/utilities/refreshTokens.js +67 -0
  164. package/dist/oauth/utilities/refreshTokens.js.map +1 -0
  165. package/dist/plugin/build-config.d.ts +7 -1
  166. package/dist/plugin/build-config.d.ts.map +1 -1
  167. package/dist/plugin/build-config.js +53 -3
  168. package/dist/plugin/build-config.js.map +1 -1
  169. package/dist/types/config.d.ts +0 -11
  170. package/dist/types/config.d.ts.map +1 -1
  171. package/dist/types/config.js +1 -1
  172. package/dist/types/config.js.map +1 -1
  173. package/dist/utils/config.d.ts +0 -22
  174. package/dist/utils/config.d.ts.map +1 -1
  175. package/dist/utils/config.js +0 -46
  176. package/dist/utils/config.js.map +1 -1
  177. package/dist/utils/messages.js +11 -11
  178. package/dist/utils/messages.js.map +1 -1
  179. package/dist/utils/payload-config-ast.d.ts +17 -1
  180. package/dist/utils/payload-config-ast.d.ts.map +1 -1
  181. package/dist/utils/payload-config-ast.js +166 -14
  182. package/dist/utils/payload-config-ast.js.map +1 -1
  183. package/dist/utils/payload-config-modifier.d.ts +2 -1
  184. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  185. package/dist/utils/payload-config-modifier.js +50 -79
  186. package/dist/utils/payload-config-modifier.js.map +1 -1
  187. package/dist/utils/payload-package-check.d.ts.map +1 -1
  188. package/dist/utils/payload-package-check.js +14 -33
  189. package/dist/utils/payload-package-check.js.map +1 -1
  190. package/dist/utils/project.d.ts +1 -1
  191. package/dist/utils/project.d.ts.map +1 -1
  192. package/dist/utils/project.js +3 -5
  193. package/dist/utils/project.js.map +1 -1
  194. package/dist/utils/s3-upload.d.ts.map +1 -1
  195. package/dist/utils/s3-upload.js +3 -8
  196. package/dist/utils/s3-upload.js.map +1 -1
  197. package/dist/utils/token-display.d.ts.map +1 -1
  198. package/dist/utils/token-display.js +3 -2
  199. package/dist/utils/token-display.js.map +1 -1
  200. package/package.json +9 -3
  201. package/dist/api/control-plane.spec.d.ts +0 -2
  202. package/dist/api/control-plane.spec.d.ts.map +0 -1
  203. package/dist/api/control-plane.spec.js +0 -296
  204. package/dist/api/control-plane.spec.js.map +0 -1
  205. package/dist/api/figma-api.spec.d.ts +0 -14
  206. package/dist/api/figma-api.spec.d.ts.map +0 -1
  207. package/dist/api/figma-api.spec.js +0 -201
  208. package/dist/api/figma-api.spec.js.map +0 -1
  209. package/dist/auth/__tests__/fixtures.d.ts +0 -26
  210. package/dist/auth/__tests__/fixtures.d.ts.map +0 -1
  211. package/dist/auth/__tests__/fixtures.js +0 -67
  212. package/dist/auth/__tests__/fixtures.js.map +0 -1
  213. package/dist/auth/__tests__/mocks.d.ts +0 -33
  214. package/dist/auth/__tests__/mocks.d.ts.map +0 -1
  215. package/dist/auth/__tests__/mocks.js +0 -63
  216. package/dist/auth/__tests__/mocks.js.map +0 -1
  217. package/dist/auth/callback-server.spec.d.ts +0 -2
  218. package/dist/auth/callback-server.spec.d.ts.map +0 -1
  219. package/dist/auth/callback-server.spec.js +0 -85
  220. package/dist/auth/callback-server.spec.js.map +0 -1
  221. package/dist/auth/crypto-utils.spec.d.ts +0 -2
  222. package/dist/auth/crypto-utils.spec.d.ts.map +0 -1
  223. package/dist/auth/crypto-utils.spec.js +0 -36
  224. package/dist/auth/crypto-utils.spec.js.map +0 -1
  225. package/dist/auth/jwt-validator.spec.d.ts +0 -10
  226. package/dist/auth/jwt-validator.spec.d.ts.map +0 -1
  227. package/dist/auth/jwt-validator.spec.js +0 -236
  228. package/dist/auth/jwt-validator.spec.js.map +0 -1
  229. package/dist/auth/oauth-flow.spec.d.ts +0 -2
  230. package/dist/auth/oauth-flow.spec.d.ts.map +0 -1
  231. package/dist/auth/oauth-flow.spec.js +0 -134
  232. package/dist/auth/oauth-flow.spec.js.map +0 -1
  233. package/dist/auth/pkce.spec.d.ts +0 -2
  234. package/dist/auth/pkce.spec.d.ts.map +0 -1
  235. package/dist/auth/pkce.spec.js +0 -32
  236. package/dist/auth/pkce.spec.js.map +0 -1
  237. package/dist/auth/project-token.spec.d.ts +0 -2
  238. package/dist/auth/project-token.spec.d.ts.map +0 -1
  239. package/dist/auth/project-token.spec.js +0 -332
  240. package/dist/auth/project-token.spec.js.map +0 -1
  241. package/dist/auth/refresh.spec.d.ts +0 -2
  242. package/dist/auth/refresh.spec.d.ts.map +0 -1
  243. package/dist/auth/refresh.spec.js +0 -105
  244. package/dist/auth/refresh.spec.js.map +0 -1
  245. package/dist/auth/token-store.spec.d.ts +0 -2
  246. package/dist/auth/token-store.spec.d.ts.map +0 -1
  247. package/dist/auth/token-store.spec.js +0 -276
  248. package/dist/auth/token-store.spec.js.map +0 -1
  249. package/dist/commands/__tests__/test-utils.d.ts +0 -28
  250. package/dist/commands/__tests__/test-utils.d.ts.map +0 -1
  251. package/dist/commands/__tests__/test-utils.js +0 -34
  252. package/dist/commands/__tests__/test-utils.js.map +0 -1
  253. package/dist/commands/deploy.spec.d.ts +0 -2
  254. package/dist/commands/deploy.spec.d.ts.map +0 -1
  255. package/dist/commands/deploy.spec.js +0 -18
  256. package/dist/commands/deploy.spec.js.map +0 -1
  257. package/dist/commands/init.spec.d.ts +0 -2
  258. package/dist/commands/init.spec.d.ts.map +0 -1
  259. package/dist/commands/init.spec.js +0 -283
  260. package/dist/commands/init.spec.js.map +0 -1
  261. package/dist/plugin/build-config.spec.d.ts +0 -2
  262. package/dist/plugin/build-config.spec.d.ts.map +0 -1
  263. package/dist/plugin/build-config.spec.js +0 -72
  264. package/dist/plugin/build-config.spec.js.map +0 -1
  265. package/dist/utils/asset-collection.spec.d.ts +0 -2
  266. package/dist/utils/asset-collection.spec.d.ts.map +0 -1
  267. package/dist/utils/asset-collection.spec.js +0 -155
  268. package/dist/utils/asset-collection.spec.js.map +0 -1
  269. package/dist/utils/build-detection.spec.d.ts +0 -2
  270. package/dist/utils/build-detection.spec.d.ts.map +0 -1
  271. package/dist/utils/build-detection.spec.js +0 -110
  272. package/dist/utils/build-detection.spec.js.map +0 -1
  273. package/dist/utils/config.spec.d.ts +0 -2
  274. package/dist/utils/config.spec.d.ts.map +0 -1
  275. package/dist/utils/config.spec.js +0 -167
  276. package/dist/utils/config.spec.js.map +0 -1
  277. package/dist/utils/download-template.spec.d.ts +0 -2
  278. package/dist/utils/download-template.spec.d.ts.map +0 -1
  279. package/dist/utils/download-template.spec.js +0 -76
  280. package/dist/utils/download-template.spec.js.map +0 -1
  281. package/dist/utils/env-management.spec.d.ts +0 -2
  282. package/dist/utils/env-management.spec.d.ts.map +0 -1
  283. package/dist/utils/env-management.spec.js +0 -123
  284. package/dist/utils/env-management.spec.js.map +0 -1
  285. package/dist/utils/git.spec.d.ts +0 -2
  286. package/dist/utils/git.spec.d.ts.map +0 -1
  287. package/dist/utils/git.spec.js +0 -99
  288. package/dist/utils/git.spec.js.map +0 -1
  289. package/dist/utils/lambda-config.spec.d.ts +0 -2
  290. package/dist/utils/lambda-config.spec.d.ts.map +0 -1
  291. package/dist/utils/lambda-config.spec.js +0 -141
  292. package/dist/utils/lambda-config.spec.js.map +0 -1
  293. package/dist/utils/payload-config-ast.spec.d.ts +0 -2
  294. package/dist/utils/payload-config-ast.spec.d.ts.map +0 -1
  295. package/dist/utils/payload-config-ast.spec.js +0 -303
  296. package/dist/utils/payload-config-ast.spec.js.map +0 -1
  297. package/dist/utils/payload-config-modifier.int.spec.d.ts +0 -2
  298. package/dist/utils/payload-config-modifier.int.spec.d.ts.map +0 -1
  299. package/dist/utils/payload-config-modifier.int.spec.js +0 -116
  300. package/dist/utils/payload-config-modifier.int.spec.js.map +0 -1
  301. package/dist/utils/payload-config-modifier.spec.d.ts +0 -2
  302. package/dist/utils/payload-config-modifier.spec.d.ts.map +0 -1
  303. package/dist/utils/payload-config-modifier.spec.js +0 -162
  304. package/dist/utils/payload-config-modifier.spec.js.map +0 -1
  305. package/dist/utils/payload-package-check.spec.d.ts +0 -2
  306. package/dist/utils/payload-package-check.spec.d.ts.map +0 -1
  307. package/dist/utils/payload-package-check.spec.js +0 -148
  308. package/dist/utils/payload-package-check.spec.js.map +0 -1
  309. package/dist/utils/project.spec.d.ts +0 -2
  310. package/dist/utils/project.spec.d.ts.map +0 -1
  311. package/dist/utils/project.spec.js +0 -222
  312. package/dist/utils/project.spec.js.map +0 -1
  313. package/dist/utils/s3-upload.spec.d.ts +0 -2
  314. package/dist/utils/s3-upload.spec.d.ts.map +0 -1
  315. package/dist/utils/s3-upload.spec.js +0 -140
  316. package/dist/utils/s3-upload.spec.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/control-plane.spec.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport {\n createDeployment,\n createTenant,\n getTenantDetails,\n listTenants,\n performDeployment,\n} from './control-plane.js'\n\ndescribe('control-plane API (mocked)', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n afterEach(() => {\n vi.restoreAllMocks()\n })\n\n describe('listTenants', () => {\n it('should return array of tenant instances', async () => {\n const tenants = await listTenants('mock-access-token')\n\n expect(Array.isArray(tenants)).toBe(true)\n expect(tenants.length).toBeGreaterThan(0)\n })\n\n it('should return tenants with required fields', async () => {\n const tenants = await listTenants('mock-access-token')\n\n tenants.forEach((tenant) => {\n expect(tenant).toHaveProperty('id')\n expect(tenant).toHaveProperty('domain')\n expect(tenant).toHaveProperty('status')\n expect(tenant).toHaveProperty('parentType')\n expect(tenant).toHaveProperty('parentId')\n expect(tenant).toHaveProperty('createdAt')\n })\n })\n\n it('should return tenants with valid status', async () => {\n const tenants = await listTenants('mock-access-token')\n\n tenants.forEach((tenant) => {\n expect(['active', 'provisioning', 'inactive']).toContain(tenant.status)\n })\n })\n\n it('should return tenants with valid parentType', async () => {\n const tenants = await listTenants('mock-access-token')\n\n tenants.forEach((tenant) => {\n expect(['team', 'org', 'workspace']).toContain(tenant.parentType)\n })\n })\n\n it('should handle different access tokens', async () => {\n const tenants1 = await listTenants('token-1')\n const tenants2 = await listTenants('token-2')\n\n // Mock should return same structure regardless of token\n expect(tenants1.length).toBe(tenants2.length)\n })\n })\n\n describe('createTenant', () => {\n it('should create tenant with name', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'test-cms',\n })\n\n expect(tenant).toHaveProperty('id')\n expect(tenant).toHaveProperty('domain')\n expect(tenant.domain).toContain('test-cms')\n })\n\n it('should return tenant with provisioning status', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'new-cms',\n })\n\n expect(tenant.status).toBe('provisioning')\n })\n\n it('should generate unique tenant IDs', async () => {\n const tenant1 = await createTenant('mock-access-token', {\n name: 'cms-1',\n })\n const tenant2 = await createTenant('mock-access-token', {\n name: 'cms-2',\n })\n\n expect(tenant1.id).not.toBe(tenant2.id)\n })\n\n it('should handle names with special characters', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'My Test CMS 123!',\n })\n\n // Should convert to slug format\n expect(tenant.domain).toMatch(/^[a-z0-9-]+\\.figmacms\\.com$/)\n })\n\n it('should include optional parent fields', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'test-cms',\n parentId: 'org_custom',\n parentType: 'org',\n })\n\n expect(tenant.parentType).toBe('org')\n expect(tenant.parentId).toBe('org_custom')\n })\n\n it('should default to team parent type', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'test-cms',\n })\n\n expect(tenant.parentType).toBe('team')\n })\n\n it('should include createdAt timestamp', async () => {\n const tenant = await createTenant('mock-access-token', {\n name: 'test-cms',\n })\n\n expect(tenant.createdAt).toBeDefined()\n expect(new Date(tenant.createdAt!).getTime()).toBeGreaterThan(0)\n })\n })\n\n describe('getTenantDetails', () => {\n it('should return tenant details for given ID', async () => {\n const tenant = await getTenantDetails('mock-access-token', 'tenant_abc123')\n\n expect(tenant).toHaveProperty('id')\n expect(tenant.id).toBe('tenant_abc123')\n })\n\n it('should return tenant with all required fields', async () => {\n const tenant = await getTenantDetails('mock-access-token', 'tenant_test')\n\n expect(tenant).toHaveProperty('id')\n expect(tenant).toHaveProperty('domain')\n expect(tenant).toHaveProperty('status')\n expect(tenant).toHaveProperty('parentType')\n expect(tenant).toHaveProperty('parentId')\n expect(tenant).toHaveProperty('createdAt')\n })\n\n it('should return active status for mock tenant', async () => {\n const tenant = await getTenantDetails('mock-access-token', 'tenant_test')\n\n expect(tenant.status).toBe('active')\n })\n\n it('should handle different tenant IDs', async () => {\n const tenant1 = await getTenantDetails('mock-access-token', 'tenant_1')\n const tenant2 = await getTenantDetails('mock-access-token', 'tenant_2')\n\n expect(tenant1.id).toBe('tenant_1')\n expect(tenant2.id).toBe('tenant_2')\n })\n })\n\n describe('createDeployment', () => {\n it('should return deployment ID and upload URLs', async () => {\n const result = await createDeployment('mock-token', 'tenant_123', {\n staticAssets: ['_next/static/abc.js', '_next/static/xyz.css'],\n })\n\n expect(result).toHaveProperty('deploymentId')\n expect(result).toHaveProperty('codeUploadUrl')\n expect(result).toHaveProperty('staticAssetUploadUrls')\n expect(result.deploymentId).toMatch(/^deploy_/)\n })\n\n it('should include upload URL for each static asset', async () => {\n const result = await createDeployment('mock-token', 'tenant_456', {\n staticAssets: ['_next/static/abc.js', '_next/static/xyz.css'],\n })\n\n expect(result.staticAssetUploadUrls).toHaveProperty('_next/static/abc.js')\n expect(result.staticAssetUploadUrls).toHaveProperty('_next/static/xyz.css')\n expect(result.staticAssetUploadUrls['_next/static/abc.js']).toContain('https://')\n })\n\n it('should return S3 upload URL format', async () => {\n const result = await createDeployment('mock-token', 'tenant_789', {\n staticAssets: ['_next/static/test.js'],\n })\n\n expect(result.codeUploadUrl).toMatch(/^https:\\/\\/.*\\.s3\\..*\\.amazonaws\\.com\\//)\n expect(result.staticAssetUploadUrls['_next/static/test.js']).toMatch(\n /^https:\\/\\/.*\\.s3\\..*\\.amazonaws\\.com\\//,\n )\n })\n\n it('should handle empty static assets array', async () => {\n const result = await createDeployment('mock-token', 'tenant_empty', {\n staticAssets: [],\n })\n\n expect(result.deploymentId).toBeDefined()\n expect(result.codeUploadUrl).toBeDefined()\n expect(Object.keys(result.staticAssetUploadUrls)).toHaveLength(0)\n })\n\n it('should generate unique deployment IDs', async () => {\n const result1 = await createDeployment('mock-token', 'tenant_abc', {\n staticAssets: [],\n })\n const result2 = await createDeployment('mock-token', 'tenant_abc', {\n staticAssets: [],\n })\n\n expect(result1.deploymentId).not.toBe(result2.deploymentId)\n })\n })\n\n describe('performDeployment', () => {\n it('should deploy using deployment ID', async () => {\n const result = await performDeployment('mock-token', 'tenant_123', {\n deploymentId: 'deploy_abc123',\n })\n\n expect(result).toHaveProperty('deploymentId')\n expect(result).toHaveProperty('message')\n expect(result.deploymentId).toBe('deploy_abc123')\n })\n\n it('should return success message', async () => {\n const result = await performDeployment('mock-token', 'tenant_456', {\n deploymentId: 'deploy_xyz789',\n })\n\n expect(result.message).toBeDefined()\n expect(result.message).toBe('Deployment initiated successfully')\n expect(result.message.length).toBeGreaterThan(0)\n })\n\n it('should handle different tenant IDs', async () => {\n const result1 = await performDeployment('mock-token', 'tenant_aaa', {\n deploymentId: 'deploy_1',\n })\n const result2 = await performDeployment('mock-token', 'tenant_bbb', {\n deploymentId: 'deploy_2',\n })\n\n expect(result1.deploymentId).toBe('deploy_1')\n expect(result2.deploymentId).toBe('deploy_2')\n })\n })\n\n describe('error handling', () => {\n beforeEach(() => {\n // Force real API mode for error testing\n process.env.FIGMA_MOCK_CONTROL_PLANE = 'false'\n })\n\n afterEach(() => {\n // Restore mock mode\n delete process.env.FIGMA_MOCK_CONTROL_PLANE\n })\n\n it('createDeployment should throw ControlPlaneError on API failure', async () => {\n // Mock fetch to return error\n global.fetch = vi.fn().mockResolvedValue({\n ok: false,\n status: 500,\n statusText: 'Internal Server Error',\n })\n\n await expect(\n createDeployment('bad-token', 'tenant_fail', { staticAssets: [] }),\n ).rejects.toThrow('Failed to create deployment: 500 Internal Server Error')\n })\n\n it('performDeployment should throw ControlPlaneError on API failure', async () => {\n // Mock fetch to return error\n global.fetch = vi.fn().mockResolvedValue({\n ok: false,\n status: 404,\n statusText: 'Not Found',\n })\n\n await expect(\n performDeployment('bad-token', 'tenant_missing', {\n deploymentId: 'deploy_notfound',\n }),\n ).rejects.toThrow('Failed to perform deployment: 404 Not Found')\n })\n\n it('createDeployment should map snake_case API response to camelCase', async () => {\n // Mock fetch to return successful API response with snake_case\n global.fetch = vi.fn().mockResolvedValue({\n json: () => ({\n error: false,\n meta: {\n code_upload_url: 'https://s3.amazonaws.com/code/upload',\n deployment_id: 'deploy_test123',\n static_asset_upload_urls: {\n '_next/static/test.js': 'https://s3.amazonaws.com/static/test.js',\n },\n },\n status: 200,\n }),\n ok: true,\n })\n\n const result = await createDeployment('token', 'tenant_123', {\n staticAssets: ['_next/static/test.js'],\n })\n\n // Verify response is mapped to camelCase\n expect(result.deploymentId).toBe('deploy_test123')\n expect(result.codeUploadUrl).toBe('https://s3.amazonaws.com/code/upload')\n expect(result.staticAssetUploadUrls).toEqual({\n '_next/static/test.js': 'https://s3.amazonaws.com/static/test.js',\n })\n })\n\n it('performDeployment should map snake_case API response to camelCase', async () => {\n // Mock fetch to return successful API response with snake_case\n global.fetch = vi.fn().mockResolvedValue({\n json: () => ({\n error: false,\n meta: {\n deployment_id: 'deploy_abc456',\n message: 'Deployment successful',\n status: 'deployed',\n },\n status: 200,\n }),\n ok: true,\n })\n\n const result = await performDeployment('token', 'tenant_456', {\n deploymentId: 'deploy_abc456',\n })\n\n // Verify response is mapped to camelCase\n expect(result.deploymentId).toBe('deploy_abc456')\n expect(result.message).toBe('Deployment successful')\n })\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","it","vi","createDeployment","createTenant","getTenantDetails","listTenants","performDeployment","clearAllMocks","restoreAllMocks","tenants","Array","isArray","toBe","length","toBeGreaterThan","forEach","tenant","toHaveProperty","toContain","status","parentType","tenants1","tenants2","name","domain","tenant1","tenant2","id","not","toMatch","parentId","createdAt","toBeDefined","Date","getTime","result","staticAssets","deploymentId","staticAssetUploadUrls","codeUploadUrl","Object","keys","toHaveLength","result1","result2","message","process","env","FIGMA_MOCK_CONTROL_PLANE","global","fetch","fn","mockResolvedValue","ok","statusText","rejects","toThrow","json","error","meta","code_upload_url","deployment_id","static_asset_upload_urls","toEqual"],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Tests JWT parsing helpers and validates mock API contract.
3
- *
4
- * NOTE: The Figma API is currently mocked for development.
5
- *
6
- * These tests verify:
7
- * 1. JWT parsing helper functions (our code)
8
- * 2. JWT structure matches expected Figma API contract
9
- * 3. Mock responses are consistent for development
10
- *
11
- * TODO: Replace with integration tests when real API is available
12
- */
13
- export {};
14
- //# sourceMappingURL=figma-api.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"figma-api.spec.d.ts","sourceRoot":"","sources":["../../src/api/figma-api.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,201 +0,0 @@
1
- /**
2
- * Tests JWT parsing helpers and validates mock API contract.
3
- *
4
- * NOTE: The Figma API is currently mocked for development.
5
- *
6
- * These tests verify:
7
- * 1. JWT parsing helper functions (our code)
8
- * 2. JWT structure matches expected Figma API contract
9
- * 3. Mock responses are consistent for development
10
- *
11
- * TODO: Replace with integration tests when real API is available
12
- */ import { describe, expect, it } from 'vitest';
13
- import { getProjectToken } from './figma-api.js';
14
- /**
15
- * Helper function to decode base64url JWT part
16
- */ function decodeJwtPart(part) {
17
- const base64 = part.replace(/-/g, '+').replace(/_/g, '/');
18
- const padded = base64.padEnd(base64.length + (4 - base64.length % 4) % 4, '=');
19
- return Buffer.from(padded, 'base64').toString('utf-8');
20
- }
21
- /**
22
- * Helper function to parse JWT header
23
- */ function parseJwtHeader(token) {
24
- const headerPart = token.split('.')[0];
25
- return JSON.parse(decodeJwtPart(headerPart));
26
- }
27
- /**
28
- * Helper function to parse JWT payload
29
- */ function parseJwtPayload(token) {
30
- const payloadPart = token.split('.')[1];
31
- return JSON.parse(decodeJwtPart(payloadPart));
32
- }
33
- describe('Figma API Client', ()=>{
34
- const mockAccessToken = 'figt_mock_access_token';
35
- const mockTenantId = 'tenant-123';
36
- describe('getProjectToken', ()=>{
37
- // TODO: Remove/modify this when real API is available
38
- describe('mock implementation', ()=>{
39
- it('should generate valid project token', async ()=>{
40
- const result = await getProjectToken(mockAccessToken, mockTenantId);
41
- expect(result).toHaveProperty('token');
42
- expect(result).toHaveProperty('expiresAt');
43
- expect(result).toHaveProperty('tenantId');
44
- expect(result.tenantId).toBe(mockTenantId);
45
- });
46
- it('should generate JWT in correct format', async ()=>{
47
- const result = await getProjectToken(mockAccessToken, mockTenantId);
48
- // JWT should be three base64url parts separated by dots
49
- const parts = result.token.split('.');
50
- expect(parts).toHaveLength(3);
51
- });
52
- it('should include valid expiry time', async ()=>{
53
- const before = Date.now();
54
- const result = await getProjectToken(mockAccessToken, mockTenantId);
55
- const after = Date.now();
56
- // Token should expire in ~25 minutes (mock generates 25 min expiry)
57
- const expectedMin = before + 24 * 60 * 1000 // 24 minutes
58
- ;
59
- const expectedMax = after + 26 * 60 * 1000 // 26 minutes
60
- ;
61
- expect(result.expiresAt).toBeGreaterThan(expectedMin);
62
- expect(result.expiresAt).toBeLessThan(expectedMax);
63
- });
64
- it('should generate unique tokens on multiple calls', async ()=>{
65
- const token1 = await getProjectToken(mockAccessToken, mockTenantId);
66
- const token2 = await getProjectToken(mockAccessToken, mockTenantId);
67
- // Tokens should be unique (signatures will differ)
68
- expect(token1.token).not.toBe(token2.token);
69
- });
70
- });
71
- describe('JWT structure and claims', ()=>{
72
- it('should generate JWT with RS256 algorithm in header', async ()=>{
73
- const result = await getProjectToken(mockAccessToken, mockTenantId);
74
- const header = parseJwtHeader(result.token);
75
- expect(header.alg).toBe('RS256');
76
- expect(header.typ).toBe('JWT');
77
- });
78
- it('should include required claims in payload', async ()=>{
79
- const result = await getProjectToken(mockAccessToken, mockTenantId);
80
- const payload = parseJwtPayload(result.token);
81
- expect(payload).toHaveProperty('exp');
82
- expect(payload).toHaveProperty('iat');
83
- expect(payload).toHaveProperty('aud');
84
- expect(payload.aud).toBe(mockTenantId);
85
- });
86
- it('should have exp claim as numeric timestamp', async ()=>{
87
- const result = await getProjectToken(mockAccessToken, mockTenantId);
88
- const payload = parseJwtPayload(result.token);
89
- expect(typeof payload.exp).toBe('number');
90
- expect(payload.exp).toBeGreaterThan(Date.now() / 1000); // Should be in future
91
- });
92
- it('should have iat claim as current timestamp', async ()=>{
93
- const before = Math.floor(Date.now() / 1000);
94
- const result = await getProjectToken(mockAccessToken, mockTenantId);
95
- const after = Math.floor(Date.now() / 1000);
96
- const payload = parseJwtPayload(result.token);
97
- expect(payload.iat).toBeGreaterThanOrEqual(before);
98
- expect(payload.iat).toBeLessThanOrEqual(after);
99
- });
100
- it('should convert exp from seconds to milliseconds in expiresAt', async ()=>{
101
- const result = await getProjectToken(mockAccessToken, mockTenantId);
102
- const payload = parseJwtPayload(result.token);
103
- // expiresAt should be exp * 1000 (converted to milliseconds)
104
- expect(result.expiresAt).toBe(payload.exp * 1000);
105
- });
106
- });
107
- describe('JWT expiry parsing', ()=>{
108
- it('should correctly parse expiry from generated JWT', async ()=>{
109
- const result = await getProjectToken(mockAccessToken, mockTenantId);
110
- // expiresAt should be a valid timestamp in milliseconds
111
- expect(typeof result.expiresAt).toBe('number');
112
- expect(result.expiresAt).toBeGreaterThan(Date.now());
113
- // Should be ~25 minutes in the future
114
- const expectedExpiry = Date.now() + 25 * 60 * 1000;
115
- const tolerance = 2 * 60 * 1000 // 2 minutes tolerance
116
- ;
117
- expect(Math.abs(result.expiresAt - expectedExpiry)).toBeLessThan(tolerance);
118
- });
119
- it('should handle JWT with past expiry date', async ()=>{
120
- // This tests that parsing works even for expired tokens
121
- // (validation happens later in jwt-validator)
122
- const result = await getProjectToken(mockAccessToken, mockTenantId);
123
- // Should parse without throwing, even if theoretically expired
124
- expect(result.expiresAt).toBeDefined();
125
- expect(typeof result.expiresAt).toBe('number');
126
- });
127
- it('should handle JWT with far future expiry', async ()=>{
128
- const result = await getProjectToken(mockAccessToken, mockTenantId);
129
- // expiresAt should be reasonable (within next 30 days)
130
- const maxFuture = Date.now() + 30 * 24 * 60 * 60 * 1000;
131
- expect(result.expiresAt).toBeLessThan(maxFuture);
132
- });
133
- });
134
- describe('error handling', ()=>{
135
- it('should handle empty access token', async ()=>{
136
- // Mock implementation doesn't validate access token, but real impl will
137
- // For now, this should still work
138
- const result = await getProjectToken('', mockTenantId);
139
- expect(result).toHaveProperty('token');
140
- });
141
- it('should handle empty tenant ID', async ()=>{
142
- // Mock implementation should handle this
143
- const result = await getProjectToken(mockAccessToken, '');
144
- expect(result.tenantId).toBe('');
145
- });
146
- it('should handle special characters in tenant ID', async ()=>{
147
- const specialTenantId = 'tenant-with-special_chars.123';
148
- const result = await getProjectToken(mockAccessToken, specialTenantId);
149
- expect(result.tenantId).toBe(specialTenantId);
150
- });
151
- });
152
- });
153
- describe('JWT format edge cases', ()=>{
154
- it('should generate base64url encoded parts (no + / =)', async ()=>{
155
- const result = await getProjectToken(mockAccessToken, mockTenantId);
156
- // Base64url should not contain +, /, or =
157
- expect(result.token).not.toMatch(/[+/=]/);
158
- });
159
- it('should generate decodable header and payload', async ()=>{
160
- const result = await getProjectToken(mockAccessToken, mockTenantId);
161
- // Should be able to decode without errors
162
- expect(()=>parseJwtHeader(result.token)).not.toThrow();
163
- expect(()=>parseJwtPayload(result.token)).not.toThrow();
164
- });
165
- it('should generate valid JSON in payload', async ()=>{
166
- const result = await getProjectToken(mockAccessToken, mockTenantId);
167
- const payload = parseJwtPayload(result.token);
168
- // Should be a valid object with expected structure
169
- expect(payload).toBeTypeOf('object');
170
- expect(payload).not.toBeNull();
171
- });
172
- });
173
- describe('return value structure', ()=>{
174
- it('should return ProjectToken with all required fields', async ()=>{
175
- const result = await getProjectToken(mockAccessToken, mockTenantId);
176
- expect(result).toHaveProperty('token');
177
- expect(result).toHaveProperty('expiresAt');
178
- expect(result).toHaveProperty('tenantId');
179
- expect(typeof result.token).toBe('string');
180
- expect(typeof result.expiresAt).toBe('number');
181
- expect(typeof result.tenantId).toBe('string');
182
- });
183
- it('should not include claims in initial response', async ()=>{
184
- const result = await getProjectToken(mockAccessToken, mockTenantId);
185
- // Claims are added after JWT validation, not in API response
186
- expect(result).not.toHaveProperty('claims');
187
- });
188
- it('should match ProjectToken interface', async ()=>{
189
- const result = await getProjectToken(mockAccessToken, mockTenantId);
190
- // Verify structure matches ProjectToken interface
191
- const keys = Object.keys(result).sort();
192
- expect(keys).toEqual([
193
- 'expiresAt',
194
- 'tenantId',
195
- 'token'
196
- ]);
197
- });
198
- });
199
- });
200
-
201
- //# sourceMappingURL=figma-api.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/api/figma-api.spec.ts"],"sourcesContent":["/**\n * Tests JWT parsing helpers and validates mock API contract.\n *\n * NOTE: The Figma API is currently mocked for development.\n *\n * These tests verify:\n * 1. JWT parsing helper functions (our code)\n * 2. JWT structure matches expected Figma API contract\n * 3. Mock responses are consistent for development\n *\n * TODO: Replace with integration tests when real API is available\n */\n\nimport { describe, expect, it } from 'vitest'\n\nimport { getProjectToken } from './figma-api.js'\n\n/**\n * Helper function to decode base64url JWT part\n */\nfunction decodeJwtPart(part: string): string {\n const base64 = part.replace(/-/g, '+').replace(/_/g, '/')\n const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=')\n return Buffer.from(padded, 'base64').toString('utf-8')\n}\n\n/**\n * Helper function to parse JWT header\n */\nfunction parseJwtHeader(token: string): { alg: string; typ: string } {\n const headerPart = token.split('.')[0]\n return JSON.parse(decodeJwtPart(headerPart))\n}\n\n/**\n * Helper function to parse JWT payload\n */\nfunction parseJwtPayload(token: string): {\n aud?: string\n email?: string\n exp?: number\n iat?: number\n sub?: string\n} {\n const payloadPart = token.split('.')[1]\n return JSON.parse(decodeJwtPart(payloadPart))\n}\n\ndescribe('Figma API Client', () => {\n const mockAccessToken = 'figt_mock_access_token'\n const mockTenantId = 'tenant-123'\n\n describe('getProjectToken', () => {\n // TODO: Remove/modify this when real API is available\n describe('mock implementation', () => {\n it('should generate valid project token', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n expect(result).toHaveProperty('token')\n expect(result).toHaveProperty('expiresAt')\n expect(result).toHaveProperty('tenantId')\n expect(result.tenantId).toBe(mockTenantId)\n })\n\n it('should generate JWT in correct format', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // JWT should be three base64url parts separated by dots\n const parts = result.token.split('.')\n expect(parts).toHaveLength(3)\n })\n\n it('should include valid expiry time', async () => {\n const before = Date.now()\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const after = Date.now()\n\n // Token should expire in ~25 minutes (mock generates 25 min expiry)\n const expectedMin = before + 24 * 60 * 1000 // 24 minutes\n const expectedMax = after + 26 * 60 * 1000 // 26 minutes\n\n expect(result.expiresAt).toBeGreaterThan(expectedMin)\n expect(result.expiresAt).toBeLessThan(expectedMax)\n })\n\n it('should generate unique tokens on multiple calls', async () => {\n const token1 = await getProjectToken(mockAccessToken, mockTenantId)\n const token2 = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Tokens should be unique (signatures will differ)\n expect(token1.token).not.toBe(token2.token)\n })\n })\n\n describe('JWT structure and claims', () => {\n it('should generate JWT with RS256 algorithm in header', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const header = parseJwtHeader(result.token)\n\n expect(header.alg).toBe('RS256')\n expect(header.typ).toBe('JWT')\n })\n\n it('should include required claims in payload', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const payload = parseJwtPayload(result.token)\n\n expect(payload).toHaveProperty('exp')\n expect(payload).toHaveProperty('iat')\n expect(payload).toHaveProperty('aud')\n expect(payload.aud).toBe(mockTenantId)\n })\n\n it('should have exp claim as numeric timestamp', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const payload = parseJwtPayload(result.token)\n\n expect(typeof payload.exp).toBe('number')\n expect(payload.exp).toBeGreaterThan(Date.now() / 1000) // Should be in future\n })\n\n it('should have iat claim as current timestamp', async () => {\n const before = Math.floor(Date.now() / 1000)\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const after = Math.floor(Date.now() / 1000)\n\n const payload = parseJwtPayload(result.token)\n\n expect(payload.iat).toBeGreaterThanOrEqual(before)\n expect(payload.iat).toBeLessThanOrEqual(after)\n })\n\n it('should convert exp from seconds to milliseconds in expiresAt', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const payload = parseJwtPayload(result.token)\n\n // expiresAt should be exp * 1000 (converted to milliseconds)\n expect(result.expiresAt).toBe(payload.exp! * 1000)\n })\n })\n\n describe('JWT expiry parsing', () => {\n it('should correctly parse expiry from generated JWT', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // expiresAt should be a valid timestamp in milliseconds\n expect(typeof result.expiresAt).toBe('number')\n expect(result.expiresAt).toBeGreaterThan(Date.now())\n\n // Should be ~25 minutes in the future\n const expectedExpiry = Date.now() + 25 * 60 * 1000\n const tolerance = 2 * 60 * 1000 // 2 minutes tolerance\n expect(Math.abs(result.expiresAt - expectedExpiry)).toBeLessThan(tolerance)\n })\n\n it('should handle JWT with past expiry date', async () => {\n // This tests that parsing works even for expired tokens\n // (validation happens later in jwt-validator)\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Should parse without throwing, even if theoretically expired\n expect(result.expiresAt).toBeDefined()\n expect(typeof result.expiresAt).toBe('number')\n })\n\n it('should handle JWT with far future expiry', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // expiresAt should be reasonable (within next 30 days)\n const maxFuture = Date.now() + 30 * 24 * 60 * 60 * 1000\n expect(result.expiresAt).toBeLessThan(maxFuture)\n })\n })\n\n describe('error handling', () => {\n it('should handle empty access token', async () => {\n // Mock implementation doesn't validate access token, but real impl will\n // For now, this should still work\n const result = await getProjectToken('', mockTenantId)\n expect(result).toHaveProperty('token')\n })\n\n it('should handle empty tenant ID', async () => {\n // Mock implementation should handle this\n const result = await getProjectToken(mockAccessToken, '')\n expect(result.tenantId).toBe('')\n })\n\n it('should handle special characters in tenant ID', async () => {\n const specialTenantId = 'tenant-with-special_chars.123'\n const result = await getProjectToken(mockAccessToken, specialTenantId)\n\n expect(result.tenantId).toBe(specialTenantId)\n })\n })\n })\n\n describe('JWT format edge cases', () => {\n it('should generate base64url encoded parts (no + / =)', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Base64url should not contain +, /, or =\n expect(result.token).not.toMatch(/[+/=]/)\n })\n\n it('should generate decodable header and payload', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Should be able to decode without errors\n expect(() => parseJwtHeader(result.token)).not.toThrow()\n expect(() => parseJwtPayload(result.token)).not.toThrow()\n })\n\n it('should generate valid JSON in payload', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n const payload = parseJwtPayload(result.token)\n\n // Should be a valid object with expected structure\n expect(payload).toBeTypeOf('object')\n expect(payload).not.toBeNull()\n })\n })\n\n describe('return value structure', () => {\n it('should return ProjectToken with all required fields', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n expect(result).toHaveProperty('token')\n expect(result).toHaveProperty('expiresAt')\n expect(result).toHaveProperty('tenantId')\n expect(typeof result.token).toBe('string')\n expect(typeof result.expiresAt).toBe('number')\n expect(typeof result.tenantId).toBe('string')\n })\n\n it('should not include claims in initial response', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Claims are added after JWT validation, not in API response\n expect(result).not.toHaveProperty('claims')\n })\n\n it('should match ProjectToken interface', async () => {\n const result = await getProjectToken(mockAccessToken, mockTenantId)\n\n // Verify structure matches ProjectToken interface\n const keys = Object.keys(result).sort()\n expect(keys).toEqual(['expiresAt', 'tenantId', 'token'])\n })\n })\n})\n"],"names":["describe","expect","it","getProjectToken","decodeJwtPart","part","base64","replace","padded","padEnd","length","Buffer","from","toString","parseJwtHeader","token","headerPart","split","JSON","parse","parseJwtPayload","payloadPart","mockAccessToken","mockTenantId","result","toHaveProperty","tenantId","toBe","parts","toHaveLength","before","Date","now","after","expectedMin","expectedMax","expiresAt","toBeGreaterThan","toBeLessThan","token1","token2","not","header","alg","typ","payload","aud","exp","Math","floor","iat","toBeGreaterThanOrEqual","toBeLessThanOrEqual","expectedExpiry","tolerance","abs","toBeDefined","maxFuture","specialTenantId","toMatch","toThrow","toBeTypeOf","toBeNull","keys","Object","sort","toEqual"],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { FigmaTokenResponse, FigmaTokens } from '../types.js';
2
- /**
3
- * Generate mock FigmaTokens for testing
4
- */
5
- export declare function mockFigmaTokens(overrides?: Partial<FigmaTokens>): FigmaTokens;
6
- /**
7
- * Generate mock expired tokens for testing
8
- */
9
- export declare function mockExpiredTokens(overrides?: Partial<FigmaTokens>): FigmaTokens;
10
- /**
11
- * Generate mock tokens expiring soon (within buffer window) for testing
12
- */
13
- export declare function mockTokensExpiringSoon(overrides?: Partial<FigmaTokens>): FigmaTokens;
14
- /**
15
- * Generate mock tokens with plenty of time remaining
16
- */
17
- export declare function mockFreshTokens(overrides?: Partial<FigmaTokens>): FigmaTokens;
18
- /**
19
- * Generate mock Figma API token response
20
- */
21
- export declare function mockFigmaTokenResponse(overrides?: Partial<FigmaTokenResponse>): FigmaTokenResponse;
22
- /**
23
- * Generate mock malformed token response (missing required fields)
24
- */
25
- export declare function mockMalformedTokenResponse(): Partial<FigmaTokenResponse>;
26
- //# sourceMappingURL=fixtures.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElE;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAY7E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAO/E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAQpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAQ7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACtC,kBAAkB,CAQpB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAKxE"}
@@ -1,67 +0,0 @@
1
- /**
2
- * Generate mock FigmaTokens for testing
3
- */ export function mockFigmaTokens(overrides) {
4
- const now = Date.now();
5
- const oneHourFromNow = now + 60 * 60 * 1000 // 1 hour
6
- ;
7
- return {
8
- accessToken: 'figt_test_access_token_123456789',
9
- expiresAt: oneHourFromNow,
10
- refreshToken: 'figt_test_refresh_token_987654321',
11
- scopes: [
12
- 'current_user:read'
13
- ],
14
- userId: 'user_123',
15
- ...overrides
16
- };
17
- }
18
- /**
19
- * Generate mock expired tokens for testing
20
- */ export function mockExpiredTokens(overrides) {
21
- const oneHourAgo = Date.now() - 60 * 60 * 1000 // 1 hour ago
22
- ;
23
- return mockFigmaTokens({
24
- expiresAt: oneHourAgo,
25
- ...overrides
26
- });
27
- }
28
- /**
29
- * Generate mock tokens expiring soon (within buffer window) for testing
30
- */ export function mockTokensExpiringSoon(overrides) {
31
- // 4 minutes from now (within 5 minute buffer)
32
- const fourMinutesFromNow = Date.now() + 4 * 60 * 1000;
33
- return mockFigmaTokens({
34
- expiresAt: fourMinutesFromNow,
35
- ...overrides
36
- });
37
- }
38
- /**
39
- * Generate mock tokens with plenty of time remaining
40
- */ export function mockFreshTokens(overrides) {
41
- // 2 hours from now
42
- const twoHoursFromNow = Date.now() + 2 * 60 * 60 * 1000;
43
- return mockFigmaTokens({
44
- expiresAt: twoHoursFromNow,
45
- ...overrides
46
- });
47
- }
48
- /**
49
- * Generate mock Figma API token response
50
- */ export function mockFigmaTokenResponse(overrides) {
51
- return {
52
- access_token: 'figt_test_access_token_123456789',
53
- expires_in: 3600,
54
- refresh_token: 'figt_test_refresh_token_987654321',
55
- user_id_string: 'user_123',
56
- ...overrides
57
- };
58
- }
59
- /**
60
- * Generate mock malformed token response (missing required fields)
61
- */ export function mockMalformedTokenResponse() {
62
- return {
63
- access_token: 'figt_test_access_token_123456789'
64
- };
65
- }
66
-
67
- //# sourceMappingURL=fixtures.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/auth/__tests__/fixtures.ts"],"sourcesContent":["import type { FigmaTokenResponse, FigmaTokens } from '../types.js'\n\n/**\n * Generate mock FigmaTokens for testing\n */\nexport function mockFigmaTokens(overrides?: Partial<FigmaTokens>): FigmaTokens {\n const now = Date.now()\n const oneHourFromNow = now + 60 * 60 * 1000 // 1 hour\n\n return {\n accessToken: 'figt_test_access_token_123456789',\n expiresAt: oneHourFromNow,\n refreshToken: 'figt_test_refresh_token_987654321',\n scopes: ['current_user:read'],\n userId: 'user_123',\n ...overrides,\n }\n}\n\n/**\n * Generate mock expired tokens for testing\n */\nexport function mockExpiredTokens(overrides?: Partial<FigmaTokens>): FigmaTokens {\n const oneHourAgo = Date.now() - 60 * 60 * 1000 // 1 hour ago\n\n return mockFigmaTokens({\n expiresAt: oneHourAgo,\n ...overrides,\n })\n}\n\n/**\n * Generate mock tokens expiring soon (within buffer window) for testing\n */\nexport function mockTokensExpiringSoon(overrides?: Partial<FigmaTokens>): FigmaTokens {\n // 4 minutes from now (within 5 minute buffer)\n const fourMinutesFromNow = Date.now() + 4 * 60 * 1000\n\n return mockFigmaTokens({\n expiresAt: fourMinutesFromNow,\n ...overrides,\n })\n}\n\n/**\n * Generate mock tokens with plenty of time remaining\n */\nexport function mockFreshTokens(overrides?: Partial<FigmaTokens>): FigmaTokens {\n // 2 hours from now\n const twoHoursFromNow = Date.now() + 2 * 60 * 60 * 1000\n\n return mockFigmaTokens({\n expiresAt: twoHoursFromNow,\n ...overrides,\n })\n}\n\n/**\n * Generate mock Figma API token response\n */\nexport function mockFigmaTokenResponse(\n overrides?: Partial<FigmaTokenResponse>,\n): FigmaTokenResponse {\n return {\n access_token: 'figt_test_access_token_123456789',\n expires_in: 3600, // 1 hour in seconds\n refresh_token: 'figt_test_refresh_token_987654321',\n user_id_string: 'user_123',\n ...overrides,\n }\n}\n\n/**\n * Generate mock malformed token response (missing required fields)\n */\nexport function mockMalformedTokenResponse(): Partial<FigmaTokenResponse> {\n return {\n access_token: 'figt_test_access_token_123456789',\n // Missing refresh_token and expires_in\n }\n}\n"],"names":["mockFigmaTokens","overrides","now","Date","oneHourFromNow","accessToken","expiresAt","refreshToken","scopes","userId","mockExpiredTokens","oneHourAgo","mockTokensExpiringSoon","fourMinutesFromNow","mockFreshTokens","twoHoursFromNow","mockFigmaTokenResponse","access_token","expires_in","refresh_token","user_id_string","mockMalformedTokenResponse"],"mappings":"AAEA;;CAEC,GACD,OAAO,SAASA,gBAAgBC,SAAgC;IAC9D,MAAMC,MAAMC,KAAKD,GAAG;IACpB,MAAME,iBAAiBF,MAAM,KAAK,KAAK,KAAK,SAAS;;IAErD,OAAO;QACLG,aAAa;QACbC,WAAWF;QACXG,cAAc;QACdC,QAAQ;YAAC;SAAoB;QAC7BC,QAAQ;QACR,GAAGR,SAAS;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASS,kBAAkBT,SAAgC;IAChE,MAAMU,aAAaR,KAAKD,GAAG,KAAK,KAAK,KAAK,KAAK,aAAa;;IAE5D,OAAOF,gBAAgB;QACrBM,WAAWK;QACX,GAAGV,SAAS;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASW,uBAAuBX,SAAgC;IACrE,8CAA8C;IAC9C,MAAMY,qBAAqBV,KAAKD,GAAG,KAAK,IAAI,KAAK;IAEjD,OAAOF,gBAAgB;QACrBM,WAAWO;QACX,GAAGZ,SAAS;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASa,gBAAgBb,SAAgC;IAC9D,mBAAmB;IACnB,MAAMc,kBAAkBZ,KAAKD,GAAG,KAAK,IAAI,KAAK,KAAK;IAEnD,OAAOF,gBAAgB;QACrBM,WAAWS;QACX,GAAGd,SAAS;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASe,uBACdf,SAAuC;IAEvC,OAAO;QACLgB,cAAc;QACdC,YAAY;QACZC,eAAe;QACfC,gBAAgB;QAChB,GAAGnB,SAAS;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASoB;IACd,OAAO;QACLJ,cAAc;IAEhB;AACF"}
@@ -1,33 +0,0 @@
1
- import type { FigmaTokenResponse } from '../types.js';
2
- /**
3
- * Create a mock fetch response
4
- */
5
- export declare function mockFetchResponse(data: unknown, options?: {
6
- ok?: boolean;
7
- status?: number;
8
- }): Response;
9
- /**
10
- * Create a successful mock fetch response with token data
11
- */
12
- export declare function mockSuccessfulTokenResponse(data: FigmaTokenResponse): Response;
13
- /**
14
- * Create a failed mock fetch response
15
- */
16
- export declare function mockFailedFetchResponse(status: number, errorMessage: string): Response;
17
- /**
18
- * Mock global fetch with a successful response
19
- */
20
- export declare function mockFetchSuccess(responseData: FigmaTokenResponse): import("vitest").Mock<(...args: any[]) => any>;
21
- /**
22
- * Mock global fetch with a failed response
23
- */
24
- export declare function mockFetchFailure(status: number, errorMessage: string): import("vitest").Mock<(...args: any[]) => any>;
25
- /**
26
- * Mock global fetch with a network error
27
- */
28
- export declare function mockFetchNetworkError(errorMessage?: string): import("vitest").Mock<(...args: any[]) => any>;
29
- /**
30
- * Restore original fetch (cleanup after tests)
31
- */
32
- export declare function restoreFetch(): void;
33
- //# sourceMappingURL=mocks.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/mocks.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAQzF,QAAQ,CACd;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,kBAAkB,YAEnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAQrE,QAAQ,CACd;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,kBAAkB,kDAIhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kDAIpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,SAAkB,kDAInE;AAED;;GAEG;AACH,wBAAgB,YAAY,SAE3B"}
@@ -1,63 +0,0 @@
1
- /* eslint-disable perfectionist/sort-objects */ /* eslint-disable @typescript-eslint/require-await */ import { vi } from 'vitest';
2
- /**
3
- * Create a mock fetch response
4
- */ export function mockFetchResponse(data, options = {}) {
5
- return {
6
- ok: options.ok ?? true,
7
- status: options.status ?? 200,
8
- statusText: options.status === 200 ? 'OK' : 'Error',
9
- headers: new Headers(),
10
- json: async ()=>data,
11
- text: async ()=>JSON.stringify(data)
12
- };
13
- }
14
- /**
15
- * Create a successful mock fetch response with token data
16
- */ export function mockSuccessfulTokenResponse(data) {
17
- return mockFetchResponse(data, {
18
- ok: true,
19
- status: 200
20
- });
21
- }
22
- /**
23
- * Create a failed mock fetch response
24
- */ export function mockFailedFetchResponse(status, errorMessage) {
25
- return {
26
- ok: false,
27
- status,
28
- statusText: 'Error',
29
- headers: new Headers(),
30
- json: async ()=>({
31
- error: errorMessage
32
- }),
33
- text: async ()=>errorMessage
34
- };
35
- }
36
- /**
37
- * Mock global fetch with a successful response
38
- */ export function mockFetchSuccess(responseData) {
39
- const mockFetch = vi.fn().mockResolvedValue(mockSuccessfulTokenResponse(responseData));
40
- global.fetch = mockFetch;
41
- return mockFetch;
42
- }
43
- /**
44
- * Mock global fetch with a failed response
45
- */ export function mockFetchFailure(status, errorMessage) {
46
- const mockFetch = vi.fn().mockResolvedValue(mockFailedFetchResponse(status, errorMessage));
47
- global.fetch = mockFetch;
48
- return mockFetch;
49
- }
50
- /**
51
- * Mock global fetch with a network error
52
- */ export function mockFetchNetworkError(errorMessage = 'Network error') {
53
- const mockFetch = vi.fn().mockRejectedValue(new Error(errorMessage));
54
- global.fetch = mockFetch;
55
- return mockFetch;
56
- }
57
- /**
58
- * Restore original fetch (cleanup after tests)
59
- */ export function restoreFetch() {
60
- vi.restoreAllMocks();
61
- }
62
-
63
- //# sourceMappingURL=mocks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/auth/__tests__/mocks.ts"],"sourcesContent":["/* eslint-disable perfectionist/sort-objects */\n/* eslint-disable @typescript-eslint/require-await */\nimport { vi } from 'vitest'\n\nimport type { FigmaTokenResponse } from '../types.js'\n\n/**\n * Create a mock fetch response\n */\nexport function mockFetchResponse(data: unknown, options: { ok?: boolean; status?: number } = {}) {\n return {\n ok: options.ok ?? true,\n status: options.status ?? 200,\n statusText: options.status === 200 ? 'OK' : 'Error',\n headers: new Headers(),\n json: async () => data,\n text: async () => JSON.stringify(data),\n } as Response\n}\n\n/**\n * Create a successful mock fetch response with token data\n */\nexport function mockSuccessfulTokenResponse(data: FigmaTokenResponse) {\n return mockFetchResponse(data, { ok: true, status: 200 })\n}\n\n/**\n * Create a failed mock fetch response\n */\nexport function mockFailedFetchResponse(status: number, errorMessage: string) {\n return {\n ok: false,\n status,\n statusText: 'Error',\n headers: new Headers(),\n json: async () => ({ error: errorMessage }),\n text: async () => errorMessage,\n } as Response\n}\n\n/**\n * Mock global fetch with a successful response\n */\nexport function mockFetchSuccess(responseData: FigmaTokenResponse) {\n const mockFetch = vi.fn().mockResolvedValue(mockSuccessfulTokenResponse(responseData))\n global.fetch = mockFetch\n return mockFetch\n}\n\n/**\n * Mock global fetch with a failed response\n */\nexport function mockFetchFailure(status: number, errorMessage: string) {\n const mockFetch = vi.fn().mockResolvedValue(mockFailedFetchResponse(status, errorMessage))\n global.fetch = mockFetch\n return mockFetch\n}\n\n/**\n * Mock global fetch with a network error\n */\nexport function mockFetchNetworkError(errorMessage = 'Network error') {\n const mockFetch = vi.fn().mockRejectedValue(new Error(errorMessage))\n global.fetch = mockFetch\n return mockFetch\n}\n\n/**\n * Restore original fetch (cleanup after tests)\n */\nexport function restoreFetch() {\n vi.restoreAllMocks()\n}\n"],"names":["vi","mockFetchResponse","data","options","ok","status","statusText","headers","Headers","json","text","JSON","stringify","mockSuccessfulTokenResponse","mockFailedFetchResponse","errorMessage","error","mockFetchSuccess","responseData","mockFetch","fn","mockResolvedValue","global","fetch","mockFetchFailure","mockFetchNetworkError","mockRejectedValue","Error","restoreFetch","restoreAllMocks"],"mappings":"AAAA,6CAA6C,GAC7C,mDAAmD,GACnD,SAASA,EAAE,QAAQ,SAAQ;AAI3B;;CAEC,GACD,OAAO,SAASC,kBAAkBC,IAAa,EAAEC,UAA6C,CAAC,CAAC;IAC9F,OAAO;QACLC,IAAID,QAAQC,EAAE,IAAI;QAClBC,QAAQF,QAAQE,MAAM,IAAI;QAC1BC,YAAYH,QAAQE,MAAM,KAAK,MAAM,OAAO;QAC5CE,SAAS,IAAIC;QACbC,MAAM,UAAYP;QAClBQ,MAAM,UAAYC,KAAKC,SAAS,CAACV;IACnC;AACF;AAEA;;CAEC,GACD,OAAO,SAASW,4BAA4BX,IAAwB;IAClE,OAAOD,kBAAkBC,MAAM;QAAEE,IAAI;QAAMC,QAAQ;IAAI;AACzD;AAEA;;CAEC,GACD,OAAO,SAASS,wBAAwBT,MAAc,EAAEU,YAAoB;IAC1E,OAAO;QACLX,IAAI;QACJC;QACAC,YAAY;QACZC,SAAS,IAAIC;QACbC,MAAM,UAAa,CAAA;gBAAEO,OAAOD;YAAa,CAAA;QACzCL,MAAM,UAAYK;IACpB;AACF;AAEA;;CAEC,GACD,OAAO,SAASE,iBAAiBC,YAAgC;IAC/D,MAAMC,YAAYnB,GAAGoB,EAAE,GAAGC,iBAAiB,CAACR,4BAA4BK;IACxEI,OAAOC,KAAK,GAAGJ;IACf,OAAOA;AACT;AAEA;;CAEC,GACD,OAAO,SAASK,iBAAiBnB,MAAc,EAAEU,YAAoB;IACnE,MAAMI,YAAYnB,GAAGoB,EAAE,GAAGC,iBAAiB,CAACP,wBAAwBT,QAAQU;IAC5EO,OAAOC,KAAK,GAAGJ;IACf,OAAOA;AACT;AAEA;;CAEC,GACD,OAAO,SAASM,sBAAsBV,eAAe,eAAe;IAClE,MAAMI,YAAYnB,GAAGoB,EAAE,GAAGM,iBAAiB,CAAC,IAAIC,MAAMZ;IACtDO,OAAOC,KAAK,GAAGJ;IACf,OAAOA;AACT;AAEA;;CAEC,GACD,OAAO,SAASS;IACd5B,GAAG6B,eAAe;AACpB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=callback-server.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"callback-server.spec.d.ts","sourceRoot":"","sources":["../../src/auth/callback-server.spec.ts"],"names":[],"mappings":""}
@@ -1,85 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { CallbackError, CallbackServer } from './callback-server.js';
3
- describe('CallbackServer', ()=>{
4
- describe('waitForCallback', ()=>{
5
- it('should resolve with code and state on successful callback', async ()=>{
6
- const server = new CallbackServer({
7
- port: 3001,
8
- timeoutMs: 5000
9
- });
10
- const expectedState = 'test-state-123';
11
- // Start waiting for callback
12
- const callbackPromise = server.waitForCallback(expectedState);
13
- // Simulate OAuth callback
14
- await fetch(`http://localhost:3001/callback?code=auth-code-123&state=${expectedState}`);
15
- const result = await callbackPromise;
16
- expect(result.code).toBe('auth-code-123');
17
- expect(result.state).toBe(expectedState);
18
- server.stop();
19
- });
20
- it('should reject with CallbackError on state mismatch', async ()=>{
21
- const server = new CallbackServer({
22
- port: 3002,
23
- timeoutMs: 5000
24
- });
25
- const expectedState = 'test-state-123';
26
- const callbackPromise = server.waitForCallback(expectedState);
27
- // Send wrong state
28
- const fetchPromise = fetch(`http://localhost:3002/callback?code=auth-code-123&state=wrong-state`);
29
- await expect(callbackPromise).rejects.toThrow(CallbackError);
30
- await expect(callbackPromise).rejects.toThrow('State mismatch');
31
- // Wait for fetch to complete
32
- await fetchPromise;
33
- server.stop();
34
- });
35
- it('should reject with CallbackError on OAuth error', async ()=>{
36
- const server = new CallbackServer({
37
- port: 3003,
38
- timeoutMs: 5000
39
- });
40
- const expectedState = 'test-state-123';
41
- const callbackPromise = server.waitForCallback(expectedState);
42
- // Send OAuth error
43
- const fetchPromise = fetch(`http://localhost:3003/callback?error=access_denied&error_description=User+denied`);
44
- await expect(callbackPromise).rejects.toThrow(CallbackError);
45
- await expect(callbackPromise).rejects.toThrow('access_denied');
46
- // Wait for fetch to complete
47
- await fetchPromise;
48
- server.stop();
49
- });
50
- it('should reject with CallbackError on timeout', async ()=>{
51
- const server = new CallbackServer({
52
- port: 3005,
53
- timeoutMs: 100
54
- });
55
- const expectedState = 'test-state-123';
56
- const callbackPromise = server.waitForCallback(expectedState);
57
- // Don't send callback - let it timeout
58
- await expect(callbackPromise).rejects.toThrow(CallbackError);
59
- await expect(callbackPromise).rejects.toThrow('timed out');
60
- server.stop();
61
- }, 1000);
62
- it('should return 404 for non-callback paths', async ()=>{
63
- const server = new CallbackServer({
64
- port: 3006,
65
- timeoutMs: 200
66
- });
67
- const expectedState = 'test-state-123';
68
- // Start server
69
- const callbackPromise = server.waitForCallback(expectedState).catch(()=>{
70
- // Ignore timeout error
71
- });
72
- // Wait a bit for server to start
73
- await new Promise((resolve)=>setTimeout(resolve, 50));
74
- // Try to access wrong path
75
- const response = await fetch('http://localhost:3006/not-callback');
76
- expect(response.status).toBe(404);
77
- // Clean up
78
- server.stop();
79
- // Wait for promise to complete
80
- await callbackPromise;
81
- }, 2000);
82
- });
83
- });
84
-
85
- //# sourceMappingURL=callback-server.spec.js.map