Skip to content

Commit fd7c301

Browse files
committed
chore: wip
1 parent 0b5fc51 commit fd7c301

File tree

4 files changed

+73
-52
lines changed

4 files changed

+73
-52
lines changed

.stacks/core/buddy/src/commands/cloud.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { addJumpBox, deleteCdkRemnants, deleteJumpBox, deleteLogGroups, deleteSt
33
import { path as p } from '@stacksjs/path'
44
import type { CLI, CloudCliOptions } from '@stacksjs/types'
55
import { ExitCode } from '@stacksjs/types'
6+
import { loop } from '@stacksjs/utils'
67
import process from 'node:process'
78

89
export function cloud(buddy: CLI) {
@@ -152,8 +153,26 @@ export function cloud(buddy: CLI) {
152153
stdin: 'inherit',
153154
})
154155

155-
await outro('Your cloud has been removed', { startTime, useSeconds: true })
156-
process.exit(ExitCode.Success)
156+
// TODO: this should not be necessary but for some reason some buckets with versions aren't properly getting deleted
157+
// and because of that, we simply run the command several times, because eventually the versions will be deleted
158+
// and consequently the buckets will be deleted
159+
// the reason we are using 7 as the number of times to run the command is because it's the most amount of times I have had to run it to get it to delete everything
160+
try {
161+
await loop(7, async () => {
162+
await runCommand('buddy cloud:clean-up', {
163+
...options,
164+
cwd: p.projectPath(),
165+
stdout: 'ignore',
166+
})
167+
})
168+
169+
await outro('Your cloud has been removed', { startTime, useSeconds: true })
170+
process.exit(ExitCode.Success)
171+
}
172+
catch (error) {
173+
await outro('While cleaning up the cloud, there was an issue', { startTime, useSeconds: true }, error as Error)
174+
process.exit(ExitCode.FatalError)
175+
}
157176
})
158177

159178
buddy

.stacks/core/cli/src/exec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import process from 'node:process'
2-
import { ExitCode } from '@stacksjs/types'
1+
import { err, handleError, ok, type Result } from '@stacksjs/error-handling'
32
import type { CliOptions, StacksError, Subprocess, SyncSubprocess } from '@stacksjs/types'
4-
import { type Result, err, handleError, ok } from '@stacksjs/error-handling'
3+
import { ExitCode } from '@stacksjs/types'
4+
import process from 'node:process'
55

66
/**
77
* Execute a command.
@@ -42,7 +42,7 @@ export async function exec(command: string | string[], options?: CliOptions): Pr
4242
cwd: options?.cwd || import.meta.dir,
4343
// env: { ...e, ...options?.env },
4444
onExit(subprocess, exitCode, signalCode, error) {
45-
if (exitCode !== ExitCode.Success && exitCode)
45+
if (exitCode && exitCode !== ExitCode.Success)
4646
process.exit(exitCode)
4747
},
4848
})

.stacks/core/cloud/src/helpers.ts

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -197,39 +197,41 @@ export async function deleteStacksBuckets() {
197197
return err('No stacks buckets found')
198198

199199
const promises = stacksBuckets.map(async (bucket) => {
200-
try {
201-
const bucketName = bucket.Name || ''
202-
203-
// Delete the bucket
204-
log.info(`Deleting bucket ${bucketName}...`)
205-
206-
// List all objects in the bucket
207-
const objects = await s3.listObjectsV2({ Bucket: bucketName })
208-
209-
// Delete all objects
210-
if (objects.Contents) {
211-
log.info('Deleting bucket objects...')
212-
await Promise.all(objects.Contents.map(object =>
213-
s3.deleteObject({ Bucket: bucketName, Key: object.Key || '' }).catch(error => handleError(error)),
214-
))
215-
log.info(`Finished deleting objects from bucket ${bucketName}`)
216-
}
200+
const bucketName = bucket.Name || ''
201+
202+
// Delete the bucket
203+
log.info(`Deleting bucket ${bucketName}...`)
204+
205+
// List all objects in the bucket
206+
const objects = await s3.listObjectsV2({ Bucket: bucketName })
207+
log.info(`Finished listing bucket ${bucketName} objects`, objects)
208+
// Delete all objects
209+
if (objects.Contents) {
210+
log.info('Deleting bucket objects...')
211+
await Promise.all(objects.Contents.map(object =>
212+
s3.deleteObject({ Bucket: bucketName, Key: object.Key || '' }).catch(error => handleError(error)),
213+
))
214+
log.info(`Finished deleting objects from bucket ${bucketName}`)
215+
}
217216

218-
log.info(`Deleting bucket ${bucketName} versions...`)
217+
log.info(`aaDeleting bucket ${bucketName} versions...`)
218+
try {
219219
const versions = await s3.listObjectVersions({ Bucket: bucketName })
220+
221+
log.info(`reaching?? Finished listing bucket ${bucketName} versions`, versions)
220222
if (versions.Versions) {
221223
await Promise.all(versions.Versions.map(version =>
222-
s3.deleteObject({ Bucket: bucketName, Key: version.Key || '', VersionId: version.VersionId }).catch(error => handleError(error)),
223-
))
224+
s3.deleteObject({ Bucket: bucketName, Key: version.Key || '', VersionId: version.VersionId }),
225+
)).catch(error => handleError(error))
224226
log.info(`Finished deleting versions from bucket ${bucketName}`)
225227
}
226228

227229
// Delete all delete markers
228230
log.info(`Deleting bucket ${bucketName} delete markers...`)
229231
if (versions.DeleteMarkers) {
230232
await Promise.all(versions.DeleteMarkers.map(marker =>
231-
s3.deleteObject({ Bucket: bucketName, Key: marker.Key || '', VersionId: marker.VersionId }).catch(error => handleError(error)),
232-
))
233+
s3.deleteObject({ Bucket: bucketName, Key: marker.Key || '', VersionId: marker.VersionId }),
234+
)).catch(error => handleError(error))
233235
log.info(`Finished deleting delete markers from bucket ${bucketName}`)
234236
}
235237

@@ -238,20 +240,22 @@ export async function deleteStacksBuckets() {
238240
if (uploads.Uploads) {
239241
log.info('Aborting bucket multipart uploads...')
240242
await Promise.all(uploads.Uploads.map(upload =>
241-
s3.abortMultipartUpload({ Bucket: bucketName, Key: upload.Key || '', UploadId: upload.UploadId }).catch(error => handleError(error)),
242-
))
243+
s3.abortMultipartUpload({ Bucket: bucketName, Key: upload.Key || '', UploadId: upload.UploadId }),
244+
)).catch(error => handleError(error))
243245
log.info(`Finished aborting multipart uploads from bucket ${bucketName}`)
244246
}
245247

246-
await s3.deleteBucket({ Bucket: bucketName })
248+
await s3.deleteBucket({ Bucket: bucketName }).catch(error => handleError(error))
247249
log.info(`Bucket ${bucketName} deleted`)
248250
}
249251
catch (error) {
250-
return err(handleError('Error deleting stacks buckets', error as Error))
252+
log.info(`Error listing bucket ${bucketName} versions`, error)
251253
}
252254
})
253255

254-
await Promise.all(promises)
256+
await Promise.all(promises).catch((error: Error) => {
257+
return err(handleError('Error deleting stacks buckets', error))
258+
})
255259

256260
return ok('Stacks buckets deleted')
257261
}

.stacks/core/types/src/search-engine.ts

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -43,36 +43,31 @@ export interface SearchEngineOptions {
4343

4444
export type SearchEngineConfig = Partial<SearchEngineOptions>
4545

46-
export interface MeiliSearchOptions {
47-
apiKey: string
48-
host: string
49-
}
50-
5146
export interface SearchEngineDriver {
5247
client: MeiliSearch
5348

5449
// Indexes
5550
createIndex: (name: string, options?: IndexOptions) => MaybePromise<EnqueuedTask>
5651
getIndex: (name: string) => MaybePromise<Index>
57-
updateIndex?: (name: string, options: IndexOptions) => MaybePromise<EnqueuedTask>
58-
deleteIndex?: (name: string) => MaybePromise<EnqueuedTask>
52+
updateIndex: (name: string, options: IndexOptions) => MaybePromise<EnqueuedTask>
53+
deleteIndex: (name: string) => MaybePromise<EnqueuedTask>
5954
updateIndexSettings: (name: string, settings: SearchEngineSettings) => MaybePromise<EnqueuedTask>
6055
listAllIndexes: () => MaybePromise<IndexesResults<Index[]>>
6156
listAllIndices: () => MaybePromise<IndexesResults<Index[]>> // alternatives plural spelling
6257

6358
// Records (MeiliSearch uses the term "documents")
64-
getRecord?: (key: string) => MaybePromise<any>
65-
getRecords?: (key: string) => MaybePromise<RecordOptions>
66-
createRecord?: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
67-
createRecords?: (records: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
68-
createOrReplaceRecord?: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
69-
createOrUpdateRecord?: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
70-
deleteRecord?: (recordId: string | number, indexName: string) => MaybePromise<EnqueuedTask>
71-
deleteAllRecords?: (indexName: string) => MaybePromise<EnqueuedTask>
72-
batchDeleteRecords?: (recordIds: string[] | number[], indexName: string) => MaybePromise<EnqueuedTask>
59+
getRecord: (key: string) => MaybePromise<any>
60+
getRecords: (key: string) => MaybePromise<RecordOptions>
61+
createRecord: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
62+
createRecords: (records: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
63+
createOrReplaceRecord: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
64+
createOrUpdateRecord: (record: any, indexName: string, options: RecordOptions) => MaybePromise<EnqueuedTask>
65+
deleteRecord: (recordId: string | number, indexName: string) => MaybePromise<EnqueuedTask>
66+
deleteAllRecords: (indexName: string) => MaybePromise<EnqueuedTask>
67+
batchDeleteRecords: (recordIds: string[] | number[], indexName: string) => MaybePromise<EnqueuedTask>
7368

7469
// Search
75-
search?: (query: string, indexName: string, options: SearchParams) => MaybePromise<Search>
70+
search: (query: string, indexName: string, options: SearchParams) => MaybePromise<Search>
7671

7772
calculatePagination: Pages
7873
currentPage: Page
@@ -95,8 +90,6 @@ export interface SearchEngineDriver {
9590
totalPages: number
9691
}
9792

98-
export type SearchEngineDriverFactory<T> = (opts?: T) => SearchEngineDriver
99-
10093
/**
10194
* This interface is used to unify the persisting of data to localStorage
10295
*/
@@ -128,4 +121,9 @@ export interface SearchEngineStorage {
128121
currentPage: number
129122
}
130123

124+
export interface MeiliSearchOptions {
125+
apiKey: string
126+
host: string
127+
}
128+
131129
export type { EnqueuedTask, Hits, Index, IndexOptions, IndexesResults, MeiliSearch, RecordOptions, SearchEngineSettings, SearchParams, SearchResponse }

0 commit comments

Comments
 (0)