@stacksjs/ts-cloud 0.1.3 → 0.1.6
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/README.md +98 -13
- package/dist/aws/acm.d.ts +129 -0
- package/dist/aws/application-autoscaling.d.ts +282 -0
- package/dist/aws/bedrock.d.ts +2292 -0
- package/dist/aws/client.d.ts +79 -0
- package/dist/aws/cloudformation.d.ts +105 -0
- package/dist/aws/cloudfront.d.ts +265 -0
- package/dist/aws/cloudwatch-logs.d.ts +48 -0
- package/dist/aws/comprehend.d.ts +505 -0
- package/dist/aws/connect.d.ts +377 -0
- package/dist/aws/deploy-imap.d.ts +14 -0
- package/dist/aws/dynamodb.d.ts +176 -0
- package/dist/aws/ec2.d.ts +272 -0
- package/dist/aws/ecr.d.ts +149 -0
- package/dist/aws/ecs.d.ts +162 -0
- package/dist/aws/elasticache.d.ts +71 -0
- package/dist/aws/elbv2.d.ts +248 -0
- package/dist/aws/email.d.ts +175 -0
- package/dist/aws/eventbridge.d.ts +142 -0
- package/dist/aws/iam.d.ts +638 -0
- package/dist/aws/imap-server.d.ts +119 -0
- package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
- package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
- package/dist/aws/lambda.d.ts +232 -0
- package/dist/aws/opensearch.d.ts +87 -0
- package/dist/aws/personalize.d.ts +516 -0
- package/dist/aws/polly.d.ts +214 -0
- package/dist/aws/rds.d.ts +240 -0
- package/dist/aws/rekognition.d.ts +543 -0
- package/dist/aws/route53-domains.d.ts +113 -0
- package/dist/aws/route53.d.ts +215 -0
- package/dist/aws/s3.d.ts +212 -0
- package/dist/aws/scheduler.d.ts +140 -0
- package/dist/aws/secrets-manager.d.ts +170 -0
- package/dist/aws/ses.d.ts +288 -0
- package/dist/aws/setup-phone.d.ts +0 -0
- package/dist/aws/setup-sms.d.ts +115 -0
- package/dist/aws/sms.d.ts +304 -0
- package/dist/aws/smtp-server.d.ts +61 -0
- package/dist/aws/sns.d.ts +117 -0
- package/dist/aws/sqs.d.ts +65 -0
- package/dist/aws/ssm.d.ts +179 -0
- package/dist/aws/sts.d.ts +15 -0
- package/dist/aws/support.d.ts +104 -0
- package/dist/aws/test-imap.d.ts +0 -0
- package/dist/aws/textract.d.ts +403 -0
- package/dist/aws/transcribe.d.ts +60 -0
- package/dist/aws/translate.d.ts +358 -0
- package/dist/aws/voice.d.ts +219 -0
- package/dist/bin/cli.js +1724 -0
- package/dist/config.d.ts +7 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/static-site-external-dns.d.ts +51 -0
- package/dist/deploy/static-site.d.ts +71 -0
- package/dist/dns/cloudflare.d.ts +52 -0
- package/dist/dns/godaddy.d.ts +38 -0
- package/dist/dns/index.d.ts +45 -0
- package/dist/dns/porkbun.d.ts +18 -0
- package/dist/dns/route53-adapter.d.ts +38 -0
- package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
- package/dist/dns/validator.d.ts +78 -0
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/infrastructure.d.ts +30 -0
- package/{src/index.ts → dist/index.d.ts} +70 -93
- package/dist/index.js +7881 -0
- package/dist/push/apns.d.ts +60 -0
- package/dist/push/fcm.d.ts +117 -0
- package/dist/push/index.d.ts +14 -0
- package/dist/security/pre-deploy-scanner.d.ts +69 -0
- package/dist/ssl/acme-client.d.ts +67 -0
- package/dist/ssl/index.d.ts +2 -0
- package/dist/ssl/letsencrypt.d.ts +48 -0
- package/dist/types.d.ts +1 -0
- package/dist/utils/cli.d.ts +123 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/template.d.ts +23 -0
- package/package.json +8 -8
- package/bin/cli.ts +0 -133
- package/bin/commands/analytics.ts +0 -328
- package/bin/commands/api.ts +0 -379
- package/bin/commands/assets.ts +0 -221
- package/bin/commands/audit.ts +0 -501
- package/bin/commands/backup.ts +0 -682
- package/bin/commands/cache.ts +0 -294
- package/bin/commands/cdn.ts +0 -281
- package/bin/commands/config.ts +0 -202
- package/bin/commands/container.ts +0 -105
- package/bin/commands/cost.ts +0 -208
- package/bin/commands/database.ts +0 -401
- package/bin/commands/deploy.ts +0 -674
- package/bin/commands/domain.ts +0 -397
- package/bin/commands/email.ts +0 -423
- package/bin/commands/environment.ts +0 -285
- package/bin/commands/events.ts +0 -424
- package/bin/commands/firewall.ts +0 -145
- package/bin/commands/function.ts +0 -116
- package/bin/commands/generate.ts +0 -280
- package/bin/commands/git.ts +0 -139
- package/bin/commands/iam.ts +0 -464
- package/bin/commands/index.ts +0 -48
- package/bin/commands/init.ts +0 -120
- package/bin/commands/logs.ts +0 -148
- package/bin/commands/network.ts +0 -579
- package/bin/commands/notify.ts +0 -489
- package/bin/commands/queue.ts +0 -407
- package/bin/commands/scheduler.ts +0 -370
- package/bin/commands/secrets.ts +0 -54
- package/bin/commands/server.ts +0 -629
- package/bin/commands/shared.ts +0 -97
- package/bin/commands/ssl.ts +0 -138
- package/bin/commands/stack.ts +0 -325
- package/bin/commands/status.ts +0 -385
- package/bin/commands/storage.ts +0 -450
- package/bin/commands/team.ts +0 -96
- package/bin/commands/tunnel.ts +0 -489
- package/bin/commands/utils.ts +0 -202
- package/build.ts +0 -15
- package/cloud +0 -2
- package/src/aws/acm.ts +0 -768
- package/src/aws/application-autoscaling.ts +0 -845
- package/src/aws/bedrock.ts +0 -4074
- package/src/aws/client.ts +0 -878
- package/src/aws/cloudformation.ts +0 -896
- package/src/aws/cloudfront.ts +0 -1531
- package/src/aws/cloudwatch-logs.ts +0 -154
- package/src/aws/comprehend.ts +0 -839
- package/src/aws/connect.ts +0 -1056
- package/src/aws/deploy-imap.ts +0 -384
- package/src/aws/dynamodb.ts +0 -340
- package/src/aws/ec2.ts +0 -1385
- package/src/aws/ecr.ts +0 -621
- package/src/aws/ecs.ts +0 -615
- package/src/aws/elasticache.ts +0 -301
- package/src/aws/elbv2.ts +0 -942
- package/src/aws/email.ts +0 -928
- package/src/aws/eventbridge.ts +0 -248
- package/src/aws/iam.ts +0 -1689
- package/src/aws/imap-server.ts +0 -2100
- package/src/aws/lambda.ts +0 -786
- package/src/aws/opensearch.ts +0 -158
- package/src/aws/personalize.ts +0 -977
- package/src/aws/polly.ts +0 -559
- package/src/aws/rds.ts +0 -888
- package/src/aws/rekognition.ts +0 -846
- package/src/aws/route53-domains.ts +0 -359
- package/src/aws/route53.ts +0 -1046
- package/src/aws/s3.ts +0 -2318
- package/src/aws/scheduler.ts +0 -571
- package/src/aws/secrets-manager.ts +0 -769
- package/src/aws/ses.ts +0 -1081
- package/src/aws/setup-phone.ts +0 -104
- package/src/aws/setup-sms.ts +0 -580
- package/src/aws/sms.ts +0 -1735
- package/src/aws/smtp-server.ts +0 -531
- package/src/aws/sns.ts +0 -758
- package/src/aws/sqs.ts +0 -382
- package/src/aws/ssm.ts +0 -807
- package/src/aws/sts.ts +0 -92
- package/src/aws/support.ts +0 -391
- package/src/aws/test-imap.ts +0 -86
- package/src/aws/textract.ts +0 -780
- package/src/aws/transcribe.ts +0 -108
- package/src/aws/translate.ts +0 -641
- package/src/aws/voice.ts +0 -1379
- package/src/config.ts +0 -35
- package/src/deploy/index.ts +0 -7
- package/src/deploy/static-site-external-dns.ts +0 -906
- package/src/deploy/static-site.ts +0 -1125
- package/src/dns/godaddy.ts +0 -412
- package/src/dns/index.ts +0 -183
- package/src/dns/porkbun.ts +0 -362
- package/src/dns/route53-adapter.ts +0 -414
- package/src/dns/validator.ts +0 -369
- package/src/generators/index.ts +0 -5
- package/src/generators/infrastructure.ts +0 -1660
- package/src/push/apns.ts +0 -452
- package/src/push/fcm.ts +0 -506
- package/src/push/index.ts +0 -58
- package/src/ssl/acme-client.ts +0 -478
- package/src/ssl/index.ts +0 -7
- package/src/ssl/letsencrypt.ts +0 -747
- package/src/types.ts +0 -2
- package/src/utils/cli.ts +0 -398
- package/src/validation/index.ts +0 -5
- package/src/validation/template.ts +0 -405
- package/test/index.test.ts +0 -128
- package/tsconfig.json +0 -18
package/bin/commands/generate.ts
DELETED
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
import type { CLI } from '@stacksjs/clapp'
|
|
2
|
-
import { existsSync } from 'node:fs'
|
|
3
|
-
import { mkdir, writeFile } from 'node:fs/promises'
|
|
4
|
-
import { join } from 'node:path'
|
|
5
|
-
import * as cli from '../../src/utils/cli'
|
|
6
|
-
import { InfrastructureGenerator } from '../../src/generators/infrastructure'
|
|
7
|
-
import { CloudFormationClient } from '../../src/aws/cloudformation'
|
|
8
|
-
import { validateTemplate, validateTemplateSize, validateResourceLimits } from '../../src/validation/template'
|
|
9
|
-
import { loadValidatedConfig } from './shared'
|
|
10
|
-
|
|
11
|
-
export function registerGenerateCommands(app: CLI): void {
|
|
12
|
-
app
|
|
13
|
-
.command('generate', 'Generate CloudFormation templates')
|
|
14
|
-
.alias('gen')
|
|
15
|
-
.option('--output <path>', 'Output directory for templates', { default: 'cloudformation' })
|
|
16
|
-
.option('--format <format>', 'Output format: json or yaml', { default: 'json' })
|
|
17
|
-
.option('--module <module>', 'Generate specific module only')
|
|
18
|
-
.action(async (options?: { output?: string, format?: string, module?: string }) => {
|
|
19
|
-
cli.header('Generating CloudFormation Templates')
|
|
20
|
-
|
|
21
|
-
const spinner = new cli.Spinner('Loading configuration...')
|
|
22
|
-
spinner.start()
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const config = await loadValidatedConfig()
|
|
26
|
-
spinner.succeed('Configuration loaded')
|
|
27
|
-
|
|
28
|
-
const outputDir = options?.output || 'cloudformation'
|
|
29
|
-
const format = options?.format || 'json'
|
|
30
|
-
const environment = (options as any)?.env || 'production'
|
|
31
|
-
|
|
32
|
-
// Create output directory
|
|
33
|
-
if (!existsSync(outputDir)) {
|
|
34
|
-
await mkdir(outputDir, { recursive: true })
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Generate infrastructure using all Phase 2 modules
|
|
38
|
-
cli.step('Generating infrastructure...')
|
|
39
|
-
const generator = new InfrastructureGenerator({
|
|
40
|
-
config,
|
|
41
|
-
environment,
|
|
42
|
-
modules: options?.module ? [options.module] : undefined,
|
|
43
|
-
})
|
|
44
|
-
|
|
45
|
-
const generationSpinner = new cli.Spinner('Generating CloudFormation template...')
|
|
46
|
-
generationSpinner.start()
|
|
47
|
-
|
|
48
|
-
// Generate the template
|
|
49
|
-
generator.generate()
|
|
50
|
-
const output = format === 'yaml' ? generator.toYAML() : generator.toJSON()
|
|
51
|
-
generationSpinner.succeed('Template generated')
|
|
52
|
-
|
|
53
|
-
// Validate template
|
|
54
|
-
cli.step('Validating template...')
|
|
55
|
-
const template = JSON.parse(generator.toJSON())
|
|
56
|
-
const validation = validateTemplate(template)
|
|
57
|
-
const sizeValidation = validateTemplateSize(output)
|
|
58
|
-
const limitsValidation = validateResourceLimits(template)
|
|
59
|
-
|
|
60
|
-
// Show errors
|
|
61
|
-
const allErrors = [
|
|
62
|
-
...validation.errors,
|
|
63
|
-
...sizeValidation.errors,
|
|
64
|
-
...limitsValidation.errors,
|
|
65
|
-
]
|
|
66
|
-
|
|
67
|
-
if (allErrors.length > 0) {
|
|
68
|
-
cli.error('Template validation failed:')
|
|
69
|
-
for (const error of allErrors) {
|
|
70
|
-
cli.error(` - ${error.path}: ${error.message}`)
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
cli.success('Template validated successfully')
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Show warnings
|
|
78
|
-
const allWarnings = [
|
|
79
|
-
...validation.warnings,
|
|
80
|
-
...sizeValidation.warnings,
|
|
81
|
-
...limitsValidation.warnings,
|
|
82
|
-
]
|
|
83
|
-
|
|
84
|
-
if (allWarnings.length > 0) {
|
|
85
|
-
for (const warning of allWarnings) {
|
|
86
|
-
cli.warn(` - ${warning.path}: ${warning.message}`)
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Write to file
|
|
91
|
-
const filename = join(outputDir, `${environment}.${format}`)
|
|
92
|
-
await writeFile(filename, output)
|
|
93
|
-
cli.success(`Generated ${filename}`)
|
|
94
|
-
|
|
95
|
-
// Show summary
|
|
96
|
-
const builder = generator.getBuilder()
|
|
97
|
-
const resourceCount = Object.keys(builder.getResources()).length
|
|
98
|
-
cli.info(`\nGenerated ${resourceCount} resources:`)
|
|
99
|
-
|
|
100
|
-
// Count resource types
|
|
101
|
-
const resources = builder.getResources()
|
|
102
|
-
const typeCounts: Record<string, number> = {}
|
|
103
|
-
for (const resource of Object.values(resources)) {
|
|
104
|
-
const type = (resource as any).Type
|
|
105
|
-
typeCounts[type] = (typeCounts[type] || 0) + 1
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Display resource types
|
|
109
|
-
const types = Object.entries(typeCounts).sort((a, b) => b[1] - a[1])
|
|
110
|
-
for (const [type, count] of types) {
|
|
111
|
-
cli.info(` - ${type}: ${count}`)
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
cli.info(`\nNext steps:
|
|
115
|
-
1. Review the generated templates in ${outputDir}/
|
|
116
|
-
2. Run 'cloud deploy' to deploy your infrastructure`)
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
spinner.fail('Failed to generate templates')
|
|
120
|
-
cli.error(error instanceof Error ? error.message : 'Unknown error')
|
|
121
|
-
}
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
app
|
|
125
|
-
.command('generate:preview', 'Preview what will be generated')
|
|
126
|
-
.action(async () => {
|
|
127
|
-
cli.header('Template Preview')
|
|
128
|
-
cli.info('This command will show a preview of generated templates')
|
|
129
|
-
// TODO: Implement preview logic
|
|
130
|
-
})
|
|
131
|
-
|
|
132
|
-
app
|
|
133
|
-
.command('diff', 'Show diff between local config and deployed stack')
|
|
134
|
-
.alias('generate:diff')
|
|
135
|
-
.option('--stack <name>', 'Stack name to compare against')
|
|
136
|
-
.option('--env <environment>', 'Environment (production, staging, development)')
|
|
137
|
-
.action(async (options?: { stack?: string, env?: string }) => {
|
|
138
|
-
cli.header('Infrastructure Diff')
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
const config = await loadValidatedConfig()
|
|
142
|
-
const environment = (options?.env || 'production') as 'production' | 'staging' | 'development'
|
|
143
|
-
const stackName = options?.stack || `${config.project.slug}-${environment}`
|
|
144
|
-
const region = config.project.region || 'us-east-1'
|
|
145
|
-
|
|
146
|
-
cli.info(`Stack: ${stackName}`)
|
|
147
|
-
cli.info(`Region: ${region}`)
|
|
148
|
-
cli.info(`Environment: ${environment}`)
|
|
149
|
-
|
|
150
|
-
// Generate new template from config
|
|
151
|
-
cli.step('Generating template from configuration...')
|
|
152
|
-
const generator = new InfrastructureGenerator({
|
|
153
|
-
config,
|
|
154
|
-
environment,
|
|
155
|
-
})
|
|
156
|
-
generator.generate()
|
|
157
|
-
const newTemplateBody = generator.toJSON()
|
|
158
|
-
const newTemplate = JSON.parse(newTemplateBody)
|
|
159
|
-
|
|
160
|
-
// Get existing template from CloudFormation
|
|
161
|
-
cli.step('Fetching deployed template...')
|
|
162
|
-
const cfn = new CloudFormationClient(region)
|
|
163
|
-
|
|
164
|
-
let existingTemplate: any = null
|
|
165
|
-
try {
|
|
166
|
-
const result = await cfn.getTemplate(stackName)
|
|
167
|
-
if (result.TemplateBody) {
|
|
168
|
-
existingTemplate = JSON.parse(result.TemplateBody)
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
catch (error: any) {
|
|
172
|
-
if (error.message?.includes('does not exist')) {
|
|
173
|
-
cli.warn(`Stack "${stackName}" does not exist yet`)
|
|
174
|
-
cli.info('\nThis will be a new deployment with the following resources:')
|
|
175
|
-
|
|
176
|
-
const resourceCount = Object.keys(newTemplate.Resources || {}).length
|
|
177
|
-
cli.info(`\nResources to create: ${resourceCount}`)
|
|
178
|
-
|
|
179
|
-
// Count and display resource types
|
|
180
|
-
const typeCounts: Record<string, number> = {}
|
|
181
|
-
for (const resource of Object.values(newTemplate.Resources || {})) {
|
|
182
|
-
const type = (resource as any).Type
|
|
183
|
-
typeCounts[type] = (typeCounts[type] || 0) + 1
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
for (const [type, count] of Object.entries(typeCounts).sort((a, b) => b[1] - a[1])) {
|
|
187
|
-
cli.info(` + ${type}: ${count}`)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
cli.info('\nRun `cloud deploy` to create this stack')
|
|
191
|
-
return
|
|
192
|
-
}
|
|
193
|
-
throw error
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
// Compare templates
|
|
197
|
-
cli.step('Comparing templates...')
|
|
198
|
-
|
|
199
|
-
const existingResources = existingTemplate.Resources || {}
|
|
200
|
-
const newResources = newTemplate.Resources || {}
|
|
201
|
-
|
|
202
|
-
const existingKeys = new Set(Object.keys(existingResources))
|
|
203
|
-
const newKeys = new Set(Object.keys(newResources))
|
|
204
|
-
|
|
205
|
-
// Find added resources
|
|
206
|
-
const added: string[] = []
|
|
207
|
-
for (const key of newKeys) {
|
|
208
|
-
if (!existingKeys.has(key)) {
|
|
209
|
-
added.push(key)
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Find removed resources
|
|
214
|
-
const removed: string[] = []
|
|
215
|
-
for (const key of existingKeys) {
|
|
216
|
-
if (!newKeys.has(key)) {
|
|
217
|
-
removed.push(key)
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Find modified resources
|
|
222
|
-
const modified: string[] = []
|
|
223
|
-
for (const key of newKeys) {
|
|
224
|
-
if (existingKeys.has(key)) {
|
|
225
|
-
const existingJson = JSON.stringify(existingResources[key])
|
|
226
|
-
const newJson = JSON.stringify(newResources[key])
|
|
227
|
-
if (existingJson !== newJson) {
|
|
228
|
-
modified.push(key)
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Display results
|
|
234
|
-
if (added.length === 0 && removed.length === 0 && modified.length === 0) {
|
|
235
|
-
cli.success('\nNo changes detected - infrastructure is up to date')
|
|
236
|
-
return
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
cli.info('\nChanges detected:\n')
|
|
240
|
-
|
|
241
|
-
if (added.length > 0) {
|
|
242
|
-
cli.success(`Resources to add (${added.length}):`)
|
|
243
|
-
for (const key of added) {
|
|
244
|
-
const type = newResources[key].Type
|
|
245
|
-
cli.info(` + ${key} (${type})`)
|
|
246
|
-
}
|
|
247
|
-
console.log()
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (removed.length > 0) {
|
|
251
|
-
cli.error(`Resources to remove (${removed.length}):`)
|
|
252
|
-
for (const key of removed) {
|
|
253
|
-
const type = existingResources[key].Type
|
|
254
|
-
cli.info(` - ${key} (${type})`)
|
|
255
|
-
}
|
|
256
|
-
console.log()
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
if (modified.length > 0) {
|
|
260
|
-
cli.warn(`Resources to modify (${modified.length}):`)
|
|
261
|
-
for (const key of modified) {
|
|
262
|
-
const type = newResources[key].Type
|
|
263
|
-
cli.info(` ~ ${key} (${type})`)
|
|
264
|
-
}
|
|
265
|
-
console.log()
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Summary
|
|
269
|
-
cli.info('Summary:')
|
|
270
|
-
cli.info(` - Add: ${added.length}`)
|
|
271
|
-
cli.info(` - Remove: ${removed.length}`)
|
|
272
|
-
cli.info(` - Modify: ${modified.length}`)
|
|
273
|
-
|
|
274
|
-
cli.info('\nRun `cloud deploy` to apply these changes')
|
|
275
|
-
}
|
|
276
|
-
catch (error: any) {
|
|
277
|
-
cli.error(`Diff failed: ${error.message}`)
|
|
278
|
-
}
|
|
279
|
-
})
|
|
280
|
-
}
|
package/bin/commands/git.ts
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
import type { CLI } from '@stacksjs/clapp'
|
|
2
|
-
import * as cli from '../../src/utils/cli'
|
|
3
|
-
|
|
4
|
-
export function registerGitCommands(app: CLI): void {
|
|
5
|
-
app
|
|
6
|
-
.command('git:add <repo>', 'Connect git repository')
|
|
7
|
-
.option('--branch <branch>', 'Default branch to deploy', { default: 'main' })
|
|
8
|
-
.action(async (repo: string, options?: { branch?: string }) => {
|
|
9
|
-
const branch = options?.branch || 'main'
|
|
10
|
-
|
|
11
|
-
cli.header('Connecting Git Repository')
|
|
12
|
-
|
|
13
|
-
cli.info(`Repository: ${repo}`)
|
|
14
|
-
cli.info(`Default branch: ${branch}`)
|
|
15
|
-
|
|
16
|
-
const confirm = await cli.confirm('\nConnect this repository?', true)
|
|
17
|
-
if (!confirm) {
|
|
18
|
-
cli.info('Operation cancelled')
|
|
19
|
-
return
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const spinner = new cli.Spinner('Setting up git integration...')
|
|
23
|
-
spinner.start()
|
|
24
|
-
|
|
25
|
-
// TODO: Store repo config, setup deploy keys
|
|
26
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
27
|
-
|
|
28
|
-
spinner.succeed('Repository connected')
|
|
29
|
-
|
|
30
|
-
cli.success('\nGit repository connected!')
|
|
31
|
-
cli.info('\nNext steps:')
|
|
32
|
-
cli.info(' - Deploy: cloud git:deploy main')
|
|
33
|
-
cli.info(' - Add webhook: cloud git:webhook:add')
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
app
|
|
37
|
-
.command('git:deploy <branch>', 'Deploy from git branch')
|
|
38
|
-
.option('--env <environment>', 'Target environment')
|
|
39
|
-
.action(async (branch: string, options?: { env?: string }) => {
|
|
40
|
-
const environment = options?.env || 'production'
|
|
41
|
-
|
|
42
|
-
cli.header(`Deploying from Git: ${branch}`)
|
|
43
|
-
|
|
44
|
-
cli.info(`Branch: ${branch}`)
|
|
45
|
-
cli.info(`Environment: ${environment}`)
|
|
46
|
-
|
|
47
|
-
const confirm = await cli.confirm('\nDeploy this branch?', true)
|
|
48
|
-
if (!confirm) {
|
|
49
|
-
cli.info('Operation cancelled')
|
|
50
|
-
return
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const spinner = new cli.Spinner('Pulling latest changes and deploying...')
|
|
54
|
-
spinner.start()
|
|
55
|
-
|
|
56
|
-
// TODO: Git pull and deploy
|
|
57
|
-
await new Promise(resolve => setTimeout(resolve, 4000))
|
|
58
|
-
|
|
59
|
-
spinner.succeed('Deployment complete')
|
|
60
|
-
|
|
61
|
-
cli.success('\nDeployed successfully!')
|
|
62
|
-
cli.info(`Branch ${branch} is now live on ${environment}`)
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
app
|
|
66
|
-
.command('git:webhook:add <repo>', 'Add webhook for auto-deploy')
|
|
67
|
-
.action(async (repo: string) => {
|
|
68
|
-
cli.header('Adding Deploy Webhook')
|
|
69
|
-
|
|
70
|
-
cli.info(`Repository: ${repo}`)
|
|
71
|
-
|
|
72
|
-
const spinner = new cli.Spinner('Creating webhook endpoint...')
|
|
73
|
-
spinner.start()
|
|
74
|
-
|
|
75
|
-
// TODO: Create API Gateway webhook endpoint
|
|
76
|
-
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
77
|
-
|
|
78
|
-
spinner.succeed('Webhook created')
|
|
79
|
-
|
|
80
|
-
cli.success('\nWebhook endpoint created!')
|
|
81
|
-
cli.info('\nWebhook URL:')
|
|
82
|
-
cli.info(' https://api.example.com/webhooks/deploy/abc123')
|
|
83
|
-
|
|
84
|
-
cli.info('\nAdd this webhook to your repository:')
|
|
85
|
-
cli.info(' - GitHub: Settings > Webhooks > Add webhook')
|
|
86
|
-
cli.info(' - GitLab: Settings > Webhooks > Add webhook')
|
|
87
|
-
cli.info(' - Event: Push events')
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
app
|
|
91
|
-
.command('git:webhook:remove <repo>', 'Remove webhook')
|
|
92
|
-
.action(async (repo: string) => {
|
|
93
|
-
cli.header('Removing Deploy Webhook')
|
|
94
|
-
|
|
95
|
-
cli.info(`Repository: ${repo}`)
|
|
96
|
-
|
|
97
|
-
const confirm = await cli.confirm('\nRemove this webhook?', true)
|
|
98
|
-
if (!confirm) {
|
|
99
|
-
cli.info('Operation cancelled')
|
|
100
|
-
return
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const spinner = new cli.Spinner('Removing webhook...')
|
|
104
|
-
spinner.start()
|
|
105
|
-
|
|
106
|
-
// TODO: Delete webhook endpoint
|
|
107
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
108
|
-
|
|
109
|
-
spinner.succeed('Webhook removed')
|
|
110
|
-
|
|
111
|
-
cli.success('\nWebhook deleted!')
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
app
|
|
115
|
-
.command('git:branches', 'List deployable branches')
|
|
116
|
-
.action(async () => {
|
|
117
|
-
cli.header('Deployable Branches')
|
|
118
|
-
|
|
119
|
-
const spinner = new cli.Spinner('Fetching branches...')
|
|
120
|
-
spinner.start()
|
|
121
|
-
|
|
122
|
-
// TODO: Fetch from git repository
|
|
123
|
-
await new Promise(resolve => setTimeout(resolve, 1500))
|
|
124
|
-
|
|
125
|
-
spinner.stop()
|
|
126
|
-
|
|
127
|
-
cli.table(
|
|
128
|
-
['Branch', 'Last Commit', 'Author', 'Deployed To'],
|
|
129
|
-
[
|
|
130
|
-
['main', '2h ago', 'john@example.com', 'production'],
|
|
131
|
-
['develop', '30m ago', 'jane@example.com', 'staging'],
|
|
132
|
-
['feature/new-ui', '1d ago', 'bob@example.com', '-'],
|
|
133
|
-
['hotfix/bug-123', '5h ago', 'alice@example.com', '-'],
|
|
134
|
-
],
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
cli.info('\nTip: Deploy a branch with `cloud git:deploy <branch>`')
|
|
138
|
-
})
|
|
139
|
-
}
|