@njdamstra/appwrite-utils-cli 1.8.9 → 1.10.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 (285) 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 +85 -35
  25. package/dist/collections/indexes.js +2 -4
  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 +90 -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 +64 -10
  44. package/dist/main.js +130 -177
  45. package/dist/migrations/afterImportActions.js +2 -3
  46. package/dist/migrations/appwriteToX.d.ts +97 -1
  47. package/dist/migrations/appwriteToX.js +9 -7
  48. package/dist/migrations/comprehensiveTransfer.js +3 -5
  49. package/dist/migrations/dataLoader.d.ts +194 -2
  50. package/dist/migrations/dataLoader.js +2 -5
  51. package/dist/migrations/importController.js +3 -4
  52. package/dist/migrations/importDataActions.js +3 -3
  53. package/dist/migrations/relationships.js +1 -2
  54. package/dist/migrations/services/DataTransformationService.js +2 -2
  55. package/dist/migrations/services/FileHandlerService.js +1 -1
  56. package/dist/migrations/services/ImportOrchestrator.js +4 -4
  57. package/dist/migrations/services/RateLimitManager.js +1 -1
  58. package/dist/migrations/services/RelationshipResolver.js +1 -1
  59. package/dist/migrations/services/UserMappingService.js +1 -1
  60. package/dist/migrations/services/ValidationService.js +1 -1
  61. package/dist/migrations/transfer.d.ts +8 -4
  62. package/dist/migrations/transfer.js +106 -55
  63. package/dist/migrations/yaml/YamlImportConfigLoader.js +1 -1
  64. package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
  65. package/dist/migrations/yaml/generateImportSchemas.js +1 -1
  66. package/dist/setupCommands.d.ts +1 -1
  67. package/dist/setupCommands.js +5 -6
  68. package/dist/setupController.js +1 -1
  69. package/dist/shared/backupTracking.d.ts +1 -1
  70. package/dist/shared/backupTracking.js +2 -2
  71. package/dist/shared/confirmationDialogs.js +1 -1
  72. package/dist/shared/migrationHelpers.d.ts +1 -1
  73. package/dist/shared/migrationHelpers.js +3 -3
  74. package/dist/shared/operationQueue.d.ts +1 -1
  75. package/dist/shared/operationQueue.js +2 -3
  76. package/dist/shared/operationsTable.d.ts +1 -1
  77. package/dist/shared/operationsTable.js +2 -2
  78. package/dist/shared/progressManager.js +1 -1
  79. package/dist/shared/selectionDialogs.js +9 -8
  80. package/dist/storage/methods.js +4 -4
  81. package/dist/storage/schemas.d.ts +386 -2
  82. package/dist/tables/indexManager.d.ts +65 -0
  83. package/dist/tables/indexManager.js +294 -0
  84. package/dist/types.d.ts +2 -2
  85. package/dist/types.js +1 -1
  86. package/dist/users/methods.js +2 -3
  87. package/dist/utils/configMigration.js +1 -1
  88. package/dist/utils/index.d.ts +1 -1
  89. package/dist/utils/index.js +1 -1
  90. package/dist/utils/loadConfigs.d.ts +2 -2
  91. package/dist/utils/loadConfigs.js +6 -7
  92. package/dist/utils/setupFiles.js +5 -7
  93. package/dist/utilsController.d.ts +15 -8
  94. package/dist/utilsController.js +57 -28
  95. package/package.json +8 -4
  96. package/src/adapters/index.ts +8 -34
  97. package/src/backups/operations/bucketBackup.ts +2 -2
  98. package/src/backups/operations/collectionBackup.ts +4 -4
  99. package/src/backups/operations/comprehensiveBackup.ts +3 -3
  100. package/src/backups/tracking/centralizedTracking.ts +3 -3
  101. package/src/cli/commands/configCommands.ts +72 -8
  102. package/src/cli/commands/databaseCommands.ts +161 -9
  103. package/src/cli/commands/functionCommands.ts +4 -3
  104. package/src/cli/commands/importFileCommands.ts +815 -0
  105. package/src/cli/commands/schemaCommands.ts +3 -3
  106. package/src/cli/commands/storageCommands.ts +2 -3
  107. package/src/cli/commands/transferCommands.ts +3 -6
  108. package/src/collections/attributes.ts +155 -39
  109. package/src/collections/indexes.ts +5 -7
  110. package/src/collections/methods.ts +115 -150
  111. package/src/collections/tableOperations.ts +92 -21
  112. package/src/collections/transferOperations.ts +4 -5
  113. package/src/collections/wipeOperations.ts +154 -51
  114. package/src/databases/methods.ts +2 -2
  115. package/src/databases/setup.ts +2 -2
  116. package/src/examples/yamlTerminologyExample.ts +2 -2
  117. package/src/functions/deployments.ts +6 -5
  118. package/src/functions/fnConfigDiscovery.ts +2 -2
  119. package/src/functions/methods.ts +19 -6
  120. package/src/init.ts +1 -1
  121. package/src/interactiveCLI.ts +78 -13
  122. package/src/main.ts +143 -287
  123. package/src/migrations/afterImportActions.ts +2 -3
  124. package/src/migrations/appwriteToX.ts +12 -8
  125. package/src/migrations/comprehensiveTransfer.ts +6 -6
  126. package/src/migrations/dataLoader.ts +2 -5
  127. package/src/migrations/importController.ts +3 -4
  128. package/src/migrations/importDataActions.ts +3 -3
  129. package/src/migrations/relationships.ts +1 -2
  130. package/src/migrations/services/DataTransformationService.ts +2 -2
  131. package/src/migrations/services/FileHandlerService.ts +1 -1
  132. package/src/migrations/services/ImportOrchestrator.ts +4 -4
  133. package/src/migrations/services/RateLimitManager.ts +1 -1
  134. package/src/migrations/services/RelationshipResolver.ts +1 -1
  135. package/src/migrations/services/UserMappingService.ts +1 -1
  136. package/src/migrations/services/ValidationService.ts +1 -1
  137. package/src/migrations/transfer.ts +126 -83
  138. package/src/migrations/yaml/YamlImportConfigLoader.ts +1 -1
  139. package/src/migrations/yaml/YamlImportIntegration.ts +2 -2
  140. package/src/migrations/yaml/generateImportSchemas.ts +1 -1
  141. package/src/setupCommands.ts +5 -6
  142. package/src/setupController.ts +1 -1
  143. package/src/shared/backupTracking.ts +3 -3
  144. package/src/shared/confirmationDialogs.ts +1 -1
  145. package/src/shared/migrationHelpers.ts +4 -4
  146. package/src/shared/operationQueue.ts +3 -4
  147. package/src/shared/operationsTable.ts +3 -3
  148. package/src/shared/progressManager.ts +1 -1
  149. package/src/shared/selectionDialogs.ts +9 -8
  150. package/src/storage/methods.ts +4 -4
  151. package/src/tables/indexManager.ts +409 -0
  152. package/src/types.ts +2 -2
  153. package/src/users/methods.ts +2 -3
  154. package/src/utils/configMigration.ts +1 -1
  155. package/src/utils/index.ts +1 -1
  156. package/src/utils/loadConfigs.ts +15 -7
  157. package/src/utils/setupFiles.ts +5 -7
  158. package/src/utilsController.ts +86 -32
  159. package/dist/adapters/AdapterFactory.d.ts +0 -94
  160. package/dist/adapters/AdapterFactory.js +0 -405
  161. package/dist/adapters/DatabaseAdapter.d.ts +0 -233
  162. package/dist/adapters/DatabaseAdapter.js +0 -50
  163. package/dist/adapters/LegacyAdapter.d.ts +0 -50
  164. package/dist/adapters/LegacyAdapter.js +0 -612
  165. package/dist/adapters/TablesDBAdapter.d.ts +0 -45
  166. package/dist/adapters/TablesDBAdapter.js +0 -571
  167. package/dist/config/ConfigManager.d.ts +0 -445
  168. package/dist/config/ConfigManager.js +0 -625
  169. package/dist/config/configMigration.d.ts +0 -87
  170. package/dist/config/configMigration.js +0 -390
  171. package/dist/config/configValidation.d.ts +0 -66
  172. package/dist/config/configValidation.js +0 -358
  173. package/dist/config/index.d.ts +0 -8
  174. package/dist/config/index.js +0 -7
  175. package/dist/config/services/ConfigDiscoveryService.d.ts +0 -126
  176. package/dist/config/services/ConfigDiscoveryService.js +0 -374
  177. package/dist/config/services/ConfigLoaderService.d.ts +0 -129
  178. package/dist/config/services/ConfigLoaderService.js +0 -540
  179. package/dist/config/services/ConfigMergeService.d.ts +0 -208
  180. package/dist/config/services/ConfigMergeService.js +0 -308
  181. package/dist/config/services/ConfigValidationService.d.ts +0 -214
  182. package/dist/config/services/ConfigValidationService.js +0 -310
  183. package/dist/config/services/SessionAuthService.d.ts +0 -225
  184. package/dist/config/services/SessionAuthService.js +0 -456
  185. package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
  186. package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
  187. package/dist/config/services/index.d.ts +0 -13
  188. package/dist/config/services/index.js +0 -10
  189. package/dist/config/yamlConfig.d.ts +0 -722
  190. package/dist/config/yamlConfig.js +0 -702
  191. package/dist/functions/pathResolution.d.ts +0 -37
  192. package/dist/functions/pathResolution.js +0 -185
  193. package/dist/shared/attributeMapper.d.ts +0 -20
  194. package/dist/shared/attributeMapper.js +0 -203
  195. package/dist/shared/errorUtils.d.ts +0 -54
  196. package/dist/shared/errorUtils.js +0 -95
  197. package/dist/shared/functionManager.d.ts +0 -48
  198. package/dist/shared/functionManager.js +0 -336
  199. package/dist/shared/indexManager.d.ts +0 -24
  200. package/dist/shared/indexManager.js +0 -151
  201. package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
  202. package/dist/shared/jsonSchemaGenerator.js +0 -290
  203. package/dist/shared/logging.d.ts +0 -61
  204. package/dist/shared/logging.js +0 -116
  205. package/dist/shared/messageFormatter.d.ts +0 -39
  206. package/dist/shared/messageFormatter.js +0 -162
  207. package/dist/shared/pydanticModelGenerator.d.ts +0 -17
  208. package/dist/shared/pydanticModelGenerator.js +0 -615
  209. package/dist/shared/schemaGenerator.d.ts +0 -40
  210. package/dist/shared/schemaGenerator.js +0 -556
  211. package/dist/utils/ClientFactory.d.ts +0 -87
  212. package/dist/utils/ClientFactory.js +0 -212
  213. package/dist/utils/configDiscovery.d.ts +0 -78
  214. package/dist/utils/configDiscovery.js +0 -472
  215. package/dist/utils/constantsGenerator.d.ts +0 -31
  216. package/dist/utils/constantsGenerator.js +0 -321
  217. package/dist/utils/dataConverters.d.ts +0 -46
  218. package/dist/utils/dataConverters.js +0 -139
  219. package/dist/utils/directoryUtils.d.ts +0 -22
  220. package/dist/utils/directoryUtils.js +0 -59
  221. package/dist/utils/getClientFromConfig.d.ts +0 -39
  222. package/dist/utils/getClientFromConfig.js +0 -199
  223. package/dist/utils/helperFunctions.d.ts +0 -63
  224. package/dist/utils/helperFunctions.js +0 -156
  225. package/dist/utils/pathResolvers.d.ts +0 -53
  226. package/dist/utils/pathResolvers.js +0 -72
  227. package/dist/utils/projectConfig.d.ts +0 -119
  228. package/dist/utils/projectConfig.js +0 -171
  229. package/dist/utils/retryFailedPromises.d.ts +0 -2
  230. package/dist/utils/retryFailedPromises.js +0 -23
  231. package/dist/utils/sessionAuth.d.ts +0 -48
  232. package/dist/utils/sessionAuth.js +0 -164
  233. package/dist/utils/typeGuards.d.ts +0 -35
  234. package/dist/utils/typeGuards.js +0 -57
  235. package/dist/utils/validationRules.d.ts +0 -43
  236. package/dist/utils/validationRules.js +0 -42
  237. package/dist/utils/versionDetection.d.ts +0 -58
  238. package/dist/utils/versionDetection.js +0 -251
  239. package/dist/utils/yamlConverter.d.ts +0 -100
  240. package/dist/utils/yamlConverter.js +0 -428
  241. package/dist/utils/yamlLoader.d.ts +0 -70
  242. package/dist/utils/yamlLoader.js +0 -267
  243. package/src/adapters/AdapterFactory.ts +0 -510
  244. package/src/adapters/DatabaseAdapter.ts +0 -306
  245. package/src/adapters/LegacyAdapter.ts +0 -841
  246. package/src/adapters/TablesDBAdapter.ts +0 -773
  247. package/src/config/ConfigManager.ts +0 -808
  248. package/src/config/README.md +0 -274
  249. package/src/config/configMigration.ts +0 -575
  250. package/src/config/configValidation.ts +0 -445
  251. package/src/config/index.ts +0 -10
  252. package/src/config/services/ConfigDiscoveryService.ts +0 -463
  253. package/src/config/services/ConfigLoaderService.ts +0 -740
  254. package/src/config/services/ConfigMergeService.ts +0 -388
  255. package/src/config/services/ConfigValidationService.ts +0 -394
  256. package/src/config/services/SessionAuthService.ts +0 -565
  257. package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
  258. package/src/config/services/index.ts +0 -29
  259. package/src/config/yamlConfig.ts +0 -761
  260. package/src/functions/pathResolution.ts +0 -227
  261. package/src/shared/attributeMapper.ts +0 -229
  262. package/src/shared/errorUtils.ts +0 -110
  263. package/src/shared/functionManager.ts +0 -525
  264. package/src/shared/indexManager.ts +0 -254
  265. package/src/shared/jsonSchemaGenerator.ts +0 -383
  266. package/src/shared/logging.ts +0 -149
  267. package/src/shared/messageFormatter.ts +0 -208
  268. package/src/shared/pydanticModelGenerator.ts +0 -618
  269. package/src/shared/schemaGenerator.ts +0 -644
  270. package/src/utils/ClientFactory.ts +0 -240
  271. package/src/utils/configDiscovery.ts +0 -557
  272. package/src/utils/constantsGenerator.ts +0 -369
  273. package/src/utils/dataConverters.ts +0 -159
  274. package/src/utils/directoryUtils.ts +0 -61
  275. package/src/utils/getClientFromConfig.ts +0 -257
  276. package/src/utils/helperFunctions.ts +0 -228
  277. package/src/utils/pathResolvers.ts +0 -81
  278. package/src/utils/projectConfig.ts +0 -299
  279. package/src/utils/retryFailedPromises.ts +0 -29
  280. package/src/utils/sessionAuth.ts +0 -230
  281. package/src/utils/typeGuards.ts +0 -65
  282. package/src/utils/validationRules.ts +0 -88
  283. package/src/utils/versionDetection.ts +0 -292
  284. package/src/utils/yamlConverter.ts +0 -542
  285. 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
+ };