@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.
Files changed (187) hide show
  1. package/README.md +98 -13
  2. package/dist/aws/acm.d.ts +129 -0
  3. package/dist/aws/application-autoscaling.d.ts +282 -0
  4. package/dist/aws/bedrock.d.ts +2292 -0
  5. package/dist/aws/client.d.ts +79 -0
  6. package/dist/aws/cloudformation.d.ts +105 -0
  7. package/dist/aws/cloudfront.d.ts +265 -0
  8. package/dist/aws/cloudwatch-logs.d.ts +48 -0
  9. package/dist/aws/comprehend.d.ts +505 -0
  10. package/dist/aws/connect.d.ts +377 -0
  11. package/dist/aws/deploy-imap.d.ts +14 -0
  12. package/dist/aws/dynamodb.d.ts +176 -0
  13. package/dist/aws/ec2.d.ts +272 -0
  14. package/dist/aws/ecr.d.ts +149 -0
  15. package/dist/aws/ecs.d.ts +162 -0
  16. package/dist/aws/elasticache.d.ts +71 -0
  17. package/dist/aws/elbv2.d.ts +248 -0
  18. package/dist/aws/email.d.ts +175 -0
  19. package/dist/aws/eventbridge.d.ts +142 -0
  20. package/dist/aws/iam.d.ts +638 -0
  21. package/dist/aws/imap-server.d.ts +119 -0
  22. package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
  23. package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
  24. package/dist/aws/lambda.d.ts +232 -0
  25. package/dist/aws/opensearch.d.ts +87 -0
  26. package/dist/aws/personalize.d.ts +516 -0
  27. package/dist/aws/polly.d.ts +214 -0
  28. package/dist/aws/rds.d.ts +240 -0
  29. package/dist/aws/rekognition.d.ts +543 -0
  30. package/dist/aws/route53-domains.d.ts +113 -0
  31. package/dist/aws/route53.d.ts +215 -0
  32. package/dist/aws/s3.d.ts +212 -0
  33. package/dist/aws/scheduler.d.ts +140 -0
  34. package/dist/aws/secrets-manager.d.ts +170 -0
  35. package/dist/aws/ses.d.ts +288 -0
  36. package/dist/aws/setup-phone.d.ts +0 -0
  37. package/dist/aws/setup-sms.d.ts +115 -0
  38. package/dist/aws/sms.d.ts +304 -0
  39. package/dist/aws/smtp-server.d.ts +61 -0
  40. package/dist/aws/sns.d.ts +117 -0
  41. package/dist/aws/sqs.d.ts +65 -0
  42. package/dist/aws/ssm.d.ts +179 -0
  43. package/dist/aws/sts.d.ts +15 -0
  44. package/dist/aws/support.d.ts +104 -0
  45. package/dist/aws/test-imap.d.ts +0 -0
  46. package/dist/aws/textract.d.ts +403 -0
  47. package/dist/aws/transcribe.d.ts +60 -0
  48. package/dist/aws/translate.d.ts +358 -0
  49. package/dist/aws/voice.d.ts +219 -0
  50. package/dist/bin/cli.js +1724 -0
  51. package/dist/config.d.ts +7 -0
  52. package/dist/deploy/index.d.ts +2 -0
  53. package/dist/deploy/static-site-external-dns.d.ts +51 -0
  54. package/dist/deploy/static-site.d.ts +71 -0
  55. package/dist/dns/cloudflare.d.ts +52 -0
  56. package/dist/dns/godaddy.d.ts +38 -0
  57. package/dist/dns/index.d.ts +45 -0
  58. package/dist/dns/porkbun.d.ts +18 -0
  59. package/dist/dns/route53-adapter.d.ts +38 -0
  60. package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
  61. package/dist/dns/validator.d.ts +78 -0
  62. package/dist/generators/index.d.ts +1 -0
  63. package/dist/generators/infrastructure.d.ts +30 -0
  64. package/{src/index.ts → dist/index.d.ts} +70 -93
  65. package/dist/index.js +7881 -0
  66. package/dist/push/apns.d.ts +60 -0
  67. package/dist/push/fcm.d.ts +117 -0
  68. package/dist/push/index.d.ts +14 -0
  69. package/dist/security/pre-deploy-scanner.d.ts +69 -0
  70. package/dist/ssl/acme-client.d.ts +67 -0
  71. package/dist/ssl/index.d.ts +2 -0
  72. package/dist/ssl/letsencrypt.d.ts +48 -0
  73. package/dist/types.d.ts +1 -0
  74. package/dist/utils/cli.d.ts +123 -0
  75. package/dist/validation/index.d.ts +1 -0
  76. package/dist/validation/template.d.ts +23 -0
  77. package/package.json +8 -8
  78. package/bin/cli.ts +0 -133
  79. package/bin/commands/analytics.ts +0 -328
  80. package/bin/commands/api.ts +0 -379
  81. package/bin/commands/assets.ts +0 -221
  82. package/bin/commands/audit.ts +0 -501
  83. package/bin/commands/backup.ts +0 -682
  84. package/bin/commands/cache.ts +0 -294
  85. package/bin/commands/cdn.ts +0 -281
  86. package/bin/commands/config.ts +0 -202
  87. package/bin/commands/container.ts +0 -105
  88. package/bin/commands/cost.ts +0 -208
  89. package/bin/commands/database.ts +0 -401
  90. package/bin/commands/deploy.ts +0 -674
  91. package/bin/commands/domain.ts +0 -397
  92. package/bin/commands/email.ts +0 -423
  93. package/bin/commands/environment.ts +0 -285
  94. package/bin/commands/events.ts +0 -424
  95. package/bin/commands/firewall.ts +0 -145
  96. package/bin/commands/function.ts +0 -116
  97. package/bin/commands/generate.ts +0 -280
  98. package/bin/commands/git.ts +0 -139
  99. package/bin/commands/iam.ts +0 -464
  100. package/bin/commands/index.ts +0 -48
  101. package/bin/commands/init.ts +0 -120
  102. package/bin/commands/logs.ts +0 -148
  103. package/bin/commands/network.ts +0 -579
  104. package/bin/commands/notify.ts +0 -489
  105. package/bin/commands/queue.ts +0 -407
  106. package/bin/commands/scheduler.ts +0 -370
  107. package/bin/commands/secrets.ts +0 -54
  108. package/bin/commands/server.ts +0 -629
  109. package/bin/commands/shared.ts +0 -97
  110. package/bin/commands/ssl.ts +0 -138
  111. package/bin/commands/stack.ts +0 -325
  112. package/bin/commands/status.ts +0 -385
  113. package/bin/commands/storage.ts +0 -450
  114. package/bin/commands/team.ts +0 -96
  115. package/bin/commands/tunnel.ts +0 -489
  116. package/bin/commands/utils.ts +0 -202
  117. package/build.ts +0 -15
  118. package/cloud +0 -2
  119. package/src/aws/acm.ts +0 -768
  120. package/src/aws/application-autoscaling.ts +0 -845
  121. package/src/aws/bedrock.ts +0 -4074
  122. package/src/aws/client.ts +0 -878
  123. package/src/aws/cloudformation.ts +0 -896
  124. package/src/aws/cloudfront.ts +0 -1531
  125. package/src/aws/cloudwatch-logs.ts +0 -154
  126. package/src/aws/comprehend.ts +0 -839
  127. package/src/aws/connect.ts +0 -1056
  128. package/src/aws/deploy-imap.ts +0 -384
  129. package/src/aws/dynamodb.ts +0 -340
  130. package/src/aws/ec2.ts +0 -1385
  131. package/src/aws/ecr.ts +0 -621
  132. package/src/aws/ecs.ts +0 -615
  133. package/src/aws/elasticache.ts +0 -301
  134. package/src/aws/elbv2.ts +0 -942
  135. package/src/aws/email.ts +0 -928
  136. package/src/aws/eventbridge.ts +0 -248
  137. package/src/aws/iam.ts +0 -1689
  138. package/src/aws/imap-server.ts +0 -2100
  139. package/src/aws/lambda.ts +0 -786
  140. package/src/aws/opensearch.ts +0 -158
  141. package/src/aws/personalize.ts +0 -977
  142. package/src/aws/polly.ts +0 -559
  143. package/src/aws/rds.ts +0 -888
  144. package/src/aws/rekognition.ts +0 -846
  145. package/src/aws/route53-domains.ts +0 -359
  146. package/src/aws/route53.ts +0 -1046
  147. package/src/aws/s3.ts +0 -2318
  148. package/src/aws/scheduler.ts +0 -571
  149. package/src/aws/secrets-manager.ts +0 -769
  150. package/src/aws/ses.ts +0 -1081
  151. package/src/aws/setup-phone.ts +0 -104
  152. package/src/aws/setup-sms.ts +0 -580
  153. package/src/aws/sms.ts +0 -1735
  154. package/src/aws/smtp-server.ts +0 -531
  155. package/src/aws/sns.ts +0 -758
  156. package/src/aws/sqs.ts +0 -382
  157. package/src/aws/ssm.ts +0 -807
  158. package/src/aws/sts.ts +0 -92
  159. package/src/aws/support.ts +0 -391
  160. package/src/aws/test-imap.ts +0 -86
  161. package/src/aws/textract.ts +0 -780
  162. package/src/aws/transcribe.ts +0 -108
  163. package/src/aws/translate.ts +0 -641
  164. package/src/aws/voice.ts +0 -1379
  165. package/src/config.ts +0 -35
  166. package/src/deploy/index.ts +0 -7
  167. package/src/deploy/static-site-external-dns.ts +0 -906
  168. package/src/deploy/static-site.ts +0 -1125
  169. package/src/dns/godaddy.ts +0 -412
  170. package/src/dns/index.ts +0 -183
  171. package/src/dns/porkbun.ts +0 -362
  172. package/src/dns/route53-adapter.ts +0 -414
  173. package/src/dns/validator.ts +0 -369
  174. package/src/generators/index.ts +0 -5
  175. package/src/generators/infrastructure.ts +0 -1660
  176. package/src/push/apns.ts +0 -452
  177. package/src/push/fcm.ts +0 -506
  178. package/src/push/index.ts +0 -58
  179. package/src/ssl/acme-client.ts +0 -478
  180. package/src/ssl/index.ts +0 -7
  181. package/src/ssl/letsencrypt.ts +0 -747
  182. package/src/types.ts +0 -2
  183. package/src/utils/cli.ts +0 -398
  184. package/src/validation/index.ts +0 -5
  185. package/src/validation/template.ts +0 -405
  186. package/test/index.test.ts +0 -128
  187. package/tsconfig.json +0 -18
@@ -1,401 +0,0 @@
1
- import type { CLI } from '@stacksjs/clapp'
2
- import * as cli from '../../src/utils/cli'
3
-
4
- export function registerDatabaseCommands(app: CLI): void {
5
- app
6
- .command('db:list', 'List all databases')
7
- .action(async () => {
8
- cli.header('Databases')
9
-
10
- const databases = [
11
- ['production-db', 'PostgreSQL 15', 'db.t3.micro', 'available', '20 GB'],
12
- ['staging-db', 'PostgreSQL 15', 'db.t3.micro', 'available', '20 GB'],
13
- ]
14
-
15
- cli.table(
16
- ['Name', 'Engine', 'Instance Type', 'Status', 'Storage'],
17
- databases,
18
- )
19
- })
20
-
21
- app
22
- .command('db:create <name>', 'Create a new database')
23
- .option('--engine <engine>', 'Database engine: postgres, mysql, or dynamodb')
24
- .option('--size <size>', 'Instance size (e.g., db.t3.micro)')
25
- .action(async (name: string, options?: { engine?: string, size?: string }) => {
26
- cli.header(`Creating Database: ${name}`)
27
-
28
- const engine = options?.engine || 'postgres'
29
- const size = options?.size || 'db.t3.micro'
30
-
31
- const spinner = new cli.Spinner(`Creating ${engine} database...`)
32
- spinner.start()
33
-
34
- // TODO: Implement database creation
35
- await new Promise(resolve => setTimeout(resolve, 3000))
36
-
37
- spinner.succeed(`Database ${name} created successfully`)
38
- cli.info(`Engine: ${engine}`)
39
- cli.info(`Size: ${size}`)
40
- })
41
-
42
- app
43
- .command('db:backup <name>', 'Create database backup')
44
- .action(async (name: string) => {
45
- cli.header(`Backing up ${name}`)
46
-
47
- const spinner = new cli.Spinner('Creating snapshot...')
48
- spinner.start()
49
-
50
- // TODO: Implement backup
51
- await new Promise(resolve => setTimeout(resolve, 2000))
52
-
53
- spinner.succeed('Backup created successfully')
54
- })
55
-
56
- app
57
- .command('db:connect <name>', 'Get connection details')
58
- .action(async (name: string) => {
59
- cli.header(`Connection Details for ${name}`)
60
-
61
- // TODO: Fetch connection details from AWS
62
- cli.info('Host: my-db.xxxxx.us-east-1.rds.amazonaws.com')
63
- cli.info('Port: 5432')
64
- cli.info('Database: postgres')
65
- cli.warn('Get password from AWS Secrets Manager')
66
- })
67
-
68
- app
69
- .command('db:restore <name> <backup-id>', 'Restore database from backup')
70
- .option('--new-name <name>', 'Name for restored database')
71
- .action(async (name: string, backupId: string, options?: { newName?: string }) => {
72
- cli.header(`Restoring Database: ${name}`)
73
-
74
- const newName = options?.newName || `${name}-restored-${Date.now()}`
75
-
76
- cli.info(`Source: ${name}`)
77
- cli.info(`Backup ID: ${backupId}`)
78
- cli.info(`Target: ${newName}`)
79
-
80
- cli.warning('\nThis will create a new database instance from the backup.')
81
-
82
- const confirm = await cli.confirm('Continue with restore?', false)
83
- if (!confirm) {
84
- cli.info('Restore cancelled')
85
- return
86
- }
87
-
88
- const spinner = new cli.Spinner('Restoring from snapshot...')
89
- spinner.start()
90
-
91
- // TODO: Restore RDS from snapshot
92
- await new Promise(resolve => setTimeout(resolve, 3000))
93
-
94
- spinner.succeed('Database restore initiated')
95
-
96
- cli.success('\nRestore started!')
97
- cli.info('\nThe new database will be available in a few minutes')
98
- cli.info(`New instance: ${newName}`)
99
- })
100
-
101
- app
102
- .command('db:tunnel <name>', 'Create SSH tunnel to database')
103
- .option('--local-port <port>', 'Local port for tunnel', { default: '5432' })
104
- .action(async (name: string, options?: { localPort?: string }) => {
105
- cli.header(`Creating SSH Tunnel to ${name}`)
106
-
107
- const localPort = options?.localPort || '5432'
108
-
109
- cli.info(`Database: ${name}`)
110
- cli.info(`Local port: ${localPort}`)
111
-
112
- const spinner = new cli.Spinner('Establishing SSH tunnel...')
113
- spinner.start()
114
-
115
- // TODO: Create SSH tunnel via bastion host
116
- await new Promise(resolve => setTimeout(resolve, 2000))
117
-
118
- spinner.succeed('SSH tunnel established')
119
-
120
- cli.success('\nTunnel active!')
121
- cli.info('\nConnection details:')
122
- cli.info(` Host: localhost`)
123
- cli.info(` Port: ${localPort}`)
124
- cli.info(` Database: postgres`)
125
- cli.info('\nPress Ctrl+C to close the tunnel')
126
-
127
- // Keep the process running
128
- // TODO: Implement actual tunnel that stays open
129
- })
130
-
131
- app
132
- .command('db:migrations:run <name>', 'Run database migrations')
133
- .action(async (name: string) => {
134
- cli.header(`Running Migrations for ${name}`)
135
-
136
- const confirm = await cli.confirm('\nRun pending migrations?', true)
137
- if (!confirm) {
138
- cli.info('Operation cancelled')
139
- return
140
- }
141
-
142
- const spinner = new cli.Spinner('Running migrations...')
143
- spinner.start()
144
-
145
- // TODO: Run migrations via Lambda or SSM
146
- await new Promise(resolve => setTimeout(resolve, 3000))
147
-
148
- spinner.succeed('Migrations complete')
149
-
150
- cli.success('\nMigrations applied!')
151
- cli.info('Executed: 3 migrations')
152
- cli.info(' - 20241101_add_users_table')
153
- cli.info(' - 20241102_add_email_column')
154
- cli.info(' - 20241103_create_indexes')
155
- })
156
-
157
- app
158
- .command('db:migrations:rollback <name>', 'Rollback last migration')
159
- .action(async (name: string) => {
160
- cli.header(`Rolling Back Migration for ${name}`)
161
-
162
- cli.warn('\nThis will revert the last migration')
163
-
164
- const confirm = await cli.confirm('Rollback last migration?', false)
165
- if (!confirm) {
166
- cli.info('Operation cancelled')
167
- return
168
- }
169
-
170
- const spinner = new cli.Spinner('Rolling back migration...')
171
- spinner.start()
172
-
173
- // TODO: Rollback via Lambda or SSM
174
- await new Promise(resolve => setTimeout(resolve, 2000))
175
-
176
- spinner.succeed('Rollback complete')
177
-
178
- cli.success('\nMigration rolled back!')
179
- cli.info('Reverted: 20241103_create_indexes')
180
- })
181
-
182
- app
183
- .command('db:migrations:status <name>', 'Show migration status')
184
- .action(async (name: string) => {
185
- cli.header(`Migration Status for ${name}`)
186
-
187
- const spinner = new cli.Spinner('Fetching migration status...')
188
- spinner.start()
189
-
190
- // TODO: Query migrations table
191
- await new Promise(resolve => setTimeout(resolve, 1500))
192
-
193
- spinner.stop()
194
-
195
- cli.table(
196
- ['Migration', 'Status', 'Executed'],
197
- [
198
- ['20241101_add_users_table', 'Applied', '2024-11-01 10:30'],
199
- ['20241102_add_email_column', 'Applied', '2024-11-02 15:45'],
200
- ['20241103_create_indexes', 'Applied', '2024-11-03 09:15'],
201
- ['20241104_add_timestamps', 'Pending', '-'],
202
- ],
203
- )
204
-
205
- cli.info('\nSummary: 3 applied, 1 pending')
206
- })
207
-
208
- app
209
- .command('db:seed <name>', 'Seed database with test data')
210
- .action(async (name: string) => {
211
- cli.header(`Seeding Database: ${name}`)
212
-
213
- cli.warn('\nThis will add test/sample data')
214
-
215
- const confirm = await cli.confirm('Seed database?', true)
216
- if (!confirm) {
217
- cli.info('Operation cancelled')
218
- return
219
- }
220
-
221
- const spinner = new cli.Spinner('Running database seeders...')
222
- spinner.start()
223
-
224
- // TODO: Run seeders
225
- await new Promise(resolve => setTimeout(resolve, 3000))
226
-
227
- spinner.succeed('Seeding complete')
228
-
229
- cli.success('\nDatabase seeded!')
230
- cli.info('Added:')
231
- cli.info(' - 100 users')
232
- cli.info(' - 500 products')
233
- cli.info(' - 1,000 orders')
234
- })
235
-
236
- app
237
- .command('db:snapshot <name>', 'Create database snapshot')
238
- .action(async (name: string) => {
239
- cli.header(`Creating Snapshot of ${name}`)
240
-
241
- const confirm = await cli.confirm('\nCreate snapshot?', true)
242
- if (!confirm) {
243
- cli.info('Operation cancelled')
244
- return
245
- }
246
-
247
- const spinner = new cli.Spinner('Creating RDS snapshot...')
248
- spinner.start()
249
-
250
- // TODO: Create RDS snapshot
251
- await new Promise(resolve => setTimeout(resolve, 3000))
252
-
253
- spinner.succeed('Snapshot created')
254
-
255
- cli.success('\nDatabase snapshot created!')
256
- cli.info('Snapshot ID: snap-db-abc123')
257
- })
258
-
259
- app
260
- .command('db:snapshot:list <name>', 'List snapshots')
261
- .action(async (name: string) => {
262
- cli.header(`Snapshots for ${name}`)
263
-
264
- const spinner = new cli.Spinner('Fetching snapshots...')
265
- spinner.start()
266
-
267
- // TODO: List RDS snapshots
268
- await new Promise(resolve => setTimeout(resolve, 1500))
269
-
270
- spinner.stop()
271
-
272
- cli.table(
273
- ['Snapshot ID', 'Created', 'Size', 'Status'],
274
- [
275
- ['snap-db-001', '2024-11-15 02:00', '12.5 GB', 'Available'],
276
- ['snap-db-002', '2024-11-14 02:00', '12.3 GB', 'Available'],
277
- ['snap-db-003', '2024-11-13 02:00', '12.1 GB', 'Available'],
278
- ],
279
- )
280
- })
281
-
282
- app
283
- .command('db:snapshot:restore <name> <snapshot-id>', 'Restore from snapshot')
284
- .option('--new-name <name>', 'Name for restored database')
285
- .action(async (name: string, snapshotId: string, options?: { newName?: string }) => {
286
- const newName = options?.newName || `${name}-restored`
287
-
288
- cli.header('Restoring from Snapshot')
289
-
290
- cli.info(`Source: ${name}`)
291
- cli.info(`Snapshot: ${snapshotId}`)
292
- cli.info(`New database: ${newName}`)
293
-
294
- const confirm = await cli.confirm('\nRestore from snapshot?', true)
295
- if (!confirm) {
296
- cli.info('Operation cancelled')
297
- return
298
- }
299
-
300
- const spinner = new cli.Spinner('Restoring database from snapshot...')
301
- spinner.start()
302
-
303
- // TODO: Restore RDS from snapshot
304
- await new Promise(resolve => setTimeout(resolve, 8000))
305
-
306
- spinner.succeed('Restore complete')
307
-
308
- cli.success('\nDatabase restored!')
309
- cli.info(`New database: ${newName}`)
310
- })
311
-
312
- app
313
- .command('db:users:add <name> <user>', 'Create database user')
314
- .option('--password <password>', 'User password')
315
- .option('--readonly', 'Create readonly user')
316
- .action(async (name: string, user: string, options?: { password?: string, readonly?: boolean }) => {
317
- const readonly = options?.readonly || false
318
-
319
- cli.header('Creating Database User')
320
-
321
- cli.info(`Database: ${name}`)
322
- cli.info(`Username: ${user}`)
323
- cli.info(`Permissions: ${readonly ? 'Read-only' : 'Read-write'}`)
324
-
325
- const confirm = await cli.confirm('\nCreate this user?', true)
326
- if (!confirm) {
327
- cli.info('Operation cancelled')
328
- return
329
- }
330
-
331
- const spinner = new cli.Spinner('Creating database user...')
332
- spinner.start()
333
-
334
- // TODO: Create DB user
335
- await new Promise(resolve => setTimeout(resolve, 2000))
336
-
337
- spinner.succeed('User created')
338
-
339
- cli.success('\nDatabase user created!')
340
- cli.info(`Username: ${user}`)
341
- cli.info('Password: ************')
342
- cli.warn('\nSave credentials securely!')
343
- })
344
-
345
- app
346
- .command('db:users:list <name>', 'List database users')
347
- .action(async (name: string) => {
348
- cli.header(`Users for ${name}`)
349
-
350
- const spinner = new cli.Spinner('Fetching database users...')
351
- spinner.start()
352
-
353
- // TODO: Query database users
354
- await new Promise(resolve => setTimeout(resolve, 1500))
355
-
356
- spinner.stop()
357
-
358
- cli.table(
359
- ['Username', 'Permissions', 'Created', 'Last Login'],
360
- [
361
- ['admin', 'Superuser', '2024-01-01', '2h ago'],
362
- ['app_user', 'Read-write', '2024-01-15', '5m ago'],
363
- ['readonly', 'Read-only', '2024-02-01', '1d ago'],
364
- ['backup', 'Read-only', '2024-01-10', 'Never'],
365
- ],
366
- )
367
- })
368
-
369
- app
370
- .command('db:slow-queries <name>', 'Show slow query log')
371
- .option('--limit <count>', 'Number of queries to show', { default: '10' })
372
- .action(async (name: string, options?: { limit?: string }) => {
373
- const limit = options?.limit || '10'
374
-
375
- cli.header(`Slow Queries for ${name}`)
376
-
377
- const spinner = new cli.Spinner('Analyzing slow query log...')
378
- spinner.start()
379
-
380
- // TODO: Query slow query log
381
- await new Promise(resolve => setTimeout(resolve, 2000))
382
-
383
- spinner.stop()
384
-
385
- cli.info(`\nTop ${limit} slow queries:\n`)
386
-
387
- cli.table(
388
- ['Time', 'Duration', 'Query', 'Rows'],
389
- [
390
- ['2h ago', '2.34s', 'SELECT * FROM users WHERE...', '15,234'],
391
- ['3h ago', '1.89s', 'SELECT * FROM orders JOIN...', '8,456'],
392
- ['5h ago', '1.56s', 'UPDATE products SET...', '3,289'],
393
- ],
394
- )
395
-
396
- cli.info('\nRecommendations:')
397
- cli.info(' - Add index on users.email')
398
- cli.info(' - Optimize JOIN query with covering index')
399
- cli.info(' - Consider batching UPDATE operations')
400
- })
401
- }