appwrite-utils-cli 0.10.85 → 1.0.1

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 (178) hide show
  1. package/.appwrite/.yaml_schemas/appwrite-config.schema.json +380 -0
  2. package/.appwrite/.yaml_schemas/collection.schema.json +255 -0
  3. package/.appwrite/collections/Categories.yaml +182 -0
  4. package/.appwrite/collections/ExampleCollection.yaml +36 -0
  5. package/.appwrite/collections/Posts.yaml +227 -0
  6. package/.appwrite/collections/Users.yaml +149 -0
  7. package/.appwrite/config.yaml +109 -0
  8. package/.appwrite/import/README.md +148 -0
  9. package/.appwrite/import/categories-import.yaml +129 -0
  10. package/.appwrite/import/posts-import.yaml +208 -0
  11. package/.appwrite/import/users-import.yaml +130 -0
  12. package/.appwrite/importData/categories.json +194 -0
  13. package/.appwrite/importData/posts.json +270 -0
  14. package/.appwrite/importData/users.json +220 -0
  15. package/.appwrite/schemas/categories.json +128 -0
  16. package/.appwrite/schemas/exampleCollection.json +52 -0
  17. package/.appwrite/schemas/posts.json +173 -0
  18. package/.appwrite/schemas/users.json +125 -0
  19. package/README.md +261 -33
  20. package/dist/collections/attributes.js +3 -2
  21. package/dist/collections/methods.js +56 -38
  22. package/dist/config/yamlConfig.d.ts +501 -0
  23. package/dist/config/yamlConfig.js +452 -0
  24. package/dist/databases/setup.d.ts +6 -0
  25. package/dist/databases/setup.js +119 -0
  26. package/dist/functions/methods.d.ts +1 -1
  27. package/dist/functions/methods.js +5 -2
  28. package/dist/functions/openapi.d.ts +4 -0
  29. package/dist/functions/openapi.js +60 -0
  30. package/dist/interactiveCLI.d.ts +5 -0
  31. package/dist/interactiveCLI.js +196 -52
  32. package/dist/main.js +91 -30
  33. package/dist/migrations/afterImportActions.js +2 -2
  34. package/dist/migrations/appwriteToX.d.ts +10 -0
  35. package/dist/migrations/appwriteToX.js +15 -4
  36. package/dist/migrations/backup.d.ts +16 -16
  37. package/dist/migrations/dataLoader.d.ts +83 -1
  38. package/dist/migrations/dataLoader.js +4 -4
  39. package/dist/migrations/importController.js +25 -18
  40. package/dist/migrations/importDataActions.js +2 -2
  41. package/dist/migrations/logging.d.ts +9 -1
  42. package/dist/migrations/logging.js +41 -22
  43. package/dist/migrations/migrationHelper.d.ts +4 -4
  44. package/dist/migrations/relationships.js +1 -1
  45. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  46. package/dist/migrations/services/DataTransformationService.js +158 -0
  47. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  48. package/dist/migrations/services/FileHandlerService.js +236 -0
  49. package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
  50. package/dist/migrations/services/ImportOrchestrator.js +488 -0
  51. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  52. package/dist/migrations/services/RateLimitManager.js +279 -0
  53. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  54. package/dist/migrations/services/RelationshipResolver.js +332 -0
  55. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  56. package/dist/migrations/services/UserMappingService.js +277 -0
  57. package/dist/migrations/services/ValidationService.d.ts +74 -0
  58. package/dist/migrations/services/ValidationService.js +260 -0
  59. package/dist/migrations/transfer.d.ts +0 -6
  60. package/dist/migrations/transfer.js +16 -132
  61. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +384 -0
  62. package/dist/migrations/yaml/YamlImportConfigLoader.js +375 -0
  63. package/dist/migrations/yaml/YamlImportIntegration.d.ts +87 -0
  64. package/dist/migrations/yaml/YamlImportIntegration.js +330 -0
  65. package/dist/migrations/yaml/generateImportSchemas.d.ts +17 -0
  66. package/dist/migrations/yaml/generateImportSchemas.js +575 -0
  67. package/dist/schemas/authUser.d.ts +9 -9
  68. package/dist/shared/attributeManager.d.ts +17 -0
  69. package/dist/shared/attributeManager.js +273 -0
  70. package/dist/shared/confirmationDialogs.d.ts +75 -0
  71. package/dist/shared/confirmationDialogs.js +236 -0
  72. package/dist/shared/functionManager.d.ts +48 -0
  73. package/dist/shared/functionManager.js +322 -0
  74. package/dist/shared/indexManager.d.ts +24 -0
  75. package/dist/shared/indexManager.js +150 -0
  76. package/dist/shared/jsonSchemaGenerator.d.ts +51 -0
  77. package/dist/shared/jsonSchemaGenerator.js +313 -0
  78. package/dist/shared/logging.d.ts +10 -0
  79. package/dist/shared/logging.js +46 -0
  80. package/dist/shared/messageFormatter.d.ts +37 -0
  81. package/dist/shared/messageFormatter.js +152 -0
  82. package/dist/shared/migrationHelpers.d.ts +173 -0
  83. package/dist/shared/migrationHelpers.js +142 -0
  84. package/dist/shared/operationLogger.d.ts +3 -0
  85. package/dist/shared/operationLogger.js +25 -0
  86. package/dist/shared/operationQueue.d.ts +13 -0
  87. package/dist/shared/operationQueue.js +79 -0
  88. package/dist/shared/progressManager.d.ts +62 -0
  89. package/dist/shared/progressManager.js +215 -0
  90. package/dist/shared/schemaGenerator.d.ts +18 -0
  91. package/dist/shared/schemaGenerator.js +523 -0
  92. package/dist/storage/methods.d.ts +3 -1
  93. package/dist/storage/methods.js +144 -55
  94. package/dist/storage/schemas.d.ts +56 -16
  95. package/dist/types.d.ts +2 -2
  96. package/dist/types.js +1 -1
  97. package/dist/users/methods.d.ts +16 -0
  98. package/dist/users/methods.js +276 -0
  99. package/dist/utils/configMigration.d.ts +1 -0
  100. package/dist/utils/configMigration.js +156 -0
  101. package/dist/utils/dataConverters.d.ts +46 -0
  102. package/dist/utils/dataConverters.js +139 -0
  103. package/dist/utils/loadConfigs.d.ts +15 -4
  104. package/dist/utils/loadConfigs.js +377 -51
  105. package/dist/utils/schemaStrings.js +2 -1
  106. package/dist/utils/setupFiles.d.ts +2 -1
  107. package/dist/utils/setupFiles.js +723 -28
  108. package/dist/utils/validationRules.d.ts +43 -0
  109. package/dist/utils/validationRules.js +42 -0
  110. package/dist/utils/yamlConverter.d.ts +48 -0
  111. package/dist/utils/yamlConverter.js +98 -0
  112. package/dist/utilsController.js +65 -43
  113. package/package.json +19 -15
  114. package/src/collections/attributes.ts +3 -2
  115. package/src/collections/methods.ts +85 -51
  116. package/src/config/yamlConfig.ts +488 -0
  117. package/src/{migrations/setupDatabase.ts → databases/setup.ts} +11 -5
  118. package/src/functions/methods.ts +8 -4
  119. package/src/functions/templates/count-docs-in-collection/package.json +25 -0
  120. package/src/functions/templates/count-docs-in-collection/tsconfig.json +28 -0
  121. package/src/functions/templates/typescript-node/package.json +24 -0
  122. package/src/functions/templates/typescript-node/tsconfig.json +28 -0
  123. package/src/functions/templates/uv/README.md +31 -0
  124. package/src/functions/templates/uv/pyproject.toml +29 -0
  125. package/src/interactiveCLI.ts +230 -63
  126. package/src/main.ts +111 -37
  127. package/src/migrations/afterImportActions.ts +2 -2
  128. package/src/migrations/appwriteToX.ts +17 -4
  129. package/src/migrations/dataLoader.ts +4 -4
  130. package/src/migrations/importController.ts +30 -22
  131. package/src/migrations/importDataActions.ts +2 -2
  132. package/src/migrations/relationships.ts +1 -1
  133. package/src/migrations/services/DataTransformationService.ts +196 -0
  134. package/src/migrations/services/FileHandlerService.ts +311 -0
  135. package/src/migrations/services/ImportOrchestrator.ts +669 -0
  136. package/src/migrations/services/RateLimitManager.ts +363 -0
  137. package/src/migrations/services/RelationshipResolver.ts +461 -0
  138. package/src/migrations/services/UserMappingService.ts +345 -0
  139. package/src/migrations/services/ValidationService.ts +349 -0
  140. package/src/migrations/transfer.ts +22 -228
  141. package/src/migrations/yaml/YamlImportConfigLoader.ts +427 -0
  142. package/src/migrations/yaml/YamlImportIntegration.ts +419 -0
  143. package/src/migrations/yaml/generateImportSchemas.ts +589 -0
  144. package/src/shared/attributeManager.ts +429 -0
  145. package/src/shared/confirmationDialogs.ts +327 -0
  146. package/src/shared/functionManager.ts +515 -0
  147. package/src/shared/indexManager.ts +253 -0
  148. package/src/shared/jsonSchemaGenerator.ts +403 -0
  149. package/src/shared/logging.ts +74 -0
  150. package/src/shared/messageFormatter.ts +195 -0
  151. package/src/{migrations/migrationHelper.ts → shared/migrationHelpers.ts} +22 -4
  152. package/src/{migrations/helper.ts → shared/operationLogger.ts} +7 -2
  153. package/src/{migrations/queue.ts → shared/operationQueue.ts} +1 -1
  154. package/src/shared/progressManager.ts +278 -0
  155. package/src/{migrations/schemaStrings.ts → shared/schemaGenerator.ts} +71 -17
  156. package/src/storage/methods.ts +199 -78
  157. package/src/types.ts +2 -2
  158. package/src/{migrations/users.ts → users/methods.ts} +2 -2
  159. package/src/utils/configMigration.ts +212 -0
  160. package/src/utils/loadConfigs.ts +414 -52
  161. package/src/utils/schemaStrings.ts +2 -1
  162. package/src/utils/setupFiles.ts +742 -40
  163. package/src/{migrations → utils}/validationRules.ts +1 -1
  164. package/src/utils/yamlConverter.ts +131 -0
  165. package/src/utilsController.ts +75 -54
  166. package/src/functions/templates/poetry/README.md +0 -30
  167. package/src/functions/templates/poetry/pyproject.toml +0 -16
  168. package/src/migrations/attributes.ts +0 -561
  169. package/src/migrations/backup.ts +0 -205
  170. package/src/migrations/databases.ts +0 -39
  171. package/src/migrations/dbHelpers.ts +0 -92
  172. package/src/migrations/indexes.ts +0 -40
  173. package/src/migrations/logging.ts +0 -29
  174. package/src/migrations/storage.ts +0 -538
  175. /package/src/{migrations → functions}/openapi.ts +0 -0
  176. /package/src/functions/templates/{poetry → uv}/src/__init__.py +0 -0
  177. /package/src/functions/templates/{poetry → uv}/src/index.py +0 -0
  178. /package/src/{migrations/converters.ts → utils/dataConverters.ts} +0 -0
@@ -0,0 +1,279 @@
1
+ import pLimit from "p-limit";
2
+ import { logger } from "../../shared/logging.js";
3
+ /**
4
+ * Manages rate limiting across the import system.
5
+ * Provides configurable p-limit instances for different operation types.
6
+ * Builds on existing p-limit usage in attributeManager and other components.
7
+ */
8
+ export class RateLimitManager {
9
+ limits = new Map();
10
+ config;
11
+ // Default rate limits based on existing usage and best practices
12
+ static DEFAULT_LIMITS = {
13
+ dataInsertion: 5, // Conservative for database writes
14
+ dataUpdate: 8, // Slightly higher for updates
15
+ dataQuery: 25, // Higher for read operations (from existing queryLimit)
16
+ fileUpload: 2, // Very conservative for file uploads
17
+ fileDownload: 3, // Slightly higher for downloads
18
+ validation: 10, // Higher for validation operations
19
+ relationshipResolution: 8, // Moderate for relationship operations
20
+ userCreation: 3, // Conservative for user creation
21
+ userUpdate: 5, // Moderate for user updates
22
+ apiCalls: 15, // General API call limit
23
+ };
24
+ constructor(config) {
25
+ this.config = { ...RateLimitManager.DEFAULT_LIMITS, ...config };
26
+ this.initializeLimits();
27
+ }
28
+ /**
29
+ * Initializes p-limit instances for all operation types.
30
+ */
31
+ initializeLimits() {
32
+ for (const [operation, limit] of Object.entries(this.config)) {
33
+ this.limits.set(operation, pLimit(limit));
34
+ logger.debug(`Rate limit for ${operation}: ${limit} concurrent operations`);
35
+ }
36
+ }
37
+ /**
38
+ * Gets the rate limiter for data insertion operations.
39
+ */
40
+ get dataInsertion() {
41
+ return this.limits.get('dataInsertion');
42
+ }
43
+ /**
44
+ * Gets the rate limiter for data update operations.
45
+ */
46
+ get dataUpdate() {
47
+ return this.limits.get('dataUpdate');
48
+ }
49
+ /**
50
+ * Gets the rate limiter for data query operations.
51
+ */
52
+ get dataQuery() {
53
+ return this.limits.get('dataQuery');
54
+ }
55
+ /**
56
+ * Gets the rate limiter for file upload operations.
57
+ */
58
+ get fileUpload() {
59
+ return this.limits.get('fileUpload');
60
+ }
61
+ /**
62
+ * Gets the rate limiter for file download operations.
63
+ */
64
+ get fileDownload() {
65
+ return this.limits.get('fileDownload');
66
+ }
67
+ /**
68
+ * Gets the rate limiter for validation operations.
69
+ */
70
+ get validation() {
71
+ return this.limits.get('validation');
72
+ }
73
+ /**
74
+ * Gets the rate limiter for relationship resolution operations.
75
+ */
76
+ get relationshipResolution() {
77
+ return this.limits.get('relationshipResolution');
78
+ }
79
+ /**
80
+ * Gets the rate limiter for user creation operations.
81
+ */
82
+ get userCreation() {
83
+ return this.limits.get('userCreation');
84
+ }
85
+ /**
86
+ * Gets the rate limiter for user update operations.
87
+ */
88
+ get userUpdate() {
89
+ return this.limits.get('userUpdate');
90
+ }
91
+ /**
92
+ * Gets the rate limiter for general API calls.
93
+ */
94
+ get apiCalls() {
95
+ return this.limits.get('apiCalls');
96
+ }
97
+ /**
98
+ * Gets a rate limiter by operation type name.
99
+ *
100
+ * @param operationType - The type of operation
101
+ * @returns The p-limit instance for the operation type
102
+ */
103
+ getLimiter(operationType) {
104
+ const limiter = this.limits.get(operationType);
105
+ if (!limiter) {
106
+ logger.warn(`No rate limiter found for operation type: ${operationType}. Using default API calls limiter.`);
107
+ return this.limits.get('apiCalls');
108
+ }
109
+ return limiter;
110
+ }
111
+ /**
112
+ * Updates the rate limit for a specific operation type.
113
+ *
114
+ * @param operationType - The operation type to update
115
+ * @param newLimit - The new concurrent operation limit
116
+ */
117
+ updateLimit(operationType, newLimit) {
118
+ this.config[operationType] = newLimit;
119
+ this.limits.set(operationType, pLimit(newLimit));
120
+ logger.info(`Updated rate limit for ${operationType}: ${newLimit} concurrent operations`);
121
+ }
122
+ /**
123
+ * Updates multiple rate limits at once.
124
+ *
125
+ * @param newConfig - Partial configuration with new limits
126
+ */
127
+ updateLimits(newConfig) {
128
+ for (const [operation, limit] of Object.entries(newConfig)) {
129
+ if (limit !== undefined) {
130
+ this.updateLimit(operation, limit);
131
+ }
132
+ }
133
+ }
134
+ /**
135
+ * Gets the current configuration.
136
+ */
137
+ getConfig() {
138
+ return { ...this.config };
139
+ }
140
+ /**
141
+ * Gets statistics about pending and active operations.
142
+ * Useful for monitoring and debugging rate limiting.
143
+ */
144
+ getStatistics() {
145
+ const stats = {};
146
+ for (const [operationType, limiter] of this.limits.entries()) {
147
+ stats[operationType] = {
148
+ pending: limiter.pendingCount,
149
+ active: limiter.activeCount,
150
+ };
151
+ }
152
+ return stats;
153
+ }
154
+ /**
155
+ * Waits for all pending operations to complete.
156
+ * Useful for graceful shutdown or testing.
157
+ *
158
+ * @param timeout - Maximum time to wait in milliseconds (default: 30 seconds)
159
+ */
160
+ async waitForCompletion(timeout = 30000) {
161
+ const startTime = Date.now();
162
+ while (Date.now() - startTime < timeout) {
163
+ const stats = this.getStatistics();
164
+ const hasPendingOperations = Object.values(stats).some(stat => stat.pending > 0 || stat.active > 0);
165
+ if (!hasPendingOperations) {
166
+ logger.info("All rate-limited operations completed");
167
+ return;
168
+ }
169
+ // Log current status
170
+ const pendingOperations = Object.entries(stats)
171
+ .filter(([_, stat]) => stat.pending > 0 || stat.active > 0)
172
+ .map(([type, stat]) => `${type}: ${stat.pending} pending, ${stat.active} active`)
173
+ .join(", ");
174
+ logger.debug(`Waiting for operations to complete: ${pendingOperations}`);
175
+ // Wait a bit before checking again
176
+ await new Promise(resolve => setTimeout(resolve, 1000));
177
+ }
178
+ logger.warn(`Timeout waiting for rate-limited operations to complete after ${timeout}ms`);
179
+ }
180
+ /**
181
+ * Creates a rate limiter with automatic retry logic.
182
+ * Combines p-limit with retry functionality for robust operation handling.
183
+ *
184
+ * @param operationType - The operation type to get the limiter for
185
+ * @param maxRetries - Maximum number of retries (default: 3)
186
+ * @param retryDelay - Delay between retries in milliseconds (default: 1000)
187
+ */
188
+ createRetryLimiter(operationType, maxRetries = 3, retryDelay = 1000) {
189
+ const limiter = this.getLimiter(operationType);
190
+ return async (operation) => {
191
+ return limiter(async () => {
192
+ let lastError;
193
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
194
+ try {
195
+ return await operation();
196
+ }
197
+ catch (error) {
198
+ lastError = error;
199
+ if (attempt < maxRetries) {
200
+ logger.warn(`Operation failed (attempt ${attempt + 1}/${maxRetries + 1}): ${lastError.message}. Retrying in ${retryDelay}ms...`);
201
+ await new Promise(resolve => setTimeout(resolve, retryDelay));
202
+ }
203
+ }
204
+ }
205
+ // If we get here, all retries failed
206
+ logger.error(`Operation failed after ${maxRetries + 1} attempts: ${lastError?.message}`);
207
+ throw lastError;
208
+ });
209
+ };
210
+ }
211
+ /**
212
+ * Adjusts rate limits based on API response times and error rates.
213
+ * Implements adaptive rate limiting for optimal performance.
214
+ *
215
+ * @param operationType - The operation type to adjust
216
+ * @param responseTime - Average response time in milliseconds
217
+ * @param errorRate - Error rate as a percentage (0-100)
218
+ */
219
+ adaptiveAdjust(operationType, responseTime, errorRate) {
220
+ const currentLimit = this.config[operationType];
221
+ let newLimit = currentLimit;
222
+ // If error rate is high, reduce concurrency
223
+ if (errorRate > 10) {
224
+ newLimit = Math.max(1, Math.floor(currentLimit * 0.7));
225
+ logger.info(`Reducing ${operationType} limit due to high error rate (${errorRate}%): ${currentLimit} -> ${newLimit}`);
226
+ }
227
+ // If response time is high, reduce concurrency
228
+ else if (responseTime > 5000) {
229
+ newLimit = Math.max(1, Math.floor(currentLimit * 0.8));
230
+ logger.info(`Reducing ${operationType} limit due to high response time (${responseTime}ms): ${currentLimit} -> ${newLimit}`);
231
+ }
232
+ // If performance is good, gradually increase concurrency
233
+ else if (errorRate < 2 && responseTime < 1000 && currentLimit < RateLimitManager.DEFAULT_LIMITS[operationType] * 2) {
234
+ newLimit = Math.min(RateLimitManager.DEFAULT_LIMITS[operationType] * 2, currentLimit + 1);
235
+ logger.info(`Increasing ${operationType} limit due to good performance: ${currentLimit} -> ${newLimit}`);
236
+ }
237
+ if (newLimit !== currentLimit) {
238
+ this.updateLimit(operationType, newLimit);
239
+ }
240
+ }
241
+ /**
242
+ * Resets all rate limits to default values.
243
+ */
244
+ resetToDefaults() {
245
+ logger.info("Resetting all rate limits to default values");
246
+ this.config = { ...RateLimitManager.DEFAULT_LIMITS };
247
+ this.initializeLimits();
248
+ }
249
+ /**
250
+ * Creates a specialized batch processor with rate limiting.
251
+ * Useful for processing large datasets with controlled concurrency.
252
+ *
253
+ * @param operationType - The operation type for rate limiting
254
+ * @param batchSize - Number of items to process in each batch
255
+ */
256
+ createBatchProcessor(operationType, batchSize = 50) {
257
+ const limiter = this.getLimiter(operationType);
258
+ return async (items, processor, onProgress) => {
259
+ const results = [];
260
+ for (let i = 0; i < items.length; i += batchSize) {
261
+ const batch = items.slice(i, i + batchSize);
262
+ const batchPromises = batch.map(item => limiter(() => processor(item)));
263
+ const batchResults = await Promise.allSettled(batchPromises);
264
+ for (const result of batchResults) {
265
+ if (result.status === 'fulfilled') {
266
+ results.push(result.value);
267
+ }
268
+ else {
269
+ logger.error(`Batch item failed: ${result.reason}`);
270
+ }
271
+ }
272
+ if (onProgress) {
273
+ onProgress(Math.min(i + batchSize, items.length), items.length);
274
+ }
275
+ }
276
+ return results;
277
+ };
278
+ }
279
+ }
@@ -0,0 +1,120 @@
1
+ import type { AppwriteConfig, CollectionCreate } from "appwrite-utils";
2
+ import type { UserMappingService } from "./UserMappingService.js";
3
+ export interface CollectionImportData {
4
+ collection?: CollectionCreate;
5
+ data: Array<{
6
+ rawData: any;
7
+ finalData: any;
8
+ context: any;
9
+ importDef?: any;
10
+ }>;
11
+ }
12
+ /**
13
+ * Service responsible for resolving relationships and ID mappings during import.
14
+ * Preserves all existing relationship resolution logic from DataLoader.
15
+ * Extracted to provide focused, testable relationship management.
16
+ */
17
+ export declare class RelationshipResolver {
18
+ private config;
19
+ private userMappingService;
20
+ private oldIdToNewIdPerCollectionMap;
21
+ constructor(config: AppwriteConfig, userMappingService: UserMappingService);
22
+ /**
23
+ * Helper method to generate a consistent key for collections.
24
+ * Preserves existing logic from DataLoader.
25
+ */
26
+ getCollectionKey(name: string): string;
27
+ /**
28
+ * Stores ID mapping for a collection.
29
+ *
30
+ * @param collectionName - The collection name
31
+ * @param oldId - The old ID
32
+ * @param newId - The new ID
33
+ */
34
+ setIdMapping(collectionName: string, oldId: string, newId: string): void;
35
+ /**
36
+ * Gets the new ID for an old ID in a specific collection.
37
+ *
38
+ * @param collectionName - The collection name
39
+ * @param oldId - The old ID to look up
40
+ * @returns The new ID if found, otherwise undefined
41
+ */
42
+ getNewIdForOldId(collectionName: string, oldId: string): string | undefined;
43
+ /**
44
+ * Checks if an ID mapping exists for a collection.
45
+ *
46
+ * @param collectionName - The collection name
47
+ * @param oldId - The old ID to check
48
+ * @returns True if mapping exists
49
+ */
50
+ hasIdMapping(collectionName: string, oldId: string): boolean;
51
+ /**
52
+ * Gets the value to match for a given key in the final data or context.
53
+ * Preserves existing logic from DataLoader.
54
+ *
55
+ * @param finalData - The final data object
56
+ * @param context - The context object
57
+ * @param key - The key to get the value for
58
+ * @returns The value to match for from finalData or Context
59
+ */
60
+ private getValueFromData;
61
+ /**
62
+ * Updates old references with new IDs based on ID mappings.
63
+ * Preserves existing reference update logic from DataLoader.
64
+ *
65
+ * @param importMap - Map of collection data by collection key
66
+ * @param collections - Array of collection configurations
67
+ */
68
+ updateOldReferencesForNew(importMap: Map<string, CollectionImportData>, collections: CollectionCreate[]): void;
69
+ /**
70
+ * Resolves relationship references using the merged user map.
71
+ * Handles cases where users have been merged during deduplication.
72
+ *
73
+ * @param oldId - The old user ID to resolve
74
+ * @param targetCollection - The target collection name
75
+ * @returns The resolved ID (new user ID if merged, otherwise mapped ID)
76
+ */
77
+ private getMergedId;
78
+ /**
79
+ * Validates relationship integrity before import.
80
+ * Checks that all referenced collections and fields exist.
81
+ *
82
+ * @param collections - Array of collections to validate
83
+ * @returns Array of validation errors
84
+ */
85
+ validateRelationships(collections: CollectionCreate[]): string[];
86
+ /**
87
+ * Gets relationship statistics for reporting.
88
+ *
89
+ * @returns Statistics about relationships and ID mappings
90
+ */
91
+ getStatistics(): {
92
+ totalCollections: number;
93
+ totalIdMappings: number;
94
+ collectionsWithMappings: string[];
95
+ };
96
+ /**
97
+ * Clears all ID mappings (useful for testing or resetting state).
98
+ */
99
+ clearAllMappings(): void;
100
+ /**
101
+ * Exports ID mappings for debugging or external use.
102
+ *
103
+ * @returns Serializable object containing all ID mappings
104
+ */
105
+ exportMappings(): {
106
+ [collectionKey: string]: {
107
+ [oldId: string]: string;
108
+ };
109
+ };
110
+ /**
111
+ * Imports ID mappings from an external source.
112
+ *
113
+ * @param mappings - The mappings to import
114
+ */
115
+ importMappings(mappings: {
116
+ [collectionKey: string]: {
117
+ [oldId: string]: string;
118
+ };
119
+ }): void;
120
+ }