@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.
- package/LICENSE.md +11 -0
- package/bin/cli.js +4 -0
- package/dist/api/control-plane.d.ts +124 -0
- package/dist/api/control-plane.d.ts.map +1 -0
- package/dist/api/control-plane.js +245 -0
- package/dist/api/control-plane.js.map +1 -0
- package/dist/api/control-plane.spec.d.ts +2 -0
- package/dist/api/control-plane.spec.d.ts.map +1 -0
- package/dist/api/control-plane.spec.js +296 -0
- package/dist/api/control-plane.spec.js.map +1 -0
- package/dist/api/figma-api.d.ts +31 -0
- package/dist/api/figma-api.d.ts.map +1 -0
- package/dist/api/figma-api.js +169 -0
- package/dist/api/figma-api.js.map +1 -0
- package/dist/api/figma-api.spec.d.ts +14 -0
- package/dist/api/figma-api.spec.d.ts.map +1 -0
- package/dist/api/figma-api.spec.js +201 -0
- package/dist/api/figma-api.spec.js.map +1 -0
- package/dist/auth/__tests__/fixtures.d.ts +26 -0
- package/dist/auth/__tests__/fixtures.d.ts.map +1 -0
- package/dist/auth/__tests__/fixtures.js +67 -0
- package/dist/auth/__tests__/fixtures.js.map +1 -0
- package/dist/auth/__tests__/mocks.d.ts +33 -0
- package/dist/auth/__tests__/mocks.d.ts.map +1 -0
- package/dist/auth/__tests__/mocks.js +63 -0
- package/dist/auth/__tests__/mocks.js.map +1 -0
- package/dist/auth/browser.d.ts +31 -0
- package/dist/auth/browser.d.ts.map +1 -0
- package/dist/auth/browser.js +41 -0
- package/dist/auth/browser.js.map +1 -0
- package/dist/auth/callback-server.d.ts +61 -0
- package/dist/auth/callback-server.d.ts.map +1 -0
- package/dist/auth/callback-server.js +168 -0
- package/dist/auth/callback-server.js.map +1 -0
- package/dist/auth/callback-server.spec.d.ts +2 -0
- package/dist/auth/callback-server.spec.d.ts.map +1 -0
- package/dist/auth/callback-server.spec.js +85 -0
- package/dist/auth/callback-server.spec.js.map +1 -0
- package/dist/auth/crypto-utils.d.ts +33 -0
- package/dist/auth/crypto-utils.d.ts.map +1 -0
- package/dist/auth/crypto-utils.js +96 -0
- package/dist/auth/crypto-utils.js.map +1 -0
- package/dist/auth/crypto-utils.spec.d.ts +2 -0
- package/dist/auth/crypto-utils.spec.d.ts.map +1 -0
- package/dist/auth/crypto-utils.spec.js +36 -0
- package/dist/auth/crypto-utils.spec.js.map +1 -0
- package/dist/auth/jwt-validator.d.ts +41 -0
- package/dist/auth/jwt-validator.d.ts.map +1 -0
- package/dist/auth/jwt-validator.js +113 -0
- package/dist/auth/jwt-validator.js.map +1 -0
- package/dist/auth/jwt-validator.spec.d.ts +10 -0
- package/dist/auth/jwt-validator.spec.d.ts.map +1 -0
- package/dist/auth/jwt-validator.spec.js +236 -0
- package/dist/auth/jwt-validator.spec.js.map +1 -0
- package/dist/auth/oauth-flow.d.ts +62 -0
- package/dist/auth/oauth-flow.d.ts.map +1 -0
- package/dist/auth/oauth-flow.js +172 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/oauth-flow.spec.d.ts +2 -0
- package/dist/auth/oauth-flow.spec.d.ts.map +1 -0
- package/dist/auth/oauth-flow.spec.js +134 -0
- package/dist/auth/oauth-flow.spec.js.map +1 -0
- package/dist/auth/pages/error.html +85 -0
- package/dist/auth/pages/success.html +74 -0
- package/dist/auth/pkce.d.ts +51 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +71 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/pkce.spec.d.ts +2 -0
- package/dist/auth/pkce.spec.d.ts.map +1 -0
- package/dist/auth/pkce.spec.js +32 -0
- package/dist/auth/pkce.spec.js.map +1 -0
- package/dist/auth/project-token.d.ts +47 -0
- package/dist/auth/project-token.d.ts.map +1 -0
- package/dist/auth/project-token.js +134 -0
- package/dist/auth/project-token.js.map +1 -0
- package/dist/auth/project-token.spec.d.ts +2 -0
- package/dist/auth/project-token.spec.d.ts.map +1 -0
- package/dist/auth/project-token.spec.js +332 -0
- package/dist/auth/project-token.spec.js.map +1 -0
- package/dist/auth/refresh.d.ts +35 -0
- package/dist/auth/refresh.d.ts.map +1 -0
- package/dist/auth/refresh.js +149 -0
- package/dist/auth/refresh.js.map +1 -0
- package/dist/auth/refresh.spec.d.ts +2 -0
- package/dist/auth/refresh.spec.d.ts.map +1 -0
- package/dist/auth/refresh.spec.js +105 -0
- package/dist/auth/refresh.spec.js.map +1 -0
- package/dist/auth/token-store.d.ts +110 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +188 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-store.spec.d.ts +2 -0
- package/dist/auth/token-store.spec.d.ts.map +1 -0
- package/dist/auth/token-store.spec.js +276 -0
- package/dist/auth/token-store.spec.js.map +1 -0
- package/dist/auth/types.d.ts +197 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +108 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/__tests__/test-utils.d.ts +28 -0
- package/dist/commands/__tests__/test-utils.d.ts.map +1 -0
- package/dist/commands/__tests__/test-utils.js +34 -0
- package/dist/commands/__tests__/test-utils.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +297 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/deploy.spec.d.ts +2 -0
- package/dist/commands/deploy.spec.d.ts.map +1 -0
- package/dist/commands/deploy.spec.js +18 -0
- package/dist/commands/deploy.spec.js.map +1 -0
- package/dist/commands/init.d.ts +30 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +410 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.spec.d.ts +2 -0
- package/dist/commands/init.spec.d.ts.map +1 -0
- package/dist/commands/init.spec.js +283 -0
- package/dist/commands/init.spec.js.map +1 -0
- package/dist/commands/list-tokens.d.ts +16 -0
- package/dist/commands/list-tokens.d.ts.map +1 -0
- package/dist/commands/list-tokens.js +44 -0
- package/dist/commands/list-tokens.js.map +1 -0
- package/dist/commands/login.d.ts +17 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +69 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +16 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +43 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/config/oauth.d.ts +19 -0
- package/dist/config/oauth.d.ts.map +1 -0
- package/dist/config/oauth.js +43 -0
- package/dist/config/oauth.js.map +1 -0
- package/dist/constants.d.ts +27 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +27 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin/adapter.d.ts +5 -0
- package/dist/plugin/adapter.d.ts.map +1 -0
- package/dist/plugin/adapter.js +139 -0
- package/dist/plugin/adapter.js.map +1 -0
- package/dist/plugin/build-config.d.ts +37 -0
- package/dist/plugin/build-config.d.ts.map +1 -0
- package/dist/plugin/build-config.js +25 -0
- package/dist/plugin/build-config.js.map +1 -0
- package/dist/plugin/build-config.spec.d.ts +2 -0
- package/dist/plugin/build-config.spec.d.ts.map +1 -0
- package/dist/plugin/build-config.spec.js +72 -0
- package/dist/plugin/build-config.spec.js.map +1 -0
- package/dist/types/config.d.ts +45 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +9 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/asset-collection.d.ts +30 -0
- package/dist/utils/asset-collection.d.ts.map +1 -0
- package/dist/utils/asset-collection.js +117 -0
- package/dist/utils/asset-collection.js.map +1 -0
- package/dist/utils/asset-collection.spec.d.ts +2 -0
- package/dist/utils/asset-collection.spec.d.ts.map +1 -0
- package/dist/utils/asset-collection.spec.js +155 -0
- package/dist/utils/asset-collection.spec.js.map +1 -0
- package/dist/utils/build-detection.d.ts +32 -0
- package/dist/utils/build-detection.d.ts.map +1 -0
- package/dist/utils/build-detection.js +55 -0
- package/dist/utils/build-detection.js.map +1 -0
- package/dist/utils/build-detection.spec.d.ts +2 -0
- package/dist/utils/build-detection.spec.d.ts.map +1 -0
- package/dist/utils/build-detection.spec.js +110 -0
- package/dist/utils/build-detection.spec.js.map +1 -0
- package/dist/utils/config.d.ts +33 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +78 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/config.spec.d.ts +2 -0
- package/dist/utils/config.spec.d.ts.map +1 -0
- package/dist/utils/config.spec.js +167 -0
- package/dist/utils/config.spec.js.map +1 -0
- package/dist/utils/download-template.d.ts +15 -0
- package/dist/utils/download-template.d.ts.map +1 -0
- package/dist/utils/download-template.js +74 -0
- package/dist/utils/download-template.js.map +1 -0
- package/dist/utils/download-template.spec.d.ts +2 -0
- package/dist/utils/download-template.spec.d.ts.map +1 -0
- package/dist/utils/download-template.spec.js +76 -0
- package/dist/utils/download-template.spec.js.map +1 -0
- package/dist/utils/env-management.d.ts +16 -0
- package/dist/utils/env-management.d.ts.map +1 -0
- package/dist/utils/env-management.js +98 -0
- package/dist/utils/env-management.js.map +1 -0
- package/dist/utils/env-management.spec.d.ts +2 -0
- package/dist/utils/env-management.spec.d.ts.map +1 -0
- package/dist/utils/env-management.spec.js +123 -0
- package/dist/utils/env-management.spec.js.map +1 -0
- package/dist/utils/format.d.ts +23 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +49 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/formatter.d.ts +11 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +47 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/git.d.ts +15 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +92 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/git.spec.d.ts +2 -0
- package/dist/utils/git.spec.d.ts.map +1 -0
- package/dist/utils/git.spec.js +99 -0
- package/dist/utils/git.spec.js.map +1 -0
- package/dist/utils/is-debug.d.ts +6 -0
- package/dist/utils/is-debug.d.ts.map +1 -0
- package/dist/utils/is-debug.js +8 -0
- package/dist/utils/is-debug.js.map +1 -0
- package/dist/utils/lambda-config.d.ts +7 -0
- package/dist/utils/lambda-config.d.ts.map +1 -0
- package/dist/utils/lambda-config.js +144 -0
- package/dist/utils/lambda-config.js.map +1 -0
- package/dist/utils/lambda-config.spec.d.ts +2 -0
- package/dist/utils/lambda-config.spec.d.ts.map +1 -0
- package/dist/utils/lambda-config.spec.js +141 -0
- package/dist/utils/lambda-config.spec.js.map +1 -0
- package/dist/utils/log.d.ts +6 -0
- package/dist/utils/log.d.ts.map +1 -0
- package/dist/utils/log.js +22 -0
- package/dist/utils/log.js.map +1 -0
- package/dist/utils/messages.d.ts +10 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +96 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/package-manager.d.ts +12 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +37 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/payload-config-ast.d.ts +30 -0
- package/dist/utils/payload-config-ast.d.ts.map +1 -0
- package/dist/utils/payload-config-ast.js +259 -0
- package/dist/utils/payload-config-ast.js.map +1 -0
- package/dist/utils/payload-config-ast.spec.d.ts +2 -0
- package/dist/utils/payload-config-ast.spec.d.ts.map +1 -0
- package/dist/utils/payload-config-ast.spec.js +303 -0
- package/dist/utils/payload-config-ast.spec.js.map +1 -0
- package/dist/utils/payload-config-finder.d.ts +9 -0
- package/dist/utils/payload-config-finder.d.ts.map +1 -0
- package/dist/utils/payload-config-finder.js +26 -0
- package/dist/utils/payload-config-finder.js.map +1 -0
- package/dist/utils/payload-config-modifier.d.ts +18 -0
- package/dist/utils/payload-config-modifier.d.ts.map +1 -0
- package/dist/utils/payload-config-modifier.int.spec.d.ts +2 -0
- package/dist/utils/payload-config-modifier.int.spec.d.ts.map +1 -0
- package/dist/utils/payload-config-modifier.int.spec.js +116 -0
- package/dist/utils/payload-config-modifier.int.spec.js.map +1 -0
- package/dist/utils/payload-config-modifier.js +232 -0
- package/dist/utils/payload-config-modifier.js.map +1 -0
- package/dist/utils/payload-config-modifier.spec.d.ts +2 -0
- package/dist/utils/payload-config-modifier.spec.d.ts.map +1 -0
- package/dist/utils/payload-config-modifier.spec.js +162 -0
- package/dist/utils/payload-config-modifier.spec.js.map +1 -0
- package/dist/utils/payload-package-check.d.ts +15 -0
- package/dist/utils/payload-package-check.d.ts.map +1 -0
- package/dist/utils/payload-package-check.js +116 -0
- package/dist/utils/payload-package-check.js.map +1 -0
- package/dist/utils/payload-package-check.spec.d.ts +2 -0
- package/dist/utils/payload-package-check.spec.d.ts.map +1 -0
- package/dist/utils/payload-package-check.spec.js +148 -0
- package/dist/utils/payload-package-check.spec.js.map +1 -0
- package/dist/utils/project.d.ts +58 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +252 -0
- package/dist/utils/project.js.map +1 -0
- package/dist/utils/project.spec.d.ts +2 -0
- package/dist/utils/project.spec.d.ts.map +1 -0
- package/dist/utils/project.spec.js +222 -0
- package/dist/utils/project.spec.js.map +1 -0
- package/dist/utils/s3-upload.d.ts +43 -0
- package/dist/utils/s3-upload.d.ts.map +1 -0
- package/dist/utils/s3-upload.js +128 -0
- package/dist/utils/s3-upload.js.map +1 -0
- package/dist/utils/s3-upload.spec.d.ts +2 -0
- package/dist/utils/s3-upload.spec.d.ts.map +1 -0
- package/dist/utils/s3-upload.spec.js +140 -0
- package/dist/utils/s3-upload.spec.js.map +1 -0
- package/dist/utils/token-display.d.ts +14 -0
- package/dist/utils/token-display.d.ts.map +1 -0
- package/dist/utils/token-display.js +62 -0
- package/dist/utils/token-display.js.map +1 -0
- package/dist/utils/typescript-validator.d.ts +11 -0
- package/dist/utils/typescript-validator.d.ts.map +1 -0
- package/dist/utils/typescript-validator.js +58 -0
- package/dist/utils/typescript-validator.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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"}
|