@payloadcms/figma 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/LICENSE.md +11 -0
  2. package/bin/cli.js +4 -0
  3. package/dist/api/control-plane.d.ts +124 -0
  4. package/dist/api/control-plane.d.ts.map +1 -0
  5. package/dist/api/control-plane.js +245 -0
  6. package/dist/api/control-plane.js.map +1 -0
  7. package/dist/api/control-plane.spec.d.ts +2 -0
  8. package/dist/api/control-plane.spec.d.ts.map +1 -0
  9. package/dist/api/control-plane.spec.js +296 -0
  10. package/dist/api/control-plane.spec.js.map +1 -0
  11. package/dist/api/figma-api.d.ts +31 -0
  12. package/dist/api/figma-api.d.ts.map +1 -0
  13. package/dist/api/figma-api.js +169 -0
  14. package/dist/api/figma-api.js.map +1 -0
  15. package/dist/api/figma-api.spec.d.ts +14 -0
  16. package/dist/api/figma-api.spec.d.ts.map +1 -0
  17. package/dist/api/figma-api.spec.js +201 -0
  18. package/dist/api/figma-api.spec.js.map +1 -0
  19. package/dist/auth/__tests__/fixtures.d.ts +26 -0
  20. package/dist/auth/__tests__/fixtures.d.ts.map +1 -0
  21. package/dist/auth/__tests__/fixtures.js +67 -0
  22. package/dist/auth/__tests__/fixtures.js.map +1 -0
  23. package/dist/auth/__tests__/mocks.d.ts +33 -0
  24. package/dist/auth/__tests__/mocks.d.ts.map +1 -0
  25. package/dist/auth/__tests__/mocks.js +63 -0
  26. package/dist/auth/__tests__/mocks.js.map +1 -0
  27. package/dist/auth/browser.d.ts +31 -0
  28. package/dist/auth/browser.d.ts.map +1 -0
  29. package/dist/auth/browser.js +41 -0
  30. package/dist/auth/browser.js.map +1 -0
  31. package/dist/auth/callback-server.d.ts +61 -0
  32. package/dist/auth/callback-server.d.ts.map +1 -0
  33. package/dist/auth/callback-server.js +168 -0
  34. package/dist/auth/callback-server.js.map +1 -0
  35. package/dist/auth/callback-server.spec.d.ts +2 -0
  36. package/dist/auth/callback-server.spec.d.ts.map +1 -0
  37. package/dist/auth/callback-server.spec.js +85 -0
  38. package/dist/auth/callback-server.spec.js.map +1 -0
  39. package/dist/auth/crypto-utils.d.ts +33 -0
  40. package/dist/auth/crypto-utils.d.ts.map +1 -0
  41. package/dist/auth/crypto-utils.js +96 -0
  42. package/dist/auth/crypto-utils.js.map +1 -0
  43. package/dist/auth/crypto-utils.spec.d.ts +2 -0
  44. package/dist/auth/crypto-utils.spec.d.ts.map +1 -0
  45. package/dist/auth/crypto-utils.spec.js +36 -0
  46. package/dist/auth/crypto-utils.spec.js.map +1 -0
  47. package/dist/auth/jwt-validator.d.ts +41 -0
  48. package/dist/auth/jwt-validator.d.ts.map +1 -0
  49. package/dist/auth/jwt-validator.js +113 -0
  50. package/dist/auth/jwt-validator.js.map +1 -0
  51. package/dist/auth/jwt-validator.spec.d.ts +10 -0
  52. package/dist/auth/jwt-validator.spec.d.ts.map +1 -0
  53. package/dist/auth/jwt-validator.spec.js +236 -0
  54. package/dist/auth/jwt-validator.spec.js.map +1 -0
  55. package/dist/auth/oauth-flow.d.ts +62 -0
  56. package/dist/auth/oauth-flow.d.ts.map +1 -0
  57. package/dist/auth/oauth-flow.js +172 -0
  58. package/dist/auth/oauth-flow.js.map +1 -0
  59. package/dist/auth/oauth-flow.spec.d.ts +2 -0
  60. package/dist/auth/oauth-flow.spec.d.ts.map +1 -0
  61. package/dist/auth/oauth-flow.spec.js +134 -0
  62. package/dist/auth/oauth-flow.spec.js.map +1 -0
  63. package/dist/auth/pages/error.html +85 -0
  64. package/dist/auth/pages/success.html +74 -0
  65. package/dist/auth/pkce.d.ts +51 -0
  66. package/dist/auth/pkce.d.ts.map +1 -0
  67. package/dist/auth/pkce.js +71 -0
  68. package/dist/auth/pkce.js.map +1 -0
  69. package/dist/auth/pkce.spec.d.ts +2 -0
  70. package/dist/auth/pkce.spec.d.ts.map +1 -0
  71. package/dist/auth/pkce.spec.js +32 -0
  72. package/dist/auth/pkce.spec.js.map +1 -0
  73. package/dist/auth/project-token.d.ts +47 -0
  74. package/dist/auth/project-token.d.ts.map +1 -0
  75. package/dist/auth/project-token.js +134 -0
  76. package/dist/auth/project-token.js.map +1 -0
  77. package/dist/auth/project-token.spec.d.ts +2 -0
  78. package/dist/auth/project-token.spec.d.ts.map +1 -0
  79. package/dist/auth/project-token.spec.js +332 -0
  80. package/dist/auth/project-token.spec.js.map +1 -0
  81. package/dist/auth/refresh.d.ts +35 -0
  82. package/dist/auth/refresh.d.ts.map +1 -0
  83. package/dist/auth/refresh.js +149 -0
  84. package/dist/auth/refresh.js.map +1 -0
  85. package/dist/auth/refresh.spec.d.ts +2 -0
  86. package/dist/auth/refresh.spec.d.ts.map +1 -0
  87. package/dist/auth/refresh.spec.js +105 -0
  88. package/dist/auth/refresh.spec.js.map +1 -0
  89. package/dist/auth/token-store.d.ts +110 -0
  90. package/dist/auth/token-store.d.ts.map +1 -0
  91. package/dist/auth/token-store.js +188 -0
  92. package/dist/auth/token-store.js.map +1 -0
  93. package/dist/auth/token-store.spec.d.ts +2 -0
  94. package/dist/auth/token-store.spec.d.ts.map +1 -0
  95. package/dist/auth/token-store.spec.js +276 -0
  96. package/dist/auth/token-store.spec.js.map +1 -0
  97. package/dist/auth/types.d.ts +197 -0
  98. package/dist/auth/types.d.ts.map +1 -0
  99. package/dist/auth/types.js +6 -0
  100. package/dist/auth/types.js.map +1 -0
  101. package/dist/cli.d.ts +5 -0
  102. package/dist/cli.d.ts.map +1 -0
  103. package/dist/cli.js +108 -0
  104. package/dist/cli.js.map +1 -0
  105. package/dist/commands/__tests__/test-utils.d.ts +28 -0
  106. package/dist/commands/__tests__/test-utils.d.ts.map +1 -0
  107. package/dist/commands/__tests__/test-utils.js +34 -0
  108. package/dist/commands/__tests__/test-utils.js.map +1 -0
  109. package/dist/commands/deploy.d.ts +16 -0
  110. package/dist/commands/deploy.d.ts.map +1 -0
  111. package/dist/commands/deploy.js +297 -0
  112. package/dist/commands/deploy.js.map +1 -0
  113. package/dist/commands/deploy.spec.d.ts +2 -0
  114. package/dist/commands/deploy.spec.d.ts.map +1 -0
  115. package/dist/commands/deploy.spec.js +18 -0
  116. package/dist/commands/deploy.spec.js.map +1 -0
  117. package/dist/commands/init.d.ts +30 -0
  118. package/dist/commands/init.d.ts.map +1 -0
  119. package/dist/commands/init.js +410 -0
  120. package/dist/commands/init.js.map +1 -0
  121. package/dist/commands/init.spec.d.ts +2 -0
  122. package/dist/commands/init.spec.d.ts.map +1 -0
  123. package/dist/commands/init.spec.js +283 -0
  124. package/dist/commands/init.spec.js.map +1 -0
  125. package/dist/commands/list-tokens.d.ts +16 -0
  126. package/dist/commands/list-tokens.d.ts.map +1 -0
  127. package/dist/commands/list-tokens.js +44 -0
  128. package/dist/commands/list-tokens.js.map +1 -0
  129. package/dist/commands/login.d.ts +17 -0
  130. package/dist/commands/login.d.ts.map +1 -0
  131. package/dist/commands/login.js +69 -0
  132. package/dist/commands/login.js.map +1 -0
  133. package/dist/commands/logout.d.ts +16 -0
  134. package/dist/commands/logout.d.ts.map +1 -0
  135. package/dist/commands/logout.js +43 -0
  136. package/dist/commands/logout.js.map +1 -0
  137. package/dist/config/oauth.d.ts +19 -0
  138. package/dist/config/oauth.d.ts.map +1 -0
  139. package/dist/config/oauth.js +43 -0
  140. package/dist/config/oauth.js.map +1 -0
  141. package/dist/constants.d.ts +27 -0
  142. package/dist/constants.d.ts.map +1 -0
  143. package/dist/constants.js +27 -0
  144. package/dist/constants.js.map +1 -0
  145. package/dist/index.d.ts +5 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +6 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/plugin/adapter.d.ts +5 -0
  150. package/dist/plugin/adapter.d.ts.map +1 -0
  151. package/dist/plugin/adapter.js +139 -0
  152. package/dist/plugin/adapter.js.map +1 -0
  153. package/dist/plugin/build-config.d.ts +37 -0
  154. package/dist/plugin/build-config.d.ts.map +1 -0
  155. package/dist/plugin/build-config.js +25 -0
  156. package/dist/plugin/build-config.js.map +1 -0
  157. package/dist/plugin/build-config.spec.d.ts +2 -0
  158. package/dist/plugin/build-config.spec.d.ts.map +1 -0
  159. package/dist/plugin/build-config.spec.js +72 -0
  160. package/dist/plugin/build-config.spec.js.map +1 -0
  161. package/dist/types/config.d.ts +45 -0
  162. package/dist/types/config.d.ts.map +1 -0
  163. package/dist/types/config.js +9 -0
  164. package/dist/types/config.js.map +1 -0
  165. package/dist/types.d.ts +60 -0
  166. package/dist/types.d.ts.map +1 -0
  167. package/dist/types.js +3 -0
  168. package/dist/types.js.map +1 -0
  169. package/dist/utils/asset-collection.d.ts +30 -0
  170. package/dist/utils/asset-collection.d.ts.map +1 -0
  171. package/dist/utils/asset-collection.js +117 -0
  172. package/dist/utils/asset-collection.js.map +1 -0
  173. package/dist/utils/asset-collection.spec.d.ts +2 -0
  174. package/dist/utils/asset-collection.spec.d.ts.map +1 -0
  175. package/dist/utils/asset-collection.spec.js +155 -0
  176. package/dist/utils/asset-collection.spec.js.map +1 -0
  177. package/dist/utils/build-detection.d.ts +32 -0
  178. package/dist/utils/build-detection.d.ts.map +1 -0
  179. package/dist/utils/build-detection.js +55 -0
  180. package/dist/utils/build-detection.js.map +1 -0
  181. package/dist/utils/build-detection.spec.d.ts +2 -0
  182. package/dist/utils/build-detection.spec.d.ts.map +1 -0
  183. package/dist/utils/build-detection.spec.js +110 -0
  184. package/dist/utils/build-detection.spec.js.map +1 -0
  185. package/dist/utils/config.d.ts +33 -0
  186. package/dist/utils/config.d.ts.map +1 -0
  187. package/dist/utils/config.js +78 -0
  188. package/dist/utils/config.js.map +1 -0
  189. package/dist/utils/config.spec.d.ts +2 -0
  190. package/dist/utils/config.spec.d.ts.map +1 -0
  191. package/dist/utils/config.spec.js +167 -0
  192. package/dist/utils/config.spec.js.map +1 -0
  193. package/dist/utils/download-template.d.ts +15 -0
  194. package/dist/utils/download-template.d.ts.map +1 -0
  195. package/dist/utils/download-template.js +74 -0
  196. package/dist/utils/download-template.js.map +1 -0
  197. package/dist/utils/download-template.spec.d.ts +2 -0
  198. package/dist/utils/download-template.spec.d.ts.map +1 -0
  199. package/dist/utils/download-template.spec.js +76 -0
  200. package/dist/utils/download-template.spec.js.map +1 -0
  201. package/dist/utils/env-management.d.ts +16 -0
  202. package/dist/utils/env-management.d.ts.map +1 -0
  203. package/dist/utils/env-management.js +98 -0
  204. package/dist/utils/env-management.js.map +1 -0
  205. package/dist/utils/env-management.spec.d.ts +2 -0
  206. package/dist/utils/env-management.spec.d.ts.map +1 -0
  207. package/dist/utils/env-management.spec.js +123 -0
  208. package/dist/utils/env-management.spec.js.map +1 -0
  209. package/dist/utils/format.d.ts +23 -0
  210. package/dist/utils/format.d.ts.map +1 -0
  211. package/dist/utils/format.js +49 -0
  212. package/dist/utils/format.js.map +1 -0
  213. package/dist/utils/formatter.d.ts +11 -0
  214. package/dist/utils/formatter.d.ts.map +1 -0
  215. package/dist/utils/formatter.js +47 -0
  216. package/dist/utils/formatter.js.map +1 -0
  217. package/dist/utils/git.d.ts +15 -0
  218. package/dist/utils/git.d.ts.map +1 -0
  219. package/dist/utils/git.js +92 -0
  220. package/dist/utils/git.js.map +1 -0
  221. package/dist/utils/git.spec.d.ts +2 -0
  222. package/dist/utils/git.spec.d.ts.map +1 -0
  223. package/dist/utils/git.spec.js +99 -0
  224. package/dist/utils/git.spec.js.map +1 -0
  225. package/dist/utils/is-debug.d.ts +6 -0
  226. package/dist/utils/is-debug.d.ts.map +1 -0
  227. package/dist/utils/is-debug.js +8 -0
  228. package/dist/utils/is-debug.js.map +1 -0
  229. package/dist/utils/lambda-config.d.ts +7 -0
  230. package/dist/utils/lambda-config.d.ts.map +1 -0
  231. package/dist/utils/lambda-config.js +144 -0
  232. package/dist/utils/lambda-config.js.map +1 -0
  233. package/dist/utils/lambda-config.spec.d.ts +2 -0
  234. package/dist/utils/lambda-config.spec.d.ts.map +1 -0
  235. package/dist/utils/lambda-config.spec.js +141 -0
  236. package/dist/utils/lambda-config.spec.js.map +1 -0
  237. package/dist/utils/log.d.ts +6 -0
  238. package/dist/utils/log.d.ts.map +1 -0
  239. package/dist/utils/log.js +22 -0
  240. package/dist/utils/log.js.map +1 -0
  241. package/dist/utils/messages.d.ts +10 -0
  242. package/dist/utils/messages.d.ts.map +1 -0
  243. package/dist/utils/messages.js +96 -0
  244. package/dist/utils/messages.js.map +1 -0
  245. package/dist/utils/package-manager.d.ts +12 -0
  246. package/dist/utils/package-manager.d.ts.map +1 -0
  247. package/dist/utils/package-manager.js +37 -0
  248. package/dist/utils/package-manager.js.map +1 -0
  249. package/dist/utils/payload-config-ast.d.ts +30 -0
  250. package/dist/utils/payload-config-ast.d.ts.map +1 -0
  251. package/dist/utils/payload-config-ast.js +259 -0
  252. package/dist/utils/payload-config-ast.js.map +1 -0
  253. package/dist/utils/payload-config-ast.spec.d.ts +2 -0
  254. package/dist/utils/payload-config-ast.spec.d.ts.map +1 -0
  255. package/dist/utils/payload-config-ast.spec.js +303 -0
  256. package/dist/utils/payload-config-ast.spec.js.map +1 -0
  257. package/dist/utils/payload-config-finder.d.ts +9 -0
  258. package/dist/utils/payload-config-finder.d.ts.map +1 -0
  259. package/dist/utils/payload-config-finder.js +26 -0
  260. package/dist/utils/payload-config-finder.js.map +1 -0
  261. package/dist/utils/payload-config-modifier.d.ts +18 -0
  262. package/dist/utils/payload-config-modifier.d.ts.map +1 -0
  263. package/dist/utils/payload-config-modifier.int.spec.d.ts +2 -0
  264. package/dist/utils/payload-config-modifier.int.spec.d.ts.map +1 -0
  265. package/dist/utils/payload-config-modifier.int.spec.js +116 -0
  266. package/dist/utils/payload-config-modifier.int.spec.js.map +1 -0
  267. package/dist/utils/payload-config-modifier.js +232 -0
  268. package/dist/utils/payload-config-modifier.js.map +1 -0
  269. package/dist/utils/payload-config-modifier.spec.d.ts +2 -0
  270. package/dist/utils/payload-config-modifier.spec.d.ts.map +1 -0
  271. package/dist/utils/payload-config-modifier.spec.js +162 -0
  272. package/dist/utils/payload-config-modifier.spec.js.map +1 -0
  273. package/dist/utils/payload-package-check.d.ts +15 -0
  274. package/dist/utils/payload-package-check.d.ts.map +1 -0
  275. package/dist/utils/payload-package-check.js +116 -0
  276. package/dist/utils/payload-package-check.js.map +1 -0
  277. package/dist/utils/payload-package-check.spec.d.ts +2 -0
  278. package/dist/utils/payload-package-check.spec.d.ts.map +1 -0
  279. package/dist/utils/payload-package-check.spec.js +148 -0
  280. package/dist/utils/payload-package-check.spec.js.map +1 -0
  281. package/dist/utils/project.d.ts +58 -0
  282. package/dist/utils/project.d.ts.map +1 -0
  283. package/dist/utils/project.js +252 -0
  284. package/dist/utils/project.js.map +1 -0
  285. package/dist/utils/project.spec.d.ts +2 -0
  286. package/dist/utils/project.spec.d.ts.map +1 -0
  287. package/dist/utils/project.spec.js +222 -0
  288. package/dist/utils/project.spec.js.map +1 -0
  289. package/dist/utils/s3-upload.d.ts +43 -0
  290. package/dist/utils/s3-upload.d.ts.map +1 -0
  291. package/dist/utils/s3-upload.js +128 -0
  292. package/dist/utils/s3-upload.js.map +1 -0
  293. package/dist/utils/s3-upload.spec.d.ts +2 -0
  294. package/dist/utils/s3-upload.spec.d.ts.map +1 -0
  295. package/dist/utils/s3-upload.spec.js +140 -0
  296. package/dist/utils/s3-upload.spec.js.map +1 -0
  297. package/dist/utils/token-display.d.ts +14 -0
  298. package/dist/utils/token-display.d.ts.map +1 -0
  299. package/dist/utils/token-display.js +62 -0
  300. package/dist/utils/token-display.js.map +1 -0
  301. package/dist/utils/typescript-validator.d.ts +11 -0
  302. package/dist/utils/typescript-validator.d.ts.map +1 -0
  303. package/dist/utils/typescript-validator.js +58 -0
  304. package/dist/utils/typescript-validator.js.map +1 -0
  305. package/package.json +69 -0
package/dist/cli.js ADDED
@@ -0,0 +1,108 @@
1
+ import * as p from '@clack/prompts';
2
+ import arg from 'arg';
3
+ import pc from 'picocolors';
4
+ import { deployCommand } from './commands/deploy.js';
5
+ import { initCommand } from './commands/init.js';
6
+ import { listTokensCommand } from './commands/list-tokens.js';
7
+ import { loginCommand } from './commands/login.js';
8
+ import { logoutCommand } from './commands/logout.js';
9
+ import { feedbackOutro, helpMessage } from './utils/messages.js';
10
+ /**
11
+ * Entrypoint for bin/cli.js
12
+ */ export async function main() {
13
+ try {
14
+ await new Main().init();
15
+ } catch (e) {
16
+ if (e instanceof Error) {
17
+ // eslint-disable-next-line no-console
18
+ console.error(e.message);
19
+ }
20
+ }
21
+ }
22
+ class Main {
23
+ args;
24
+ constructor(){
25
+ // @ts-expect-error bad typings
26
+ this.args = arg({
27
+ '--debug': Boolean,
28
+ '--force': Boolean,
29
+ '--help': Boolean,
30
+ '--id': String,
31
+ '--name': String,
32
+ '--skip-auth': Boolean,
33
+ '--yes': Boolean,
34
+ // Aliases
35
+ '-f': '--force',
36
+ '-h': '--help',
37
+ '-y': '--yes'
38
+ }, {
39
+ permissive: true
40
+ });
41
+ // Set debug flag globally
42
+ if (this.args['--debug']) {
43
+ process.env.DEBUG = 'true';
44
+ }
45
+ }
46
+ async init() {
47
+ try {
48
+ if (this.args['--help']) {
49
+ helpMessage();
50
+ process.exit(0);
51
+ }
52
+ // Get the subcommand (first non-flag argument)
53
+ const subcommand = this.args._[0];
54
+ // eslint-disable-next-line no-console
55
+ console.log('\n');
56
+ p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')));
57
+ // Route to appropriate command handler
58
+ switch(subcommand){
59
+ case 'deploy':
60
+ await deployCommand({
61
+ debug: this.args['--debug'],
62
+ yes: this.args['--yes']
63
+ });
64
+ break;
65
+ case 'init':
66
+ await initCommand({
67
+ id: this.args['--id'],
68
+ name: this.args['--name'],
69
+ debug: this.args['--debug'],
70
+ force: this.args['--force'],
71
+ skipAuth: this.args['--skip-auth']
72
+ });
73
+ break;
74
+ case 'list-tokens':
75
+ listTokensCommand({
76
+ debug: this.args['--debug']
77
+ });
78
+ break;
79
+ case 'login':
80
+ await loginCommand({
81
+ debug: this.args['--debug']
82
+ });
83
+ break;
84
+ case 'logout':
85
+ await logoutCommand({
86
+ debug: this.args['--debug']
87
+ });
88
+ break;
89
+ case undefined:
90
+ // No subcommand - show default message
91
+ p.note("Let's create a new CMS!");
92
+ p.outro(feedbackOutro());
93
+ break;
94
+ default:
95
+ p.log.error(pc.red(`Unknown command: ${subcommand}`));
96
+ p.note('Use --help to see available commands', 'Tip');
97
+ process.exit(1);
98
+ }
99
+ process.exit(0);
100
+ } catch (err) {
101
+ // eslint-disable-next-line no-console
102
+ console.error(err instanceof Error ? err.message : 'An error occurred');
103
+ process.exit(1);
104
+ }
105
+ }
106
+ }
107
+
108
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport arg from 'arg'\nimport pc from 'picocolors'\n\nimport type { CliArgs } from './types.js'\n\nimport { deployCommand } from './commands/deploy.js'\nimport { initCommand } from './commands/init.js'\nimport { listTokensCommand } from './commands/list-tokens.js'\nimport { loginCommand } from './commands/login.js'\nimport { logoutCommand } from './commands/logout.js'\nimport { feedbackOutro, helpMessage } from './utils/messages.js'\n\n/**\n * Entrypoint for bin/cli.js\n */\nexport async function main(): Promise<void> {\n try {\n await new Main().init()\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(e.message)\n }\n }\n}\n\nclass Main {\n args: CliArgs\n\n constructor() {\n // @ts-expect-error bad typings\n this.args = arg(\n {\n '--debug': Boolean,\n '--force': Boolean,\n '--help': Boolean,\n '--id': String,\n '--name': String,\n '--skip-auth': Boolean,\n '--yes': Boolean,\n\n // Aliases\n '-f': '--force',\n '-h': '--help',\n '-y': '--yes',\n },\n { permissive: true },\n )\n\n // Set debug flag globally\n if (this.args['--debug']) {\n process.env.DEBUG = 'true'\n }\n }\n\n async init(): Promise<void> {\n try {\n if (this.args['--help']) {\n helpMessage()\n process.exit(0)\n }\n\n // Get the subcommand (first non-flag argument)\n const subcommand = this.args._[0]\n\n // eslint-disable-next-line no-console\n console.log('\\n')\n p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')))\n\n // Route to appropriate command handler\n switch (subcommand) {\n case 'deploy':\n await deployCommand({\n debug: this.args['--debug'],\n yes: this.args['--yes'],\n })\n break\n\n case 'init':\n await initCommand({\n id: this.args['--id'],\n name: this.args['--name'],\n debug: this.args['--debug'],\n force: this.args['--force'],\n skipAuth: this.args['--skip-auth'],\n })\n break\n\n case 'list-tokens':\n listTokensCommand({\n debug: this.args['--debug'],\n })\n break\n\n case 'login':\n await loginCommand({\n debug: this.args['--debug'],\n })\n break\n\n case 'logout':\n await logoutCommand({\n debug: this.args['--debug'],\n })\n break\n\n case undefined:\n // No subcommand - show default message\n p.note(\"Let's create a new CMS!\")\n p.outro(feedbackOutro())\n break\n\n default:\n p.log.error(pc.red(`Unknown command: ${subcommand}`))\n p.note('Use --help to see available commands', 'Tip')\n process.exit(1)\n }\n\n process.exit(0)\n } catch (err: unknown) {\n // eslint-disable-next-line no-console\n console.error(err instanceof Error ? err.message : 'An error occurred')\n process.exit(1)\n }\n }\n}\n"],"names":["p","arg","pc","deployCommand","initCommand","listTokensCommand","loginCommand","logoutCommand","feedbackOutro","helpMessage","main","Main","init","e","Error","console","error","message","args","Boolean","String","permissive","process","env","DEBUG","exit","subcommand","_","log","intro","bgCyan","black","debug","yes","id","name","force","skipAuth","undefined","note","outro","red","err"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { vi } from 'vitest';
2
+ /**
3
+ * Mock process.exit to capture exit calls without actually exiting
4
+ * Returns a function to restore the original process.exit
5
+ */
6
+ export declare function mockProcessExit(): {
7
+ exitMock: ReturnType<typeof vi.spyOn<[code?: null | number | string | undefined], never>>;
8
+ restore: () => void;
9
+ };
10
+ /**
11
+ * Create mock for OAuth flow module with sensible defaults
12
+ */
13
+ export declare function createOAuthFlowMocks(): {
14
+ executeOAuthFlow: import("vitest").Mock<(...args: any[]) => any>;
15
+ getValidAccessToken: import("vitest").Mock<(...args: any[]) => any>;
16
+ OAuthFlowError: {
17
+ new (message: string, cause?: Error): {
18
+ cause?: Error;
19
+ name: string;
20
+ message: string;
21
+ stack?: string;
22
+ };
23
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
24
+ prepareStackTrace?: ((err: Error, stackTraces: NodeJS.CallSite[]) => any) | undefined;
25
+ stackTraceLimit: number;
26
+ };
27
+ };
28
+ //# sourceMappingURL=test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE3B;;;GAGG;AACH,wBAAgB,eAAe,IAAI;IACjC,QAAQ,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;IACzF,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,CAYA;AAED;;GAEG;AACH,wBAAgB,oBAAoB;;;;sBAMT,MAAM,UAAU,KAAK;oBADlC,KAAK;;;;;;uDASitJ,OAAQ,QAAQ;;;EADnvJ"}
@@ -0,0 +1,34 @@
1
+ import { vi } from 'vitest';
2
+ /**
3
+ * Mock process.exit to capture exit calls without actually exiting
4
+ * Returns a function to restore the original process.exit
5
+ */ export function mockProcessExit() {
6
+ const exitMock = vi.spyOn(process, 'exit').mockImplementation((code)=>{
7
+ // Throw to stop execution in tests
8
+ throw new Error(`process.exit(${code})`);
9
+ });
10
+ return {
11
+ exitMock,
12
+ restore: ()=>{
13
+ exitMock.mockRestore();
14
+ }
15
+ };
16
+ }
17
+ /**
18
+ * Create mock for OAuth flow module with sensible defaults
19
+ */ export function createOAuthFlowMocks() {
20
+ return {
21
+ executeOAuthFlow: vi.fn(),
22
+ getValidAccessToken: vi.fn(),
23
+ OAuthFlowError: class OAuthFlowError extends Error {
24
+ cause;
25
+ constructor(message, cause){
26
+ super(message);
27
+ this.cause = cause;
28
+ this.name = 'OAuthFlowError';
29
+ }
30
+ }
31
+ };
32
+ }
33
+
34
+ //# sourceMappingURL=test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/commands/__tests__/test-utils.ts"],"sourcesContent":["import { vi } from 'vitest'\n\n/**\n * Mock process.exit to capture exit calls without actually exiting\n * Returns a function to restore the original process.exit\n */\nexport function mockProcessExit(): {\n exitMock: ReturnType<typeof vi.spyOn<[code?: null | number | string | undefined], never>>\n restore: () => void\n} {\n const exitMock = vi.spyOn(process, 'exit').mockImplementation(((code?: number) => {\n // Throw to stop execution in tests\n throw new Error(`process.exit(${code})`)\n }) as never)\n\n return {\n exitMock,\n restore: () => {\n exitMock.mockRestore()\n },\n }\n}\n\n/**\n * Create mock for OAuth flow module with sensible defaults\n */\nexport function createOAuthFlowMocks() {\n return {\n executeOAuthFlow: vi.fn(),\n getValidAccessToken: vi.fn(),\n OAuthFlowError: class OAuthFlowError extends Error {\n cause?: Error\n constructor(message: string, cause?: Error) {\n super(message)\n this.cause = cause\n this.name = 'OAuthFlowError'\n }\n },\n }\n}\n"],"names":["vi","mockProcessExit","exitMock","spyOn","process","mockImplementation","code","Error","restore","mockRestore","createOAuthFlowMocks","executeOAuthFlow","fn","getValidAccessToken","OAuthFlowError","cause","message","name"],"mappings":"AAAA,SAASA,EAAE,QAAQ,SAAQ;AAE3B;;;CAGC,GACD,OAAO,SAASC;IAId,MAAMC,WAAWF,GAAGG,KAAK,CAACC,SAAS,QAAQC,kBAAkB,CAAE,CAACC;QAC9D,mCAAmC;QACnC,MAAM,IAAIC,MAAM,CAAC,aAAa,EAAED,KAAK,CAAC,CAAC;IACzC;IAEA,OAAO;QACLJ;QACAM,SAAS;YACPN,SAASO,WAAW;QACtB;IACF;AACF;AAEA;;CAEC,GACD,OAAO,SAASC;IACd,OAAO;QACLC,kBAAkBX,GAAGY,EAAE;QACvBC,qBAAqBb,GAAGY,EAAE;QAC1BE,gBAAgB,MAAMA,uBAAuBP;YAC3CQ,MAAa;YACb,YAAYC,OAAe,EAAED,KAAa,CAAE;gBAC1C,KAAK,CAACC;gBACN,IAAI,CAACD,KAAK,GAAGA;gBACb,IAAI,CAACE,IAAI,GAAG;YACd;QACF;IACF;AACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Options for deploy command
3
+ */
4
+ export interface DeployCommandOptions {
5
+ /** Enable debug mode */
6
+ debug?: boolean;
7
+ /** Skip confirmation prompts */
8
+ yes?: boolean;
9
+ }
10
+ /**
11
+ * Execute the deploy command
12
+ *
13
+ * @param options - Command options
14
+ */
15
+ export declare function deployCommand(options: DeployCommandOptions): Promise<void>;
16
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gCAAgC;IAChC,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA6BD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmThF"}
@@ -0,0 +1,297 @@
1
+ import * as p from '@clack/prompts';
2
+ import { spawn } from 'child_process';
3
+ import path from 'path';
4
+ import pc from 'picocolors';
5
+ import { createDeployment, getTenantDetails, performDeployment } from '../api/control-plane.js';
6
+ import { getValidAccessToken } from '../auth/oauth-flow.js';
7
+ import { getValidProjectToken } from '../auth/project-token.js';
8
+ import { TokenStore } from '../auth/token-store.js';
9
+ import { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js';
10
+ import { detectBuild, getBuildCommand } from '../utils/build-detection.js';
11
+ import { hasFigmaConfig, readFigmaConfig } from '../utils/config.js';
12
+ import * as log from '../utils/log.js';
13
+ import { getPackageManager } from '../utils/package-manager.js';
14
+ import { isInProjectDirectory } from '../utils/project.js';
15
+ import { uploadLambdaZip, uploadStaticAssets } from '../utils/s3-upload.js';
16
+ import { loginCommand } from './login.js';
17
+ /**
18
+ * Format bytes to human-readable string
19
+ */ function formatBytes(bytes) {
20
+ if (bytes === 0) {
21
+ return '0 B';
22
+ }
23
+ const k = 1024;
24
+ const sizes = [
25
+ 'B',
26
+ 'KB',
27
+ 'MB',
28
+ 'GB'
29
+ ];
30
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
31
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
32
+ }
33
+ /**
34
+ * Format date to human-readable string in local time
35
+ */ function formatDate(date) {
36
+ return date.toLocaleString('en-US', {
37
+ day: 'numeric',
38
+ hour: 'numeric',
39
+ minute: 'numeric',
40
+ month: 'long',
41
+ timeZoneName: 'short',
42
+ year: 'numeric'
43
+ });
44
+ }
45
+ /**
46
+ * Execute the deploy command
47
+ *
48
+ * @param options - Command options
49
+ */ export async function deployCommand(options) {
50
+ const projectPath = process.cwd();
51
+ const spinner = p.spinner();
52
+ try {
53
+ // ===== PRE-FLIGHT CHECKS =====
54
+ // Check if in project directory
55
+ if (!await isInProjectDirectory(projectPath)) {
56
+ p.log.error(pc.red("✗ 'deploy' command is not available outside of a Payload project."));
57
+ p.note('Create a project or connect an existing one to Figma: npx @payloadcms/figma init', 'Tip');
58
+ process.exit(1);
59
+ }
60
+ // Check if project connected to Figma
61
+ if (!await hasFigmaConfig(projectPath)) {
62
+ p.log.error(pc.red('✗ Your project is not connected to a Figma CMS ID.'));
63
+ p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip');
64
+ process.exit(1);
65
+ }
66
+ // Get tenant configuration
67
+ const config = await readFigmaConfig(projectPath);
68
+ if (!config || !config.tenantId) {
69
+ p.log.error(pc.red('✗ No tenant ID found in figma.config.json'));
70
+ process.exit(1);
71
+ }
72
+ // Check authentication
73
+ const tokenStore = new TokenStore();
74
+ let accessToken = await getValidAccessToken(tokenStore);
75
+ if (!accessToken) {
76
+ p.log.message('Please log in to continue');
77
+ await loginCommand({
78
+ debug: options.debug
79
+ });
80
+ accessToken = await getValidAccessToken(tokenStore);
81
+ if (!accessToken) {
82
+ p.log.error(pc.red('✗ Authentication failed'));
83
+ process.exit(1);
84
+ }
85
+ }
86
+ // Get project token
87
+ try {
88
+ await getValidProjectToken(tokenStore, config.tenantId);
89
+ } catch (error) {
90
+ p.log.error(pc.yellow('⚠ Project token invalid'));
91
+ throw error;
92
+ }
93
+ // ===== BUILD VALIDATION =====
94
+ spinner.start('Checking for build...');
95
+ let buildInfo = await detectBuild(projectPath);
96
+ if (!buildInfo) {
97
+ spinner.stop(pc.yellow('⚠ No build found for this project.'));
98
+ // Try to find build command
99
+ const buildCmd = await getBuildCommand(projectPath);
100
+ if (!buildCmd) {
101
+ p.log.error('No build script found in package.json');
102
+ p.note('Add a build script to package.json: "build": "next build"', 'Tip');
103
+ process.exit(1);
104
+ }
105
+ // Prompt to run build
106
+ if (!options.yes) {
107
+ const shouldBuild = await p.confirm({
108
+ initialValue: true,
109
+ message: `Build command found in package.json. Run it?`
110
+ });
111
+ if (p.isCancel(shouldBuild) || !shouldBuild) {
112
+ p.log.message('Cancelling deployment...');
113
+ process.exit(0);
114
+ }
115
+ }
116
+ // Run build
117
+ const packageManager = await getPackageManager(projectPath);
118
+ const buildCommand = `${packageManager} run build`;
119
+ spinner.stop(`Running ${buildCommand}...\n`);
120
+ try {
121
+ // Stream build output to user with formatting
122
+ const buildProcess = spawn(packageManager, [
123
+ 'run',
124
+ 'build'
125
+ ], {
126
+ cwd: projectPath,
127
+ stdio: [
128
+ 'ignore',
129
+ 'pipe',
130
+ 'pipe'
131
+ ]
132
+ });
133
+ // Indent and dim output
134
+ buildProcess.stdout?.on('data', (data)=>{
135
+ const lines = data.toString().split('\n');
136
+ lines.forEach((line)=>{
137
+ if (line.trim()) {
138
+ // eslint-disable-next-line no-console
139
+ console.log(pc.dim(` ${line}`)); // Standard output
140
+ }
141
+ });
142
+ });
143
+ buildProcess.stderr?.on('data', (data)=>{
144
+ const lines = data.toString().split('\n');
145
+ lines.forEach((line)=>{
146
+ if (line.trim()) {
147
+ // eslint-disable-next-line no-console
148
+ console.log(pc.dim(` ${line}`)); // Standard error
149
+ }
150
+ });
151
+ });
152
+ const exitCode = await new Promise((resolve)=>{
153
+ buildProcess.on('close', resolve);
154
+ });
155
+ if (exitCode !== 0) {
156
+ throw new Error(`Build process exited with code ${exitCode}`);
157
+ }
158
+ p.log.success(pc.green('✓ Build completed'));
159
+ } catch (error) {
160
+ p.log.error(pc.red('✗ Build failed'));
161
+ if (error instanceof Error && options.debug) {
162
+ log.error(`Build error: ${error.message}`);
163
+ }
164
+ process.exit(1);
165
+ }
166
+ // Re-check for build
167
+ buildInfo = await detectBuild(projectPath);
168
+ if (!buildInfo) {
169
+ p.log.error(pc.red('✗ Build completed but standalone build not found'));
170
+ p.note('Ensure next.config.js has output: "standalone"', 'Check Lambda Configuration');
171
+ process.exit(1);
172
+ }
173
+ } else {
174
+ spinner.stop(pc.green('✓ Build found'));
175
+ p.note([
176
+ `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,
177
+ `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`
178
+ ].join('\n'), 'Build Details');
179
+ }
180
+ // ===== DEPLOYMENT PREPARATION =====
181
+ // Create Lambda zip
182
+ spinner.start('Creating deployment package...');
183
+ try {
184
+ await createLambdaZip(projectPath);
185
+ spinner.stop(pc.green('✓ Deployment package created'));
186
+ } catch (error) {
187
+ spinner.stop(pc.red('✗ Failed to create deployment package'));
188
+ throw error;
189
+ }
190
+ // Collect static assets
191
+ spinner.start('Collecting static assets...');
192
+ const staticAssets = await collectStaticAssets(projectPath);
193
+ const zipPath = path.join(projectPath, 'lambda.zip');
194
+ const zipSize = await getFileSize(zipPath);
195
+ spinner.stop(pc.green(`✓ ${staticAssets.length} static assets detected`));
196
+ log.debug(`Lambda zip size: ${formatBytes(zipSize)}`);
197
+ log.debug(`Static assets: ${staticAssets.length} files`);
198
+ // ===== DEPLOYMENT CONFIRMATION =====
199
+ if (!options.yes) {
200
+ p.note([
201
+ `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,
202
+ `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,
203
+ `${pc.cyan('Code size:')} ${formatBytes(zipSize)}`,
204
+ `${pc.cyan('Static assets:')} ${staticAssets.length} files`
205
+ ].join('\n'), 'Details');
206
+ const shouldDeploy = await p.confirm({
207
+ initialValue: true,
208
+ message: 'Deploy this build to Figma?'
209
+ });
210
+ if (p.isCancel(shouldDeploy) || !shouldDeploy) {
211
+ p.log.message('Cancelling deployment...');
212
+ process.exit(0);
213
+ }
214
+ }
215
+ // ===== DEPLOYMENT EXECUTION =====
216
+ // Step 1: Create deployment
217
+ spinner.start('Creating deployment...');
218
+ let deploymentId;
219
+ let codeUploadUrl;
220
+ let staticAssetUploadUrls;
221
+ try {
222
+ const createResponse = await createDeployment(accessToken, config.tenantId, {
223
+ staticAssets
224
+ });
225
+ deploymentId = createResponse.deploymentId;
226
+ codeUploadUrl = createResponse.codeUploadUrl;
227
+ staticAssetUploadUrls = createResponse.staticAssetUploadUrls;
228
+ log.debug(`Deployment ID: ${deploymentId}`);
229
+ } catch (error) {
230
+ spinner.stop(pc.red('✗ Failed to create deployment'));
231
+ throw error;
232
+ }
233
+ // Step 2: Upload code
234
+ spinner.message(`Uploading code (${formatBytes(zipSize)})...`);
235
+ try {
236
+ await uploadLambdaZip(zipPath, codeUploadUrl);
237
+ spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`));
238
+ } catch (error) {
239
+ spinner.stop(pc.red('✗ Failed to upload code'));
240
+ throw error;
241
+ }
242
+ // Step 3: Upload static assets
243
+ if (staticAssets.length > 0) {
244
+ spinner.start('Uploading static assets...');
245
+ try {
246
+ const uploadResults = await uploadStaticAssets(projectPath, staticAssetUploadUrls, (uploaded, total)=>{
247
+ spinner.message(`Uploading static assets (${uploaded}/${total})...`);
248
+ });
249
+ if (uploadResults.assetsFailed > 0) {
250
+ spinner.stop(pc.yellow(`⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`));
251
+ p.log.warning(`${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`);
252
+ } else {
253
+ spinner.stop(pc.green(`✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`));
254
+ }
255
+ } catch (error) {
256
+ spinner.stop(pc.red('✗ Failed to upload assets'));
257
+ throw error;
258
+ }
259
+ }
260
+ // Step 4: Perform deployment
261
+ spinner.start('Performing deployment...');
262
+ try {
263
+ await performDeployment(accessToken, config.tenantId, {
264
+ deploymentId
265
+ });
266
+ spinner.stop(pc.green('✓ Deployment initiated'));
267
+ } catch (error) {
268
+ spinner.stop(pc.red('✗ Failed to perform deployment'));
269
+ throw error;
270
+ }
271
+ // TODO: Add deployment progress tracking
272
+ // Future: Poll deployment status and show progress
273
+ // API endpoint: GET /v1/tenant/{tenant_id}/deploy/{deployment_id}/status
274
+ // Success output
275
+ p.log.message('This usually takes 2-3 minutes to complete.');
276
+ // Get tenant details for URL
277
+ try {
278
+ const tenant = await getTenantDetails(accessToken, config.tenantId);
279
+ if (tenant.domain) {
280
+ p.log.message(`View: ${pc.cyan(`https://${tenant.domain}/`)}`);
281
+ }
282
+ } catch {
283
+ // Non-critical - just skip URL display
284
+ }
285
+ p.note(`Manage your deployment at:\n${pc.cyan(`https://cms.figma.com/manage/tenants/${config.tenantId}`)}`, 'Next Steps');
286
+ } catch (error) {
287
+ spinner.stop(pc.red('✗ Failed'));
288
+ const message = error instanceof Error ? error.message : 'Unknown error';
289
+ p.log.error(pc.red(`✗ ${message}`));
290
+ if (options.debug && error instanceof Error && error.stack) {
291
+ log.error(`Stack trace: ${error.stack}`);
292
+ }
293
+ process.exit(1);
294
+ }
295
+ }
296
+
297
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport { spawn } from 'child_process'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport { createDeployment, getTenantDetails, performDeployment } from '../api/control-plane.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getValidProjectToken } from '../auth/project-token.js'\nimport { TokenStore } from '../auth/token-store.js'\nimport { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js'\nimport { detectBuild, getBuildCommand } from '../utils/build-detection.js'\nimport { hasFigmaConfig, readFigmaConfig } from '../utils/config.js'\nimport * as log from '../utils/log.js'\nimport { getPackageManager } from '../utils/package-manager.js'\nimport { isInProjectDirectory } from '../utils/project.js'\nimport { uploadLambdaZip, uploadStaticAssets } from '../utils/s3-upload.js'\nimport { loginCommand } from './login.js'\n\n/**\n * Options for deploy command\n */\nexport interface DeployCommandOptions {\n /** Enable debug mode */\n debug?: boolean\n /** Skip confirmation prompts */\n yes?: boolean\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B'\n }\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`\n}\n\n/**\n * Format date to human-readable string in local time\n */\nfunction formatDate(date: Date): string {\n return date.toLocaleString('en-US', {\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n month: 'long',\n timeZoneName: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Execute the deploy command\n *\n * @param options - Command options\n */\nexport async function deployCommand(options: DeployCommandOptions): Promise<void> {\n const projectPath = process.cwd()\n const spinner = p.spinner()\n\n try {\n // ===== PRE-FLIGHT CHECKS =====\n\n // Check if in project directory\n if (!(await isInProjectDirectory(projectPath))) {\n p.log.error(pc.red(\"✗ 'deploy' command is not available outside of a Payload project.\"))\n p.note(\n 'Create a project or connect an existing one to Figma: npx @payloadcms/figma init',\n 'Tip',\n )\n process.exit(1)\n }\n\n // Check if project connected to Figma\n if (!(await hasFigmaConfig(projectPath))) {\n p.log.error(pc.red('✗ Your project is not connected to a Figma CMS ID.'))\n p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip')\n process.exit(1)\n }\n\n // Get tenant configuration\n const config = await readFigmaConfig(projectPath)\n if (!config || !config.tenantId) {\n p.log.error(pc.red('✗ No tenant ID found in figma.config.json'))\n process.exit(1)\n }\n\n // Check authentication\n const tokenStore = new TokenStore()\n\n let accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.message('Please log in to continue')\n await loginCommand({ debug: options.debug })\n accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.error(pc.red('✗ Authentication failed'))\n process.exit(1)\n }\n }\n\n // Get project token\n try {\n await getValidProjectToken(tokenStore, config.tenantId)\n } catch (error) {\n p.log.error(pc.yellow('⚠ Project token invalid'))\n throw error\n }\n\n // ===== BUILD VALIDATION =====\n\n spinner.start('Checking for build...')\n let buildInfo = await detectBuild(projectPath)\n\n if (!buildInfo) {\n spinner.stop(pc.yellow('⚠ No build found for this project.'))\n\n // Try to find build command\n const buildCmd = await getBuildCommand(projectPath)\n\n if (!buildCmd) {\n p.log.error('No build script found in package.json')\n p.note('Add a build script to package.json: \"build\": \"next build\"', 'Tip')\n process.exit(1)\n }\n\n // Prompt to run build\n if (!options.yes) {\n const shouldBuild = await p.confirm({\n initialValue: true,\n message: `Build command found in package.json. Run it?`,\n })\n\n if (p.isCancel(shouldBuild) || !shouldBuild) {\n p.log.message('Cancelling deployment...')\n process.exit(0)\n }\n }\n\n // Run build\n const packageManager = await getPackageManager(projectPath)\n const buildCommand = `${packageManager} run build`\n spinner.stop(`Running ${buildCommand}...\\n`)\n\n try {\n // Stream build output to user with formatting\n const buildProcess = spawn(packageManager, ['run', 'build'], {\n cwd: projectPath,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n // Indent and dim output\n buildProcess.stdout?.on('data', (data) => {\n const lines = data.toString().split('\\n')\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`)) // Standard output\n }\n })\n })\n\n buildProcess.stderr?.on('data', (data) => {\n const lines = data.toString().split('\\n')\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`)) // Standard error\n }\n })\n })\n\n const exitCode = await new Promise<number>((resolve) => {\n buildProcess.on('close', resolve)\n })\n\n if (exitCode !== 0) {\n throw new Error(`Build process exited with code ${exitCode}`)\n }\n\n p.log.success(pc.green('✓ Build completed'))\n } catch (error) {\n p.log.error(pc.red('✗ Build failed'))\n if (error instanceof Error && options.debug) {\n log.error(`Build error: ${error.message}`)\n }\n process.exit(1)\n }\n\n // Re-check for build\n buildInfo = await detectBuild(projectPath)\n if (!buildInfo) {\n p.log.error(pc.red('✗ Build completed but standalone build not found'))\n p.note('Ensure next.config.js has output: \"standalone\"', 'Check Lambda Configuration')\n process.exit(1)\n }\n } else {\n spinner.stop(pc.green('✓ Build found'))\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n ].join('\\n'),\n 'Build Details',\n )\n }\n\n // ===== DEPLOYMENT PREPARATION =====\n\n // Create Lambda zip\n spinner.start('Creating deployment package...')\n try {\n await createLambdaZip(projectPath)\n spinner.stop(pc.green('✓ Deployment package created'))\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to create deployment package'))\n throw error\n }\n\n // Collect static assets\n spinner.start('Collecting static assets...')\n const staticAssets = await collectStaticAssets(projectPath)\n const zipPath = path.join(projectPath, 'lambda.zip')\n const zipSize = await getFileSize(zipPath)\n spinner.stop(pc.green(`✓ ${staticAssets.length} static assets detected`))\n\n log.debug(`Lambda zip size: ${formatBytes(zipSize)}`)\n log.debug(`Static assets: ${staticAssets.length} files`)\n\n // ===== DEPLOYMENT CONFIRMATION =====\n\n if (!options.yes) {\n p.note(\n [\n `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,\n `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`,\n `${pc.cyan('Code size:')} ${formatBytes(zipSize)}`,\n `${pc.cyan('Static assets:')} ${staticAssets.length} files`,\n ].join('\\n'),\n 'Details',\n )\n\n const shouldDeploy = await p.confirm({\n initialValue: true,\n message: 'Deploy this build to Figma?',\n })\n\n if (p.isCancel(shouldDeploy) || !shouldDeploy) {\n p.log.message('Cancelling deployment...')\n process.exit(0)\n }\n }\n\n // ===== DEPLOYMENT EXECUTION =====\n\n // Step 1: Create deployment\n spinner.start('Creating deployment...')\n let deploymentId: string\n let codeUploadUrl: string\n let staticAssetUploadUrls: Record<string, string>\n\n try {\n const createResponse = await createDeployment(accessToken, config.tenantId, {\n staticAssets,\n })\n\n deploymentId = createResponse.deploymentId\n codeUploadUrl = createResponse.codeUploadUrl\n staticAssetUploadUrls = createResponse.staticAssetUploadUrls\n\n log.debug(`Deployment ID: ${deploymentId}`)\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to create deployment'))\n throw error\n }\n\n // Step 2: Upload code\n spinner.message(`Uploading code (${formatBytes(zipSize)})...`)\n try {\n await uploadLambdaZip(zipPath, codeUploadUrl)\n spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`))\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to upload code'))\n throw error\n }\n\n // Step 3: Upload static assets\n if (staticAssets.length > 0) {\n spinner.start('Uploading static assets...')\n\n try {\n const uploadResults = await uploadStaticAssets(\n projectPath,\n staticAssetUploadUrls,\n (uploaded, total) => {\n spinner.message(`Uploading static assets (${uploaded}/${total})...`)\n },\n )\n\n if (uploadResults.assetsFailed > 0) {\n spinner.stop(\n pc.yellow(\n `⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`,\n ),\n )\n p.log.warning(\n `${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`,\n )\n } else {\n spinner.stop(\n pc.green(\n `✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`,\n ),\n )\n }\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to upload assets'))\n throw error\n }\n }\n\n // Step 4: Perform deployment\n spinner.start('Performing deployment...')\n try {\n await performDeployment(accessToken, config.tenantId, {\n deploymentId,\n })\n spinner.stop(pc.green('✓ Deployment initiated'))\n } catch (error) {\n spinner.stop(pc.red('✗ Failed to perform deployment'))\n throw error\n }\n\n // TODO: Add deployment progress tracking\n // Future: Poll deployment status and show progress\n // API endpoint: GET /v1/tenant/{tenant_id}/deploy/{deployment_id}/status\n\n // Success output\n p.log.message('This usually takes 2-3 minutes to complete.')\n\n // Get tenant details for URL\n try {\n const tenant = await getTenantDetails(accessToken, config.tenantId)\n if (tenant.domain) {\n p.log.message(`View: ${pc.cyan(`https://${tenant.domain}/`)}`)\n }\n } catch {\n // Non-critical - just skip URL display\n }\n\n p.note(\n `Manage your deployment at:\\n${pc.cyan(`https://cms.figma.com/manage/tenants/${config.tenantId}`)}`,\n 'Next Steps',\n )\n } catch (error) {\n spinner.stop(pc.red('✗ Failed'))\n const message = error instanceof Error ? error.message : 'Unknown error'\n p.log.error(pc.red(`✗ ${message}`))\n if (options.debug && error instanceof Error && error.stack) {\n log.error(`Stack trace: ${error.stack}`)\n }\n process.exit(1)\n }\n}\n"],"names":["p","spawn","path","pc","createDeployment","getTenantDetails","performDeployment","getValidAccessToken","getValidProjectToken","TokenStore","collectStaticAssets","createLambdaZip","getFileSize","detectBuild","getBuildCommand","hasFigmaConfig","readFigmaConfig","log","getPackageManager","isInProjectDirectory","uploadLambdaZip","uploadStaticAssets","loginCommand","formatBytes","bytes","k","sizes","i","Math","floor","parseFloat","pow","toFixed","formatDate","date","toLocaleString","day","hour","minute","month","timeZoneName","year","deployCommand","options","projectPath","process","cwd","spinner","error","red","note","exit","config","tenantId","tokenStore","accessToken","message","debug","yellow","start","buildInfo","stop","buildCmd","yes","shouldBuild","confirm","initialValue","isCancel","packageManager","buildCommand","buildProcess","stdio","stdout","on","data","lines","toString","split","forEach","line","trim","console","dim","stderr","exitCode","Promise","resolve","Error","success","green","cyan","buildId","timestamp","join","staticAssets","zipPath","zipSize","length","shouldDeploy","deploymentId","codeUploadUrl","staticAssetUploadUrls","createResponse","uploadResults","uploaded","total","assetsFailed","assetsUploaded","warning","totalBytesUploaded","tenant","domain","stack"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deploy.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.spec.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { deployCommand } from './deploy.js';
3
+ describe('deploy command', ()=>{
4
+ describe('pre-flight checks', ()=>{
5
+ it('should export deployCommand function', ()=>{
6
+ expect(deployCommand).toBeDefined();
7
+ expect(typeof deployCommand).toBe('function');
8
+ });
9
+ it('should accept options parameter', async ()=>{
10
+ // This will fail during pre-flight checks but tests signature
11
+ await expect(deployCommand({
12
+ debug: true
13
+ })).rejects.toThrow();
14
+ });
15
+ });
16
+ });
17
+
18
+ //# sourceMappingURL=deploy.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/deploy.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { deployCommand } from './deploy.js'\n\ndescribe('deploy command', () => {\n describe('pre-flight checks', () => {\n it('should export deployCommand function', () => {\n expect(deployCommand).toBeDefined()\n expect(typeof deployCommand).toBe('function')\n })\n\n it('should accept options parameter', async () => {\n // This will fail during pre-flight checks but tests signature\n await expect(deployCommand({ debug: true })).rejects.toThrow()\n })\n })\n})\n"],"names":["describe","expect","it","deployCommand","toBeDefined","toBe","debug","rejects","toThrow"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,aAAa,QAAQ,cAAa;AAE3CH,SAAS,kBAAkB;IACzBA,SAAS,qBAAqB;QAC5BE,GAAG,wCAAwC;YACzCD,OAAOE,eAAeC,WAAW;YACjCH,OAAO,OAAOE,eAAeE,IAAI,CAAC;QACpC;QAEAH,GAAG,mCAAmC;YACpC,8DAA8D;YAC9D,MAAMD,OAAOE,cAAc;gBAAEG,OAAO;YAAK,IAAIC,OAAO,CAACC,OAAO;QAC9D;IACF;AACF"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Options for init command
3
+ */
4
+ export interface InitCommandOptions {
5
+ /** Enable debug mode */
6
+ debug?: boolean;
7
+ /** Force reconfiguration of existing project */
8
+ force?: boolean;
9
+ /** Tenant ID to use (optional - will prompt if not provided) */
10
+ id?: string;
11
+ /** Project name (for scaffolding) */
12
+ name?: string;
13
+ /** Skip authentication check (for testing/development) */
14
+ skipAuth?: boolean;
15
+ /** Skip prompts and use defaults where possible */
16
+ yes?: boolean;
17
+ }
18
+ /**
19
+ * Handle the `init` command
20
+ *
21
+ * Sets up a project by:
22
+ * 1. Checking authentication
23
+ * 2. Detecting/scaffolding Payload project
24
+ * 3. Fetching tenant details
25
+ * 4. Storing configuration
26
+ *
27
+ * @param options - Command options
28
+ */
29
+ export declare function initCommand(options: InitCommandOptions): Promise<void>;
30
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gEAAgE;IAChE,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mDAAmD;IACnD,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAiDD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2a5E"}