appwrite-utils-cli 1.5.2 → 1.6.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 (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 +479 -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 +209 -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 +274 -1563
  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
@@ -0,0 +1,263 @@
1
+ import yaml from "js-yaml";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { logger } from "../shared/logging.js";
5
+ import { normalizeYamlData, usesTableTerminology, convertTerminology } from "./yamlConverter.js";
6
+ /**
7
+ * Enhanced YAML loader with dual terminology support
8
+ */
9
+ export class YamlLoader {
10
+ baseDirectory;
11
+ constructor(baseDirectory) {
12
+ this.baseDirectory = baseDirectory;
13
+ }
14
+ /**
15
+ * Loads a YAML file with automatic terminology detection and normalization
16
+ */
17
+ async loadCollectionYaml(filePath) {
18
+ const fullPath = path.resolve(this.baseDirectory, filePath);
19
+ if (!fs.existsSync(fullPath)) {
20
+ throw new Error(`YAML file not found: ${fullPath}`);
21
+ }
22
+ try {
23
+ const yamlContent = fs.readFileSync(fullPath, "utf8");
24
+ const rawData = yaml.load(yamlContent);
25
+ // Detect original terminology
26
+ const originalTerminology = usesTableTerminology(rawData) ? 'table' : 'collection';
27
+ // Normalize to collection terminology for internal processing
28
+ const normalized = normalizeYamlData(rawData);
29
+ logger.info(`Loaded YAML file: ${filePath} (${originalTerminology} terminology)`);
30
+ return {
31
+ data: rawData,
32
+ originalTerminology,
33
+ normalized
34
+ };
35
+ }
36
+ catch (error) {
37
+ throw new Error(`Failed to load YAML file ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
38
+ }
39
+ }
40
+ /**
41
+ * Loads multiple YAML files from a directory with terminology support
42
+ */
43
+ async loadDirectoryYamls(directoryPath, targetTerminology) {
44
+ const fullDirectoryPath = path.resolve(this.baseDirectory, directoryPath);
45
+ if (!fs.existsSync(fullDirectoryPath)) {
46
+ logger.warn(`Directory not found: ${fullDirectoryPath}`);
47
+ return {
48
+ collections: [],
49
+ summary: { total: 0, collectionFormat: 0, tableFormat: 0, converted: 0 }
50
+ };
51
+ }
52
+ const collections = [];
53
+ const files = fs.readdirSync(fullDirectoryPath, { withFileTypes: true });
54
+ let collectionFormatCount = 0;
55
+ let tableFormatCount = 0;
56
+ let convertedCount = 0;
57
+ for (const file of files) {
58
+ if (file.isFile() && file.name.endsWith('.yaml')) {
59
+ try {
60
+ const filePath = path.join(directoryPath, file.name);
61
+ const result = await this.loadCollectionYaml(filePath);
62
+ let converted;
63
+ // Convert terminology if requested and different from original
64
+ if (targetTerminology && targetTerminology !== result.originalTerminology) {
65
+ converted = convertTerminology(result.data, targetTerminology === 'table');
66
+ convertedCount++;
67
+ }
68
+ collections.push({
69
+ filePath,
70
+ data: result.data,
71
+ originalTerminology: result.originalTerminology,
72
+ converted
73
+ });
74
+ if (result.originalTerminology === 'collection') {
75
+ collectionFormatCount++;
76
+ }
77
+ else {
78
+ tableFormatCount++;
79
+ }
80
+ }
81
+ catch (error) {
82
+ logger.error(`Failed to load ${file.name}:`, error);
83
+ }
84
+ }
85
+ }
86
+ return {
87
+ collections,
88
+ summary: {
89
+ total: collections.length,
90
+ collectionFormat: collectionFormatCount,
91
+ tableFormat: tableFormatCount,
92
+ converted: convertedCount
93
+ }
94
+ };
95
+ }
96
+ /**
97
+ * Converts YAML data to CollectionCreate format for internal use
98
+ */
99
+ yamlToCollectionCreate(yamlData) {
100
+ // Always normalize to ensure consistent attribute terminology
101
+ const normalized = normalizeYamlData(yamlData);
102
+ return {
103
+ name: normalized.name,
104
+ $id: normalized.id || normalized.name.toLowerCase().replace(/\s+/g, '_'),
105
+ enabled: normalized.enabled !== false,
106
+ documentSecurity: normalized.documentSecurity || false,
107
+ $permissions: normalized.permissions?.map(p => ({
108
+ permission: p.permission,
109
+ target: p.target
110
+ })) || [],
111
+ attributes: normalized.attributes?.map(attr => ({
112
+ key: attr.key,
113
+ type: attr.type,
114
+ size: attr.size,
115
+ required: attr.required || false,
116
+ array: attr.array || false,
117
+ xdefault: attr.default,
118
+ min: attr.min,
119
+ max: attr.max,
120
+ elements: attr.elements,
121
+ relatedCollection: attr.relatedCollection,
122
+ relationType: attr.relationType,
123
+ twoWay: attr.twoWay,
124
+ twoWayKey: attr.twoWayKey,
125
+ onDelete: attr.onDelete,
126
+ side: attr.side
127
+ })) || [],
128
+ indexes: normalized.indexes?.map(idx => ({
129
+ key: idx.key,
130
+ type: idx.type,
131
+ attributes: idx.attributes,
132
+ orders: idx.orders
133
+ })) || [],
134
+ importDefs: normalized.importDefs || []
135
+ };
136
+ }
137
+ /**
138
+ * Saves YAML data with specified terminology
139
+ */
140
+ async saveCollectionYaml(filePath, data, config) {
141
+ const fullPath = path.resolve(this.baseDirectory, filePath);
142
+ const directory = path.dirname(fullPath);
143
+ // Ensure directory exists
144
+ if (!fs.existsSync(directory)) {
145
+ fs.mkdirSync(directory, { recursive: true });
146
+ }
147
+ // Convert to target terminology if needed
148
+ const targetData = config.useTableTerminology
149
+ ? convertTerminology(data, true)
150
+ : normalizeYamlData(data);
151
+ // Generate YAML content
152
+ const yamlContent = yaml.dump(targetData, {
153
+ indent: 2,
154
+ lineWidth: 120,
155
+ sortKeys: false,
156
+ quotingType: '"',
157
+ forceQuotes: false,
158
+ });
159
+ // Add schema reference and header
160
+ const schemaPath = config.schemaPath ||
161
+ (config.useTableTerminology ? "../.yaml_schemas/table.schema.json" : "../.yaml_schemas/collection.schema.json");
162
+ const entityType = config.useTableTerminology ? 'Table' : 'Collection';
163
+ const header = `# yaml-language-server: $schema=${schemaPath}
164
+ # ${entityType} Definition: ${data.name}
165
+ `;
166
+ const finalContent = header + yamlContent;
167
+ fs.writeFileSync(fullPath, finalContent, "utf8");
168
+ logger.info(`Saved ${entityType.toLowerCase()} YAML: ${fullPath}`);
169
+ }
170
+ /**
171
+ * Migrates YAML files from one terminology to another
172
+ */
173
+ async migrateTerminology(sourceDirectory, targetDirectory, toTableTerminology) {
174
+ const result = await this.loadDirectoryYamls(sourceDirectory);
175
+ const errors = [];
176
+ let migrated = 0;
177
+ let skipped = 0;
178
+ // Ensure target directory exists
179
+ const fullTargetPath = path.resolve(this.baseDirectory, targetDirectory);
180
+ if (!fs.existsSync(fullTargetPath)) {
181
+ fs.mkdirSync(fullTargetPath, { recursive: true });
182
+ }
183
+ for (const collection of result.collections) {
184
+ try {
185
+ const needsMigration = toTableTerminology
186
+ ? collection.originalTerminology === 'collection'
187
+ : collection.originalTerminology === 'table';
188
+ if (!needsMigration) {
189
+ skipped++;
190
+ continue;
191
+ }
192
+ const targetFileName = path.basename(collection.filePath);
193
+ const targetFilePath = path.join(targetDirectory, targetFileName);
194
+ await this.saveCollectionYaml(targetFilePath, collection.data, {
195
+ useTableTerminology: toTableTerminology,
196
+ entityType: toTableTerminology ? 'table' : 'collection'
197
+ });
198
+ migrated++;
199
+ }
200
+ catch (error) {
201
+ const errorMessage = `Failed to migrate ${collection.filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`;
202
+ errors.push(errorMessage);
203
+ logger.error(errorMessage);
204
+ }
205
+ }
206
+ logger.info(`Migration complete: ${migrated} migrated, ${skipped} skipped, ${errors.length} errors`);
207
+ return { migrated, skipped, errors };
208
+ }
209
+ /**
210
+ * Validates YAML files for terminology consistency
211
+ */
212
+ async validateTerminologyConsistency(directoryPath) {
213
+ const result = await this.loadDirectoryYamls(directoryPath);
214
+ const issues = [];
215
+ let mixedFiles = 0;
216
+ for (const collection of result.collections) {
217
+ // Check for mixed terminology within a single file
218
+ const data = collection.data;
219
+ const hasAttributes = !!data.attributes && data.attributes.length > 0;
220
+ const hasColumns = !!data.columns && data.columns.length > 0;
221
+ const hasAttributeIndexes = data.indexes?.some(idx => !!idx.attributes);
222
+ const hasColumnIndexes = data.indexes?.some(idx => !!idx.columns);
223
+ if (hasAttributes && hasColumns) {
224
+ issues.push({
225
+ file: collection.filePath,
226
+ issue: "File contains both 'attributes' and 'columns' - use only one terminology",
227
+ severity: 'error'
228
+ });
229
+ mixedFiles++;
230
+ }
231
+ if (hasAttributeIndexes && hasColumnIndexes) {
232
+ issues.push({
233
+ file: collection.filePath,
234
+ issue: "Indexes contain both 'attributes' and 'columns' references - use consistent terminology",
235
+ severity: 'error'
236
+ });
237
+ }
238
+ // Check for missing required fields
239
+ if (!hasAttributes && !hasColumns) {
240
+ issues.push({
241
+ file: collection.filePath,
242
+ issue: "File missing both 'attributes' and 'columns' - at least one is required",
243
+ severity: 'warning'
244
+ });
245
+ }
246
+ }
247
+ return {
248
+ isConsistent: issues.filter(i => i.severity === 'error').length === 0,
249
+ issues,
250
+ summary: {
251
+ collectionFiles: result.summary.collectionFormat,
252
+ tableFiles: result.summary.tableFormat,
253
+ mixedFiles
254
+ }
255
+ };
256
+ }
257
+ }
258
+ /**
259
+ * Creates a YAML loader instance for the given base directory
260
+ */
261
+ export function createYamlLoader(baseDirectory) {
262
+ return new YamlLoader(baseDirectory);
263
+ }
@@ -2,6 +2,8 @@ import { Client, Databases, Storage, type Models } from "node-appwrite";
2
2
  import { type AppwriteConfig, type AppwriteFunction, type Specification } from "appwrite-utils";
3
3
  import { type AfterImportActions, type ConverterFunctions, type ValidationRules } from "appwrite-utils";
4
4
  import { type TransferOptions } from "./migrations/transfer.js";
5
+ import type { DatabaseAdapter } from './adapters/DatabaseAdapter.js';
6
+ import { type ValidationResult } from "./config/configValidation.js";
5
7
  export interface SetupOptions {
6
8
  databases?: Models.Database[];
7
9
  collections?: string[];
@@ -23,24 +25,32 @@ export declare class UtilsController {
23
25
  appwriteServer?: Client;
24
26
  database?: Databases;
25
27
  storage?: Storage;
28
+ adapter?: DatabaseAdapter;
26
29
  converterDefinitions: ConverterFunctions;
27
30
  validityRuleDefinitions: ValidationRules;
28
31
  afterImportActionsDefinitions: AfterImportActions;
32
+ private sessionCookie?;
33
+ private authMethod?;
34
+ private sessionMetadata?;
29
35
  constructor(currentUserDir: string, directConfig?: {
30
36
  appwriteEndpoint?: string;
31
37
  appwriteProject?: string;
32
38
  appwriteKey?: string;
33
39
  });
34
- init(): Promise<void>;
40
+ init(options?: {
41
+ validate?: boolean;
42
+ strictMode?: boolean;
43
+ useSession?: boolean;
44
+ sessionCookie?: string;
45
+ }): Promise<void>;
35
46
  reloadConfig(): Promise<void>;
36
- setupMigrationDatabase(): Promise<void>;
37
47
  ensureDatabaseConfigBucketsExist(databases?: Models.Database[]): Promise<void>;
38
48
  ensureDatabasesExist(databases?: Models.Database[]): Promise<void>;
39
49
  ensureCollectionsExist(database: Models.Database, collections?: Models.Collection[]): Promise<void>;
40
50
  getDatabasesByIds(ids: string[]): Promise<Models.Database[] | undefined>;
41
51
  wipeOtherDatabases(databasesToKeep: Models.Database[]): Promise<void>;
42
52
  wipeUsers(): Promise<void>;
43
- backupDatabase(database: Models.Database): Promise<void>;
53
+ backupDatabase(database: Models.Database, format?: 'json' | 'zip'): Promise<void>;
44
54
  listAllFunctions(): Promise<Models.Function[]>;
45
55
  findFunctionDirectories(): Promise<Map<any, any>>;
46
56
  deployFunction(functionName: string, functionPath?: string, functionConfig?: AppwriteFunction): Promise<void>;
@@ -61,4 +71,27 @@ export declare class UtilsController {
61
71
  getAppwriteFolderPath(): string | undefined;
62
72
  transferData(options: TransferOptions): Promise<void>;
63
73
  updateFunctionSpecifications(functionId: string, specification: Specification): Promise<void>;
74
+ /**
75
+ * Validates the current configuration for collections/tables conflicts
76
+ */
77
+ validateConfiguration(strictMode?: boolean): Promise<ValidationResult>;
78
+ /**
79
+ * Extract session information from the current authenticated client
80
+ * This preserves session context for use across config reloads and adapter operations
81
+ */
82
+ private extractSessionInfo;
83
+ /**
84
+ * Create session preservation options for passing to loadConfig
85
+ * Returns current session state to maintain authentication across config reloads
86
+ */
87
+ private createSessionPreservationOptions;
88
+ /**
89
+ * Get current session information for debugging/logging purposes
90
+ */
91
+ getSessionInfo(): {
92
+ hasSession: boolean;
93
+ authMethod?: string;
94
+ email?: string;
95
+ expiresAt?: string;
96
+ };
64
97
  }