@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.
- package/CHANGELOG.md +16 -0
- package/CONFIG_TODO.md +1189 -0
- package/SELECTION_DIALOGS.md +146 -0
- package/SERVICE_IMPLEMENTATION_REPORT.md +462 -0
- package/dist/adapters/index.d.ts +7 -8
- package/dist/adapters/index.js +7 -9
- package/dist/backups/operations/bucketBackup.js +2 -2
- package/dist/backups/operations/collectionBackup.d.ts +1 -1
- package/dist/backups/operations/collectionBackup.js +3 -3
- package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
- package/dist/backups/operations/comprehensiveBackup.js +2 -2
- package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
- package/dist/backups/tracking/centralizedTracking.js +2 -2
- package/dist/cli/commands/configCommands.js +51 -7
- package/dist/cli/commands/databaseCommands.d.ts +1 -0
- package/dist/cli/commands/databaseCommands.js +119 -9
- package/dist/cli/commands/functionCommands.js +3 -3
- package/dist/cli/commands/importFileCommands.d.ts +7 -0
- package/dist/cli/commands/importFileCommands.js +674 -0
- package/dist/cli/commands/schemaCommands.js +3 -3
- package/dist/cli/commands/storageCommands.js +2 -3
- package/dist/cli/commands/transferCommands.js +3 -5
- package/dist/collections/attributes.d.ts +1 -1
- package/dist/collections/attributes.js +2 -35
- package/dist/collections/indexes.js +1 -3
- package/dist/collections/methods.d.ts +1 -1
- package/dist/collections/methods.js +111 -192
- package/dist/collections/tableOperations.d.ts +1 -0
- package/dist/collections/tableOperations.js +55 -23
- package/dist/collections/transferOperations.d.ts +1 -1
- package/dist/collections/transferOperations.js +3 -4
- package/dist/collections/wipeOperations.d.ts +4 -3
- package/dist/collections/wipeOperations.js +112 -39
- package/dist/databases/methods.js +2 -2
- package/dist/databases/setup.js +2 -2
- package/dist/examples/yamlTerminologyExample.js +2 -2
- package/dist/functions/deployments.d.ts +1 -1
- package/dist/functions/deployments.js +5 -5
- package/dist/functions/fnConfigDiscovery.js +2 -2
- package/dist/functions/methods.js +16 -4
- package/dist/init.js +1 -1
- package/dist/interactiveCLI.d.ts +6 -1
- package/dist/interactiveCLI.js +63 -9
- package/dist/main.js +130 -177
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +1 -1
- package/dist/migrations/appwriteToX.js +9 -7
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- package/dist/migrations/dataLoader.js +2 -5
- package/dist/migrations/importController.js +3 -4
- package/dist/migrations/importDataActions.js +3 -3
- package/dist/migrations/relationships.js +1 -2
- package/dist/migrations/services/DataTransformationService.js +2 -2
- package/dist/migrations/services/FileHandlerService.js +1 -1
- package/dist/migrations/services/ImportOrchestrator.js +4 -4
- package/dist/migrations/services/RateLimitManager.js +1 -1
- package/dist/migrations/services/RelationshipResolver.js +1 -1
- package/dist/migrations/services/UserMappingService.js +1 -1
- package/dist/migrations/services/ValidationService.js +1 -1
- package/dist/migrations/transfer.d.ts +8 -4
- package/dist/migrations/transfer.js +106 -55
- package/dist/migrations/yaml/YamlImportConfigLoader.js +1 -1
- package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
- package/dist/migrations/yaml/generateImportSchemas.js +1 -1
- package/dist/setupCommands.d.ts +1 -1
- package/dist/setupCommands.js +5 -6
- package/dist/setupController.js +1 -1
- package/dist/shared/backupTracking.d.ts +1 -1
- package/dist/shared/backupTracking.js +2 -2
- package/dist/shared/confirmationDialogs.js +1 -1
- package/dist/shared/migrationHelpers.d.ts +1 -1
- package/dist/shared/migrationHelpers.js +3 -3
- package/dist/shared/operationQueue.d.ts +1 -1
- package/dist/shared/operationQueue.js +2 -3
- package/dist/shared/operationsTable.d.ts +1 -1
- package/dist/shared/operationsTable.js +2 -2
- package/dist/shared/progressManager.js +1 -1
- package/dist/shared/selectionDialogs.js +9 -8
- package/dist/storage/methods.js +4 -4
- package/dist/storage/schemas.d.ts +2 -2
- package/dist/tables/indexManager.d.ts +65 -0
- package/dist/tables/indexManager.js +294 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/users/methods.js +2 -3
- package/dist/utils/configMigration.js +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/loadConfigs.d.ts +2 -2
- package/dist/utils/loadConfigs.js +6 -7
- package/dist/utils/setupFiles.js +5 -7
- package/dist/utilsController.d.ts +15 -8
- package/dist/utilsController.js +57 -28
- package/package.json +7 -3
- package/src/adapters/index.ts +8 -34
- package/src/backups/operations/bucketBackup.ts +2 -2
- package/src/backups/operations/collectionBackup.ts +4 -4
- package/src/backups/operations/comprehensiveBackup.ts +3 -3
- package/src/backups/tracking/centralizedTracking.ts +3 -3
- package/src/cli/commands/configCommands.ts +72 -8
- package/src/cli/commands/databaseCommands.ts +161 -9
- package/src/cli/commands/functionCommands.ts +4 -3
- package/src/cli/commands/importFileCommands.ts +815 -0
- package/src/cli/commands/schemaCommands.ts +3 -3
- package/src/cli/commands/storageCommands.ts +2 -3
- package/src/cli/commands/transferCommands.ts +3 -6
- package/src/collections/attributes.ts +3 -39
- package/src/collections/indexes.ts +2 -4
- package/src/collections/methods.ts +115 -150
- package/src/collections/tableOperations.ts +57 -21
- package/src/collections/transferOperations.ts +4 -5
- package/src/collections/wipeOperations.ts +154 -51
- package/src/databases/methods.ts +2 -2
- package/src/databases/setup.ts +2 -2
- package/src/examples/yamlTerminologyExample.ts +2 -2
- package/src/functions/deployments.ts +6 -5
- package/src/functions/fnConfigDiscovery.ts +2 -2
- package/src/functions/methods.ts +17 -4
- package/src/init.ts +1 -1
- package/src/interactiveCLI.ts +75 -10
- package/src/main.ts +143 -287
- package/src/migrations/afterImportActions.ts +2 -3
- package/src/migrations/appwriteToX.ts +12 -8
- package/src/migrations/comprehensiveTransfer.ts +6 -6
- package/src/migrations/dataLoader.ts +2 -5
- package/src/migrations/importController.ts +3 -4
- package/src/migrations/importDataActions.ts +3 -3
- package/src/migrations/relationships.ts +1 -2
- package/src/migrations/services/DataTransformationService.ts +2 -2
- package/src/migrations/services/FileHandlerService.ts +1 -1
- package/src/migrations/services/ImportOrchestrator.ts +4 -4
- package/src/migrations/services/RateLimitManager.ts +1 -1
- package/src/migrations/services/RelationshipResolver.ts +1 -1
- package/src/migrations/services/UserMappingService.ts +1 -1
- package/src/migrations/services/ValidationService.ts +1 -1
- package/src/migrations/transfer.ts +126 -83
- package/src/migrations/yaml/YamlImportConfigLoader.ts +1 -1
- package/src/migrations/yaml/YamlImportIntegration.ts +2 -2
- package/src/migrations/yaml/generateImportSchemas.ts +1 -1
- package/src/setupCommands.ts +5 -6
- package/src/setupController.ts +1 -1
- package/src/shared/backupTracking.ts +3 -3
- package/src/shared/confirmationDialogs.ts +1 -1
- package/src/shared/migrationHelpers.ts +4 -4
- package/src/shared/operationQueue.ts +3 -4
- package/src/shared/operationsTable.ts +3 -3
- package/src/shared/progressManager.ts +1 -1
- package/src/shared/selectionDialogs.ts +9 -8
- package/src/storage/methods.ts +4 -4
- package/src/tables/indexManager.ts +409 -0
- package/src/types.ts +2 -2
- package/src/users/methods.ts +2 -3
- package/src/utils/configMigration.ts +1 -1
- package/src/utils/index.ts +1 -1
- package/src/utils/loadConfigs.ts +15 -7
- package/src/utils/setupFiles.ts +5 -7
- package/src/utilsController.ts +86 -32
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -405
- package/dist/adapters/DatabaseAdapter.d.ts +0 -233
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -612
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -571
- package/dist/config/ConfigManager.d.ts +0 -445
- package/dist/config/ConfigManager.js +0 -625
- package/dist/config/configMigration.d.ts +0 -87
- package/dist/config/configMigration.js +0 -390
- package/dist/config/configValidation.d.ts +0 -66
- package/dist/config/configValidation.js +0 -358
- package/dist/config/index.d.ts +0 -8
- package/dist/config/index.js +0 -7
- package/dist/config/services/ConfigDiscoveryService.d.ts +0 -126
- package/dist/config/services/ConfigDiscoveryService.js +0 -374
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -540
- package/dist/config/services/ConfigMergeService.d.ts +0 -208
- package/dist/config/services/ConfigMergeService.js +0 -308
- package/dist/config/services/ConfigValidationService.d.ts +0 -214
- package/dist/config/services/ConfigValidationService.js +0 -310
- package/dist/config/services/SessionAuthService.d.ts +0 -225
- package/dist/config/services/SessionAuthService.js +0 -456
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
- package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
- package/dist/config/services/index.d.ts +0 -13
- package/dist/config/services/index.js +0 -10
- package/dist/config/yamlConfig.d.ts +0 -722
- package/dist/config/yamlConfig.js +0 -702
- package/dist/functions/pathResolution.d.ts +0 -37
- package/dist/functions/pathResolution.js +0 -185
- package/dist/shared/attributeMapper.d.ts +0 -20
- package/dist/shared/attributeMapper.js +0 -203
- package/dist/shared/errorUtils.d.ts +0 -54
- package/dist/shared/errorUtils.js +0 -95
- package/dist/shared/functionManager.d.ts +0 -48
- package/dist/shared/functionManager.js +0 -336
- package/dist/shared/indexManager.d.ts +0 -24
- package/dist/shared/indexManager.js +0 -151
- package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
- package/dist/shared/jsonSchemaGenerator.js +0 -290
- package/dist/shared/logging.d.ts +0 -61
- package/dist/shared/logging.js +0 -116
- package/dist/shared/messageFormatter.d.ts +0 -39
- package/dist/shared/messageFormatter.js +0 -162
- package/dist/shared/pydanticModelGenerator.d.ts +0 -17
- package/dist/shared/pydanticModelGenerator.js +0 -615
- package/dist/shared/schemaGenerator.d.ts +0 -40
- package/dist/shared/schemaGenerator.js +0 -556
- package/dist/utils/ClientFactory.d.ts +0 -87
- package/dist/utils/ClientFactory.js +0 -212
- package/dist/utils/configDiscovery.d.ts +0 -78
- package/dist/utils/configDiscovery.js +0 -472
- package/dist/utils/constantsGenerator.d.ts +0 -31
- package/dist/utils/constantsGenerator.js +0 -321
- package/dist/utils/dataConverters.d.ts +0 -46
- package/dist/utils/dataConverters.js +0 -139
- package/dist/utils/directoryUtils.d.ts +0 -22
- package/dist/utils/directoryUtils.js +0 -59
- package/dist/utils/getClientFromConfig.d.ts +0 -39
- package/dist/utils/getClientFromConfig.js +0 -199
- package/dist/utils/helperFunctions.d.ts +0 -63
- package/dist/utils/helperFunctions.js +0 -156
- package/dist/utils/pathResolvers.d.ts +0 -53
- package/dist/utils/pathResolvers.js +0 -72
- package/dist/utils/projectConfig.d.ts +0 -119
- package/dist/utils/projectConfig.js +0 -171
- package/dist/utils/retryFailedPromises.d.ts +0 -2
- package/dist/utils/retryFailedPromises.js +0 -23
- package/dist/utils/sessionAuth.d.ts +0 -48
- package/dist/utils/sessionAuth.js +0 -164
- package/dist/utils/typeGuards.d.ts +0 -35
- package/dist/utils/typeGuards.js +0 -57
- package/dist/utils/validationRules.d.ts +0 -43
- package/dist/utils/validationRules.js +0 -42
- package/dist/utils/versionDetection.d.ts +0 -58
- package/dist/utils/versionDetection.js +0 -251
- package/dist/utils/yamlConverter.d.ts +0 -100
- package/dist/utils/yamlConverter.js +0 -428
- package/dist/utils/yamlLoader.d.ts +0 -70
- package/dist/utils/yamlLoader.js +0 -267
- package/src/adapters/AdapterFactory.ts +0 -510
- package/src/adapters/DatabaseAdapter.ts +0 -306
- package/src/adapters/LegacyAdapter.ts +0 -841
- package/src/adapters/TablesDBAdapter.ts +0 -773
- package/src/config/ConfigManager.ts +0 -808
- package/src/config/README.md +0 -274
- package/src/config/configMigration.ts +0 -575
- package/src/config/configValidation.ts +0 -445
- package/src/config/index.ts +0 -10
- package/src/config/services/ConfigDiscoveryService.ts +0 -463
- package/src/config/services/ConfigLoaderService.ts +0 -740
- package/src/config/services/ConfigMergeService.ts +0 -388
- package/src/config/services/ConfigValidationService.ts +0 -394
- package/src/config/services/SessionAuthService.ts +0 -565
- package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
- package/src/config/services/index.ts +0 -29
- package/src/config/yamlConfig.ts +0 -761
- package/src/functions/pathResolution.ts +0 -227
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -525
- package/src/shared/indexManager.ts +0 -254
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -299
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- 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
|
|
5
|
-
import { logger } from
|
|
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
|
|
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
|
|
2
|
-
import { tryAwaitWithRetry } from "
|
|
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
|
|
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 "
|
|
5
|
-
import { createMigrationPlan, executeMigrationPlan, saveMigrationResult, } from
|
|
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("
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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
|
|
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(
|
|
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 =
|
|
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,
|
|
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,
|
|
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
|
|
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 "
|
|
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
|
+
};
|