@njdamstra/appwrite-utils-cli 1.8.9 → 1.10.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 (284) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CONFIG_TODO.md +1189 -0
  3. package/SELECTION_DIALOGS.md +146 -0
  4. package/SERVICE_IMPLEMENTATION_REPORT.md +462 -0
  5. package/dist/adapters/index.d.ts +7 -8
  6. package/dist/adapters/index.js +7 -9
  7. package/dist/backups/operations/bucketBackup.js +2 -2
  8. package/dist/backups/operations/collectionBackup.d.ts +1 -1
  9. package/dist/backups/operations/collectionBackup.js +3 -3
  10. package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
  11. package/dist/backups/operations/comprehensiveBackup.js +2 -2
  12. package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
  13. package/dist/backups/tracking/centralizedTracking.js +2 -2
  14. package/dist/cli/commands/configCommands.js +51 -7
  15. package/dist/cli/commands/databaseCommands.d.ts +1 -0
  16. package/dist/cli/commands/databaseCommands.js +119 -9
  17. package/dist/cli/commands/functionCommands.js +3 -3
  18. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  19. package/dist/cli/commands/importFileCommands.js +674 -0
  20. package/dist/cli/commands/schemaCommands.js +3 -3
  21. package/dist/cli/commands/storageCommands.js +2 -3
  22. package/dist/cli/commands/transferCommands.js +3 -5
  23. package/dist/collections/attributes.d.ts +1 -1
  24. package/dist/collections/attributes.js +2 -35
  25. package/dist/collections/indexes.js +1 -3
  26. package/dist/collections/methods.d.ts +1 -1
  27. package/dist/collections/methods.js +111 -192
  28. package/dist/collections/tableOperations.d.ts +1 -0
  29. package/dist/collections/tableOperations.js +55 -23
  30. package/dist/collections/transferOperations.d.ts +1 -1
  31. package/dist/collections/transferOperations.js +3 -4
  32. package/dist/collections/wipeOperations.d.ts +4 -3
  33. package/dist/collections/wipeOperations.js +112 -39
  34. package/dist/databases/methods.js +2 -2
  35. package/dist/databases/setup.js +2 -2
  36. package/dist/examples/yamlTerminologyExample.js +2 -2
  37. package/dist/functions/deployments.d.ts +1 -1
  38. package/dist/functions/deployments.js +5 -5
  39. package/dist/functions/fnConfigDiscovery.js +2 -2
  40. package/dist/functions/methods.js +16 -4
  41. package/dist/init.js +1 -1
  42. package/dist/interactiveCLI.d.ts +6 -1
  43. package/dist/interactiveCLI.js +63 -9
  44. package/dist/main.js +130 -177
  45. package/dist/migrations/afterImportActions.js +2 -3
  46. package/dist/migrations/appwriteToX.d.ts +1 -1
  47. package/dist/migrations/appwriteToX.js +9 -7
  48. package/dist/migrations/comprehensiveTransfer.js +3 -5
  49. package/dist/migrations/dataLoader.js +2 -5
  50. package/dist/migrations/importController.js +3 -4
  51. package/dist/migrations/importDataActions.js +3 -3
  52. package/dist/migrations/relationships.js +1 -2
  53. package/dist/migrations/services/DataTransformationService.js +2 -2
  54. package/dist/migrations/services/FileHandlerService.js +1 -1
  55. package/dist/migrations/services/ImportOrchestrator.js +4 -4
  56. package/dist/migrations/services/RateLimitManager.js +1 -1
  57. package/dist/migrations/services/RelationshipResolver.js +1 -1
  58. package/dist/migrations/services/UserMappingService.js +1 -1
  59. package/dist/migrations/services/ValidationService.js +1 -1
  60. package/dist/migrations/transfer.d.ts +8 -4
  61. package/dist/migrations/transfer.js +106 -55
  62. package/dist/migrations/yaml/YamlImportConfigLoader.js +1 -1
  63. package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
  64. package/dist/migrations/yaml/generateImportSchemas.js +1 -1
  65. package/dist/setupCommands.d.ts +1 -1
  66. package/dist/setupCommands.js +5 -6
  67. package/dist/setupController.js +1 -1
  68. package/dist/shared/backupTracking.d.ts +1 -1
  69. package/dist/shared/backupTracking.js +2 -2
  70. package/dist/shared/confirmationDialogs.js +1 -1
  71. package/dist/shared/migrationHelpers.d.ts +1 -1
  72. package/dist/shared/migrationHelpers.js +3 -3
  73. package/dist/shared/operationQueue.d.ts +1 -1
  74. package/dist/shared/operationQueue.js +2 -3
  75. package/dist/shared/operationsTable.d.ts +1 -1
  76. package/dist/shared/operationsTable.js +2 -2
  77. package/dist/shared/progressManager.js +1 -1
  78. package/dist/shared/selectionDialogs.js +9 -8
  79. package/dist/storage/methods.js +4 -4
  80. package/dist/storage/schemas.d.ts +2 -2
  81. package/dist/tables/indexManager.d.ts +65 -0
  82. package/dist/tables/indexManager.js +294 -0
  83. package/dist/types.d.ts +2 -2
  84. package/dist/types.js +1 -1
  85. package/dist/users/methods.js +2 -3
  86. package/dist/utils/configMigration.js +1 -1
  87. package/dist/utils/index.d.ts +1 -1
  88. package/dist/utils/index.js +1 -1
  89. package/dist/utils/loadConfigs.d.ts +2 -2
  90. package/dist/utils/loadConfigs.js +6 -7
  91. package/dist/utils/setupFiles.js +5 -7
  92. package/dist/utilsController.d.ts +15 -8
  93. package/dist/utilsController.js +57 -28
  94. package/package.json +7 -3
  95. package/src/adapters/index.ts +8 -34
  96. package/src/backups/operations/bucketBackup.ts +2 -2
  97. package/src/backups/operations/collectionBackup.ts +4 -4
  98. package/src/backups/operations/comprehensiveBackup.ts +3 -3
  99. package/src/backups/tracking/centralizedTracking.ts +3 -3
  100. package/src/cli/commands/configCommands.ts +72 -8
  101. package/src/cli/commands/databaseCommands.ts +161 -9
  102. package/src/cli/commands/functionCommands.ts +4 -3
  103. package/src/cli/commands/importFileCommands.ts +815 -0
  104. package/src/cli/commands/schemaCommands.ts +3 -3
  105. package/src/cli/commands/storageCommands.ts +2 -3
  106. package/src/cli/commands/transferCommands.ts +3 -6
  107. package/src/collections/attributes.ts +3 -39
  108. package/src/collections/indexes.ts +2 -4
  109. package/src/collections/methods.ts +115 -150
  110. package/src/collections/tableOperations.ts +57 -21
  111. package/src/collections/transferOperations.ts +4 -5
  112. package/src/collections/wipeOperations.ts +154 -51
  113. package/src/databases/methods.ts +2 -2
  114. package/src/databases/setup.ts +2 -2
  115. package/src/examples/yamlTerminologyExample.ts +2 -2
  116. package/src/functions/deployments.ts +6 -5
  117. package/src/functions/fnConfigDiscovery.ts +2 -2
  118. package/src/functions/methods.ts +17 -4
  119. package/src/init.ts +1 -1
  120. package/src/interactiveCLI.ts +75 -10
  121. package/src/main.ts +143 -287
  122. package/src/migrations/afterImportActions.ts +2 -3
  123. package/src/migrations/appwriteToX.ts +12 -8
  124. package/src/migrations/comprehensiveTransfer.ts +6 -6
  125. package/src/migrations/dataLoader.ts +2 -5
  126. package/src/migrations/importController.ts +3 -4
  127. package/src/migrations/importDataActions.ts +3 -3
  128. package/src/migrations/relationships.ts +1 -2
  129. package/src/migrations/services/DataTransformationService.ts +2 -2
  130. package/src/migrations/services/FileHandlerService.ts +1 -1
  131. package/src/migrations/services/ImportOrchestrator.ts +4 -4
  132. package/src/migrations/services/RateLimitManager.ts +1 -1
  133. package/src/migrations/services/RelationshipResolver.ts +1 -1
  134. package/src/migrations/services/UserMappingService.ts +1 -1
  135. package/src/migrations/services/ValidationService.ts +1 -1
  136. package/src/migrations/transfer.ts +126 -83
  137. package/src/migrations/yaml/YamlImportConfigLoader.ts +1 -1
  138. package/src/migrations/yaml/YamlImportIntegration.ts +2 -2
  139. package/src/migrations/yaml/generateImportSchemas.ts +1 -1
  140. package/src/setupCommands.ts +5 -6
  141. package/src/setupController.ts +1 -1
  142. package/src/shared/backupTracking.ts +3 -3
  143. package/src/shared/confirmationDialogs.ts +1 -1
  144. package/src/shared/migrationHelpers.ts +4 -4
  145. package/src/shared/operationQueue.ts +3 -4
  146. package/src/shared/operationsTable.ts +3 -3
  147. package/src/shared/progressManager.ts +1 -1
  148. package/src/shared/selectionDialogs.ts +9 -8
  149. package/src/storage/methods.ts +4 -4
  150. package/src/tables/indexManager.ts +409 -0
  151. package/src/types.ts +2 -2
  152. package/src/users/methods.ts +2 -3
  153. package/src/utils/configMigration.ts +1 -1
  154. package/src/utils/index.ts +1 -1
  155. package/src/utils/loadConfigs.ts +15 -7
  156. package/src/utils/setupFiles.ts +5 -7
  157. package/src/utilsController.ts +86 -32
  158. package/dist/adapters/AdapterFactory.d.ts +0 -94
  159. package/dist/adapters/AdapterFactory.js +0 -405
  160. package/dist/adapters/DatabaseAdapter.d.ts +0 -233
  161. package/dist/adapters/DatabaseAdapter.js +0 -50
  162. package/dist/adapters/LegacyAdapter.d.ts +0 -50
  163. package/dist/adapters/LegacyAdapter.js +0 -612
  164. package/dist/adapters/TablesDBAdapter.d.ts +0 -45
  165. package/dist/adapters/TablesDBAdapter.js +0 -571
  166. package/dist/config/ConfigManager.d.ts +0 -445
  167. package/dist/config/ConfigManager.js +0 -625
  168. package/dist/config/configMigration.d.ts +0 -87
  169. package/dist/config/configMigration.js +0 -390
  170. package/dist/config/configValidation.d.ts +0 -66
  171. package/dist/config/configValidation.js +0 -358
  172. package/dist/config/index.d.ts +0 -8
  173. package/dist/config/index.js +0 -7
  174. package/dist/config/services/ConfigDiscoveryService.d.ts +0 -126
  175. package/dist/config/services/ConfigDiscoveryService.js +0 -374
  176. package/dist/config/services/ConfigLoaderService.d.ts +0 -129
  177. package/dist/config/services/ConfigLoaderService.js +0 -540
  178. package/dist/config/services/ConfigMergeService.d.ts +0 -208
  179. package/dist/config/services/ConfigMergeService.js +0 -308
  180. package/dist/config/services/ConfigValidationService.d.ts +0 -214
  181. package/dist/config/services/ConfigValidationService.js +0 -310
  182. package/dist/config/services/SessionAuthService.d.ts +0 -225
  183. package/dist/config/services/SessionAuthService.js +0 -456
  184. package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
  185. package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
  186. package/dist/config/services/index.d.ts +0 -13
  187. package/dist/config/services/index.js +0 -10
  188. package/dist/config/yamlConfig.d.ts +0 -722
  189. package/dist/config/yamlConfig.js +0 -702
  190. package/dist/functions/pathResolution.d.ts +0 -37
  191. package/dist/functions/pathResolution.js +0 -185
  192. package/dist/shared/attributeMapper.d.ts +0 -20
  193. package/dist/shared/attributeMapper.js +0 -203
  194. package/dist/shared/errorUtils.d.ts +0 -54
  195. package/dist/shared/errorUtils.js +0 -95
  196. package/dist/shared/functionManager.d.ts +0 -48
  197. package/dist/shared/functionManager.js +0 -336
  198. package/dist/shared/indexManager.d.ts +0 -24
  199. package/dist/shared/indexManager.js +0 -151
  200. package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
  201. package/dist/shared/jsonSchemaGenerator.js +0 -290
  202. package/dist/shared/logging.d.ts +0 -61
  203. package/dist/shared/logging.js +0 -116
  204. package/dist/shared/messageFormatter.d.ts +0 -39
  205. package/dist/shared/messageFormatter.js +0 -162
  206. package/dist/shared/pydanticModelGenerator.d.ts +0 -17
  207. package/dist/shared/pydanticModelGenerator.js +0 -615
  208. package/dist/shared/schemaGenerator.d.ts +0 -40
  209. package/dist/shared/schemaGenerator.js +0 -556
  210. package/dist/utils/ClientFactory.d.ts +0 -87
  211. package/dist/utils/ClientFactory.js +0 -212
  212. package/dist/utils/configDiscovery.d.ts +0 -78
  213. package/dist/utils/configDiscovery.js +0 -472
  214. package/dist/utils/constantsGenerator.d.ts +0 -31
  215. package/dist/utils/constantsGenerator.js +0 -321
  216. package/dist/utils/dataConverters.d.ts +0 -46
  217. package/dist/utils/dataConverters.js +0 -139
  218. package/dist/utils/directoryUtils.d.ts +0 -22
  219. package/dist/utils/directoryUtils.js +0 -59
  220. package/dist/utils/getClientFromConfig.d.ts +0 -39
  221. package/dist/utils/getClientFromConfig.js +0 -199
  222. package/dist/utils/helperFunctions.d.ts +0 -63
  223. package/dist/utils/helperFunctions.js +0 -156
  224. package/dist/utils/pathResolvers.d.ts +0 -53
  225. package/dist/utils/pathResolvers.js +0 -72
  226. package/dist/utils/projectConfig.d.ts +0 -119
  227. package/dist/utils/projectConfig.js +0 -171
  228. package/dist/utils/retryFailedPromises.d.ts +0 -2
  229. package/dist/utils/retryFailedPromises.js +0 -23
  230. package/dist/utils/sessionAuth.d.ts +0 -48
  231. package/dist/utils/sessionAuth.js +0 -164
  232. package/dist/utils/typeGuards.d.ts +0 -35
  233. package/dist/utils/typeGuards.js +0 -57
  234. package/dist/utils/validationRules.d.ts +0 -43
  235. package/dist/utils/validationRules.js +0 -42
  236. package/dist/utils/versionDetection.d.ts +0 -58
  237. package/dist/utils/versionDetection.js +0 -251
  238. package/dist/utils/yamlConverter.d.ts +0 -100
  239. package/dist/utils/yamlConverter.js +0 -428
  240. package/dist/utils/yamlLoader.d.ts +0 -70
  241. package/dist/utils/yamlLoader.js +0 -267
  242. package/src/adapters/AdapterFactory.ts +0 -510
  243. package/src/adapters/DatabaseAdapter.ts +0 -306
  244. package/src/adapters/LegacyAdapter.ts +0 -841
  245. package/src/adapters/TablesDBAdapter.ts +0 -773
  246. package/src/config/ConfigManager.ts +0 -808
  247. package/src/config/README.md +0 -274
  248. package/src/config/configMigration.ts +0 -575
  249. package/src/config/configValidation.ts +0 -445
  250. package/src/config/index.ts +0 -10
  251. package/src/config/services/ConfigDiscoveryService.ts +0 -463
  252. package/src/config/services/ConfigLoaderService.ts +0 -740
  253. package/src/config/services/ConfigMergeService.ts +0 -388
  254. package/src/config/services/ConfigValidationService.ts +0 -394
  255. package/src/config/services/SessionAuthService.ts +0 -565
  256. package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
  257. package/src/config/services/index.ts +0 -29
  258. package/src/config/yamlConfig.ts +0 -761
  259. package/src/functions/pathResolution.ts +0 -227
  260. package/src/shared/attributeMapper.ts +0 -229
  261. package/src/shared/errorUtils.ts +0 -110
  262. package/src/shared/functionManager.ts +0 -525
  263. package/src/shared/indexManager.ts +0 -254
  264. package/src/shared/jsonSchemaGenerator.ts +0 -383
  265. package/src/shared/logging.ts +0 -149
  266. package/src/shared/messageFormatter.ts +0 -208
  267. package/src/shared/pydanticModelGenerator.ts +0 -618
  268. package/src/shared/schemaGenerator.ts +0 -644
  269. package/src/utils/ClientFactory.ts +0 -240
  270. package/src/utils/configDiscovery.ts +0 -557
  271. package/src/utils/constantsGenerator.ts +0 -369
  272. package/src/utils/dataConverters.ts +0 -159
  273. package/src/utils/directoryUtils.ts +0 -61
  274. package/src/utils/getClientFromConfig.ts +0 -257
  275. package/src/utils/helperFunctions.ts +0 -228
  276. package/src/utils/pathResolvers.ts +0 -81
  277. package/src/utils/projectConfig.ts +0 -299
  278. package/src/utils/retryFailedPromises.ts +0 -29
  279. package/src/utils/sessionAuth.ts +0 -230
  280. package/src/utils/typeGuards.ts +0 -65
  281. package/src/utils/validationRules.ts +0 -88
  282. package/src/utils/versionDetection.ts +0 -292
  283. package/src/utils/yamlConverter.ts +0 -542
  284. package/src/utils/yamlLoader.ts +0 -371
@@ -1,8 +1,8 @@
1
1
  import { ID } from "node-appwrite";
2
2
  import { InputFile } from "node-appwrite/file";
3
3
  import { ulid } from "ulidx";
4
- import { MessageFormatter } from "../../shared/messageFormatter.js";
5
- import { logger } from "../../shared/logging.js";
4
+ import { MessageFormatter } from '@njdamstra/appwrite-utils-helpers';
5
+ import { logger } from '@njdamstra/appwrite-utils-helpers';
6
6
  import { backupDatabase } from "../../storage/methods.js";
7
7
  import { backupBucket } from "./bucketBackup.js";
8
8
  import { recordCentralizedBackup, createCentralizedBackupTrackingTable } from "../tracking/centralizedTracking.js";
@@ -1,4 +1,4 @@
1
- import type { DatabaseAdapter } from "../../adapters/DatabaseAdapter.js";
1
+ import type { DatabaseAdapter } from '@njdamstra/appwrite-utils-helpers';
2
2
  import { type BackupMetadata, type BackupType } from "../../shared/backupMetadataSchema.js";
3
3
  /**
4
4
  * Creates the centralized backup tracking table with enhanced schema
@@ -1,5 +1,5 @@
1
- import { logger } from "../../shared/logging.js";
2
- import { tryAwaitWithRetry } from "../../utils/helperFunctions.js";
1
+ import { logger } from '@njdamstra/appwrite-utils-helpers';
2
+ import { tryAwaitWithRetry } from "@njdamstra/appwrite-utils-helpers";
3
3
  import { Query, ID } from "node-appwrite";
4
4
  import { BACKUP_TABLE_ID, BACKUP_TABLE_NAME, BackupMetadataSchema } from "../../shared/backupMetadataSchema.js";
5
5
  /**
@@ -1,11 +1,12 @@
1
1
  import inquirer from "inquirer";
2
- import { MessageFormatter } from "../../shared/messageFormatter.js";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { MessageFormatter } from '@njdamstra/appwrite-utils-helpers';
3
5
  import { migrateConfig } from "../../utils/configMigration.js";
4
- import { validateCollectionsTablesConfig, reportValidationResults, } from "../../config/configValidation.js";
5
- import { createMigrationPlan, executeMigrationPlan, saveMigrationResult, } from "../../config/configMigration.js";
6
+ import { validateCollectionsTablesConfig, reportValidationResults, ConfigManager, findAppwriteConfig, findYamlConfig, YamlLoader, resolveCollectionsDir, resolveTablesDir } from "@njdamstra/appwrite-utils-helpers";
7
+ import { createMigrationPlan, executeMigrationPlan, saveMigrationResult, } from '@njdamstra/appwrite-utils-helpers';
6
8
  import { createEmptyCollection } from "../../utils/setupFiles.js";
7
9
  import chalk from "chalk";
8
- import { ConfigManager } from "../../config/ConfigManager.js";
9
10
  import { UtilsController } from "../../utilsController.js";
10
11
  export const configCommands = {
11
12
  async migrateTypeScriptConfig(cli) {
@@ -37,7 +38,7 @@ export const configCommands = {
37
38
  MessageFormatter.error("No configuration found to validate", undefined, { prefix: "Validation" });
38
39
  return;
39
40
  }
40
- const { validateCollectionsTablesConfig, reportValidationResults } = await import("../../config/configValidation.js");
41
+ const { validateCollectionsTablesConfig, reportValidationResults } = await import("@njdamstra/appwrite-utils-helpers");
41
42
  const validation = validateCollectionsTablesConfig(config);
42
43
  reportValidationResults(validation, { verbose: true });
43
44
  if (validation.isValid) {
@@ -55,6 +56,8 @@ export const configCommands = {
55
56
  try {
56
57
  MessageFormatter.info("Starting collections to tables migration...", { prefix: "Migration" });
57
58
  await cli.initControllerIfNeeded();
59
+ const currentDir = cli.currentDir;
60
+ const yamlConfigPath = findYamlConfig(currentDir);
58
61
  // Ensure config is properly loaded with YAML collections
59
62
  if (!cli.controller?.config) {
60
63
  MessageFormatter.error("No configuration found", undefined, { prefix: "Migration" });
@@ -65,7 +68,6 @@ export const configCommands = {
65
68
  MessageFormatter.error("No collections found in configuration. Please check your YAML files or appwriteConfig.ts", undefined, { prefix: "Migration" });
66
69
  return;
67
70
  }
68
- const { createMigrationPlan, executeMigrationPlan, saveMigrationResult } = await import("../../config/configMigration.js");
69
71
  // Get user's migration strategy preference
70
72
  const { strategy } = await inquirer.prompt([
71
73
  {
@@ -79,6 +81,46 @@ export const configCommands = {
79
81
  ]
80
82
  }
81
83
  ]);
84
+ if (yamlConfigPath) {
85
+ const appwriteDir = path.dirname(yamlConfigPath);
86
+ const collectionsDir = resolveCollectionsDir(appwriteDir);
87
+ const tablesDir = resolveTablesDir(appwriteDir);
88
+ if (!fs.existsSync(collectionsDir)) {
89
+ MessageFormatter.error(`Collections directory not found: ${collectionsDir}`, undefined, { prefix: "Migration" });
90
+ return;
91
+ }
92
+ const collectionFiles = fs
93
+ .readdirSync(collectionsDir)
94
+ .filter(file => file.endsWith(".yaml") || file.endsWith(".yml"));
95
+ if (collectionFiles.length === 0) {
96
+ MessageFormatter.error("No YAML collection files found to migrate.", undefined, { prefix: "Migration" });
97
+ return;
98
+ }
99
+ const { confirmed } = await inquirer.prompt([
100
+ {
101
+ type: "confirm",
102
+ name: "confirmed",
103
+ message: `Proceed with migration? This will process ${collectionFiles.length} file(s).`,
104
+ default: false
105
+ }
106
+ ]);
107
+ if (!confirmed) {
108
+ MessageFormatter.info("Migration cancelled by user", { prefix: "Migration" });
109
+ return;
110
+ }
111
+ const yamlLoader = new YamlLoader(appwriteDir);
112
+ const result = await yamlLoader.migrateTerminology(path.relative(appwriteDir, collectionsDir), path.relative(appwriteDir, tablesDir), true);
113
+ if (result.errors.length > 0) {
114
+ MessageFormatter.warning(`Migration completed with ${result.errors.length} error(s).`, { prefix: "Migration" });
115
+ }
116
+ if (strategy === "move") {
117
+ const backupDir = `${collectionsDir}.backup.${Date.now()}`;
118
+ fs.renameSync(collectionsDir, backupDir);
119
+ MessageFormatter.info(`Collections moved to ${path.basename(backupDir)}`, { prefix: "Migration" });
120
+ }
121
+ MessageFormatter.success(`Collections migrated to tables (${result.migrated} converted, ${result.skipped} skipped).`, { prefix: "Migration" });
122
+ return;
123
+ }
82
124
  // Map user-friendly strategy names to internal MigrationStrategy types
83
125
  const migrationStrategy = strategy === "move" ? "full_migration" :
84
126
  strategy === "copy" || strategy === "dual" ? "dual_format" : "full_migration";
@@ -93,7 +135,9 @@ export const configCommands = {
93
135
  ]);
94
136
  if (confirmed) {
95
137
  const result = executeMigrationPlan(cli.controller.config, plan);
96
- await saveMigrationResult(result, cli.currentDir);
138
+ const configDir = findAppwriteConfig(currentDir) || currentDir;
139
+ const outputPath = path.join(configDir, "appwriteConfig.ts");
140
+ await saveMigrationResult(result, outputPath, { originalConfigPath: outputPath });
97
141
  MessageFormatter.success("Collections to tables migration completed!", { prefix: "Migration" });
98
142
  }
99
143
  else {
@@ -10,4 +10,5 @@ export declare const databaseCommands: {
10
10
  executeUnifiedBackup(cli: InteractiveCLI, trackingDatabaseId: string, scope: any): Promise<void>;
11
11
  wipeDatabase(cli: InteractiveCLI): Promise<void>;
12
12
  wipeCollections(cli: InteractiveCLI): Promise<void>;
13
+ wipeTablesData(cli: InteractiveCLI): Promise<void>;
13
14
  };
@@ -1,27 +1,49 @@
1
1
  import inquirer from "inquirer";
2
2
  import chalk from "chalk";
3
3
  import { join } from "node:path";
4
- import { MessageFormatter } from "../../shared/messageFormatter.js";
4
+ import { Query } from "node-appwrite";
5
+ import { MessageFormatter } from '@njdamstra/appwrite-utils-helpers';
5
6
  import { ConfirmationDialogs } from "../../shared/confirmationDialogs.js";
6
7
  import { SelectionDialogs } from "../../shared/selectionDialogs.js";
7
- import { logger } from "../../shared/logging.js";
8
+ import { logger } from '@njdamstra/appwrite-utils-helpers';
8
9
  import { fetchAllDatabases } from "../../databases/methods.js";
9
10
  import { listBuckets } from "../../storage/methods.js";
10
11
  import { getFunction, downloadLatestFunctionDeployment } from "../../functions/methods.js";
12
+ import { wipeTableRows } from "../../collections/wipeOperations.js";
11
13
  export const databaseCommands = {
12
14
  async syncDb(cli) {
13
15
  MessageFormatter.progress("Pushing local configuration to Appwrite...", { prefix: "Database" });
14
16
  try {
15
17
  // Initialize controller
16
18
  await cli.controller.init();
17
- // Get available and configured databases
18
- const availableDatabases = await fetchAllDatabases(cli.controller.database);
19
+ // Get available databases from server and configured databases from local config
20
+ const serverDatabases = await fetchAllDatabases(cli.controller.database);
19
21
  const configuredDatabases = cli.controller.config?.databases || [];
22
+ // For PUSH operations: Merge local configured databases with server databases
23
+ // This allows pushing databases that don't exist on the server yet
24
+ const serverDbIds = new Set(serverDatabases.map(db => db.$id));
25
+ const mergedDatabases = [...serverDatabases];
26
+ // Add locally configured databases that don't exist on server yet
27
+ for (const configDb of configuredDatabases) {
28
+ const dbId = configDb.$id;
29
+ if (dbId && !serverDbIds.has(dbId)) {
30
+ // Create a pseudo-database object for selection
31
+ mergedDatabases.push({
32
+ $id: dbId,
33
+ name: configDb.name || dbId,
34
+ $createdAt: new Date().toISOString(),
35
+ $updatedAt: new Date().toISOString(),
36
+ enabled: true,
37
+ _isLocalOnly: true, // Mark as not yet on server
38
+ });
39
+ MessageFormatter.info(`Including local database "${configDb.name || dbId}" (not yet on server)`, { prefix: "Database" });
40
+ }
41
+ }
20
42
  // Get local collections for selection
21
43
  const localCollections = cli.getLocalCollections();
22
44
  // Push operations always use local configuration as source of truth
23
- // Select databases
24
- const selectedDatabaseIds = await SelectionDialogs.selectDatabases(availableDatabases, configuredDatabases, { showSelectAll: false, allowNewOnly: false, defaultSelected: [] });
45
+ // Select databases (now includes locally configured databases that don't exist on server)
46
+ const selectedDatabaseIds = await SelectionDialogs.selectDatabases(mergedDatabases, configuredDatabases, { showSelectAll: false, allowNewOnly: false, defaultSelected: [] });
25
47
  if (selectedDatabaseIds.length === 0) {
26
48
  MessageFormatter.warning("No databases selected. Skipping database sync.", { prefix: "Database" });
27
49
  return;
@@ -30,7 +52,7 @@ export const databaseCommands = {
30
52
  const tableSelectionsMap = new Map();
31
53
  const availableTablesMap = new Map();
32
54
  for (const databaseId of selectedDatabaseIds) {
33
- const database = availableDatabases.find(db => db.$id === databaseId);
55
+ const database = mergedDatabases.find(db => db.$id === databaseId);
34
56
  // Use the existing selectCollectionsAndTables method
35
57
  const selectedCollections = await cli.selectCollectionsAndTables(database, cli.controller.database, chalk.blue(`Select collections/tables to push to "${database.name}":`), true, // multiSelect
36
58
  true, // prefer local
@@ -70,7 +92,7 @@ export const databaseCommands = {
70
92
  const selectedBucketIds = await SelectionDialogs.selectBucketsForDatabases(selectedDatabaseIds, availableBuckets, configuredBuckets, { showSelectAll: false, groupByDatabase: true, defaultSelected: [] });
71
93
  if (selectedBucketIds.length > 0) {
72
94
  // Create BucketSelection objects
73
- bucketSelections = SelectionDialogs.createBucketSelection(selectedBucketIds, availableBuckets, configuredBuckets, availableDatabases);
95
+ bucketSelections = SelectionDialogs.createBucketSelection(selectedBucketIds, availableBuckets, configuredBuckets, mergedDatabases);
74
96
  MessageFormatter.info(`Selected ${bucketSelections.length} storage bucket(s)`, { prefix: "Database" });
75
97
  }
76
98
  }
@@ -81,7 +103,7 @@ export const databaseCommands = {
81
103
  }
82
104
  }
83
105
  // Create DatabaseSelection objects
84
- const databaseSelections = SelectionDialogs.createDatabaseSelection(selectedDatabaseIds, availableDatabases, tableSelectionsMap, configuredDatabases, availableTablesMap);
106
+ const databaseSelections = SelectionDialogs.createDatabaseSelection(selectedDatabaseIds, mergedDatabases, tableSelectionsMap, configuredDatabases, availableTablesMap);
85
107
  // Show confirmation summary
86
108
  const selectionSummary = SelectionDialogs.createSyncSelectionSummary(databaseSelections, bucketSelections);
87
109
  const confirmed = await SelectionDialogs.confirmSyncSelection(selectionSummary, 'push');
@@ -550,5 +572,93 @@ export const databaseCommands = {
550
572
  }
551
573
  }
552
574
  MessageFormatter.success("Wipe collections operation completed", { prefix: "Wipe" });
575
+ },
576
+ async wipeTablesData(cli) {
577
+ const controller = cli.controller;
578
+ if (!controller?.adapter) {
579
+ throw new Error("Database adapter is not initialized. TablesDB operations require adapter support.");
580
+ }
581
+ try {
582
+ // Step 1: Select database (single selection for clearer UX)
583
+ const databases = await fetchAllDatabases(controller.database);
584
+ if (!databases || databases.length === 0) {
585
+ MessageFormatter.warning("No databases found", { prefix: "Wipe" });
586
+ return;
587
+ }
588
+ const { selectedDatabase } = await inquirer.prompt([
589
+ {
590
+ type: "list",
591
+ name: "selectedDatabase",
592
+ message: "Select database containing tables to wipe:",
593
+ choices: databases.map((db) => ({
594
+ name: `${db.name} (${db.$id})`,
595
+ value: db
596
+ }))
597
+ }
598
+ ]);
599
+ const database = selectedDatabase;
600
+ // Step 2: Get available tables
601
+ const adapter = controller.adapter;
602
+ const tablesResponse = await adapter.listTables({
603
+ databaseId: database.$id,
604
+ queries: [Query.limit(500)]
605
+ });
606
+ const availableTables = tablesResponse.tables || [];
607
+ if (availableTables.length === 0) {
608
+ MessageFormatter.warning(`No tables found in database: ${database.name}`, { prefix: "Wipe" });
609
+ return;
610
+ }
611
+ // Step 3: Select tables using existing SelectionDialogs
612
+ const selectedTableIds = await SelectionDialogs.selectTablesForDatabase(database.$id, database.name, availableTables, [], // No configured tables context needed for wipe
613
+ {
614
+ showSelectAll: true,
615
+ allowNewOnly: false,
616
+ defaultSelected: []
617
+ });
618
+ if (selectedTableIds.length === 0) {
619
+ MessageFormatter.warning("No tables selected. Operation cancelled.", { prefix: "Wipe" });
620
+ return;
621
+ }
622
+ // Step 4: Show confirmation with table details
623
+ const selectedTables = availableTables.filter((t) => selectedTableIds.includes(t.$id));
624
+ const tableNames = selectedTables.map((t) => t.name);
625
+ console.log(chalk.yellow.bold("\n⚠️ WARNING: Table Row Wipe Operation"));
626
+ console.log(chalk.yellow("This will delete ALL ROWS from the selected tables."));
627
+ console.log(chalk.yellow("The table structures will remain intact.\n"));
628
+ console.log(chalk.cyan("Database:"), chalk.white(database.name));
629
+ console.log(chalk.cyan("Tables to wipe:"));
630
+ tableNames.forEach((name) => console.log(chalk.white(` • ${name}`)));
631
+ console.log();
632
+ const { confirmed } = await inquirer.prompt([
633
+ {
634
+ type: "confirm",
635
+ name: "confirmed",
636
+ message: chalk.red.bold("Are you ABSOLUTELY SURE you want to wipe these table rows?"),
637
+ default: false
638
+ }
639
+ ]);
640
+ if (!confirmed) {
641
+ MessageFormatter.info("Wipe operation cancelled by user", { prefix: "Wipe" });
642
+ return;
643
+ }
644
+ // Step 5: Execute wipe using existing wipeTableRows function
645
+ MessageFormatter.progress("Starting table row wipe operation...", { prefix: "Wipe" });
646
+ for (const table of selectedTables) {
647
+ try {
648
+ MessageFormatter.info(`Wiping rows from table: ${table.name}`, { prefix: "Wipe" });
649
+ // Use existing wipeTableRows from wipeOperations.ts
650
+ await wipeTableRows(adapter, database.$id, table.$id);
651
+ MessageFormatter.success(`Successfully wiped rows from table: ${table.name}`, { prefix: "Wipe" });
652
+ }
653
+ catch (error) {
654
+ MessageFormatter.error(`Failed to wipe table ${table.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Wipe" });
655
+ }
656
+ }
657
+ MessageFormatter.success(`Wipe operation completed for ${selectedTables.length} table(s)`, { prefix: "Wipe" });
658
+ }
659
+ catch (error) {
660
+ MessageFormatter.error("Table wipe operation failed", error instanceof Error ? error : new Error(String(error)), { prefix: "Wipe" });
661
+ throw error;
662
+ }
553
663
  }
554
664
  };
@@ -5,11 +5,11 @@ import os from "node:os";
5
5
  import { ulid } from "ulidx";
6
6
  import chalk from "chalk";
7
7
  import { Query } from "node-appwrite";
8
- import { MessageFormatter } from "../../shared/messageFormatter.js";
8
+ import { MessageFormatter } from '@njdamstra/appwrite-utils-helpers';
9
9
  import { createFunctionTemplate, deleteFunction, downloadLatestFunctionDeployment, listFunctions, listSpecifications, } from "../../functions/methods.js";
10
10
  import { deployLocalFunction } from "../../functions/deployments.js";
11
11
  import { discoverFnConfigs, mergeDiscoveredFunctions } from "../../functions/fnConfigDiscovery.js";
12
- import { addFunctionToYamlConfig, findYamlConfig } from "../../config/yamlConfig.js";
12
+ import { addFunctionToYamlConfig, findYamlConfig } from "@njdamstra/appwrite-utils-helpers";
13
13
  import { RuntimeSchema } from "@njdamstra/appwrite-utils";
14
14
  export const functionCommands = {
15
15
  async createFunction(cli) {
@@ -260,7 +260,7 @@ export const functionCommands = {
260
260
  await deployLocalFunction(cli.controller.appwriteServer, effectiveConfig.name, {
261
261
  ...effectiveConfig,
262
262
  dirPath: functionPath,
263
- }, functionPath);
263
+ }, functionPath, yamlBaseDir);
264
264
  MessageFormatter.success("Function deployed successfully!", { prefix: "Functions" });
265
265
  }
266
266
  catch (error) {
@@ -0,0 +1,7 @@
1
+ import type { DatabaseAdapter } from "@njdamstra/appwrite-utils-helpers";
2
+ import type { InteractiveCLI } from "../../interactiveCLI.js";
3
+ export declare function importFileFromPath(adapter: DatabaseAdapter, filePath: string, databaseId: string, tableId: string): Promise<void>;
4
+ export declare function importFilePromptMissing(adapter: DatabaseAdapter, database: any, filePath: string, targetDb?: string, targetTable?: string): Promise<void>;
5
+ export declare const importFileCommands: {
6
+ importFile(cli: InteractiveCLI): Promise<void>;
7
+ };