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

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 (308) hide show
  1. package/dist/api/control-plane.d.ts.map +1 -1
  2. package/dist/api/control-plane.js +2 -7
  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/exports/client.d.ts +3 -0
  40. package/dist/exports/client.d.ts.map +1 -0
  41. package/dist/exports/client.js +4 -0
  42. package/dist/exports/client.js.map +1 -0
  43. package/dist/oauth/components/LoginButton/index.d.ts +9 -0
  44. package/dist/oauth/components/LoginButton/index.d.ts.map +1 -0
  45. package/dist/oauth/components/LoginButton/index.js +52 -0
  46. package/dist/oauth/components/LoginButton/index.js.map +1 -0
  47. package/dist/oauth/components/LoginButton/index.scss +10 -0
  48. package/dist/oauth/components/LogoutButton/index.d.ts +7 -0
  49. package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -0
  50. package/dist/oauth/components/LogoutButton/index.js +67 -0
  51. package/dist/oauth/components/LogoutButton/index.js.map +1 -0
  52. package/dist/oauth/components/LogoutButton/index.scss +10 -0
  53. package/dist/oauth/defaults.d.ts +10 -0
  54. package/dist/oauth/defaults.d.ts.map +1 -0
  55. package/dist/oauth/defaults.js +91 -0
  56. package/dist/oauth/defaults.js.map +1 -0
  57. package/dist/oauth/endpoints/getLoginEndpoint.d.ts +13 -0
  58. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -0
  59. package/dist/oauth/endpoints/getLoginEndpoint.js +237 -0
  60. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -0
  61. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts +12 -0
  62. package/dist/oauth/endpoints/getLogoutEndpoint.d.ts.map +1 -0
  63. package/dist/oauth/endpoints/getLogoutEndpoint.js +99 -0
  64. package/dist/oauth/endpoints/getLogoutEndpoint.js.map +1 -0
  65. package/dist/oauth/endpoints/getMetaEndpoint.d.ts +13 -0
  66. package/dist/oauth/endpoints/getMetaEndpoint.d.ts.map +1 -0
  67. package/dist/oauth/endpoints/getMetaEndpoint.js +25 -0
  68. package/dist/oauth/endpoints/getMetaEndpoint.js.map +1 -0
  69. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts +13 -0
  70. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.d.ts.map +1 -0
  71. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js +21 -0
  72. package/dist/oauth/endpoints/getRedirectToLoginEndpoint.js.map +1 -0
  73. package/dist/oauth/exports/client.d.ts +3 -0
  74. package/dist/oauth/exports/client.d.ts.map +1 -0
  75. package/dist/oauth/exports/client.js +4 -0
  76. package/dist/oauth/exports/client.js.map +1 -0
  77. package/dist/oauth/hooks/afterLogout.d.ts +8 -0
  78. package/dist/oauth/hooks/afterLogout.d.ts.map +1 -0
  79. package/dist/oauth/hooks/afterLogout.js +27 -0
  80. package/dist/oauth/hooks/afterLogout.js.map +1 -0
  81. package/dist/oauth/hooks/me.d.ts +5 -0
  82. package/dist/oauth/hooks/me.d.ts.map +1 -0
  83. package/dist/oauth/hooks/me.js +55 -0
  84. package/dist/oauth/hooks/me.js.map +1 -0
  85. package/dist/oauth/hooks/refresh.d.ts +8 -0
  86. package/dist/oauth/hooks/refresh.d.ts.map +1 -0
  87. package/dist/oauth/hooks/refresh.js +91 -0
  88. package/dist/oauth/hooks/refresh.js.map +1 -0
  89. package/dist/oauth/index.d.ts +4 -0
  90. package/dist/oauth/index.d.ts.map +1 -0
  91. package/dist/oauth/index.js +222 -0
  92. package/dist/oauth/index.js.map +1 -0
  93. package/dist/oauth/strategy/index.d.ts +54 -0
  94. package/dist/oauth/strategy/index.d.ts.map +1 -0
  95. package/dist/oauth/strategy/index.js +280 -0
  96. package/dist/oauth/strategy/index.js.map +1 -0
  97. package/dist/oauth/types.d.ts +192 -0
  98. package/dist/oauth/types.d.ts.map +1 -0
  99. package/dist/oauth/types.js +3 -0
  100. package/dist/oauth/types.js.map +1 -0
  101. package/dist/oauth/utilities/clearCookie.d.ts +9 -0
  102. package/dist/oauth/utilities/clearCookie.d.ts.map +1 -0
  103. package/dist/oauth/utilities/clearCookie.js +21 -0
  104. package/dist/oauth/utilities/clearCookie.js.map +1 -0
  105. package/dist/oauth/utilities/createCookieOptions.d.ts +10 -0
  106. package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -0
  107. package/dist/oauth/utilities/createCookieOptions.js +42 -0
  108. package/dist/oauth/utilities/createCookieOptions.js.map +1 -0
  109. package/dist/oauth/utilities/createDebugLogger.d.ts +4 -0
  110. package/dist/oauth/utilities/createDebugLogger.d.ts.map +1 -0
  111. package/dist/oauth/utilities/createDebugLogger.js +16 -0
  112. package/dist/oauth/utilities/createDebugLogger.js.map +1 -0
  113. package/dist/oauth/utilities/extractOrigin.d.ts +2 -0
  114. package/dist/oauth/utilities/extractOrigin.d.ts.map +1 -0
  115. package/dist/oauth/utilities/extractOrigin.js +12 -0
  116. package/dist/oauth/utilities/extractOrigin.js.map +1 -0
  117. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts +3 -0
  118. package/dist/oauth/utilities/getAdminCollectionSlug.d.ts.map +1 -0
  119. package/dist/oauth/utilities/getAdminCollectionSlug.js +18 -0
  120. package/dist/oauth/utilities/getAdminCollectionSlug.js.map +1 -0
  121. package/dist/oauth/utilities/getAdminPath.d.ts +8 -0
  122. package/dist/oauth/utilities/getAdminPath.d.ts.map +1 -0
  123. package/dist/oauth/utilities/getAdminPath.js +9 -0
  124. package/dist/oauth/utilities/getAdminPath.js.map +1 -0
  125. package/dist/oauth/utilities/getAuthorizeURL.d.ts +17 -0
  126. package/dist/oauth/utilities/getAuthorizeURL.d.ts.map +1 -0
  127. package/dist/oauth/utilities/getAuthorizeURL.js +45 -0
  128. package/dist/oauth/utilities/getAuthorizeURL.js.map +1 -0
  129. package/dist/oauth/utilities/getCookieExpiration.d.ts +4 -0
  130. package/dist/oauth/utilities/getCookieExpiration.d.ts.map +1 -0
  131. package/dist/oauth/utilities/getCookieExpiration.js +11 -0
  132. package/dist/oauth/utilities/getCookieExpiration.js.map +1 -0
  133. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts +2 -0
  134. package/dist/oauth/utilities/getSecondsFromTokenExp.d.ts.map +1 -0
  135. package/dist/oauth/utilities/getSecondsFromTokenExp.js +7 -0
  136. package/dist/oauth/utilities/getSecondsFromTokenExp.js.map +1 -0
  137. package/dist/oauth/utilities/getTokenExp.d.ts +6 -0
  138. package/dist/oauth/utilities/getTokenExp.d.ts.map +1 -0
  139. package/dist/oauth/utilities/getTokenExp.js +20 -0
  140. package/dist/oauth/utilities/getTokenExp.js.map +1 -0
  141. package/dist/oauth/utilities/getUsernameField.d.ts +9 -0
  142. package/dist/oauth/utilities/getUsernameField.d.ts.map +1 -0
  143. package/dist/oauth/utilities/getUsernameField.js +20 -0
  144. package/dist/oauth/utilities/getUsernameField.js.map +1 -0
  145. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts +8 -0
  146. package/dist/oauth/utilities/hasUserTokenPropsChanged.d.ts.map +1 -0
  147. package/dist/oauth/utilities/hasUserTokenPropsChanged.js +25 -0
  148. package/dist/oauth/utilities/hasUserTokenPropsChanged.js.map +1 -0
  149. package/dist/oauth/utilities/mergeHeaders.d.ts +2 -0
  150. package/dist/oauth/utilities/mergeHeaders.d.ts.map +1 -0
  151. package/dist/oauth/utilities/mergeHeaders.js +37 -0
  152. package/dist/oauth/utilities/mergeHeaders.js.map +1 -0
  153. package/dist/oauth/utilities/refreshTokens.d.ts +16 -0
  154. package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -0
  155. package/dist/oauth/utilities/refreshTokens.js +67 -0
  156. package/dist/oauth/utilities/refreshTokens.js.map +1 -0
  157. package/dist/plugin/build-config.d.ts +7 -1
  158. package/dist/plugin/build-config.d.ts.map +1 -1
  159. package/dist/plugin/build-config.js +29 -2
  160. package/dist/plugin/build-config.js.map +1 -1
  161. package/dist/types/config.d.ts +0 -11
  162. package/dist/types/config.d.ts.map +1 -1
  163. package/dist/types/config.js +1 -1
  164. package/dist/types/config.js.map +1 -1
  165. package/dist/utils/config.d.ts +0 -22
  166. package/dist/utils/config.d.ts.map +1 -1
  167. package/dist/utils/config.js +0 -46
  168. package/dist/utils/config.js.map +1 -1
  169. package/dist/utils/messages.js +11 -11
  170. package/dist/utils/messages.js.map +1 -1
  171. package/dist/utils/payload-config-ast.d.ts +17 -1
  172. package/dist/utils/payload-config-ast.d.ts.map +1 -1
  173. package/dist/utils/payload-config-ast.js +166 -14
  174. package/dist/utils/payload-config-ast.js.map +1 -1
  175. package/dist/utils/payload-config-modifier.d.ts +2 -1
  176. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  177. package/dist/utils/payload-config-modifier.js +50 -79
  178. package/dist/utils/payload-config-modifier.js.map +1 -1
  179. package/dist/utils/payload-package-check.d.ts.map +1 -1
  180. package/dist/utils/payload-package-check.js +14 -33
  181. package/dist/utils/payload-package-check.js.map +1 -1
  182. package/dist/utils/project.d.ts +1 -1
  183. package/dist/utils/project.d.ts.map +1 -1
  184. package/dist/utils/project.js +3 -5
  185. package/dist/utils/project.js.map +1 -1
  186. package/dist/utils/s3-upload.d.ts.map +1 -1
  187. package/dist/utils/s3-upload.js +3 -8
  188. package/dist/utils/s3-upload.js.map +1 -1
  189. package/dist/utils/token-display.d.ts.map +1 -1
  190. package/dist/utils/token-display.js +3 -2
  191. package/dist/utils/token-display.js.map +1 -1
  192. package/package.json +9 -3
  193. package/dist/api/control-plane.spec.d.ts +0 -2
  194. package/dist/api/control-plane.spec.d.ts.map +0 -1
  195. package/dist/api/control-plane.spec.js +0 -296
  196. package/dist/api/control-plane.spec.js.map +0 -1
  197. package/dist/api/figma-api.spec.d.ts +0 -14
  198. package/dist/api/figma-api.spec.d.ts.map +0 -1
  199. package/dist/api/figma-api.spec.js +0 -201
  200. package/dist/api/figma-api.spec.js.map +0 -1
  201. package/dist/auth/__tests__/fixtures.d.ts +0 -26
  202. package/dist/auth/__tests__/fixtures.d.ts.map +0 -1
  203. package/dist/auth/__tests__/fixtures.js +0 -67
  204. package/dist/auth/__tests__/fixtures.js.map +0 -1
  205. package/dist/auth/__tests__/mocks.d.ts +0 -33
  206. package/dist/auth/__tests__/mocks.d.ts.map +0 -1
  207. package/dist/auth/__tests__/mocks.js +0 -63
  208. package/dist/auth/__tests__/mocks.js.map +0 -1
  209. package/dist/auth/callback-server.spec.d.ts +0 -2
  210. package/dist/auth/callback-server.spec.d.ts.map +0 -1
  211. package/dist/auth/callback-server.spec.js +0 -85
  212. package/dist/auth/callback-server.spec.js.map +0 -1
  213. package/dist/auth/crypto-utils.spec.d.ts +0 -2
  214. package/dist/auth/crypto-utils.spec.d.ts.map +0 -1
  215. package/dist/auth/crypto-utils.spec.js +0 -36
  216. package/dist/auth/crypto-utils.spec.js.map +0 -1
  217. package/dist/auth/jwt-validator.spec.d.ts +0 -10
  218. package/dist/auth/jwt-validator.spec.d.ts.map +0 -1
  219. package/dist/auth/jwt-validator.spec.js +0 -236
  220. package/dist/auth/jwt-validator.spec.js.map +0 -1
  221. package/dist/auth/oauth-flow.spec.d.ts +0 -2
  222. package/dist/auth/oauth-flow.spec.d.ts.map +0 -1
  223. package/dist/auth/oauth-flow.spec.js +0 -134
  224. package/dist/auth/oauth-flow.spec.js.map +0 -1
  225. package/dist/auth/pkce.spec.d.ts +0 -2
  226. package/dist/auth/pkce.spec.d.ts.map +0 -1
  227. package/dist/auth/pkce.spec.js +0 -32
  228. package/dist/auth/pkce.spec.js.map +0 -1
  229. package/dist/auth/project-token.spec.d.ts +0 -2
  230. package/dist/auth/project-token.spec.d.ts.map +0 -1
  231. package/dist/auth/project-token.spec.js +0 -332
  232. package/dist/auth/project-token.spec.js.map +0 -1
  233. package/dist/auth/refresh.spec.d.ts +0 -2
  234. package/dist/auth/refresh.spec.d.ts.map +0 -1
  235. package/dist/auth/refresh.spec.js +0 -105
  236. package/dist/auth/refresh.spec.js.map +0 -1
  237. package/dist/auth/token-store.spec.d.ts +0 -2
  238. package/dist/auth/token-store.spec.d.ts.map +0 -1
  239. package/dist/auth/token-store.spec.js +0 -276
  240. package/dist/auth/token-store.spec.js.map +0 -1
  241. package/dist/commands/__tests__/test-utils.d.ts +0 -28
  242. package/dist/commands/__tests__/test-utils.d.ts.map +0 -1
  243. package/dist/commands/__tests__/test-utils.js +0 -34
  244. package/dist/commands/__tests__/test-utils.js.map +0 -1
  245. package/dist/commands/deploy.spec.d.ts +0 -2
  246. package/dist/commands/deploy.spec.d.ts.map +0 -1
  247. package/dist/commands/deploy.spec.js +0 -18
  248. package/dist/commands/deploy.spec.js.map +0 -1
  249. package/dist/commands/init.spec.d.ts +0 -2
  250. package/dist/commands/init.spec.d.ts.map +0 -1
  251. package/dist/commands/init.spec.js +0 -283
  252. package/dist/commands/init.spec.js.map +0 -1
  253. package/dist/plugin/build-config.spec.d.ts +0 -2
  254. package/dist/plugin/build-config.spec.d.ts.map +0 -1
  255. package/dist/plugin/build-config.spec.js +0 -72
  256. package/dist/plugin/build-config.spec.js.map +0 -1
  257. package/dist/utils/asset-collection.spec.d.ts +0 -2
  258. package/dist/utils/asset-collection.spec.d.ts.map +0 -1
  259. package/dist/utils/asset-collection.spec.js +0 -155
  260. package/dist/utils/asset-collection.spec.js.map +0 -1
  261. package/dist/utils/build-detection.spec.d.ts +0 -2
  262. package/dist/utils/build-detection.spec.d.ts.map +0 -1
  263. package/dist/utils/build-detection.spec.js +0 -110
  264. package/dist/utils/build-detection.spec.js.map +0 -1
  265. package/dist/utils/config.spec.d.ts +0 -2
  266. package/dist/utils/config.spec.d.ts.map +0 -1
  267. package/dist/utils/config.spec.js +0 -167
  268. package/dist/utils/config.spec.js.map +0 -1
  269. package/dist/utils/download-template.spec.d.ts +0 -2
  270. package/dist/utils/download-template.spec.d.ts.map +0 -1
  271. package/dist/utils/download-template.spec.js +0 -76
  272. package/dist/utils/download-template.spec.js.map +0 -1
  273. package/dist/utils/env-management.spec.d.ts +0 -2
  274. package/dist/utils/env-management.spec.d.ts.map +0 -1
  275. package/dist/utils/env-management.spec.js +0 -123
  276. package/dist/utils/env-management.spec.js.map +0 -1
  277. package/dist/utils/git.spec.d.ts +0 -2
  278. package/dist/utils/git.spec.d.ts.map +0 -1
  279. package/dist/utils/git.spec.js +0 -99
  280. package/dist/utils/git.spec.js.map +0 -1
  281. package/dist/utils/lambda-config.spec.d.ts +0 -2
  282. package/dist/utils/lambda-config.spec.d.ts.map +0 -1
  283. package/dist/utils/lambda-config.spec.js +0 -141
  284. package/dist/utils/lambda-config.spec.js.map +0 -1
  285. package/dist/utils/payload-config-ast.spec.d.ts +0 -2
  286. package/dist/utils/payload-config-ast.spec.d.ts.map +0 -1
  287. package/dist/utils/payload-config-ast.spec.js +0 -303
  288. package/dist/utils/payload-config-ast.spec.js.map +0 -1
  289. package/dist/utils/payload-config-modifier.int.spec.d.ts +0 -2
  290. package/dist/utils/payload-config-modifier.int.spec.d.ts.map +0 -1
  291. package/dist/utils/payload-config-modifier.int.spec.js +0 -116
  292. package/dist/utils/payload-config-modifier.int.spec.js.map +0 -1
  293. package/dist/utils/payload-config-modifier.spec.d.ts +0 -2
  294. package/dist/utils/payload-config-modifier.spec.d.ts.map +0 -1
  295. package/dist/utils/payload-config-modifier.spec.js +0 -162
  296. package/dist/utils/payload-config-modifier.spec.js.map +0 -1
  297. package/dist/utils/payload-package-check.spec.d.ts +0 -2
  298. package/dist/utils/payload-package-check.spec.d.ts.map +0 -1
  299. package/dist/utils/payload-package-check.spec.js +0 -148
  300. package/dist/utils/payload-package-check.spec.js.map +0 -1
  301. package/dist/utils/project.spec.d.ts +0 -2
  302. package/dist/utils/project.spec.d.ts.map +0 -1
  303. package/dist/utils/project.spec.js +0 -222
  304. package/dist/utils/project.spec.js.map +0 -1
  305. package/dist/utils/s3-upload.spec.d.ts +0 -2
  306. package/dist/utils/s3-upload.spec.d.ts.map +0 -1
  307. package/dist/utils/s3-upload.spec.js +0 -140
  308. package/dist/utils/s3-upload.spec.js.map +0 -1
@@ -1,222 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { detectPayloadProject, validatePayloadVersion } from './project.js';
5
- describe('project utilities', ()=>{
6
- let testDir;
7
- beforeEach(async ()=>{
8
- // Create unique temp directory for each test
9
- testDir = path.join(process.cwd(), '.test-tmp', `project-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`);
10
- await fs.mkdir(testDir, {
11
- recursive: true
12
- });
13
- });
14
- afterEach(async ()=>{
15
- // Clean up test directory
16
- try {
17
- await fs.rm(testDir, {
18
- force: true,
19
- recursive: true
20
- });
21
- } catch {
22
- // Ignore cleanup errors
23
- }
24
- });
25
- describe('detectPayloadProject', ()=>{
26
- it('should detect project with payload in dependencies', async ()=>{
27
- const packageJson = {
28
- name: 'test-project',
29
- dependencies: {
30
- next: '^15.0.0',
31
- payload: '^3.54.0'
32
- },
33
- version: '1.0.0'
34
- };
35
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
36
- const result = await detectPayloadProject(testDir);
37
- expect(result.hasPayload).toBe(true);
38
- expect(result.payloadVersion).toBe('^3.54.0');
39
- expect(result.path).toBe(testDir);
40
- });
41
- it('should detect project with payload in devDependencies', async ()=>{
42
- const packageJson = {
43
- name: 'test-project',
44
- devDependencies: {
45
- payload: '3.50.0'
46
- },
47
- version: '1.0.0'
48
- };
49
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
50
- const result = await detectPayloadProject(testDir);
51
- expect(result.hasPayload).toBe(true);
52
- expect(result.payloadVersion).toBe('3.50.0');
53
- });
54
- it('should return false if no payload dependency', async ()=>{
55
- const packageJson = {
56
- name: 'test-project',
57
- dependencies: {
58
- next: '^15.0.0',
59
- react: '^19.0.0'
60
- },
61
- version: '1.0.0'
62
- };
63
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
64
- const result = await detectPayloadProject(testDir);
65
- expect(result.hasPayload).toBe(false);
66
- expect(result.payloadVersion).toBeUndefined();
67
- });
68
- it('should return false if no package.json exists', async ()=>{
69
- const result = await detectPayloadProject(testDir);
70
- expect(result.hasPayload).toBe(false);
71
- expect(result.payloadVersion).toBeUndefined();
72
- });
73
- it('should detect pnpm as package manager', async ()=>{
74
- const packageJson = {
75
- name: 'test-project',
76
- dependencies: {
77
- payload: '^3.0.0'
78
- }
79
- };
80
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
81
- await fs.writeFile(path.join(testDir, 'pnpm-lock.yaml'), '', 'utf-8');
82
- const result = await detectPayloadProject(testDir);
83
- expect(result.packageManager).toBe('pnpm');
84
- });
85
- it('should detect yarn as package manager', async ()=>{
86
- const packageJson = {
87
- name: 'test-project',
88
- dependencies: {
89
- payload: '^3.0.0'
90
- }
91
- };
92
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
93
- await fs.writeFile(path.join(testDir, 'yarn.lock'), '', 'utf-8');
94
- const result = await detectPayloadProject(testDir);
95
- expect(result.packageManager).toBe('yarn');
96
- });
97
- it('should default to npm as package manager', async ()=>{
98
- const packageJson = {
99
- name: 'test-project',
100
- dependencies: {
101
- payload: '^3.0.0'
102
- }
103
- };
104
- await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
105
- const result = await detectPayloadProject(testDir);
106
- expect(result.packageManager).toBe('npm');
107
- });
108
- it('should handle invalid package.json', async ()=>{
109
- await fs.writeFile(path.join(testDir, 'package.json'), 'invalid json{', 'utf-8');
110
- await expect(detectPayloadProject(testDir)).rejects.toThrow('Failed to read package.json');
111
- });
112
- });
113
- describe('validatePayloadVersion', ()=>{
114
- it('should accept version 3.x.x', ()=>{
115
- expect(validatePayloadVersion('3.54.0')).toBe(true);
116
- expect(validatePayloadVersion('3.0.0')).toBe(true);
117
- expect(validatePayloadVersion('3.100.999')).toBe(true);
118
- });
119
- it('should accept version with caret', ()=>{
120
- expect(validatePayloadVersion('^3.54.0')).toBe(true);
121
- expect(validatePayloadVersion('^3.0.0')).toBe(true);
122
- });
123
- it('should accept version with tilde', ()=>{
124
- expect(validatePayloadVersion('~3.54.0')).toBe(true);
125
- expect(validatePayloadVersion('~3.0.0')).toBe(true);
126
- });
127
- it('should reject version 2.x.x', ()=>{
128
- expect(validatePayloadVersion('2.54.0')).toBe(false);
129
- expect(validatePayloadVersion('^2.0.0')).toBe(false);
130
- });
131
- it('should reject version 4.x.x', ()=>{
132
- expect(validatePayloadVersion('4.0.0')).toBe(false);
133
- expect(validatePayloadVersion('^4.0.0')).toBe(false);
134
- });
135
- it('should reject invalid version strings', ()=>{
136
- expect(validatePayloadVersion('invalid')).toBe(false);
137
- expect(validatePayloadVersion('x.y.z')).toBe(false);
138
- expect(validatePayloadVersion('')).toBe(false);
139
- });
140
- it('should handle version ranges', ()=>{
141
- expect(validatePayloadVersion('>=3.0.0')).toBe(true);
142
- expect(validatePayloadVersion('>=3.0.0 <4.0.0')).toBe(true);
143
- });
144
- });
145
- describe('scaffoldProject', ()=>{
146
- it('should create project directory if it does not exist', async ()=>{
147
- const { scaffoldProject } = await import('./project.js');
148
- const newDir = path.join(testDir, 'new-project');
149
- // Note: This will fail in test because template files don't exist in dist during test
150
- // We're testing the directory creation part
151
- try {
152
- await scaffoldProject(newDir, 'test-project');
153
- } catch {
154
- // Expected to fail when trying to read templates
155
- // But directory should still be created
156
- }
157
- const exists = await fs.access(newDir).then(()=>true).catch(()=>false);
158
- expect(exists).toBe(true);
159
- });
160
- it('should replace workspace versions with actual npm versions', async ()=>{
161
- const projectDir = path.join(testDir, 'workspace-test');
162
- await fs.mkdir(projectDir, {
163
- recursive: true
164
- });
165
- // Create a mock package.json with workspace versions
166
- const mockPackageJson = {
167
- name: 'template-name',
168
- dependencies: {
169
- '@payloadcms/db-mongodb': 'workspace:^',
170
- '@payloadcms/richtext-lexical': 'workspace:*',
171
- next: '^15.0.0',
172
- payload: 'workspace:*'
173
- },
174
- devDependencies: {
175
- '@payloadcms/graphql': 'workspace:*',
176
- typescript: '^5.0.0'
177
- },
178
- version: '1.0.0'
179
- };
180
- await fs.writeFile(path.join(projectDir, 'package.json'), JSON.stringify(mockPackageJson, null, 2));
181
- // Mock fetch to return a version
182
- const mockFetch = vi.fn().mockResolvedValue({
183
- json: ()=>Promise.resolve({
184
- latest: '3.0.0'
185
- }),
186
- ok: true
187
- });
188
- global.fetch = mockFetch;
189
- // Mock downloadTemplateFromGitHub to do nothing (already have package.json)
190
- const downloadMock = vi.fn().mockResolvedValue(undefined);
191
- vi.doMock('./download-template.js', ()=>({
192
- downloadTemplateFromGitHub: downloadMock
193
- }));
194
- // Mock applyLambdaModifications to do nothing
195
- const lambdaMock = vi.fn().mockResolvedValue(undefined);
196
- vi.doMock('./lambda-config.js', ()=>({
197
- applyLambdaModifications: lambdaMock
198
- }));
199
- // Re-import to get mocked version
200
- vi.resetModules();
201
- const { scaffoldProject } = await import('./project.js');
202
- await scaffoldProject(projectDir, 'my-project');
203
- // Read the updated package.json
204
- const updatedPackageJson = JSON.parse(await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8'));
205
- // Verify name was updated
206
- expect(updatedPackageJson.name).toBe('my-project');
207
- // Verify workspace versions were replaced
208
- expect(updatedPackageJson.dependencies.payload).toBe('3.0.0');
209
- expect(updatedPackageJson.dependencies['@payloadcms/db-mongodb']).toBe('3.0.0');
210
- expect(updatedPackageJson.dependencies['@payloadcms/richtext-lexical']).toBe('3.0.0');
211
- // Verify non-payload packages unchanged
212
- expect(updatedPackageJson.dependencies.next).toBe('^15.0.0');
213
- // Verify devDependencies
214
- expect(updatedPackageJson.devDependencies['@payloadcms/graphql']).toBe('3.0.0');
215
- expect(updatedPackageJson.devDependencies.typescript).toBe('^5.0.0');
216
- // Verify npm registry was called
217
- expect(mockFetch).toHaveBeenCalledWith('https://registry.npmjs.org/-/package/payload/dist-tags');
218
- });
219
- });
220
- });
221
-
222
- //# sourceMappingURL=project.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/project.spec.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { detectPayloadProject, validatePayloadVersion } from './project.js'\n\ndescribe('project utilities', () => {\n let testDir: string\n\n beforeEach(async () => {\n // Create unique temp directory for each test\n testDir = path.join(\n process.cwd(),\n '.test-tmp',\n `project-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n )\n await fs.mkdir(testDir, { recursive: true })\n })\n\n afterEach(async () => {\n // Clean up test directory\n try {\n await fs.rm(testDir, { force: true, recursive: true })\n } catch {\n // Ignore cleanup errors\n }\n })\n\n describe('detectPayloadProject', () => {\n it('should detect project with payload in dependencies', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: {\n next: '^15.0.0',\n payload: '^3.54.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(true)\n expect(result.payloadVersion).toBe('^3.54.0')\n expect(result.path).toBe(testDir)\n })\n\n it('should detect project with payload in devDependencies', async () => {\n const packageJson = {\n name: 'test-project',\n devDependencies: {\n payload: '3.50.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(true)\n expect(result.payloadVersion).toBe('3.50.0')\n })\n\n it('should return false if no payload dependency', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: {\n next: '^15.0.0',\n react: '^19.0.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(false)\n expect(result.payloadVersion).toBeUndefined()\n })\n\n it('should return false if no package.json exists', async () => {\n const result = await detectPayloadProject(testDir)\n\n expect(result.hasPayload).toBe(false)\n expect(result.payloadVersion).toBeUndefined()\n })\n\n it('should detect pnpm as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n await fs.writeFile(path.join(testDir, 'pnpm-lock.yaml'), '', 'utf-8')\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('pnpm')\n })\n\n it('should detect yarn as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n await fs.writeFile(path.join(testDir, 'yarn.lock'), '', 'utf-8')\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('yarn')\n })\n\n it('should default to npm as package manager', async () => {\n const packageJson = {\n name: 'test-project',\n dependencies: { payload: '^3.0.0' },\n }\n\n await fs.writeFile(\n path.join(testDir, 'package.json'),\n JSON.stringify(packageJson, null, 2),\n 'utf-8',\n )\n\n const result = await detectPayloadProject(testDir)\n\n expect(result.packageManager).toBe('npm')\n })\n\n it('should handle invalid package.json', async () => {\n await fs.writeFile(path.join(testDir, 'package.json'), 'invalid json{', 'utf-8')\n\n await expect(detectPayloadProject(testDir)).rejects.toThrow('Failed to read package.json')\n })\n })\n\n describe('validatePayloadVersion', () => {\n it('should accept version 3.x.x', () => {\n expect(validatePayloadVersion('3.54.0')).toBe(true)\n expect(validatePayloadVersion('3.0.0')).toBe(true)\n expect(validatePayloadVersion('3.100.999')).toBe(true)\n })\n\n it('should accept version with caret', () => {\n expect(validatePayloadVersion('^3.54.0')).toBe(true)\n expect(validatePayloadVersion('^3.0.0')).toBe(true)\n })\n\n it('should accept version with tilde', () => {\n expect(validatePayloadVersion('~3.54.0')).toBe(true)\n expect(validatePayloadVersion('~3.0.0')).toBe(true)\n })\n\n it('should reject version 2.x.x', () => {\n expect(validatePayloadVersion('2.54.0')).toBe(false)\n expect(validatePayloadVersion('^2.0.0')).toBe(false)\n })\n\n it('should reject version 4.x.x', () => {\n expect(validatePayloadVersion('4.0.0')).toBe(false)\n expect(validatePayloadVersion('^4.0.0')).toBe(false)\n })\n\n it('should reject invalid version strings', () => {\n expect(validatePayloadVersion('invalid')).toBe(false)\n expect(validatePayloadVersion('x.y.z')).toBe(false)\n expect(validatePayloadVersion('')).toBe(false)\n })\n\n it('should handle version ranges', () => {\n expect(validatePayloadVersion('>=3.0.0')).toBe(true)\n expect(validatePayloadVersion('>=3.0.0 <4.0.0')).toBe(true)\n })\n })\n\n describe('scaffoldProject', () => {\n it('should create project directory if it does not exist', async () => {\n const { scaffoldProject } = await import('./project.js')\n const newDir = path.join(testDir, 'new-project')\n\n // Note: This will fail in test because template files don't exist in dist during test\n // We're testing the directory creation part\n try {\n await scaffoldProject(newDir, 'test-project')\n } catch {\n // Expected to fail when trying to read templates\n // But directory should still be created\n }\n\n const exists = await fs\n .access(newDir)\n .then(() => true)\n .catch(() => false)\n expect(exists).toBe(true)\n })\n\n it('should replace workspace versions with actual npm versions', async () => {\n const projectDir = path.join(testDir, 'workspace-test')\n await fs.mkdir(projectDir, { recursive: true })\n\n // Create a mock package.json with workspace versions\n const mockPackageJson = {\n name: 'template-name',\n dependencies: {\n '@payloadcms/db-mongodb': 'workspace:^',\n '@payloadcms/richtext-lexical': 'workspace:*',\n next: '^15.0.0',\n payload: 'workspace:*',\n },\n devDependencies: {\n '@payloadcms/graphql': 'workspace:*',\n typescript: '^5.0.0',\n },\n version: '1.0.0',\n }\n\n await fs.writeFile(\n path.join(projectDir, 'package.json'),\n JSON.stringify(mockPackageJson, null, 2),\n )\n\n // Mock fetch to return a version\n const mockFetch = vi.fn().mockResolvedValue({\n json: () => Promise.resolve({ latest: '3.0.0' }),\n ok: true,\n })\n global.fetch = mockFetch as never\n\n // Mock downloadTemplateFromGitHub to do nothing (already have package.json)\n const downloadMock = vi.fn().mockResolvedValue(undefined)\n vi.doMock('./download-template.js', () => ({\n downloadTemplateFromGitHub: downloadMock,\n }))\n\n // Mock applyLambdaModifications to do nothing\n const lambdaMock = vi.fn().mockResolvedValue(undefined)\n vi.doMock('./lambda-config.js', () => ({\n applyLambdaModifications: lambdaMock,\n }))\n\n // Re-import to get mocked version\n vi.resetModules()\n const { scaffoldProject } = await import('./project.js')\n\n await scaffoldProject(projectDir, 'my-project')\n\n // Read the updated package.json\n const updatedPackageJson = JSON.parse(\n await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8'),\n )\n\n // Verify name was updated\n expect(updatedPackageJson.name).toBe('my-project')\n\n // Verify workspace versions were replaced\n expect(updatedPackageJson.dependencies.payload).toBe('3.0.0')\n expect(updatedPackageJson.dependencies['@payloadcms/db-mongodb']).toBe('3.0.0')\n expect(updatedPackageJson.dependencies['@payloadcms/richtext-lexical']).toBe('3.0.0')\n\n // Verify non-payload packages unchanged\n expect(updatedPackageJson.dependencies.next).toBe('^15.0.0')\n\n // Verify devDependencies\n expect(updatedPackageJson.devDependencies['@payloadcms/graphql']).toBe('3.0.0')\n expect(updatedPackageJson.devDependencies.typescript).toBe('^5.0.0')\n\n // Verify npm registry was called\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://registry.npmjs.org/-/package/payload/dist-tags',\n )\n })\n })\n})\n"],"names":["fs","path","afterEach","beforeEach","describe","expect","it","vi","detectPayloadProject","validatePayloadVersion","testDir","join","process","cwd","Date","now","Math","random","toString","substring","mkdir","recursive","rm","force","packageJson","name","dependencies","next","payload","version","writeFile","JSON","stringify","result","hasPayload","toBe","payloadVersion","devDependencies","react","toBeUndefined","packageManager","rejects","toThrow","scaffoldProject","newDir","exists","access","then","catch","projectDir","mockPackageJson","typescript","mockFetch","fn","mockResolvedValue","json","Promise","resolve","latest","ok","global","fetch","downloadMock","undefined","doMock","downloadTemplateFromGitHub","lambdaMock","applyLambdaModifications","resetModules","updatedPackageJson","parse","readFile","toHaveBeenCalledWith"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=s3-upload.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"s3-upload.spec.d.ts","sourceRoot":"","sources":["../../src/utils/s3-upload.spec.ts"],"names":[],"mappings":""}
@@ -1,140 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { uploadFile, uploadLambdaZip, uploadStaticAssets } from './s3-upload.js';
5
- describe('s3-upload', ()=>{
6
- const testDir = path.join(process.cwd(), 'test-fixtures', 's3-upload');
7
- beforeEach(async ()=>{
8
- await fs.mkdir(testDir, {
9
- recursive: true
10
- });
11
- vi.clearAllMocks();
12
- });
13
- afterEach(async ()=>{
14
- await fs.rm(testDir, {
15
- force: true,
16
- recursive: true
17
- });
18
- vi.restoreAllMocks();
19
- });
20
- describe('uploadFile', ()=>{
21
- it('should upload file to signed URL', async ()=>{
22
- const testFile = path.join(testDir, 'test.txt');
23
- await fs.writeFile(testFile, 'test content');
24
- const mockFetch = vi.fn().mockResolvedValue({
25
- ok: true,
26
- status: 200
27
- });
28
- global.fetch = mockFetch;
29
- await uploadFile(testFile, 'https://s3.example.com/upload?signature=abc');
30
- expect(mockFetch).toHaveBeenCalledWith('https://s3.example.com/upload?signature=abc', expect.objectContaining({
31
- body: expect.any(Buffer),
32
- method: 'PUT'
33
- }));
34
- });
35
- it('should retry on failure', async ()=>{
36
- const testFile = path.join(testDir, 'test.txt');
37
- await fs.writeFile(testFile, 'test');
38
- const mockFetch = vi.fn().mockResolvedValueOnce({
39
- ok: false,
40
- status: 500
41
- }).mockResolvedValueOnce({
42
- ok: false,
43
- status: 500
44
- }).mockResolvedValueOnce({
45
- ok: true,
46
- status: 200
47
- });
48
- global.fetch = mockFetch;
49
- await uploadFile(testFile, 'https://s3.example.com/upload');
50
- expect(mockFetch).toHaveBeenCalledTimes(3);
51
- });
52
- it('should throw after max retries', async ()=>{
53
- const testFile = path.join(testDir, 'test.txt');
54
- await fs.writeFile(testFile, 'test');
55
- const mockFetch = vi.fn().mockResolvedValue({
56
- ok: false,
57
- status: 500
58
- });
59
- global.fetch = mockFetch;
60
- await expect(uploadFile(testFile, 'https://s3.example.com/upload')).rejects.toThrow();
61
- });
62
- it('should throw error for non-existent file', async ()=>{
63
- global.fetch = vi.fn().mockResolvedValue({
64
- ok: true
65
- });
66
- await expect(uploadFile(path.join(testDir, 'missing.txt'), 'https://s3.example.com')).rejects.toThrow();
67
- });
68
- });
69
- describe('uploadLambdaZip', ()=>{
70
- it('should upload zip file', async ()=>{
71
- const zipPath = path.join(testDir, 'lambda.zip');
72
- await fs.writeFile(zipPath, 'mock zip content');
73
- const mockFetch = vi.fn().mockResolvedValue({
74
- ok: true,
75
- status: 200
76
- });
77
- global.fetch = mockFetch;
78
- await uploadLambdaZip(zipPath, 'https://s3.example.com/lambda.zip');
79
- expect(mockFetch).toHaveBeenCalledWith('https://s3.example.com/lambda.zip', expect.objectContaining({
80
- headers: expect.objectContaining({
81
- 'Content-Type': 'application/zip'
82
- }),
83
- method: 'PUT'
84
- }));
85
- });
86
- });
87
- describe('uploadStaticAssets', ()=>{
88
- it('should upload multiple assets', async ()=>{
89
- // Files are on disk at .next/static (filesystem structure)
90
- const staticDir = path.join(testDir, '.next', 'static');
91
- await fs.mkdir(staticDir, {
92
- recursive: true
93
- });
94
- await fs.writeFile(path.join(staticDir, 'file1.js'), 'code1');
95
- await fs.writeFile(path.join(staticDir, 'file2.css'), 'styles');
96
- // Asset paths use _next prefix (S3 convention)
97
- const assetUrls = {
98
- '_next/static/file1.js': 'https://s3.example.com/file1.js',
99
- '_next/static/file2.css': 'https://s3.example.com/file2.css'
100
- };
101
- const mockFetch = vi.fn().mockResolvedValue({
102
- ok: true,
103
- status: 200
104
- });
105
- global.fetch = mockFetch;
106
- const result = await uploadStaticAssets(testDir, assetUrls);
107
- expect(result.lambdaUploaded).toBe(false);
108
- expect(result.assetsUploaded).toBe(2);
109
- expect(result.assetsFailed).toBe(0);
110
- expect(mockFetch).toHaveBeenCalledTimes(2);
111
- });
112
- it('should track failed uploads', async ()=>{
113
- // Files on disk at .next/static
114
- const staticDir = path.join(testDir, '.next', 'static');
115
- await fs.mkdir(staticDir, {
116
- recursive: true
117
- });
118
- await fs.writeFile(path.join(staticDir, 'file1.js'), 'code');
119
- // Asset paths use _next prefix
120
- const assetUrls = {
121
- '_next/static/file1.js': 'https://s3.example.com/file1.js'
122
- };
123
- const mockFetch = vi.fn().mockResolvedValue({
124
- ok: false,
125
- status: 500
126
- });
127
- global.fetch = mockFetch;
128
- const result = await uploadStaticAssets(testDir, assetUrls);
129
- expect(result.assetsUploaded).toBe(0);
130
- expect(result.assetsFailed).toBe(1);
131
- });
132
- it('should handle empty asset list', async ()=>{
133
- const result = await uploadStaticAssets(testDir, {});
134
- expect(result.assetsUploaded).toBe(0);
135
- expect(result.assetsFailed).toBe(0);
136
- });
137
- });
138
- });
139
-
140
- //# sourceMappingURL=s3-upload.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utils/s3-upload.spec.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport path from 'path'\nimport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { uploadFile, uploadLambdaZip, uploadStaticAssets } from './s3-upload.js'\n\ndescribe('s3-upload', () => {\n const testDir = path.join(process.cwd(), 'test-fixtures', 's3-upload')\n\n beforeEach(async () => {\n await fs.mkdir(testDir, { recursive: true })\n vi.clearAllMocks()\n })\n\n afterEach(async () => {\n await fs.rm(testDir, { force: true, recursive: true })\n vi.restoreAllMocks()\n })\n\n describe('uploadFile', () => {\n it('should upload file to signed URL', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test content')\n\n const mockFetch = vi.fn().mockResolvedValue({\n ok: true,\n status: 200,\n })\n global.fetch = mockFetch\n\n await uploadFile(testFile, 'https://s3.example.com/upload?signature=abc')\n\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://s3.example.com/upload?signature=abc',\n expect.objectContaining({\n body: expect.any(Buffer),\n method: 'PUT',\n }),\n )\n })\n\n it('should retry on failure', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test')\n\n const mockFetch = vi\n .fn()\n .mockResolvedValueOnce({ ok: false, status: 500 })\n .mockResolvedValueOnce({ ok: false, status: 500 })\n .mockResolvedValueOnce({ ok: true, status: 200 })\n\n global.fetch = mockFetch\n\n await uploadFile(testFile, 'https://s3.example.com/upload')\n\n expect(mockFetch).toHaveBeenCalledTimes(3)\n })\n\n it('should throw after max retries', async () => {\n const testFile = path.join(testDir, 'test.txt')\n await fs.writeFile(testFile, 'test')\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 500 })\n global.fetch = mockFetch\n\n await expect(uploadFile(testFile, 'https://s3.example.com/upload')).rejects.toThrow()\n })\n\n it('should throw error for non-existent file', async () => {\n global.fetch = vi.fn().mockResolvedValue({ ok: true })\n\n await expect(\n uploadFile(path.join(testDir, 'missing.txt'), 'https://s3.example.com'),\n ).rejects.toThrow()\n })\n })\n\n describe('uploadLambdaZip', () => {\n it('should upload zip file', async () => {\n const zipPath = path.join(testDir, 'lambda.zip')\n await fs.writeFile(zipPath, 'mock zip content')\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200 })\n global.fetch = mockFetch\n\n await uploadLambdaZip(zipPath, 'https://s3.example.com/lambda.zip')\n\n expect(mockFetch).toHaveBeenCalledWith(\n 'https://s3.example.com/lambda.zip',\n expect.objectContaining({\n headers: expect.objectContaining({\n 'Content-Type': 'application/zip',\n }),\n method: 'PUT',\n }),\n )\n })\n })\n\n describe('uploadStaticAssets', () => {\n it('should upload multiple assets', async () => {\n // Files are on disk at .next/static (filesystem structure)\n const staticDir = path.join(testDir, '.next', 'static')\n await fs.mkdir(staticDir, { recursive: true })\n await fs.writeFile(path.join(staticDir, 'file1.js'), 'code1')\n await fs.writeFile(path.join(staticDir, 'file2.css'), 'styles')\n\n // Asset paths use _next prefix (S3 convention)\n const assetUrls = {\n '_next/static/file1.js': 'https://s3.example.com/file1.js',\n '_next/static/file2.css': 'https://s3.example.com/file2.css',\n }\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200 })\n global.fetch = mockFetch\n\n const result = await uploadStaticAssets(testDir, assetUrls)\n\n expect(result.lambdaUploaded).toBe(false)\n expect(result.assetsUploaded).toBe(2)\n expect(result.assetsFailed).toBe(0)\n expect(mockFetch).toHaveBeenCalledTimes(2)\n })\n\n it('should track failed uploads', async () => {\n // Files on disk at .next/static\n const staticDir = path.join(testDir, '.next', 'static')\n await fs.mkdir(staticDir, { recursive: true })\n await fs.writeFile(path.join(staticDir, 'file1.js'), 'code')\n\n // Asset paths use _next prefix\n const assetUrls = {\n '_next/static/file1.js': 'https://s3.example.com/file1.js',\n }\n\n const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 500 })\n global.fetch = mockFetch\n\n const result = await uploadStaticAssets(testDir, assetUrls)\n\n expect(result.assetsUploaded).toBe(0)\n expect(result.assetsFailed).toBe(1)\n })\n\n it('should handle empty asset list', async () => {\n const result = await uploadStaticAssets(testDir, {})\n\n expect(result.assetsUploaded).toBe(0)\n expect(result.assetsFailed).toBe(0)\n })\n })\n})\n"],"names":["fs","path","afterEach","beforeEach","describe","expect","it","vi","uploadFile","uploadLambdaZip","uploadStaticAssets","testDir","join","process","cwd","mkdir","recursive","clearAllMocks","rm","force","restoreAllMocks","testFile","writeFile","mockFetch","fn","mockResolvedValue","ok","status","global","fetch","toHaveBeenCalledWith","objectContaining","body","any","Buffer","method","mockResolvedValueOnce","toHaveBeenCalledTimes","rejects","toThrow","zipPath","headers","staticDir","assetUrls","result","lambdaUploaded","toBe","assetsUploaded","assetsFailed"],"mappings":"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"}