appwrite-utils-cli 1.11.0 → 1.12.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 (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -0,0 +1,12 @@
1
+ import { type Index } from "appwrite-utils";
2
+ import { Databases, type Models } from "node-appwrite";
3
+ /**
4
+ * Enhanced index creation with proper status monitoring and retry logic
5
+ */
6
+ export declare const createOrUpdateIndexWithStatusCheck: (dbId: string, db: Databases, collectionId: string, collection: Models.Collection, index: Index, retryCount?: number, maxRetries?: number) => Promise<boolean>;
7
+ /**
8
+ * Enhanced index creation with status monitoring for all indexes
9
+ */
10
+ export declare const createOrUpdateIndexesWithStatusCheck: (dbId: string, db: Databases, collectionId: string, collection: Models.Collection, indexes: Index[]) => Promise<boolean>;
11
+ export declare const createOrUpdateIndex: (dbId: string, db: Databases, collectionId: string, index: Index) => Promise<Models.Index | null>;
12
+ export declare const createOrUpdateIndexes: (dbId: string, db: Databases, collectionId: string, indexes: Index[]) => Promise<void>;
@@ -0,0 +1,215 @@
1
+ import { indexSchema } from "appwrite-utils";
2
+ import { Databases, IndexType, Query } from "node-appwrite";
3
+ import { delay, tryAwaitWithRetry, calculateExponentialBackoff, isLegacyDatabases, MessageFormatter } from "appwrite-utils-helpers";
4
+ // System attributes that are always available for indexing in Appwrite
5
+ const SYSTEM_ATTRIBUTES = ['$id', '$createdAt', '$updatedAt', '$permissions'];
6
+ /**
7
+ * Wait for index to become available, with retry logic for stuck indexes and exponential backoff
8
+ */
9
+ const waitForIndexAvailable = async (db, dbId, collectionId, indexKey, maxWaitTime = 60000, // 1 minute
10
+ retryCount = 0, maxRetries = 5) => {
11
+ const startTime = Date.now();
12
+ let checkInterval = 2000; // Start with 2 seconds
13
+ // Calculate exponential backoff: 2s, 4s, 8s, 16s, 30s (capped at 30s)
14
+ if (retryCount > 0) {
15
+ const exponentialDelay = calculateExponentialBackoff(retryCount);
16
+ await delay(exponentialDelay);
17
+ }
18
+ while (Date.now() - startTime < maxWaitTime) {
19
+ try {
20
+ const indexList = await (isLegacyDatabases(db)
21
+ ? db.listIndexes(dbId, collectionId)
22
+ : db.listIndexes({ databaseId: dbId, tableId: collectionId }));
23
+ const indexes = isLegacyDatabases(db)
24
+ ? indexList.indexes
25
+ : (indexList.data || indexList.indexes || []);
26
+ const index = indexes.find((idx) => idx.key === indexKey);
27
+ if (!index) {
28
+ MessageFormatter.error(`Index '${indexKey}' not found in database '${dbId}' collection '${collectionId}'`);
29
+ return false;
30
+ }
31
+ switch (index.status) {
32
+ case 'available':
33
+ return true;
34
+ case 'failed':
35
+ MessageFormatter.error(`Index '${indexKey}' failed: ${index.error} (type: ${index.type}, attributes: [${index.attributes.join(', ')}])`);
36
+ return false;
37
+ case 'stuck':
38
+ MessageFormatter.warning(`Index '${indexKey}' is stuck, will retry... (type: ${index.type}, attributes: [${index.attributes.join(', ')}])`);
39
+ return false;
40
+ case 'processing':
41
+ // Continue waiting
42
+ break;
43
+ case 'deleting':
44
+ MessageFormatter.warning(`Index '${indexKey}' is being deleted`);
45
+ break;
46
+ default:
47
+ MessageFormatter.warning(`Unknown status '${index.status}' for index '${indexKey}'`);
48
+ break;
49
+ }
50
+ await delay(checkInterval);
51
+ }
52
+ catch (error) {
53
+ MessageFormatter.error(`Error checking index '${indexKey}' status in database '${dbId}' collection '${collectionId}': ${error}`);
54
+ return false;
55
+ }
56
+ }
57
+ // Timeout reached
58
+ MessageFormatter.warning(`Timeout waiting for index '${indexKey}' (${maxWaitTime}ms)`);
59
+ // If we have retries left and this isn't the last retry, try recreating
60
+ if (retryCount < maxRetries) {
61
+ MessageFormatter.info(`Retrying index '${indexKey}' creation (attempt ${retryCount + 1}/${maxRetries})`);
62
+ return false; // Signal that we need to retry
63
+ }
64
+ return false;
65
+ };
66
+ /**
67
+ * Enhanced index creation with proper status monitoring and retry logic
68
+ */
69
+ export const createOrUpdateIndexWithStatusCheck = async (dbId, db, collectionId, collection, index, retryCount = 0, maxRetries = 3) => {
70
+ MessageFormatter.info(`Creating/updating index '${index.key}' (attempt ${retryCount + 1}/${maxRetries + 1}) - type: ${index.type}, attributes: [${index.attributes.join(', ')}]`);
71
+ try {
72
+ // First, validate that all required attributes exist
73
+ const freshCollection = await db.getCollection(dbId, collectionId);
74
+ const existingAttributeKeys = freshCollection.attributes.map((attr) => attr.key);
75
+ // Include system attributes that are always available
76
+ const allAvailableAttributes = [...existingAttributeKeys, ...SYSTEM_ATTRIBUTES];
77
+ const missingAttributes = index.attributes.filter(attr => !allAvailableAttributes.includes(attr));
78
+ if (missingAttributes.length > 0) {
79
+ MessageFormatter.error(`Index '${index.key}' cannot be created: missing attributes [${missingAttributes.join(', ')}] (type: ${index.type})`);
80
+ MessageFormatter.error(`Available attributes: [${existingAttributeKeys.join(', ')}, ${SYSTEM_ATTRIBUTES.join(', ')}]`);
81
+ return false; // Don't retry if attributes are missing
82
+ }
83
+ // Try to create/update the index using existing logic
84
+ await createOrUpdateIndex(dbId, db, collectionId, index);
85
+ // Now wait for the index to become available
86
+ const success = await waitForIndexAvailable(db, dbId, collectionId, index.key, 60000, // 1 minute timeout
87
+ retryCount, maxRetries);
88
+ if (success) {
89
+ return true;
90
+ }
91
+ // If not successful and we have retries left, just retry the index creation
92
+ if (retryCount < maxRetries) {
93
+ MessageFormatter.warning(`Index '${index.key}' failed/stuck, retrying (${retryCount + 1}/${maxRetries}) - type: ${index.type}, attributes: [${index.attributes.join(', ')}]`);
94
+ // Wait a bit before retry
95
+ await new Promise(resolve => setTimeout(resolve, 2000 * (retryCount + 1)));
96
+ // Retry the index creation
97
+ return await createOrUpdateIndexWithStatusCheck(dbId, db, collectionId, collection, index, retryCount + 1, maxRetries);
98
+ }
99
+ MessageFormatter.error(`Failed to create index '${index.key}' after ${maxRetries + 1} attempts (type: ${index.type}, attributes: [${index.attributes.join(', ')}])`);
100
+ return false;
101
+ }
102
+ catch (error) {
103
+ const errorMessage = error instanceof Error ? error.message : String(error);
104
+ MessageFormatter.error(`Error creating index '${index.key}': ${errorMessage} (type: ${index.type}, attributes: [${index.attributes.join(', ')}])`);
105
+ // Check if this is a permanent error that shouldn't be retried
106
+ if (errorMessage.toLowerCase().includes('not found') ||
107
+ errorMessage.toLowerCase().includes('missing') ||
108
+ errorMessage.toLowerCase().includes('does not exist') ||
109
+ errorMessage.toLowerCase().includes('attribute') && errorMessage.toLowerCase().includes('not found')) {
110
+ MessageFormatter.error(`Index '${index.key}' has permanent error - not retrying (type: ${index.type})`);
111
+ return false;
112
+ }
113
+ if (retryCount < maxRetries) {
114
+ MessageFormatter.warning(`Retrying index '${index.key}' due to error... (type: ${index.type}, attributes: [${index.attributes.join(', ')}])`);
115
+ // Wait a bit before retry
116
+ await delay(2000);
117
+ return await createOrUpdateIndexWithStatusCheck(dbId, db, collectionId, collection, index, retryCount + 1, maxRetries);
118
+ }
119
+ return false;
120
+ }
121
+ };
122
+ /**
123
+ * Enhanced index creation with status monitoring for all indexes
124
+ */
125
+ export const createOrUpdateIndexesWithStatusCheck = async (dbId, db, collectionId, collection, indexes) => {
126
+ MessageFormatter.info(`Creating/updating ${indexes.length} indexes with status monitoring for collection '${collectionId}'`);
127
+ let indexesToProcess = [...indexes];
128
+ let overallRetryCount = 0;
129
+ const maxOverallRetries = 3;
130
+ while (indexesToProcess.length > 0 && overallRetryCount < maxOverallRetries) {
131
+ const remainingIndexes = [...indexesToProcess];
132
+ indexesToProcess = []; // Reset for next iteration
133
+ for (const index of remainingIndexes) {
134
+ const success = await createOrUpdateIndexWithStatusCheck(dbId, db, collectionId, collection, index);
135
+ if (success) {
136
+ MessageFormatter.info(`✅ ${index.key} (${index.type})`);
137
+ // Add delay between successful indexes
138
+ await delay(1000);
139
+ }
140
+ else {
141
+ MessageFormatter.info(`❌ ${index.key} (${index.type})`);
142
+ indexesToProcess.push(index); // Add back to retry list
143
+ }
144
+ }
145
+ if (indexesToProcess.length === 0) {
146
+ return true;
147
+ }
148
+ overallRetryCount++;
149
+ if (overallRetryCount < maxOverallRetries) {
150
+ MessageFormatter.warning(`⏳ Retrying ${indexesToProcess.length} failed indexes...`);
151
+ await delay(5000);
152
+ }
153
+ }
154
+ // If we get here, some indexes still failed after all retries
155
+ if (indexesToProcess.length > 0) {
156
+ const failedIndexKeys = indexesToProcess.map(i => `${i.key} (${i.type})`).join(', ');
157
+ MessageFormatter.error(`\nFailed to create ${indexesToProcess.length} indexes after ${maxOverallRetries} attempts: ${failedIndexKeys}`);
158
+ MessageFormatter.error(`This may indicate a fundamental issue with the index definitions or Appwrite instance`);
159
+ return false;
160
+ }
161
+ MessageFormatter.success(`\nSuccessfully created all ${indexes.length} indexes for collection '${collectionId}'`);
162
+ return true;
163
+ };
164
+ export const createOrUpdateIndex = async (dbId, db, collectionId, index) => {
165
+ const existingIndex = await db.listIndexes(dbId, collectionId, [
166
+ Query.equal("key", index.key),
167
+ ]);
168
+ let createIndex = false;
169
+ let newIndex = null;
170
+ if (existingIndex.total === 0) {
171
+ // No existing index, create it
172
+ createIndex = true;
173
+ }
174
+ else {
175
+ const existing = existingIndex.indexes[0];
176
+ // Check key and type
177
+ const keyMatches = existing.key === index.key;
178
+ const typeMatches = existing.type === index.type;
179
+ // Compare attributes as SETS (order doesn't matter, only content)
180
+ const existingAttrsSet = new Set(existing.attributes);
181
+ const newAttrsSet = new Set(index.attributes);
182
+ const attributesMatch = existingAttrsSet.size === newAttrsSet.size &&
183
+ [...existingAttrsSet].every(attr => newAttrsSet.has(attr));
184
+ // Compare orders as SETS if both exist (order doesn't matter)
185
+ let ordersMatch = true;
186
+ if (index.orders && existing.orders) {
187
+ const existingOrdersSet = new Set(existing.orders);
188
+ const newOrdersSet = new Set(index.orders);
189
+ ordersMatch =
190
+ existingOrdersSet.size === newOrdersSet.size &&
191
+ [...existingOrdersSet].every(ord => newOrdersSet.has(ord));
192
+ }
193
+ // Only recreate if something genuinely changed
194
+ if (!keyMatches || !typeMatches || !attributesMatch || !ordersMatch) {
195
+ await db.deleteIndex(dbId, collectionId, existing.key);
196
+ createIndex = true;
197
+ }
198
+ }
199
+ if (createIndex) {
200
+ // Ensure orders array exists and matches attributes length
201
+ // Default to "asc" for each attribute if not specified
202
+ const orders = index.orders && index.orders.length === index.attributes.length
203
+ ? index.orders
204
+ : index.attributes.map(() => "asc");
205
+ newIndex = await db.createIndex(dbId, collectionId, index.key, index.type, index.attributes, orders);
206
+ }
207
+ return newIndex;
208
+ };
209
+ export const createOrUpdateIndexes = async (dbId, db, collectionId, indexes) => {
210
+ for (const index of indexes) {
211
+ await tryAwaitWithRetry(async () => await createOrUpdateIndex(dbId, db, collectionId, index));
212
+ // Add delay after each index creation/update
213
+ await delay(500);
214
+ }
215
+ };
@@ -0,0 +1,19 @@
1
+ import { Databases, type Models } from "node-appwrite";
2
+ import type { AppwriteConfig, CollectionCreate } from "appwrite-utils";
3
+ import type { DatabaseAdapter } from "appwrite-utils-helpers";
4
+ export { wipeDatabase, wipeCollection, wipeAllTables, wipeTableRows, } from "./wipeOperations.js";
5
+ export { transferDocumentsBetweenDbsLocalToLocal, transferDocumentsBetweenDbsLocalToRemote, } from "./transferOperations.js";
6
+ export declare const documentExists: (db: Databases | DatabaseAdapter, dbId: string, targetCollectionId: string, toCreateObject: any) => Promise<Models.Document | null>;
7
+ export declare const checkForCollection: (db: Databases | DatabaseAdapter, dbId: string, collection: Partial<CollectionCreate>) => Promise<Models.Collection | null>;
8
+ export declare const fetchAndCacheCollectionByName: (db: Databases | DatabaseAdapter, dbId: string, collectionName: string) => Promise<Models.Collection | undefined>;
9
+ export declare const generateSchemas: (config: AppwriteConfig, appwriteFolderPath: string) => Promise<void>;
10
+ export declare const createOrUpdateCollections: (database: Databases, databaseId: string, config: AppwriteConfig, deletedCollections?: {
11
+ collectionId: string;
12
+ collectionName: string;
13
+ }[], selectedCollections?: Models.Collection[]) => Promise<void>;
14
+ export declare const createOrUpdateCollectionsViaAdapter: (adapter: DatabaseAdapter, databaseId: string, config: AppwriteConfig, deletedCollections?: {
15
+ collectionId: string;
16
+ collectionName: string;
17
+ }[], selectedCollections?: Models.Collection[]) => Promise<void>;
18
+ export declare const generateMockData: (database: Databases, databaseId: string, configCollections: any[]) => Promise<void>;
19
+ export declare const fetchAllCollections: (dbId: string, database: Databases) => Promise<Models.Collection[]>;