@payloadcms/figma 0.0.1-alpha.41 → 0.0.1-alpha.5

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 (269) hide show
  1. package/dist/api/control-plane.d.ts +1 -22
  2. package/dist/api/control-plane.d.ts.map +1 -1
  3. package/dist/api/control-plane.js +22 -55
  4. package/dist/api/control-plane.js.map +1 -1
  5. package/dist/api/figma-api.d.ts.map +1 -1
  6. package/dist/api/figma-api.js +21 -45
  7. package/dist/api/figma-api.js.map +1 -1
  8. package/dist/auth/callback-server.d.ts.map +1 -1
  9. package/dist/auth/callback-server.js +1 -2
  10. package/dist/auth/callback-server.js.map +1 -1
  11. package/dist/auth/crypto-utils.d.ts.map +1 -1
  12. package/dist/auth/crypto-utils.js +5 -5
  13. package/dist/auth/crypto-utils.js.map +1 -1
  14. package/dist/auth/jwt-validator.d.ts +1 -2
  15. package/dist/auth/jwt-validator.d.ts.map +1 -1
  16. package/dist/auth/jwt-validator.js +2 -2
  17. package/dist/auth/jwt-validator.js.map +1 -1
  18. package/dist/auth/oauth-flow.d.ts +1 -1
  19. package/dist/auth/oauth-flow.d.ts.map +1 -1
  20. package/dist/auth/oauth-flow.js +8 -9
  21. package/dist/auth/oauth-flow.js.map +1 -1
  22. package/dist/auth/project-token.d.ts.map +1 -1
  23. package/dist/auth/project-token.js +4 -9
  24. package/dist/auth/project-token.js.map +1 -1
  25. package/dist/auth/refresh.d.ts.map +1 -1
  26. package/dist/auth/refresh.js +9 -14
  27. package/dist/auth/refresh.js.map +1 -1
  28. package/dist/auth/token-store.d.ts +0 -10
  29. package/dist/auth/token-store.d.ts.map +1 -1
  30. package/dist/auth/token-store.js +0 -20
  31. package/dist/auth/token-store.js.map +1 -1
  32. package/dist/cli.d.ts.map +1 -1
  33. package/dist/cli.js +0 -31
  34. package/dist/cli.js.map +1 -1
  35. package/dist/commands/deploy.d.ts +0 -4
  36. package/dist/commands/deploy.d.ts.map +1 -1
  37. package/dist/commands/deploy.js +129 -71
  38. package/dist/commands/deploy.js.map +1 -1
  39. package/dist/commands/init.d.ts +5 -1
  40. package/dist/commands/init.d.ts.map +1 -1
  41. package/dist/commands/init.js +85 -94
  42. package/dist/commands/init.js.map +1 -1
  43. package/dist/commands/list-tokens.d.ts.map +1 -1
  44. package/dist/commands/list-tokens.js +3 -6
  45. package/dist/commands/list-tokens.js.map +1 -1
  46. package/dist/commands/login.d.ts +1 -8
  47. package/dist/commands/login.d.ts.map +1 -1
  48. package/dist/commands/login.js +11 -21
  49. package/dist/commands/login.js.map +1 -1
  50. package/dist/commands/logout.js +2 -2
  51. package/dist/commands/logout.js.map +1 -1
  52. package/dist/config/oauth.d.ts +14 -4
  53. package/dist/config/oauth.d.ts.map +1 -1
  54. package/dist/config/oauth.js +40 -19
  55. package/dist/config/oauth.js.map +1 -1
  56. package/dist/constants.d.ts +18 -26
  57. package/dist/constants.d.ts.map +1 -1
  58. package/dist/constants.js +20 -34
  59. package/dist/constants.js.map +1 -1
  60. package/dist/exports/client.d.ts +0 -1
  61. package/dist/exports/client.d.ts.map +1 -1
  62. package/dist/exports/client.js +0 -1
  63. package/dist/exports/client.js.map +1 -1
  64. package/dist/index.d.ts +1 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/oauth/components/LoginButton/index.d.ts.map +1 -1
  69. package/dist/oauth/components/LoginButton/index.js +6 -50
  70. package/dist/oauth/components/LoginButton/index.js.map +1 -1
  71. package/dist/oauth/components/LoginButton/index.scss +3 -50
  72. package/dist/oauth/components/LogoutButton/index.d.ts.map +1 -1
  73. package/dist/oauth/components/LogoutButton/index.js +1 -0
  74. package/dist/oauth/components/LogoutButton/index.js.map +1 -1
  75. package/dist/oauth/defaults.d.ts.map +1 -1
  76. package/dist/oauth/defaults.js +5 -29
  77. package/dist/oauth/defaults.js.map +1 -1
  78. package/dist/oauth/endpoints/getLoginEndpoint.d.ts.map +1 -1
  79. package/dist/oauth/endpoints/getLoginEndpoint.js +4 -4
  80. package/dist/oauth/endpoints/getLoginEndpoint.js.map +1 -1
  81. package/dist/oauth/index.d.ts.map +1 -1
  82. package/dist/oauth/index.js +5 -40
  83. package/dist/oauth/index.js.map +1 -1
  84. package/dist/oauth/strategy/index.d.ts +2 -0
  85. package/dist/oauth/strategy/index.d.ts.map +1 -1
  86. package/dist/oauth/strategy/index.js +15 -38
  87. package/dist/oauth/strategy/index.js.map +1 -1
  88. package/dist/oauth/types.d.ts +6 -6
  89. package/dist/oauth/types.d.ts.map +1 -1
  90. package/dist/oauth/types.js.map +1 -1
  91. package/dist/oauth/utilities/createCookieOptions.d.ts.map +1 -1
  92. package/dist/oauth/utilities/createCookieOptions.js.map +1 -1
  93. package/dist/oauth/utilities/refreshTokens.d.ts.map +1 -1
  94. package/dist/oauth/utilities/refreshTokens.js +1 -1
  95. package/dist/oauth/utilities/refreshTokens.js.map +1 -1
  96. package/dist/plugin/build-config.d.ts +4 -21
  97. package/dist/plugin/build-config.d.ts.map +1 -1
  98. package/dist/plugin/build-config.js +8 -114
  99. package/dist/plugin/build-config.js.map +1 -1
  100. package/dist/types.d.ts +0 -1
  101. package/dist/types.d.ts.map +1 -1
  102. package/dist/types.js.map +1 -1
  103. package/dist/utils/asset-collection.d.ts +6 -3
  104. package/dist/utils/asset-collection.d.ts.map +1 -1
  105. package/dist/utils/asset-collection.js +34 -10
  106. package/dist/utils/asset-collection.js.map +1 -1
  107. package/dist/utils/config.js +1 -1
  108. package/dist/utils/config.js.map +1 -1
  109. package/dist/utils/env-management.d.ts +8 -9
  110. package/dist/utils/env-management.d.ts.map +1 -1
  111. package/dist/utils/env-management.js +74 -73
  112. package/dist/utils/env-management.js.map +1 -1
  113. package/dist/utils/formatter.d.ts.map +1 -1
  114. package/dist/utils/formatter.js +5 -3
  115. package/dist/utils/formatter.js.map +1 -1
  116. package/dist/utils/lambda-config.d.ts +1 -3
  117. package/dist/utils/lambda-config.d.ts.map +1 -1
  118. package/dist/utils/lambda-config.js +21 -13
  119. package/dist/utils/lambda-config.js.map +1 -1
  120. package/dist/utils/messages.d.ts.map +1 -1
  121. package/dist/utils/messages.js +7 -8
  122. package/dist/utils/messages.js.map +1 -1
  123. package/dist/utils/payload-config-ast.d.ts +3 -22
  124. package/dist/utils/payload-config-ast.d.ts.map +1 -1
  125. package/dist/utils/payload-config-ast.js +31 -89
  126. package/dist/utils/payload-config-ast.js.map +1 -1
  127. package/dist/utils/payload-config-finder.d.ts +2 -2
  128. package/dist/utils/payload-config-finder.d.ts.map +1 -1
  129. package/dist/utils/payload-config-finder.js +9 -48
  130. package/dist/utils/payload-config-finder.js.map +1 -1
  131. package/dist/utils/payload-config-modifier.d.ts.map +1 -1
  132. package/dist/utils/payload-config-modifier.js +6 -54
  133. package/dist/utils/payload-config-modifier.js.map +1 -1
  134. package/dist/utils/payload-package-check.d.ts +1 -12
  135. package/dist/utils/payload-package-check.d.ts.map +1 -1
  136. package/dist/utils/payload-package-check.js +5 -63
  137. package/dist/utils/payload-package-check.js.map +1 -1
  138. package/dist/utils/project.d.ts.map +1 -1
  139. package/dist/utils/project.js +5 -8
  140. package/dist/utils/project.js.map +1 -1
  141. package/dist/utils/s3-upload.d.ts +1 -0
  142. package/dist/utils/s3-upload.d.ts.map +1 -1
  143. package/dist/utils/s3-upload.js +3 -10
  144. package/dist/utils/s3-upload.js.map +1 -1
  145. package/dist/utils/token-display.d.ts.map +1 -1
  146. package/dist/utils/token-display.js +5 -11
  147. package/dist/utils/token-display.js.map +1 -1
  148. package/dist/utils/typescript-validator.d.ts.map +1 -1
  149. package/dist/utils/typescript-validator.js +6 -4
  150. package/dist/utils/typescript-validator.js.map +1 -1
  151. package/package.json +9 -27
  152. package/dist/commands/build-lambda-zip.d.ts +0 -5
  153. package/dist/commands/build-lambda-zip.d.ts.map +0 -1
  154. package/dist/commands/build-lambda-zip.js +0 -19
  155. package/dist/commands/build-lambda-zip.js.map +0 -1
  156. package/dist/db-content-api/README.md +0 -98
  157. package/dist/db-content-api/generated/content-api-types.d.ts +0 -3854
  158. package/dist/db-content-api/generated/content-api-types.d.ts.map +0 -1
  159. package/dist/db-content-api/generated/content-api-types.js +0 -7
  160. package/dist/db-content-api/generated/content-api-types.js.map +0 -1
  161. package/dist/db-content-api/index.d.ts +0 -18
  162. package/dist/db-content-api/index.d.ts.map +0 -1
  163. package/dist/db-content-api/index.js +0 -578
  164. package/dist/db-content-api/index.js.map +0 -1
  165. package/dist/db-content-api/temp-utilities/pagination.d.ts +0 -13
  166. package/dist/db-content-api/temp-utilities/pagination.d.ts.map +0 -1
  167. package/dist/db-content-api/temp-utilities/pagination.js +0 -45
  168. package/dist/db-content-api/temp-utilities/pagination.js.map +0 -1
  169. package/dist/db-content-api/temp-utilities/slug.d.ts +0 -2
  170. package/dist/db-content-api/temp-utilities/slug.d.ts.map +0 -1
  171. package/dist/db-content-api/temp-utilities/slug.js +0 -3
  172. package/dist/db-content-api/temp-utilities/slug.js.map +0 -1
  173. package/dist/db-content-api/temp-utilities/sorting.d.ts +0 -3
  174. package/dist/db-content-api/temp-utilities/sorting.d.ts.map +0 -1
  175. package/dist/db-content-api/temp-utilities/sorting.js +0 -32
  176. package/dist/db-content-api/temp-utilities/sorting.js.map +0 -1
  177. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts +0 -4
  178. package/dist/db-content-api/temp-utilities/unwrapDocument.d.ts.map +0 -1
  179. package/dist/db-content-api/temp-utilities/unwrapDocument.js +0 -53
  180. package/dist/db-content-api/temp-utilities/unwrapDocument.js.map +0 -1
  181. package/dist/db-content-api/utilities/auth.d.ts +0 -30
  182. package/dist/db-content-api/utilities/auth.d.ts.map +0 -1
  183. package/dist/db-content-api/utilities/auth.js +0 -81
  184. package/dist/db-content-api/utilities/auth.js.map +0 -1
  185. package/dist/db-content-api/utilities/data/applyDefaults.d.ts +0 -7
  186. package/dist/db-content-api/utilities/data/applyDefaults.d.ts.map +0 -1
  187. package/dist/db-content-api/utilities/data/applyDefaults.js +0 -59
  188. package/dist/db-content-api/utilities/data/applyDefaults.js.map +0 -1
  189. package/dist/db-content-api/utilities/data/castFieldValue.d.ts +0 -11
  190. package/dist/db-content-api/utilities/data/castFieldValue.d.ts.map +0 -1
  191. package/dist/db-content-api/utilities/data/castFieldValue.js +0 -66
  192. package/dist/db-content-api/utilities/data/castFieldValue.js.map +0 -1
  193. package/dist/db-content-api/utilities/data/index.d.ts +0 -30
  194. package/dist/db-content-api/utilities/data/index.d.ts.map +0 -1
  195. package/dist/db-content-api/utilities/data/index.js +0 -182
  196. package/dist/db-content-api/utilities/data/index.js.map +0 -1
  197. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts +0 -12
  198. package/dist/db-content-api/utilities/data/removeVirtualFields.d.ts.map +0 -1
  199. package/dist/db-content-api/utilities/data/removeVirtualFields.js +0 -54
  200. package/dist/db-content-api/utilities/data/removeVirtualFields.js.map +0 -1
  201. package/dist/db-content-api/utilities/data/stripFields.d.ts +0 -48
  202. package/dist/db-content-api/utilities/data/stripFields.d.ts.map +0 -1
  203. package/dist/db-content-api/utilities/data/stripFields.js +0 -195
  204. package/dist/db-content-api/utilities/data/stripFields.js.map +0 -1
  205. package/dist/db-content-api/utilities/joins.d.ts +0 -55
  206. package/dist/db-content-api/utilities/joins.d.ts.map +0 -1
  207. package/dist/db-content-api/utilities/joins.js +0 -136
  208. package/dist/db-content-api/utilities/joins.js.map +0 -1
  209. package/dist/db-content-api/utilities/where.d.ts +0 -12
  210. package/dist/db-content-api/utilities/where.d.ts.map +0 -1
  211. package/dist/db-content-api/utilities/where.js +0 -107
  212. package/dist/db-content-api/utilities/where.js.map +0 -1
  213. package/dist/endpoints/health.d.ts +0 -3
  214. package/dist/endpoints/health.d.ts.map +0 -1
  215. package/dist/endpoints/health.js +0 -11
  216. package/dist/endpoints/health.js.map +0 -1
  217. package/dist/oauth/utilities/isDuplicateKeyError.d.ts +0 -7
  218. package/dist/oauth/utilities/isDuplicateKeyError.d.ts.map +0 -1
  219. package/dist/oauth/utilities/isDuplicateKeyError.js +0 -14
  220. package/dist/oauth/utilities/isDuplicateKeyError.js.map +0 -1
  221. package/dist/storage-content-api/api-types.d.ts +0 -161
  222. package/dist/storage-content-api/api-types.d.ts.map +0 -1
  223. package/dist/storage-content-api/api-types.js +0 -6
  224. package/dist/storage-content-api/api-types.js.map +0 -1
  225. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts +0 -9
  226. package/dist/storage-content-api/client-uploads/ClientUploadHandler.d.ts.map +0 -1
  227. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js +0 -42
  228. package/dist/storage-content-api/client-uploads/ClientUploadHandler.js.map +0 -1
  229. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts +0 -13
  230. package/dist/storage-content-api/client-uploads/generateSignedURL.d.ts.map +0 -1
  231. package/dist/storage-content-api/client-uploads/generateSignedURL.js +0 -31
  232. package/dist/storage-content-api/client-uploads/generateSignedURL.js.map +0 -1
  233. package/dist/storage-content-api/client.d.ts +0 -6
  234. package/dist/storage-content-api/client.d.ts.map +0 -1
  235. package/dist/storage-content-api/client.js +0 -36
  236. package/dist/storage-content-api/client.js.map +0 -1
  237. package/dist/storage-content-api/generateURL.d.ts +0 -7
  238. package/dist/storage-content-api/generateURL.d.ts.map +0 -1
  239. package/dist/storage-content-api/generateURL.js +0 -7
  240. package/dist/storage-content-api/generateURL.js.map +0 -1
  241. package/dist/storage-content-api/handleDelete.d.ts +0 -8
  242. package/dist/storage-content-api/handleDelete.d.ts.map +0 -1
  243. package/dist/storage-content-api/handleDelete.js +0 -15
  244. package/dist/storage-content-api/handleDelete.js.map +0 -1
  245. package/dist/storage-content-api/handleUpload.d.ts +0 -11
  246. package/dist/storage-content-api/handleUpload.d.ts.map +0 -1
  247. package/dist/storage-content-api/handleUpload.js +0 -136
  248. package/dist/storage-content-api/handleUpload.js.map +0 -1
  249. package/dist/storage-content-api/index.d.ts +0 -5
  250. package/dist/storage-content-api/index.d.ts.map +0 -1
  251. package/dist/storage-content-api/index.js +0 -31
  252. package/dist/storage-content-api/index.js.map +0 -1
  253. package/dist/storage-content-api/staticHandler.d.ts +0 -10
  254. package/dist/storage-content-api/staticHandler.d.ts.map +0 -1
  255. package/dist/storage-content-api/staticHandler.js +0 -55
  256. package/dist/storage-content-api/staticHandler.js.map +0 -1
  257. package/dist/storage-content-api/types.d.ts +0 -10
  258. package/dist/storage-content-api/types.d.ts.map +0 -1
  259. package/dist/storage-content-api/types.js +0 -3
  260. package/dist/storage-content-api/types.js.map +0 -1
  261. package/dist/templates/README.md +0 -19
  262. package/dist/utils/build-lambda-zip.d.ts +0 -14
  263. package/dist/utils/build-lambda-zip.d.ts.map +0 -1
  264. package/dist/utils/build-lambda-zip.js +0 -81
  265. package/dist/utils/build-lambda-zip.js.map +0 -1
  266. package/dist/utils/version-check.d.ts +0 -3
  267. package/dist/utils/version-check.d.ts.map +0 -1
  268. package/dist/utils/version-check.js +0 -38
  269. package/dist/utils/version-check.js.map +0 -1
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAS1C"}
package/dist/cli.js CHANGED
@@ -1,13 +1,11 @@
1
1
  import * as p from '@clack/prompts';
2
2
  import arg from 'arg';
3
3
  import pc from 'picocolors';
4
- import { buildLambdaZipCommand } from './commands/build-lambda-zip.js';
5
4
  import { deployCommand } from './commands/deploy.js';
6
5
  import { initCommand } from './commands/init.js';
7
6
  import { listTokensCommand } from './commands/list-tokens.js';
8
7
  import { loginCommand } from './commands/login.js';
9
8
  import { logoutCommand } from './commands/logout.js';
10
- import { setEnvironment } from './constants.js';
11
9
  import { feedbackOutro, helpMessage } from './utils/messages.js';
12
10
  /**
13
11
  * Entrypoint for bin/cli.js
@@ -27,19 +25,15 @@ class Main {
27
25
  // @ts-expect-error bad typings
28
26
  this.args = arg({
29
27
  '--debug': Boolean,
30
- '--env': String,
31
28
  '--force': Boolean,
32
29
  '--help': Boolean,
33
30
  '--id': String,
34
31
  '--name': String,
35
32
  '--skip-auth': Boolean,
36
- '--skip-build': Boolean,
37
- '--version': Boolean,
38
33
  '--yes': Boolean,
39
34
  // Aliases
40
35
  '-f': '--force',
41
36
  '-h': '--help',
42
- '-v': '--version',
43
37
  '-y': '--yes'
44
38
  }, {
45
39
  permissive: true
@@ -48,19 +42,6 @@ class Main {
48
42
  if (this.args['--debug']) {
49
43
  process.env.DEBUG = 'true';
50
44
  }
51
- // Handle --env flag for environment switching
52
- if (this.args['--env']) {
53
- const envArg = this.args['--env'].toLowerCase();
54
- if (envArg === 'prod' || envArg === 'production') {
55
- setEnvironment('production');
56
- } else if (envArg === 'staging') {
57
- setEnvironment('staging');
58
- } else {
59
- // eslint-disable-next-line no-console
60
- console.error(`Invalid --env value: ${this.args['--env']}. Use 'prod' or 'staging'.`);
61
- process.exit(1);
62
- }
63
- }
64
45
  }
65
46
  async init() {
66
47
  try {
@@ -68,13 +49,6 @@ class Main {
68
49
  helpMessage();
69
50
  process.exit(0);
70
51
  }
71
- if (this.args['--version']) {
72
- const { getOwnVersion } = await import('./utils/version-check.js');
73
- const version = await getOwnVersion();
74
- // eslint-disable-next-line no-console
75
- console.log(version);
76
- process.exit(0);
77
- }
78
52
  // Get the subcommand (first non-flag argument)
79
53
  const subcommand = this.args._[0];
80
54
  // eslint-disable-next-line no-console
@@ -82,14 +56,9 @@ class Main {
82
56
  p.intro(pc.bgCyan(pc.black(' @payloadcms/figma ')));
83
57
  // Route to appropriate command handler
84
58
  switch(subcommand){
85
- case 'build-lambda-zip':
86
- await buildLambdaZipCommand();
87
- break;
88
59
  case 'deploy':
89
60
  await deployCommand({
90
- id: this.args['--id'],
91
61
  debug: this.args['--debug'],
92
- skipBuild: this.args['--skip-build'],
93
62
  yes: this.args['--yes']
94
63
  });
95
64
  break;
package/dist/cli.js.map CHANGED
@@ -1 +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 { buildLambdaZipCommand } from './commands/build-lambda-zip.js'\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 { setEnvironment } from './constants.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 '--env': String,\n '--force': Boolean,\n '--help': Boolean,\n '--id': String,\n '--name': String,\n '--skip-auth': Boolean,\n '--skip-build': Boolean,\n '--version': Boolean,\n '--yes': Boolean,\n\n // Aliases\n '-f': '--force',\n '-h': '--help',\n '-v': '--version',\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 // Handle --env flag for environment switching\n if (this.args['--env']) {\n const envArg = this.args['--env'].toLowerCase()\n if (envArg === 'prod' || envArg === 'production') {\n setEnvironment('production')\n } else if (envArg === 'staging') {\n setEnvironment('staging')\n } else {\n // eslint-disable-next-line no-console\n console.error(`Invalid --env value: ${this.args['--env']}. Use 'prod' or 'staging'.`)\n process.exit(1)\n }\n }\n }\n\n async init(): Promise<void> {\n try {\n if (this.args['--help']) {\n helpMessage()\n process.exit(0)\n }\n\n if (this.args['--version']) {\n const { getOwnVersion } = await import('./utils/version-check.js')\n const version = await getOwnVersion()\n // eslint-disable-next-line no-console\n console.log(version)\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 'build-lambda-zip':\n await buildLambdaZipCommand()\n break\n\n case 'deploy':\n await deployCommand({\n id: this.args['--id'],\n debug: this.args['--debug'],\n skipBuild: this.args['--skip-build'],\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 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","buildLambdaZipCommand","deployCommand","initCommand","listTokensCommand","loginCommand","logoutCommand","setEnvironment","feedbackOutro","helpMessage","main","Main","init","e","Error","console","error","message","args","Boolean","String","permissive","process","env","DEBUG","envArg","toLowerCase","exit","getOwnVersion","version","log","subcommand","_","intro","bgCyan","black","id","debug","skipBuild","yes","name","force","skipAuth","undefined","note","outro","red","err"],"mappings":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,SAAS,MAAK;AACrB,OAAOC,QAAQ,aAAY;AAI3B,SAASC,qBAAqB,QAAQ,iCAAgC;AACtE,SAASC,aAAa,QAAQ,uBAAsB;AACpD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,iBAAiB,QAAQ,4BAA2B;AAC7D,SAASC,YAAY,QAAQ,sBAAqB;AAClD,SAASC,aAAa,QAAQ,uBAAsB;AACpD,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,SAASC,aAAa,EAAEC,WAAW,QAAQ,sBAAqB;AAEhE;;CAEC,GACD,OAAO,eAAeC;IACpB,IAAI;QACF,MAAM,IAAIC,OAAOC,IAAI;IACvB,EAAE,OAAOC,GAAG;QACV,IAAIA,aAAaC,OAAO;YACtB,sCAAsC;YACtCC,QAAQC,KAAK,CAACH,EAAEI,OAAO;QACzB;IACF;AACF;AAEA,MAAMN;IACJO,KAAa;IAEb,aAAc;QACZ,+BAA+B;QAC/B,IAAI,CAACA,IAAI,GAAGnB,IACV;YACE,WAAWoB;YACX,SAASC;YACT,WAAWD;YACX,UAAUA;YACV,QAAQC;YACR,UAAUA;YACV,eAAeD;YACf,gBAAgBA;YAChB,aAAaA;YACb,SAASA;YAET,UAAU;YACV,MAAM;YACN,MAAM;YACN,MAAM;YACN,MAAM;QACR,GACA;YAAEE,YAAY;QAAK;QAGrB,0BAA0B;QAC1B,IAAI,IAAI,CAACH,IAAI,CAAC,UAAU,EAAE;YACxBI,QAAQC,GAAG,CAACC,KAAK,GAAG;QACtB;QAEA,8CAA8C;QAC9C,IAAI,IAAI,CAACN,IAAI,CAAC,QAAQ,EAAE;YACtB,MAAMO,SAAS,IAAI,CAACP,IAAI,CAAC,QAAQ,CAACQ,WAAW;YAC7C,IAAID,WAAW,UAAUA,WAAW,cAAc;gBAChDlB,eAAe;YACjB,OAAO,IAAIkB,WAAW,WAAW;gBAC/BlB,eAAe;YACjB,OAAO;gBACL,sCAAsC;gBACtCQ,QAAQC,KAAK,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAACE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC;gBACpFI,QAAQK,IAAI,CAAC;YACf;QACF;IACF;IAEA,MAAMf,OAAsB;QAC1B,IAAI;YACF,IAAI,IAAI,CAACM,IAAI,CAAC,SAAS,EAAE;gBACvBT;gBACAa,QAAQK,IAAI,CAAC;YACf;YAEA,IAAI,IAAI,CAACT,IAAI,CAAC,YAAY,EAAE;gBAC1B,MAAM,EAAEU,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC;gBACvC,MAAMC,UAAU,MAAMD;gBACtB,sCAAsC;gBACtCb,QAAQe,GAAG,CAACD;gBACZP,QAAQK,IAAI,CAAC;YACf;YAEA,+CAA+C;YAC/C,MAAMI,aAAa,IAAI,CAACb,IAAI,CAACc,CAAC,CAAC,EAAE;YAEjC,sCAAsC;YACtCjB,QAAQe,GAAG,CAAC;YACZhC,EAAEmC,KAAK,CAACjC,GAAGkC,MAAM,CAAClC,GAAGmC,KAAK,CAAC;YAE3B,uCAAuC;YACvC,OAAQJ;gBACN,KAAK;oBACH,MAAM9B;oBACN;gBAEF,KAAK;oBACH,MAAMC,cAAc;wBAClBkC,IAAI,IAAI,CAAClB,IAAI,CAAC,OAAO;wBACrBmB,OAAO,IAAI,CAACnB,IAAI,CAAC,UAAU;wBAC3BoB,WAAW,IAAI,CAACpB,IAAI,CAAC,eAAe;wBACpCqB,KAAK,IAAI,CAACrB,IAAI,CAAC,QAAQ;oBACzB;oBACA;gBAEF,KAAK;oBACH,MAAMf,YAAY;wBAChBiC,IAAI,IAAI,CAAClB,IAAI,CAAC,OAAO;wBACrBsB,MAAM,IAAI,CAACtB,IAAI,CAAC,SAAS;wBACzBmB,OAAO,IAAI,CAACnB,IAAI,CAAC,UAAU;wBAC3BuB,OAAO,IAAI,CAACvB,IAAI,CAAC,UAAU;wBAC3BwB,UAAU,IAAI,CAACxB,IAAI,CAAC,cAAc;oBACpC;oBACA;gBAEF,KAAK;oBACHd,kBAAkB;wBAChBiC,OAAO,IAAI,CAACnB,IAAI,CAAC,UAAU;oBAC7B;oBACA;gBAEF,KAAK;oBACH,MAAMb;oBACN;gBAEF,KAAK;oBACH,MAAMC,cAAc;wBAClB+B,OAAO,IAAI,CAACnB,IAAI,CAAC,UAAU;oBAC7B;oBACA;gBAEF,KAAKyB;oBACH,uCAAuC;oBACvC7C,EAAE8C,IAAI,CAAC;oBACP9C,EAAE+C,KAAK,CAACrC;oBACR;gBAEF;oBACEV,EAAEgC,GAAG,CAACd,KAAK,CAAChB,GAAG8C,GAAG,CAAC,CAAC,iBAAiB,EAAEf,YAAY;oBACnDjC,EAAE8C,IAAI,CAAC,wCAAwC;oBAC/CtB,QAAQK,IAAI,CAAC;YACjB;YAEAL,QAAQK,IAAI,CAAC;QACf,EAAE,OAAOoB,KAAc;YACrB,sCAAsC;YACtChC,QAAQC,KAAK,CAAC+B,eAAejC,QAAQiC,IAAI9B,OAAO,GAAG;YACnDK,QAAQK,IAAI,CAAC;QACf;IACF;AACF"}
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 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":"AAAA,YAAYA,OAAO,iBAAgB;AACnC,OAAOC,SAAS,MAAK;AACrB,OAAOC,QAAQ,aAAY;AAI3B,SAASC,aAAa,QAAQ,uBAAsB;AACpD,SAASC,WAAW,QAAQ,qBAAoB;AAChD,SAASC,iBAAiB,QAAQ,4BAA2B;AAC7D,SAASC,YAAY,QAAQ,sBAAqB;AAClD,SAASC,aAAa,QAAQ,uBAAsB;AACpD,SAASC,aAAa,EAAEC,WAAW,QAAQ,sBAAqB;AAEhE;;CAEC,GACD,OAAO,eAAeC;IACpB,IAAI;QACF,MAAM,IAAIC,OAAOC,IAAI;IACvB,EAAE,OAAOC,GAAG;QACV,IAAIA,aAAaC,OAAO;YACtB,sCAAsC;YACtCC,QAAQC,KAAK,CAACH,EAAEI,OAAO;QACzB;IACF;AACF;AAEA,MAAMN;IACJO,KAAa;IAEb,aAAc;QACZ,+BAA+B;QAC/B,IAAI,CAACA,IAAI,GAAGjB,IACV;YACE,WAAWkB;YACX,WAAWA;YACX,UAAUA;YACV,QAAQC;YACR,UAAUA;YACV,eAAeD;YACf,SAASA;YAET,UAAU;YACV,MAAM;YACN,MAAM;YACN,MAAM;QACR,GACA;YAAEE,YAAY;QAAK;QAGrB,0BAA0B;QAC1B,IAAI,IAAI,CAACH,IAAI,CAAC,UAAU,EAAE;YACxBI,QAAQC,GAAG,CAACC,KAAK,GAAG;QACtB;IACF;IAEA,MAAMZ,OAAsB;QAC1B,IAAI;YACF,IAAI,IAAI,CAACM,IAAI,CAAC,SAAS,EAAE;gBACvBT;gBACAa,QAAQG,IAAI,CAAC;YACf;YAEA,+CAA+C;YAC/C,MAAMC,aAAa,IAAI,CAACR,IAAI,CAACS,CAAC,CAAC,EAAE;YAEjC,sCAAsC;YACtCZ,QAAQa,GAAG,CAAC;YACZ5B,EAAE6B,KAAK,CAAC3B,GAAG4B,MAAM,CAAC5B,GAAG6B,KAAK,CAAC;YAE3B,uCAAuC;YACvC,OAAQL;gBACN,KAAK;oBACH,MAAMvB,cAAc;wBAClB6B,OAAO,IAAI,CAACd,IAAI,CAAC,UAAU;wBAC3Be,KAAK,IAAI,CAACf,IAAI,CAAC,QAAQ;oBACzB;oBACA;gBAEF,KAAK;oBACH,MAAMd,YAAY;wBAChB8B,IAAI,IAAI,CAAChB,IAAI,CAAC,OAAO;wBACrBiB,MAAM,IAAI,CAACjB,IAAI,CAAC,SAAS;wBACzBc,OAAO,IAAI,CAACd,IAAI,CAAC,UAAU;wBAC3BkB,OAAO,IAAI,CAAClB,IAAI,CAAC,UAAU;wBAC3BmB,UAAU,IAAI,CAACnB,IAAI,CAAC,cAAc;oBACpC;oBACA;gBAEF,KAAK;oBACHb,kBAAkB;wBAChB2B,OAAO,IAAI,CAACd,IAAI,CAAC,UAAU;oBAC7B;oBACA;gBAEF,KAAK;oBACH,MAAMZ;oBACN;gBAEF,KAAK;oBACH,MAAMC,cAAc;wBAClByB,OAAO,IAAI,CAACd,IAAI,CAAC,UAAU;oBAC7B;oBACA;gBAEF,KAAKoB;oBACH,uCAAuC;oBACvCtC,EAAEuC,IAAI,CAAC;oBACPvC,EAAEwC,KAAK,CAAChC;oBACR;gBAEF;oBACER,EAAE4B,GAAG,CAACZ,KAAK,CAACd,GAAGuC,GAAG,CAAC,CAAC,iBAAiB,EAAEf,YAAY;oBACnD1B,EAAEuC,IAAI,CAAC,wCAAwC;oBAC/CjB,QAAQG,IAAI,CAAC;YACjB;YAEAH,QAAQG,IAAI,CAAC;QACf,EAAE,OAAOiB,KAAc;YACrB,sCAAsC;YACtC3B,QAAQC,KAAK,CAAC0B,eAAe5B,QAAQ4B,IAAIzB,OAAO,GAAG;YACnDK,QAAQG,IAAI,CAAC;QACf;IACF;AACF"}
@@ -4,10 +4,6 @@
4
4
  export interface DeployCommandOptions {
5
5
  /** Enable debug mode */
6
6
  debug?: boolean;
7
- /** Tenant ID */
8
- id?: string;
9
- /** Skip the build step (use existing build) */
10
- skipBuild?: boolean;
11
7
  /** Skip confirmation prompts */
12
8
  yes?: boolean;
13
9
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gBAAgB;IAChB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,+CAA+C;IAC/C,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gCAAgC;IAChC,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA6BD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyPhF"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAoBA;;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,CAyThF"}
@@ -1,15 +1,18 @@
1
1
  import * as p from '@clack/prompts';
2
- import spawn from 'cross-spawn';
2
+ import { spawn } from 'child_process';
3
3
  import path from 'path';
4
4
  import pc from 'picocolors';
5
- import { ControlPlaneError, createDeployment, performDeployment } from '../api/control-plane.js';
5
+ import { Project } from 'ts-morph';
6
+ import { createDeployment, getTenantDetails, performDeployment } from '../api/control-plane.js';
6
7
  import { getValidAccessToken } from '../auth/oauth-flow.js';
7
- import { getTokenStore } from '../auth/token-store.js';
8
+ import { getValidProjectToken } from '../auth/project-token.js';
9
+ import { TokenStore } from '../auth/token-store.js';
8
10
  import { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js';
9
11
  import { detectBuild, getBuildCommand } from '../utils/build-detection.js';
10
- import { getEnvVar } from '../utils/env-management.js';
11
12
  import * as log from '../utils/log.js';
12
13
  import { getPackageManager } from '../utils/package-manager.js';
14
+ import { readFigmaConfig } from '../utils/payload-config-ast.js';
15
+ import { findPayloadConfig } from '../utils/payload-config-finder.js';
13
16
  import { isInProjectDirectory } from '../utils/project.js';
14
17
  import { uploadLambdaZip, uploadStaticAssets } from '../utils/s3-upload.js';
15
18
  import { loginCommand } from './login.js';
@@ -48,14 +51,6 @@ import { loginCommand } from './login.js';
48
51
  */ export async function deployCommand(options) {
49
52
  const projectPath = process.cwd();
50
53
  const spinner = p.spinner();
51
- let tenantId = options.id;
52
- if (!tenantId) {
53
- tenantId = await getEnvVar(projectPath, 'FIGMA_TENANT_ID') ?? undefined;
54
- }
55
- if (!tenantId) {
56
- p.log.error(pc.red('✗ Tenant ID not found. Run `@payloadcms/figma init` first.'));
57
- process.exit(1);
58
- }
59
54
  try {
60
55
  // ===== PRE-FLIGHT CHECKS =====
61
56
  // Check if in project directory
@@ -64,8 +59,27 @@ import { loginCommand } from './login.js';
64
59
  p.note('Create a project or connect an existing one to Figma: npx @payloadcms/figma init', 'Tip');
65
60
  process.exit(1);
66
61
  }
62
+ // Find and read payload config
63
+ const configPath = await findPayloadConfig(projectPath);
64
+ if (!configPath) {
65
+ p.log.error(pc.red('✗ payload.config.ts not found'));
66
+ p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip');
67
+ process.exit(1);
68
+ }
69
+ // Parse config with ts-morph
70
+ const project = new Project({
71
+ skipAddingFilesFromTsConfig: true
72
+ });
73
+ const sourceFile = project.addSourceFileAtPath(configPath);
74
+ // Read figma configuration from buildConfig
75
+ const config = readFigmaConfig(sourceFile);
76
+ if (!config || !config.tenantId) {
77
+ p.log.error(pc.red('✗ No figma configuration found in payload.config.ts'));
78
+ p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip');
79
+ process.exit(1);
80
+ }
67
81
  // Check authentication
68
- const tokenStore = getTokenStore();
82
+ const tokenStore = new TokenStore();
69
83
  let accessToken = await getValidAccessToken(tokenStore);
70
84
  if (!accessToken) {
71
85
  p.log.message('Please log in to continue');
@@ -76,33 +90,40 @@ import { loginCommand } from './login.js';
76
90
  process.exit(1);
77
91
  }
78
92
  }
79
- // ===== BUILD =====
80
- let buildInfo;
81
- if (options.skipBuild) {
82
- // User asserts build exists - verify it
83
- spinner.start('Checking for build...');
84
- buildInfo = await detectBuild(projectPath);
85
- if (!buildInfo) {
86
- spinner.stop(pc.red('✗ No build found'));
87
- p.log.error('Use deploy without --skip-build to build first.');
88
- process.exit(1);
89
- }
90
- spinner.stop(pc.green(' Build found'));
91
- p.note([
92
- `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,
93
- `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`
94
- ].join('\n'), 'Build Details');
95
- } else {
96
- // Always build (no prompt)
93
+ // Get project token
94
+ try {
95
+ await getValidProjectToken(tokenStore, config.tenantId);
96
+ } catch (error) {
97
+ p.log.error(pc.yellow(' Project token invalid'));
98
+ throw error;
99
+ }
100
+ // ===== BUILD VALIDATION =====
101
+ spinner.start('Checking for build...');
102
+ let buildInfo = await detectBuild(projectPath);
103
+ if (!buildInfo) {
104
+ spinner.stop(pc.yellow(' No build found for this project.'));
105
+ // Try to find build command
97
106
  const buildCmd = await getBuildCommand(projectPath);
98
107
  if (!buildCmd) {
99
108
  p.log.error('No build script found in package.json');
100
109
  p.note('Add a build script to package.json: "build": "next build"', 'Tip');
101
110
  process.exit(1);
102
111
  }
112
+ // Prompt to run build
113
+ if (!options.yes) {
114
+ const shouldBuild = await p.confirm({
115
+ initialValue: true,
116
+ message: `Build command found in package.json. Run it?`
117
+ });
118
+ if (p.isCancel(shouldBuild) || !shouldBuild) {
119
+ p.log.message('Cancelling deployment...');
120
+ process.exit(0);
121
+ }
122
+ }
123
+ // Run build
103
124
  const packageManager = await getPackageManager(projectPath);
104
125
  const buildCommand = `${packageManager} run build`;
105
- p.log.step(`Running ${buildCommand}...\n`);
126
+ spinner.stop(`Running ${buildCommand}...\n`);
106
127
  try {
107
128
  // Stream build output to user with formatting
108
129
  const buildProcess = spawn(packageManager, [
@@ -118,20 +139,20 @@ import { loginCommand } from './login.js';
118
139
  });
119
140
  // Indent and dim output
120
141
  buildProcess.stdout?.on('data', (data)=>{
121
- const lines = data.toString().split(/\r?\n/);
142
+ const lines = data.toString().split('\n');
122
143
  lines.forEach((line)=>{
123
144
  if (line.trim()) {
124
145
  // eslint-disable-next-line no-console
125
- console.log(pc.dim(` ${line}`));
146
+ console.log(pc.dim(` ${line}`)); // Standard output
126
147
  }
127
148
  });
128
149
  });
129
150
  buildProcess.stderr?.on('data', (data)=>{
130
- const lines = data.toString().split(/\r?\n/);
151
+ const lines = data.toString().split('\n');
131
152
  lines.forEach((line)=>{
132
153
  if (line.trim()) {
133
154
  // eslint-disable-next-line no-console
134
- console.log(pc.dim(` ${line}`));
155
+ console.log(pc.dim(` ${line}`)); // Standard error
135
156
  }
136
157
  });
137
158
  });
@@ -149,13 +170,19 @@ import { loginCommand } from './login.js';
149
170
  }
150
171
  process.exit(1);
151
172
  }
152
- // Verify build output
173
+ // Re-check for build
153
174
  buildInfo = await detectBuild(projectPath);
154
175
  if (!buildInfo) {
155
176
  p.log.error(pc.red('✗ Build completed but standalone build not found'));
156
177
  p.note('Ensure next.config.js has output: "standalone"', 'Check Lambda Configuration');
157
178
  process.exit(1);
158
179
  }
180
+ } else {
181
+ spinner.stop(pc.green('✓ Build found'));
182
+ p.note([
183
+ `${pc.cyan('Build ID:')} ${buildInfo.buildId}`,
184
+ `${pc.cyan('Date:')} ${formatDate(buildInfo.timestamp)}`
185
+ ].join('\n'), 'Build Details');
159
186
  }
160
187
  // ===== DEPLOYMENT PREPARATION =====
161
188
  // Create Lambda zip
@@ -183,59 +210,90 @@ import { loginCommand } from './login.js';
183
210
  `${pc.cyan('Code size:')} ${formatBytes(zipSize)}`,
184
211
  `${pc.cyan('Static assets:')} ${staticAssets.length} files`
185
212
  ].join('\n'), 'Details');
213
+ const shouldDeploy = await p.confirm({
214
+ initialValue: true,
215
+ message: 'Deploy this build to Figma?'
216
+ });
217
+ if (p.isCancel(shouldDeploy) || !shouldDeploy) {
218
+ p.log.message('Cancelling deployment...');
219
+ process.exit(0);
220
+ }
186
221
  }
187
222
  // ===== DEPLOYMENT EXECUTION =====
188
223
  // Step 1: Create deployment
189
224
  spinner.start('Creating deployment...');
190
- const createResponse = await createDeployment(accessToken, tenantId, {
191
- staticAssets
192
- });
193
- const deploymentId = createResponse.deploymentId;
194
- const codeUploadUrl = createResponse.codeUploadUrl;
195
- const staticAssetUploadUrls = createResponse.staticAssetUploadUrls;
196
- log.debug(`Deployment ID: ${deploymentId}`);
225
+ let deploymentId;
226
+ let codeUploadUrl;
227
+ let staticAssetUploadUrls;
228
+ try {
229
+ const createResponse = await createDeployment(accessToken, config.tenantId, {
230
+ staticAssets
231
+ });
232
+ deploymentId = createResponse.deploymentId;
233
+ codeUploadUrl = createResponse.codeUploadUrl;
234
+ staticAssetUploadUrls = createResponse.staticAssetUploadUrls;
235
+ log.debug(`Deployment ID: ${deploymentId}`);
236
+ } catch (error) {
237
+ spinner.stop(pc.red('✗ Failed to create deployment'));
238
+ throw error;
239
+ }
197
240
  // Step 2: Upload code
198
241
  spinner.message(`Uploading code (${formatBytes(zipSize)})...`);
199
- await uploadLambdaZip(zipPath, codeUploadUrl);
200
- spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`));
242
+ try {
243
+ await uploadLambdaZip(zipPath, codeUploadUrl);
244
+ spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`));
245
+ } catch (error) {
246
+ spinner.stop(pc.red('✗ Failed to upload code'));
247
+ throw error;
248
+ }
201
249
  // Step 3: Upload static assets
202
250
  if (staticAssets.length > 0) {
203
251
  spinner.start('Uploading static assets...');
204
- const uploadResults = await uploadStaticAssets(projectPath, staticAssetUploadUrls, (uploaded, total)=>{
205
- spinner.message(`Uploading static assets (${uploaded}/${total})...`);
206
- });
207
- if (uploadResults.assetsFailed > 0) {
208
- spinner.stop(pc.yellow(`⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`));
209
- p.log.warning(`${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`);
210
- } else {
211
- spinner.stop(pc.green(`✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`));
252
+ try {
253
+ const uploadResults = await uploadStaticAssets(projectPath, staticAssetUploadUrls, (uploaded, total)=>{
254
+ spinner.message(`Uploading static assets (${uploaded}/${total})...`);
255
+ });
256
+ if (uploadResults.assetsFailed > 0) {
257
+ spinner.stop(pc.yellow(`⚠ ${uploadResults.assetsUploaded}/${staticAssets.length} assets uploaded (${uploadResults.assetsFailed} failed)`));
258
+ p.log.warning(`${uploadResults.assetsFailed} assets failed to upload. Deployment may be incomplete.`);
259
+ } else {
260
+ spinner.stop(pc.green(`✓ Static assets uploaded (${uploadResults.assetsUploaded} files, ${formatBytes(uploadResults.totalBytesUploaded)})`));
261
+ }
262
+ } catch (error) {
263
+ spinner.stop(pc.red('✗ Failed to upload assets'));
264
+ throw error;
212
265
  }
213
266
  }
214
267
  // Step 4: Perform deployment
215
268
  spinner.start('Performing deployment...');
216
- const result = await performDeployment(accessToken, tenantId, {
217
- deploymentId
218
- });
219
- const tenantDomains = result.tenantDomains ?? [];
220
- spinner.stop(pc.green('✓ Deployment initiated'));
269
+ try {
270
+ await performDeployment(accessToken, config.tenantId, {
271
+ deploymentId
272
+ });
273
+ spinner.stop(pc.green('✓ Deployment initiated'));
274
+ } catch (error) {
275
+ spinner.stop(pc.red('✗ Failed to perform deployment'));
276
+ throw error;
277
+ }
221
278
  // TODO: Add deployment progress tracking
222
279
  // Future: Poll deployment status and show progress
223
280
  // API endpoint: GET /v1/tenant/{tenant_id}/deploy/{deployment_id}/status
224
281
  // Success output
225
- if (tenantDomains.length > 0) {
226
- p.log.step(`URL: ${pc.cyan(`https://${tenantDomains[0]}`)}`);
227
- }
228
- p.log.step('This usually takes 2-3 minutes to complete.');
229
- } catch (error) {
230
- if (error instanceof ControlPlaneError) {
231
- spinner.stop(pc.red(`✗ ${error.message}`));
232
- if (error.statusCode) {
233
- p.log.message(pc.dim(` HTTP ${error.statusCode}`));
282
+ p.log.message('This usually takes 2-3 minutes to complete.');
283
+ // Get tenant details for URL
284
+ try {
285
+ const tenant = await getTenantDetails(accessToken, config.tenantId);
286
+ if (tenant.domain) {
287
+ p.log.message(`View: ${pc.cyan(`https://${tenant.domain}/`)}`);
234
288
  }
235
- } else {
236
- const message = error instanceof Error ? error.message : 'Unknown error';
237
- spinner.stop(pc.red(`✗ ${message}`));
289
+ } catch {
290
+ // Non-critical - just skip URL display
238
291
  }
292
+ p.note(`Manage your deployment at:\n${pc.cyan(`https://cms.figma.com/manage/tenants/${config.tenantId}`)}`, 'Next Steps');
293
+ } catch (error) {
294
+ spinner.stop(pc.red('✗ Failed'));
295
+ const message = error instanceof Error ? error.message : 'Unknown error';
296
+ p.log.error(pc.red(`✗ ${message}`));
239
297
  if (options.debug && error instanceof Error && error.stack) {
240
298
  log.error(`Stack trace: ${error.stack}`);
241
299
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/deploy.ts"],"sourcesContent":["import * as p from '@clack/prompts'\nimport spawn from 'cross-spawn'\nimport path from 'path'\nimport pc from 'picocolors'\n\nimport { ControlPlaneError, createDeployment, performDeployment } from '../api/control-plane.js'\nimport { getValidAccessToken } from '../auth/oauth-flow.js'\nimport { getTokenStore } from '../auth/token-store.js'\nimport { collectStaticAssets, createLambdaZip, getFileSize } from '../utils/asset-collection.js'\nimport { detectBuild, getBuildCommand } from '../utils/build-detection.js'\nimport { getEnvVar } from '../utils/env-management.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 /** Tenant ID */\n id?: string\n /** Skip the build step (use existing build) */\n skipBuild?: 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 let tenantId = options.id\n if (!tenantId) {\n tenantId = (await getEnvVar(projectPath, 'FIGMA_TENANT_ID')) ?? undefined\n }\n if (!tenantId) {\n p.log.error(pc.red('✗ Tenant ID not found. Run `@payloadcms/figma init` first.'))\n process.exit(1)\n }\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 authentication\n const tokenStore = getTokenStore()\n\n let accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.message('Please log in to continue')\n await loginCommand()\n accessToken = await getValidAccessToken(tokenStore)\n if (!accessToken) {\n p.log.error(pc.red('✗ Authentication failed'))\n process.exit(1)\n }\n }\n\n // ===== BUILD =====\n\n let buildInfo: Awaited<ReturnType<typeof detectBuild>>\n\n if (options.skipBuild) {\n // User asserts build exists - verify it\n spinner.start('Checking for build...')\n buildInfo = await detectBuild(projectPath)\n\n if (!buildInfo) {\n spinner.stop(pc.red('✗ No build found'))\n p.log.error('Use deploy without --skip-build to build first.')\n process.exit(1)\n }\n\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 } else {\n // Always build (no prompt)\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 const packageManager = await getPackageManager(projectPath)\n const buildCommand = `${packageManager} run build`\n p.log.step(`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(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\n }\n })\n })\n\n buildProcess.stderr?.on('data', (data) => {\n const lines = data.toString().split(/\\r?\\n/)\n lines.forEach((line: string) => {\n if (line.trim()) {\n // eslint-disable-next-line no-console\n console.log(pc.dim(` ${line}`))\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 // Verify build output\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 }\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\n // ===== DEPLOYMENT EXECUTION =====\n\n // Step 1: Create deployment\n spinner.start('Creating deployment...')\n const createResponse = await createDeployment(accessToken, tenantId, {\n staticAssets,\n })\n\n const deploymentId = createResponse.deploymentId\n const codeUploadUrl = createResponse.codeUploadUrl\n const staticAssetUploadUrls = createResponse.staticAssetUploadUrls\n\n log.debug(`Deployment ID: ${deploymentId}`)\n\n // Step 2: Upload code\n spinner.message(`Uploading code (${formatBytes(zipSize)})...`)\n await uploadLambdaZip(zipPath, codeUploadUrl)\n spinner.stop(pc.green(`✓ Code uploaded (${formatBytes(zipSize)})`))\n\n // Step 3: Upload static assets\n if (staticAssets.length > 0) {\n spinner.start('Uploading static assets...')\n\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 }\n\n // Step 4: Perform deployment\n spinner.start('Performing deployment...')\n const result = await performDeployment(accessToken, tenantId, {\n deploymentId,\n })\n const tenantDomains = result.tenantDomains ?? []\n spinner.stop(pc.green('✓ Deployment initiated'))\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 if (tenantDomains.length > 0) {\n p.log.step(`URL: ${pc.cyan(`https://${tenantDomains[0]}`)}`)\n }\n p.log.step('This usually takes 2-3 minutes to complete.')\n } catch (error) {\n if (error instanceof ControlPlaneError) {\n spinner.stop(pc.red(`✗ ${error.message}`))\n if (error.statusCode) {\n p.log.message(pc.dim(` HTTP ${error.statusCode}`))\n }\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error'\n spinner.stop(pc.red(`✗ ${message}`))\n }\n\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","ControlPlaneError","createDeployment","performDeployment","getValidAccessToken","getTokenStore","collectStaticAssets","createLambdaZip","getFileSize","detectBuild","getBuildCommand","getEnvVar","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","tenantId","id","undefined","error","red","exit","note","tokenStore","accessToken","message","buildInfo","skipBuild","start","stop","green","cyan","buildId","timestamp","join","buildCmd","packageManager","buildCommand","step","buildProcess","stdio","stdout","on","data","lines","toString","split","forEach","line","trim","console","dim","stderr","exitCode","Promise","resolve","Error","success","debug","staticAssets","zipPath","zipSize","length","yes","createResponse","deploymentId","codeUploadUrl","staticAssetUploadUrls","uploadResults","uploaded","total","assetsFailed","yellow","assetsUploaded","warning","totalBytesUploaded","result","tenantDomains","statusCode","stack"],"mappings":"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"}
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'\nimport { Project } from 'ts-morph'\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 * as log from '../utils/log.js'\nimport { getPackageManager } from '../utils/package-manager.js'\nimport { readFigmaConfig } from '../utils/payload-config-ast.js'\nimport { findPayloadConfig } from '../utils/payload-config-finder.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 // Find and read payload config\n const configPath = await findPayloadConfig(projectPath)\n if (!configPath) {\n p.log.error(pc.red('✗ payload.config.ts not found'))\n p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip')\n process.exit(1)\n }\n\n // Parse config with ts-morph\n const project = new Project({ skipAddingFilesFromTsConfig: true })\n const sourceFile = project.addSourceFileAtPath(configPath)\n\n // Read figma configuration from buildConfig\n const config = readFigmaConfig(sourceFile)\n if (!config || !config.tenantId) {\n p.log.error(pc.red('✗ No figma configuration found in payload.config.ts'))\n p.note('Run npx @payloadcms/figma init to configure your project.', 'Tip')\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()\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","Project","createDeployment","getTenantDetails","performDeployment","getValidAccessToken","getValidProjectToken","TokenStore","collectStaticAssets","createLambdaZip","getFileSize","detectBuild","getBuildCommand","log","getPackageManager","readFigmaConfig","findPayloadConfig","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","configPath","project","skipAddingFilesFromTsConfig","sourceFile","addSourceFileAtPath","config","tenantId","tokenStore","accessToken","message","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","debug","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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"}
@@ -6,10 +6,14 @@ export interface InitCommandOptions {
6
6
  debug?: boolean;
7
7
  /** Force reconfiguration of existing project */
8
8
  force?: boolean;
9
- /** Content System ID to use */
9
+ /** Tenant ID to use (optional - will prompt if not provided) */
10
10
  id?: string;
11
11
  /** Project name (for scaffolding) */
12
12
  name?: string;
13
+ /** Disable Content System (defaults to enabled) */
14
+ noContentSystem?: boolean;
15
+ /** AWS region for deployment (defaults to us-east-1) */
16
+ region?: string;
13
17
  /** Skip authentication check (for testing/development) */
14
18
  skipAuth?: boolean;
15
19
  /** Skip prompts and use defaults where possible */
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAkCA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,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;AAoED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2W5E"}
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,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,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,CAmW5E"}