appwrite-utils-cli 1.5.2 → 1.6.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.
Files changed (233) hide show
  1. package/CHANGELOG.md +199 -0
  2. package/README.md +251 -29
  3. package/dist/adapters/AdapterFactory.d.ts +10 -3
  4. package/dist/adapters/AdapterFactory.js +213 -17
  5. package/dist/adapters/TablesDBAdapter.js +60 -17
  6. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  7. package/dist/backups/operations/bucketBackup.js +197 -0
  8. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  9. package/dist/backups/operations/collectionBackup.js +201 -0
  10. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  11. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  12. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  13. package/dist/backups/schemas/bucketManifest.js +33 -0
  14. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  15. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  16. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  17. package/dist/backups/tracking/centralizedTracking.js +274 -0
  18. package/dist/cli/commands/configCommands.d.ts +8 -0
  19. package/dist/cli/commands/configCommands.js +160 -0
  20. package/dist/cli/commands/databaseCommands.d.ts +13 -0
  21. package/dist/cli/commands/databaseCommands.js +478 -0
  22. package/dist/cli/commands/functionCommands.d.ts +7 -0
  23. package/dist/cli/commands/functionCommands.js +289 -0
  24. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  25. package/dist/cli/commands/schemaCommands.js +134 -0
  26. package/dist/cli/commands/transferCommands.d.ts +5 -0
  27. package/dist/cli/commands/transferCommands.js +384 -0
  28. package/dist/collections/attributes.d.ts +5 -4
  29. package/dist/collections/attributes.js +539 -246
  30. package/dist/collections/indexes.js +39 -37
  31. package/dist/collections/methods.d.ts +2 -16
  32. package/dist/collections/methods.js +90 -538
  33. package/dist/collections/transferOperations.d.ts +7 -0
  34. package/dist/collections/transferOperations.js +331 -0
  35. package/dist/collections/wipeOperations.d.ts +16 -0
  36. package/dist/collections/wipeOperations.js +328 -0
  37. package/dist/config/configMigration.d.ts +87 -0
  38. package/dist/config/configMigration.js +390 -0
  39. package/dist/config/configValidation.d.ts +66 -0
  40. package/dist/config/configValidation.js +358 -0
  41. package/dist/config/yamlConfig.d.ts +455 -1
  42. package/dist/config/yamlConfig.js +145 -52
  43. package/dist/databases/methods.js +3 -2
  44. package/dist/databases/setup.d.ts +1 -2
  45. package/dist/databases/setup.js +9 -87
  46. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  47. package/dist/examples/yamlTerminologyExample.js +269 -0
  48. package/dist/functions/deployments.js +11 -10
  49. package/dist/functions/methods.d.ts +1 -1
  50. package/dist/functions/methods.js +5 -4
  51. package/dist/init.js +9 -9
  52. package/dist/interactiveCLI.d.ts +8 -17
  53. package/dist/interactiveCLI.js +181 -1172
  54. package/dist/main.js +364 -21
  55. package/dist/migrations/afterImportActions.js +22 -30
  56. package/dist/migrations/appwriteToX.js +71 -25
  57. package/dist/migrations/dataLoader.js +35 -26
  58. package/dist/migrations/importController.js +29 -30
  59. package/dist/migrations/relationships.js +13 -12
  60. package/dist/migrations/services/ImportOrchestrator.js +16 -19
  61. package/dist/migrations/transfer.js +46 -46
  62. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +3 -1
  63. package/dist/migrations/yaml/YamlImportConfigLoader.js +6 -3
  64. package/dist/migrations/yaml/YamlImportIntegration.d.ts +9 -3
  65. package/dist/migrations/yaml/YamlImportIntegration.js +22 -11
  66. package/dist/migrations/yaml/generateImportSchemas.d.ts +14 -1
  67. package/dist/migrations/yaml/generateImportSchemas.js +736 -7
  68. package/dist/schemas/authUser.d.ts +1 -1
  69. package/dist/setupController.js +3 -2
  70. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  71. package/dist/shared/backupMetadataSchema.js +38 -0
  72. package/dist/shared/backupTracking.d.ts +18 -0
  73. package/dist/shared/backupTracking.js +176 -0
  74. package/dist/shared/confirmationDialogs.js +15 -15
  75. package/dist/shared/errorUtils.d.ts +54 -0
  76. package/dist/shared/errorUtils.js +95 -0
  77. package/dist/shared/functionManager.js +20 -19
  78. package/dist/shared/indexManager.js +12 -11
  79. package/dist/shared/jsonSchemaGenerator.js +10 -26
  80. package/dist/shared/logging.d.ts +51 -0
  81. package/dist/shared/logging.js +70 -0
  82. package/dist/shared/messageFormatter.d.ts +2 -0
  83. package/dist/shared/messageFormatter.js +10 -0
  84. package/dist/shared/migrationHelpers.d.ts +6 -16
  85. package/dist/shared/migrationHelpers.js +24 -21
  86. package/dist/shared/operationLogger.d.ts +8 -1
  87. package/dist/shared/operationLogger.js +11 -24
  88. package/dist/shared/operationQueue.d.ts +28 -1
  89. package/dist/shared/operationQueue.js +268 -66
  90. package/dist/shared/operationsTable.d.ts +26 -0
  91. package/dist/shared/operationsTable.js +286 -0
  92. package/dist/shared/operationsTableSchema.d.ts +48 -0
  93. package/dist/shared/operationsTableSchema.js +35 -0
  94. package/dist/shared/relationshipExtractor.d.ts +56 -0
  95. package/dist/shared/relationshipExtractor.js +138 -0
  96. package/dist/shared/schemaGenerator.d.ts +19 -1
  97. package/dist/shared/schemaGenerator.js +56 -75
  98. package/dist/storage/backupCompression.d.ts +20 -0
  99. package/dist/storage/backupCompression.js +67 -0
  100. package/dist/storage/methods.d.ts +16 -2
  101. package/dist/storage/methods.js +98 -14
  102. package/dist/users/methods.js +9 -8
  103. package/dist/utils/configDiscovery.d.ts +78 -0
  104. package/dist/utils/configDiscovery.js +430 -0
  105. package/dist/utils/directoryUtils.d.ts +22 -0
  106. package/dist/utils/directoryUtils.js +59 -0
  107. package/dist/utils/getClientFromConfig.d.ts +17 -8
  108. package/dist/utils/getClientFromConfig.js +162 -17
  109. package/dist/utils/helperFunctions.d.ts +16 -2
  110. package/dist/utils/helperFunctions.js +19 -5
  111. package/dist/utils/loadConfigs.d.ts +34 -9
  112. package/dist/utils/loadConfigs.js +236 -316
  113. package/dist/utils/pathResolvers.d.ts +53 -0
  114. package/dist/utils/pathResolvers.js +72 -0
  115. package/dist/utils/projectConfig.d.ts +119 -0
  116. package/dist/utils/projectConfig.js +171 -0
  117. package/dist/utils/retryFailedPromises.js +4 -2
  118. package/dist/utils/sessionAuth.d.ts +48 -0
  119. package/dist/utils/sessionAuth.js +164 -0
  120. package/dist/utils/sessionPreservationExample.d.ts +1666 -0
  121. package/dist/utils/sessionPreservationExample.js +101 -0
  122. package/dist/utils/setupFiles.js +301 -41
  123. package/dist/utils/typeGuards.d.ts +35 -0
  124. package/dist/utils/typeGuards.js +57 -0
  125. package/dist/utils/versionDetection.js +145 -9
  126. package/dist/utils/yamlConverter.d.ts +53 -3
  127. package/dist/utils/yamlConverter.js +232 -13
  128. package/dist/utils/yamlLoader.d.ts +70 -0
  129. package/dist/utils/yamlLoader.js +263 -0
  130. package/dist/utilsController.d.ts +36 -3
  131. package/dist/utilsController.js +186 -56
  132. package/package.json +12 -2
  133. package/src/adapters/AdapterFactory.ts +263 -35
  134. package/src/adapters/TablesDBAdapter.ts +225 -36
  135. package/src/backups/operations/bucketBackup.ts +277 -0
  136. package/src/backups/operations/collectionBackup.ts +310 -0
  137. package/src/backups/operations/comprehensiveBackup.ts +342 -0
  138. package/src/backups/schemas/bucketManifest.ts +78 -0
  139. package/src/backups/schemas/comprehensiveManifest.ts +76 -0
  140. package/src/backups/tracking/centralizedTracking.ts +352 -0
  141. package/src/cli/commands/configCommands.ts +194 -0
  142. package/src/cli/commands/databaseCommands.ts +635 -0
  143. package/src/cli/commands/functionCommands.ts +379 -0
  144. package/src/cli/commands/schemaCommands.ts +163 -0
  145. package/src/cli/commands/transferCommands.ts +457 -0
  146. package/src/collections/attributes.ts +900 -621
  147. package/src/collections/attributes.ts.backup +1555 -0
  148. package/src/collections/indexes.ts +116 -114
  149. package/src/collections/methods.ts +295 -968
  150. package/src/collections/transferOperations.ts +516 -0
  151. package/src/collections/wipeOperations.ts +501 -0
  152. package/src/config/README.md +274 -0
  153. package/src/config/configMigration.ts +575 -0
  154. package/src/config/configValidation.ts +445 -0
  155. package/src/config/yamlConfig.ts +168 -55
  156. package/src/databases/methods.ts +3 -2
  157. package/src/databases/setup.ts +11 -138
  158. package/src/examples/yamlTerminologyExample.ts +341 -0
  159. package/src/functions/deployments.ts +14 -12
  160. package/src/functions/methods.ts +11 -11
  161. package/src/functions/templates/hono-typescript/README.md +286 -0
  162. package/src/functions/templates/hono-typescript/package.json +26 -0
  163. package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
  164. package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
  165. package/src/functions/templates/hono-typescript/src/app.ts +180 -0
  166. package/src/functions/templates/hono-typescript/src/context.ts +103 -0
  167. package/src/functions/templates/hono-typescript/src/index.ts +54 -0
  168. package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
  169. package/src/functions/templates/hono-typescript/tsconfig.json +20 -0
  170. package/src/functions/templates/typescript-node/package.json +2 -1
  171. package/src/functions/templates/typescript-node/src/context.ts +103 -0
  172. package/src/functions/templates/typescript-node/src/index.ts +18 -12
  173. package/src/functions/templates/uv/pyproject.toml +1 -0
  174. package/src/functions/templates/uv/src/context.py +125 -0
  175. package/src/functions/templates/uv/src/index.py +35 -5
  176. package/src/init.ts +9 -11
  177. package/src/interactiveCLI.ts +278 -1596
  178. package/src/main.ts +418 -24
  179. package/src/migrations/afterImportActions.ts +71 -44
  180. package/src/migrations/appwriteToX.ts +100 -34
  181. package/src/migrations/dataLoader.ts +48 -34
  182. package/src/migrations/importController.ts +44 -39
  183. package/src/migrations/relationships.ts +28 -18
  184. package/src/migrations/services/ImportOrchestrator.ts +24 -27
  185. package/src/migrations/transfer.ts +159 -121
  186. package/src/migrations/yaml/YamlImportConfigLoader.ts +11 -4
  187. package/src/migrations/yaml/YamlImportIntegration.ts +47 -20
  188. package/src/migrations/yaml/generateImportSchemas.ts +751 -12
  189. package/src/setupController.ts +3 -2
  190. package/src/shared/backupMetadataSchema.ts +93 -0
  191. package/src/shared/backupTracking.ts +211 -0
  192. package/src/shared/confirmationDialogs.ts +19 -19
  193. package/src/shared/errorUtils.ts +110 -0
  194. package/src/shared/functionManager.ts +21 -20
  195. package/src/shared/indexManager.ts +12 -11
  196. package/src/shared/jsonSchemaGenerator.ts +38 -52
  197. package/src/shared/logging.ts +75 -0
  198. package/src/shared/messageFormatter.ts +14 -1
  199. package/src/shared/migrationHelpers.ts +45 -38
  200. package/src/shared/operationLogger.ts +11 -36
  201. package/src/shared/operationQueue.ts +322 -93
  202. package/src/shared/operationsTable.ts +338 -0
  203. package/src/shared/operationsTableSchema.ts +60 -0
  204. package/src/shared/relationshipExtractor.ts +214 -0
  205. package/src/shared/schemaGenerator.ts +179 -219
  206. package/src/storage/backupCompression.ts +88 -0
  207. package/src/storage/methods.ts +131 -34
  208. package/src/users/methods.ts +11 -9
  209. package/src/utils/configDiscovery.ts +502 -0
  210. package/src/utils/directoryUtils.ts +61 -0
  211. package/src/utils/getClientFromConfig.ts +205 -22
  212. package/src/utils/helperFunctions.ts +23 -5
  213. package/src/utils/loadConfigs.ts +313 -345
  214. package/src/utils/pathResolvers.ts +81 -0
  215. package/src/utils/projectConfig.ts +299 -0
  216. package/src/utils/retryFailedPromises.ts +4 -2
  217. package/src/utils/sessionAuth.ts +230 -0
  218. package/src/utils/setupFiles.ts +322 -54
  219. package/src/utils/typeGuards.ts +65 -0
  220. package/src/utils/versionDetection.ts +218 -64
  221. package/src/utils/yamlConverter.ts +296 -13
  222. package/src/utils/yamlLoader.ts +364 -0
  223. package/src/utilsController.ts +314 -110
  224. package/tests/README.md +497 -0
  225. package/tests/adapters/AdapterFactory.test.ts +277 -0
  226. package/tests/integration/syncOperations.test.ts +463 -0
  227. package/tests/jest.config.js +25 -0
  228. package/tests/migration/configMigration.test.ts +546 -0
  229. package/tests/setup.ts +62 -0
  230. package/tests/testUtils.ts +340 -0
  231. package/tests/utils/loadConfigs.test.ts +350 -0
  232. package/tests/validation/configValidation.test.ts +412 -0
  233. package/src/utils/schemaStrings.ts +0 -517
@@ -17,6 +17,9 @@ import { retryFailedPromises } from "../utils/retryFailedPromises.js";
17
17
  import { InputFile } from "node-appwrite/file";
18
18
  import { MessageFormatter, Messages } from "../shared/messageFormatter.js";
19
19
  import { ProgressManager } from "../shared/progressManager.js";
20
+ import { recordBackup } from "../shared/backupTracking.js";
21
+ import { AdapterFactory } from "../adapters/AdapterFactory.js";
22
+ import { createBackupZip } from "./backupCompression.js";
20
23
 
21
24
  export const getStorage = (config: AppwriteConfig) => {
22
25
  const client = getClientFromConfig(config);
@@ -274,30 +277,70 @@ export const initOrGetDocumentStorage = async (
274
277
  }
275
278
  };
276
279
 
277
- export const initOrGetBackupStorage = async (
278
- config: AppwriteConfig,
280
+ /**
281
+ * Initializes or gets the centralized backup bucket
282
+ * All backups are stored in a single "appwrite-backups" bucket
283
+ */
284
+ export const initBackupBucket = async (
279
285
  storage: Storage
280
- ) => {
286
+ ): Promise<Models.Bucket | undefined> => {
287
+ const BACKUP_BUCKET_ID = "appwrite-backups";
288
+ const BACKUP_BUCKET_NAME = "Backups";
289
+
281
290
  try {
282
- return await tryAwaitWithRetry(
283
- async () => await storage.getBucket("backup")
284
- );
285
- } catch (e) {
286
- return await initOrGetDocumentStorage(
287
- storage,
288
- config,
289
- "backups",
290
- "Database Backups"
291
- );
291
+ // Try to get existing bucket
292
+ const bucket = await storage.getBucket(BACKUP_BUCKET_ID);
293
+ return bucket;
294
+ } catch (error) {
295
+ // Bucket doesn't exist, create it
296
+ try {
297
+ const bucket = await storage.createBucket(
298
+ BACKUP_BUCKET_ID,
299
+ BACKUP_BUCKET_NAME,
300
+ [
301
+ Permission.read(Role.any()),
302
+ Permission.create(Role.users()),
303
+ Permission.update(Role.users()),
304
+ Permission.delete(Role.users())
305
+ ],
306
+ false, // fileSecurity
307
+ true, // enabled
308
+ undefined, // maximumFileSize
309
+ undefined, // allowedFileExtensions
310
+ Compression.Gzip, // compression
311
+ false, // encryption
312
+ false // antivirus
313
+ );
314
+
315
+ MessageFormatter.success(`Created backup bucket: ${BACKUP_BUCKET_ID}`);
316
+ return bucket;
317
+ } catch (createError) {
318
+ MessageFormatter.error("Failed to create backup bucket",
319
+ createError instanceof Error ? createError : new Error(String(createError))
320
+ );
321
+ return undefined;
322
+ }
292
323
  }
293
324
  };
294
325
 
326
+ export interface DatabaseBackupResult {
327
+ backupFileId: string;
328
+ backupFileName: string;
329
+ backupSizeBytes: number;
330
+ databaseId: string;
331
+ databaseName: string;
332
+ collectionCount: number;
333
+ documentCount: number;
334
+ format: 'json' | 'zip';
335
+ }
336
+
295
337
  export const backupDatabase = async (
296
338
  config: AppwriteConfig,
297
339
  database: Databases,
298
340
  databaseId: string,
299
- storage: Storage
300
- ): Promise<void> => {
341
+ storage: Storage,
342
+ format: 'json' | 'zip' = 'json'
343
+ ): Promise<DatabaseBackupResult> => {
301
344
  const startTime = Date.now();
302
345
 
303
346
  MessageFormatter.banner("Database Backup", `Backing up database: ${databaseId}`);
@@ -317,7 +360,7 @@ export const backupDatabase = async (
317
360
  total: 100,
318
361
  error: "",
319
362
  status: "in_progress",
320
- }, undefined, config.useMigrations);
363
+ });
321
364
 
322
365
  let progress: ProgressManager | null = null;
323
366
  let totalDocuments = 0;
@@ -449,8 +492,7 @@ export const backupDatabase = async (
449
492
  error: "",
450
493
  status: "in_progress",
451
494
  },
452
- backupOperation.$id,
453
- config.useMigrations
495
+ backupOperation.$id
454
496
  );
455
497
  }
456
498
 
@@ -484,21 +526,65 @@ export const backupDatabase = async (
484
526
  }
485
527
 
486
528
  MessageFormatter.step(3, 3, "Creating backup file");
487
-
488
- const bucket = await initOrGetDocumentStorage(storage, config, databaseId);
489
- const backupData = JSON.stringify(data);
490
- const backupSize = Buffer.byteLength(backupData, 'utf8');
491
- const fileName = `${new Date().toISOString()}-${databaseId}.json`;
492
-
493
- const inputFile = InputFile.fromPlainText(backupData, fileName);
529
+
530
+ const bucket = await initBackupBucket(storage);
531
+ if (!bucket) {
532
+ throw new Error("Failed to initialize backup bucket");
533
+ }
534
+
535
+ let inputFile: any;
536
+ let fileName: string;
537
+ let backupSize: number;
538
+
539
+ if (format === 'zip') {
540
+ // Create compressed backup
541
+ const zipBuffer = await createBackupZip(data);
542
+ fileName = `${new Date().toISOString()}-${databaseId}.zip`;
543
+ backupSize = zipBuffer.length;
544
+ inputFile = InputFile.fromBuffer(new Uint8Array(zipBuffer), fileName);
545
+ } else {
546
+ // Use JSON format (existing logic)
547
+ const backupData = JSON.stringify(data, null, 2);
548
+ fileName = `${new Date().toISOString()}-${databaseId}.json`;
549
+ backupSize = Buffer.byteLength(backupData, 'utf8');
550
+ inputFile = InputFile.fromPlainText(backupData, fileName);
551
+ }
552
+
494
553
  const fileCreated = await storage.createFile(
495
- bucket!.$id,
554
+ bucket.$id,
496
555
  ulid(),
497
556
  inputFile
498
557
  );
499
558
 
500
559
  progress?.stop();
501
560
 
561
+ // Record backup metadata
562
+ try {
563
+ const { adapter } = await AdapterFactory.create({
564
+ appwriteEndpoint: config.appwriteEndpoint,
565
+ appwriteProject: config.appwriteProject,
566
+ appwriteKey: config.appwriteKey,
567
+ sessionCookie: config.sessionCookie
568
+ });
569
+
570
+ await recordBackup(adapter, databaseId, {
571
+ backupId: fileCreated.$id,
572
+ backupType: 'database',
573
+ databaseId: databaseId,
574
+ sizeBytes: backupSize,
575
+ collections: data.collections.length,
576
+ documents: processedDocuments,
577
+ format: format,
578
+ status: 'completed',
579
+ restorationStatus: 'not_restored'
580
+ });
581
+ } catch (metadataError) {
582
+ // Don't fail backup if metadata recording fails
583
+ MessageFormatter.warning(
584
+ `Failed to record backup metadata: ${metadataError instanceof Error ? metadataError.message : String(metadataError)}`
585
+ );
586
+ }
587
+
502
588
  if (backupOperation) {
503
589
  await logOperation(
504
590
  database,
@@ -512,13 +598,12 @@ export const backupDatabase = async (
512
598
  error: "",
513
599
  status: "completed",
514
600
  },
515
- backupOperation.$id,
516
- config.useMigrations
601
+ backupOperation.$id
517
602
  );
518
603
  }
519
604
 
520
605
  const duration = Date.now() - startTime;
521
-
606
+
522
607
  MessageFormatter.operationSummary("Backup", {
523
608
  database: databaseId,
524
609
  collections: data.collections.length,
@@ -529,11 +614,24 @@ export const backupDatabase = async (
529
614
  }, duration);
530
615
 
531
616
  MessageFormatter.success(Messages.BACKUP_COMPLETED(databaseId, backupSize));
617
+
618
+ // Return backup result for tracking
619
+ const dbData = JSON.parse(data.database);
620
+ return {
621
+ backupFileId: fileCreated.$id,
622
+ backupFileName: fileName,
623
+ backupSizeBytes: backupSize,
624
+ databaseId: databaseId,
625
+ databaseName: dbData.name || databaseId,
626
+ collectionCount: data.collections.length,
627
+ documentCount: processedDocuments,
628
+ format: format
629
+ };
532
630
  } catch (error) {
533
631
  progress?.fail(error instanceof Error ? error.message : String(error));
534
-
632
+
535
633
  MessageFormatter.error("Backup failed", error instanceof Error ? error : new Error(String(error)));
536
-
634
+
537
635
  if (backupOperation) {
538
636
  await logOperation(
539
637
  database,
@@ -547,11 +645,10 @@ export const backupDatabase = async (
547
645
  error: String(error),
548
646
  status: "error",
549
647
  },
550
- backupOperation.$id,
551
- config.useMigrations
648
+ backupOperation.$id
552
649
  );
553
650
  }
554
-
651
+
555
652
  throw error;
556
653
  }
557
654
  };
@@ -20,6 +20,7 @@ import {
20
20
  } from "../utils/helperFunctions.js";
21
21
  import { isUndefined } from "es-toolkit/compat";
22
22
  import { isEmpty } from "es-toolkit/compat";
23
+ import { MessageFormatter } from "../shared/messageFormatter.js";
23
24
 
24
25
  export class UsersController {
25
26
  private config: AppwriteConfig;
@@ -43,7 +44,7 @@ export class UsersController {
43
44
 
44
45
  async wipeUsers() {
45
46
  const allUsers = await this.getAllUsers();
46
- console.log("Deleting all users...");
47
+ MessageFormatter.progress("Deleting all users...", { prefix: "Users" });
47
48
 
48
49
  const createBatches = (finalData: any[], batchSize: number) => {
49
50
  const finalBatches: any[][] = [];
@@ -58,7 +59,7 @@ export class UsersController {
58
59
  const batchedUserPromises = createBatches(allUsers, 25); // Batch size of 25
59
60
 
60
61
  for (const batch of batchedUserPromises) {
61
- console.log(`Deleting ${batch.length} users...`);
62
+ MessageFormatter.progress(`Deleting ${batch.length} users...`, { prefix: "Users" });
62
63
  await Promise.all(
63
64
  batch.map((user) =>
64
65
  tryAwaitWithRetry(async () => await this.users.delete(user.$id))
@@ -66,11 +67,11 @@ export class UsersController {
66
67
  );
67
68
  usersDeleted += batch.length;
68
69
  if (usersDeleted % 100 === 0) {
69
- console.log(`Deleted ${usersDeleted} users...`);
70
+ MessageFormatter.progress(`Deleted ${usersDeleted} users...`, { prefix: "Users" });
70
71
  }
71
72
  }
72
73
  } else {
73
- console.log("No users to delete");
74
+ MessageFormatter.info("No users to delete", { prefix: "Users" });
74
75
  }
75
76
  }
76
77
 
@@ -194,7 +195,7 @@ export class UsersController {
194
195
  item.email
195
196
  );
196
197
  } else {
197
- console.log("Email update skipped: Email already exists.");
198
+ MessageFormatter.warning("Email update skipped: Email already exists.", { prefix: "Users" });
198
199
  }
199
200
  }
200
201
  if (item.password) {
@@ -228,8 +229,9 @@ export class UsersController {
228
229
  }
229
230
  }
230
231
  if (item.$createdAt && item.$updatedAt) {
231
- console.log(
232
- "$createdAt and $updatedAt are not yet supported, sorry about that!"
232
+ MessageFormatter.warning(
233
+ "$createdAt and $updatedAt are not yet supported, sorry about that!",
234
+ { prefix: "Users" }
233
235
  );
234
236
  }
235
237
  if (item.labels && item.labels.length) {
@@ -305,10 +307,10 @@ export class UsersController {
305
307
  let fromUsers = await localUsers.list([Query.limit(50)]);
306
308
 
307
309
  if (fromUsers.users.length === 0) {
308
- console.log(`No users found`);
310
+ MessageFormatter.info("No users found", { prefix: "Users" });
309
311
  return;
310
312
  } else if (fromUsers.users.length < 50) {
311
- console.log(`Transferring ${fromUsers.users.length} users to remote`);
313
+ MessageFormatter.progress(`Transferring ${fromUsers.users.length} users to remote`, { prefix: "Users" });
312
314
  const batchedPromises = fromUsers.users.map((user) => {
313
315
  return tryAwaitWithRetry(async () => {
314
316
  const toCreateObject: Partial<typeof user> = {