appwrite-utils-cli 1.9.7 → 1.12.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/README.md +1004 -1004
- 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.js +156 -104
- 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 → columns.d.ts} +1 -1
- package/dist/collections/{attributes.js → columns.js} +15 -9
- package/dist/collections/indexes.js +1 -3
- package/dist/collections/methods.d.ts +1 -1
- package/dist/collections/methods.js +38 -20
- package/dist/collections/tableOperations.d.ts +1 -0
- package/dist/collections/tableOperations.js +30 -11
- 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 +6 -6
- package/dist/functions/fnConfigDiscovery.js +2 -2
- package/dist/functions/methods.js +2 -2
- package/dist/functions/templates/count-docs-in-collection/README.md +53 -53
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -159
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +8 -8
- package/dist/functions/templates/hono-typescript/README.md +285 -285
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
- package/dist/functions/templates/hono-typescript/src/app.ts +179 -179
- package/dist/functions/templates/hono-typescript/src/context.ts +102 -102
- package/{src/functions/templates/hono-typescript/src/index.ts → dist/functions/templates/hono-typescript/src/main.ts} +53 -53
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
- package/dist/functions/templates/typescript-node/README.md +31 -31
- package/dist/functions/templates/typescript-node/src/context.ts +102 -102
- package/dist/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
- package/dist/functions/templates/uv/README.md +30 -30
- package/dist/functions/templates/uv/pyproject.toml +29 -29
- package/dist/functions/templates/uv/src/context.py +124 -124
- package/dist/functions/templates/uv/src/{index.py → main.py} +45 -45
- package/dist/init.js +1 -1
- package/dist/interactiveCLI.d.ts +6 -1
- package/dist/interactiveCLI.js +79 -25
- package/dist/main.js +125 -180
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +1 -1
- package/dist/migrations/appwriteToX.js +10 -8
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- package/dist/migrations/dataLoader.d.ts +4 -2
- package/dist/migrations/dataLoader.js +42 -20
- package/dist/migrations/importController.d.ts +2 -0
- package/dist/migrations/importController.js +39 -24
- 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.d.ts +2 -0
- package/dist/migrations/services/ImportOrchestrator.js +15 -7
- 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 +108 -55
- package/dist/migrations/yaml/YamlImportConfigLoader.js +52 -52
- package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
- package/dist/migrations/yaml/generateImportSchemas.js +174 -174
- 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 +4 -4
- package/dist/shared/operationQueue.d.ts +1 -1
- package/dist/shared/operationQueue.js +3 -4
- package/dist/shared/operationsTable.d.ts +1 -1
- package/dist/shared/operationsTable.js +35 -34
- package/dist/shared/operationsTableSchema.d.ts +3 -3
- package/dist/shared/operationsTableSchema.js +2 -2
- package/dist/shared/progressManager.js +1 -1
- package/dist/shared/selectionDialogs.d.ts +6 -0
- package/dist/shared/selectionDialogs.js +56 -12
- package/dist/storage/methods.d.ts +12 -0
- package/dist/storage/methods.js +92 -89
- package/dist/storage/schemas.d.ts +2 -2
- package/dist/tables/indexManager.d.ts +1 -1
- package/dist/tables/indexManager.js +2 -2
- 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 +139 -141
- package/dist/utilsController.d.ts +16 -9
- package/dist/utilsController.js +93 -68
- package/package.json +9 -3
- package/.appwrite/.yaml_schemas/appwrite-config.schema.json +0 -380
- package/.appwrite/.yaml_schemas/collection.schema.json +0 -255
- package/.appwrite/collections/Categories.yaml +0 -182
- package/.appwrite/collections/ExampleCollection.yaml +0 -36
- package/.appwrite/collections/Posts.yaml +0 -227
- package/.appwrite/collections/Users.yaml +0 -149
- package/.appwrite/config.yaml +0 -109
- package/.appwrite/import/README.md +0 -148
- package/.appwrite/import/categories-import.yaml +0 -129
- package/.appwrite/import/posts-import.yaml +0 -208
- package/.appwrite/import/users-import.yaml +0 -130
- package/.appwrite/importData/categories.json +0 -194
- package/.appwrite/importData/posts.json +0 -270
- package/.appwrite/importData/users.json +0 -220
- package/.appwrite/schemas/categories.json +0 -128
- package/.appwrite/schemas/exampleCollection.json +0 -52
- package/.appwrite/schemas/posts.json +0 -173
- package/.appwrite/schemas/users.json +0 -125
- package/CHANGELOG.md +0 -35
- package/CONFIG_TODO.md +0 -1189
- package/SELECTION_DIALOGS.md +0 -146
- package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -420
- package/dist/adapters/DatabaseAdapter.d.ts +0 -243
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -615
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -611
- package/dist/config/ConfigManager.d.ts +0 -450
- package/dist/config/ConfigManager.js +0 -650
- 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 -122
- package/dist/config/services/ConfigDiscoveryService.js +0 -322
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -535
- 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/functions/templates/count-docs-in-collection/package.json +0 -25
- package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/dist/functions/templates/hono-typescript/package.json +0 -26
- package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
- package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/dist/functions/templates/typescript-node/package.json +0 -25
- package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
- 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 -348
- 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 -122
- package/dist/utils/projectConfig.js +0 -206
- 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/scripts/copy-templates.ts +0 -23
- package/src/adapters/AdapterFactory.ts +0 -529
- package/src/adapters/DatabaseAdapter.ts +0 -319
- package/src/adapters/LegacyAdapter.ts +0 -844
- package/src/adapters/TablesDBAdapter.ts +0 -823
- package/src/adapters/index.ts +0 -37
- package/src/backups/operations/bucketBackup.ts +0 -277
- package/src/backups/operations/collectionBackup.ts +0 -310
- package/src/backups/operations/comprehensiveBackup.ts +0 -342
- package/src/backups/schemas/bucketManifest.ts +0 -78
- package/src/backups/schemas/comprehensiveManifest.ts +0 -76
- package/src/backups/tracking/centralizedTracking.ts +0 -352
- package/src/cli/commands/configCommands.ts +0 -201
- package/src/cli/commands/databaseCommands.ts +0 -879
- package/src/cli/commands/functionCommands.ts +0 -418
- package/src/cli/commands/schemaCommands.ts +0 -200
- package/src/cli/commands/storageCommands.ts +0 -152
- package/src/cli/commands/transferCommands.ts +0 -457
- package/src/collections/attributes.ts +0 -2020
- package/src/collections/attributes.ts.backup +0 -1555
- package/src/collections/indexes.ts +0 -352
- package/src/collections/methods.ts +0 -700
- package/src/collections/tableOperations.ts +0 -521
- package/src/collections/transferOperations.ts +0 -590
- package/src/collections/wipeOperations.ts +0 -346
- package/src/config/ConfigManager.ts +0 -849
- 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 -410
- package/src/config/services/ConfigLoaderService.ts +0 -732
- 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/databases/methods.ts +0 -49
- package/src/databases/setup.ts +0 -77
- package/src/examples/yamlTerminologyExample.ts +0 -346
- package/src/functions/deployments.ts +0 -220
- package/src/functions/fnConfigDiscovery.ts +0 -103
- package/src/functions/methods.ts +0 -284
- package/src/functions/pathResolution.ts +0 -227
- package/src/functions/templates/count-docs-in-collection/README.md +0 -54
- package/src/functions/templates/count-docs-in-collection/package.json +0 -25
- package/src/functions/templates/count-docs-in-collection/src/main.ts +0 -159
- package/src/functions/templates/count-docs-in-collection/src/request.ts +0 -9
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/src/functions/templates/hono-typescript/README.md +0 -286
- package/src/functions/templates/hono-typescript/package.json +0 -26
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
- package/src/functions/templates/hono-typescript/src/app.ts +0 -180
- package/src/functions/templates/hono-typescript/src/context.ts +0 -103
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
- package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/src/functions/templates/typescript-node/README.md +0 -32
- package/src/functions/templates/typescript-node/package.json +0 -25
- package/src/functions/templates/typescript-node/src/context.ts +0 -103
- package/src/functions/templates/typescript-node/src/index.ts +0 -29
- package/src/functions/templates/typescript-node/tsconfig.json +0 -28
- package/src/functions/templates/uv/README.md +0 -31
- package/src/functions/templates/uv/pyproject.toml +0 -30
- package/src/functions/templates/uv/src/__init__.py +0 -0
- package/src/functions/templates/uv/src/context.py +0 -125
- package/src/functions/templates/uv/src/index.py +0 -46
- package/src/init.ts +0 -62
- package/src/interactiveCLI.ts +0 -1136
- package/src/main.ts +0 -1670
- package/src/migrations/afterImportActions.ts +0 -580
- package/src/migrations/appwriteToX.ts +0 -664
- package/src/migrations/comprehensiveTransfer.ts +0 -2285
- package/src/migrations/dataLoader.ts +0 -1702
- package/src/migrations/importController.ts +0 -428
- package/src/migrations/importDataActions.ts +0 -315
- package/src/migrations/relationships.ts +0 -334
- package/src/migrations/services/DataTransformationService.ts +0 -196
- package/src/migrations/services/FileHandlerService.ts +0 -311
- package/src/migrations/services/ImportOrchestrator.ts +0 -666
- package/src/migrations/services/RateLimitManager.ts +0 -363
- package/src/migrations/services/RelationshipResolver.ts +0 -461
- package/src/migrations/services/UserMappingService.ts +0 -345
- package/src/migrations/services/ValidationService.ts +0 -349
- package/src/migrations/transfer.ts +0 -1068
- package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
- package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
- package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
- package/src/schemas/authUser.ts +0 -23
- package/src/setup.ts +0 -8
- package/src/setupCommands.ts +0 -603
- package/src/setupController.ts +0 -43
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/backupMetadataSchema.ts +0 -93
- package/src/shared/backupTracking.ts +0 -211
- package/src/shared/confirmationDialogs.ts +0 -327
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -537
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/migrationHelpers.ts +0 -232
- package/src/shared/operationLogger.ts +0 -20
- package/src/shared/operationQueue.ts +0 -377
- package/src/shared/operationsTable.ts +0 -338
- package/src/shared/operationsTableSchema.ts +0 -60
- package/src/shared/progressManager.ts +0 -278
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/relationshipExtractor.ts +0 -214
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/shared/selectionDialogs.ts +0 -749
- package/src/storage/backupCompression.ts +0 -88
- package/src/storage/methods.ts +0 -698
- package/src/storage/schemas.ts +0 -205
- package/src/tables/indexManager.ts +0 -409
- package/src/types/node-appwrite-tablesdb.d.ts +0 -44
- package/src/types.ts +0 -9
- package/src/users/methods.ts +0 -359
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/configMigration.ts +0 -348
- 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/index.ts +0 -2
- package/src/utils/loadConfigs.ts +0 -449
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -340
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/setupFiles.ts +0 -1238
- 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
- package/src/utilsController.ts +0 -1213
- package/tests/README.md +0 -497
- package/tests/adapters/AdapterFactory.test.ts +0 -277
- package/tests/integration/syncOperations.test.ts +0 -463
- package/tests/jest.config.js +0 -25
- package/tests/migration/configMigration.test.ts +0 -546
- package/tests/setup.ts +0 -62
- package/tests/testUtils.ts +0 -340
- package/tests/utils/loadConfigs.test.ts +0 -350
- package/tests/validation/configValidation.test.ts +0 -412
- package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
- package/tsconfig.json +0 -44
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
2
|
import path from "path";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import { MessageFormatter } from
|
|
5
|
-
import { SchemaGenerator } from
|
|
4
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
5
|
+
import { SchemaGenerator } from 'appwrite-utils-helpers';
|
|
6
6
|
import { setupDirsFiles } from "../../utils/setupFiles.js";
|
|
7
7
|
import { fetchAllDatabases } from "../../databases/methods.js";
|
|
8
8
|
export const schemaCommands = {
|
|
@@ -112,7 +112,7 @@ export const schemaCommands = {
|
|
|
112
112
|
},
|
|
113
113
|
]);
|
|
114
114
|
try {
|
|
115
|
-
const { ConstantsGenerator } = await import("
|
|
115
|
+
const { ConstantsGenerator } = await import("appwrite-utils-helpers");
|
|
116
116
|
const generator = new ConstantsGenerator(cli.controller.config);
|
|
117
117
|
const include = {
|
|
118
118
|
databases: includeWhat.includes('databases'),
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { Storage, Permission, Role, Compression } from "node-appwrite";
|
|
4
|
-
import { MessageFormatter } from
|
|
4
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
5
5
|
import { listBuckets, createBucket as createBucketApi, deleteBucket as deleteBucketApi } from "../../storage/methods.js";
|
|
6
|
-
import { writeYamlConfig } from "
|
|
7
|
-
import { ConfigManager } from "../../config/ConfigManager.js";
|
|
6
|
+
import { writeYamlConfig, ConfigManager } from "appwrite-utils-helpers";
|
|
8
7
|
export const storageCommands = {
|
|
9
8
|
async createBucket(cli) {
|
|
10
9
|
const storage = cli.controller.storage;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
2
|
import { Databases, Storage } from "node-appwrite";
|
|
3
|
-
import { MessageFormatter } from
|
|
3
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
4
4
|
import { fetchAllDatabases } from "../../databases/methods.js";
|
|
5
5
|
import { listBuckets } from "../../storage/methods.js";
|
|
6
|
-
import { getClient } from "
|
|
6
|
+
import { getClient } from "appwrite-utils-helpers";
|
|
7
7
|
import { ComprehensiveTransfer } from "../../migrations/comprehensiveTransfer.js";
|
|
8
8
|
export const transferCommands = {
|
|
9
9
|
async transferData(cli) {
|
|
@@ -91,9 +91,7 @@ export const transferCommands = {
|
|
|
91
91
|
fromDb,
|
|
92
92
|
targetDb,
|
|
93
93
|
isRemote,
|
|
94
|
-
collections: selectedCollections.
|
|
95
|
-
? selectedCollections.map((c) => c.$id)
|
|
96
|
-
: undefined,
|
|
94
|
+
collections: selectedCollections.map((c) => c.$id),
|
|
97
95
|
sourceBucket,
|
|
98
96
|
targetBucket,
|
|
99
97
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Databases, type Models } from "node-appwrite";
|
|
2
2
|
import { type Attribute } from "appwrite-utils";
|
|
3
|
-
import type { DatabaseAdapter } from "
|
|
3
|
+
import type { DatabaseAdapter } from "appwrite-utils-helpers";
|
|
4
4
|
/**
|
|
5
5
|
* Enhanced attribute creation with proper status monitoring and retry logic
|
|
6
6
|
*/
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { Query } from "node-appwrite";
|
|
2
2
|
import { attributeSchema, parseAttribute, } from "appwrite-utils";
|
|
3
3
|
import { nameToIdMapping, enqueueOperation, markAttributeProcessed, isAttributeProcessed, } from "../shared/operationQueue.js";
|
|
4
|
-
import { delay, tryAwaitWithRetry, calculateExponentialBackoff, } from "
|
|
4
|
+
import { delay, tryAwaitWithRetry, calculateExponentialBackoff, } from "appwrite-utils-helpers";
|
|
5
5
|
import chalk from "chalk";
|
|
6
6
|
import { Decimal } from "decimal.js";
|
|
7
|
-
import { logger } from "
|
|
8
|
-
import { MessageFormatter } from "../shared/messageFormatter.js";
|
|
9
|
-
import { isDatabaseAdapter } from "../utils/typeGuards.js";
|
|
7
|
+
import { logger, MessageFormatter, isDatabaseAdapter } from "appwrite-utils-helpers";
|
|
10
8
|
// Extreme values that Appwrite may return, which should be treated as undefined
|
|
11
9
|
const EXTREME_MIN_INTEGER = -9223372036854776000;
|
|
12
10
|
const EXTREME_MAX_INTEGER = 9223372036854776000;
|
|
13
11
|
const EXTREME_MIN_FLOAT = -1.7976931348623157e308;
|
|
14
12
|
const EXTREME_MAX_FLOAT = 1.7976931348623157e308;
|
|
13
|
+
/** Get columns/attributes array, preferring modern 'columns' over legacy 'attributes' */
|
|
14
|
+
function getColumns(obj) {
|
|
15
|
+
return obj.columns || obj.attributes || [];
|
|
16
|
+
}
|
|
15
17
|
/**
|
|
16
18
|
* Type guard to check if an attribute has min/max properties
|
|
17
19
|
*/
|
|
@@ -560,7 +562,7 @@ retryCount = 0, maxRetries = 5) => {
|
|
|
560
562
|
const collection = isDatabaseAdapter(db)
|
|
561
563
|
? (await db.getTable({ databaseId: dbId, tableId: collectionId })).data
|
|
562
564
|
: await db.getCollection(dbId, collectionId);
|
|
563
|
-
const attribute = collection.
|
|
565
|
+
const attribute = getColumns(collection).find((attr) => attr.key === attributeKey);
|
|
564
566
|
if (!attribute) {
|
|
565
567
|
MessageFormatter.error(`Attribute '${attributeKey}' not found`);
|
|
566
568
|
return false;
|
|
@@ -933,7 +935,7 @@ export const createOrUpdateAttribute = async (db, dbId, collection, attribute) =
|
|
|
933
935
|
const updateEnabled = true;
|
|
934
936
|
let finalAttribute = attribute;
|
|
935
937
|
try {
|
|
936
|
-
const collectionAttr = collection.
|
|
938
|
+
const collectionAttr = getColumns(collection).find((attr) => attr.key === attribute.key);
|
|
937
939
|
foundAttribute = parseAttribute(collectionAttr);
|
|
938
940
|
}
|
|
939
941
|
catch (error) {
|
|
@@ -955,7 +957,11 @@ export const createOrUpdateAttribute = async (db, dbId, collection, attribute) =
|
|
|
955
957
|
await db.deleteAttribute(dbId, collection.$id, attribute.key);
|
|
956
958
|
}
|
|
957
959
|
// Remove from local collection metadata so downstream logic treats it as new
|
|
958
|
-
|
|
960
|
+
const filtered = getColumns(collection).filter((attr) => attr.key !== attribute.key);
|
|
961
|
+
if ('columns' in collection)
|
|
962
|
+
collection.columns = filtered;
|
|
963
|
+
if ('attributes' in collection)
|
|
964
|
+
collection.attributes = filtered;
|
|
959
965
|
foundAttribute = undefined;
|
|
960
966
|
}
|
|
961
967
|
catch (deleteError) {
|
|
@@ -1128,7 +1134,7 @@ export const createOrUpdateAttribute = async (db, dbId, collection, attribute) =
|
|
|
1128
1134
|
* Enhanced collection attribute creation with proper status monitoring
|
|
1129
1135
|
*/
|
|
1130
1136
|
export const createUpdateCollectionAttributesWithStatusCheck = async (db, dbId, collection, attributes) => {
|
|
1131
|
-
const existingAttributes = collection.
|
|
1137
|
+
const existingAttributes = getColumns(collection).map((attr) => parseAttribute(attr)) || [];
|
|
1132
1138
|
const attributesToRemove = existingAttributes.filter((attr) => !attributes.some((a) => a.key === attr.key));
|
|
1133
1139
|
const indexesToRemove = collection.indexes.filter((index) => attributesToRemove.some((attr) => index.attributes.includes(attr.key)));
|
|
1134
1140
|
// Handle attribute removal first
|
|
@@ -1275,7 +1281,7 @@ export const createUpdateCollectionAttributesWithStatusCheck = async (db, dbId,
|
|
|
1275
1281
|
};
|
|
1276
1282
|
export const createUpdateCollectionAttributes = async (db, dbId, collection, attributes) => {
|
|
1277
1283
|
MessageFormatter.info(chalk.green(`Creating/Updating attributes for collection: ${collection.name}`));
|
|
1278
|
-
const existingAttributes = collection.
|
|
1284
|
+
const existingAttributes = getColumns(collection).map((attr) => parseAttribute(attr)) || [];
|
|
1279
1285
|
const attributesToRemove = existingAttributes.filter((attr) => !attributes.some((a) => a.key === attr.key));
|
|
1280
1286
|
const indexesToRemove = collection.indexes.filter((index) => attributesToRemove.some((attr) => index.attributes.includes(attr.key)));
|
|
1281
1287
|
if (attributesToRemove.length > 0) {
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { indexSchema } from "appwrite-utils";
|
|
2
2
|
import { Databases, IndexType, Query } from "node-appwrite";
|
|
3
|
-
import { delay, tryAwaitWithRetry, calculateExponentialBackoff } from "
|
|
4
|
-
import { isLegacyDatabases } from "../utils/typeGuards.js";
|
|
5
|
-
import { MessageFormatter } from "../shared/messageFormatter.js";
|
|
3
|
+
import { delay, tryAwaitWithRetry, calculateExponentialBackoff, isLegacyDatabases, MessageFormatter } from "appwrite-utils-helpers";
|
|
6
4
|
// System attributes that are always available for indexing in Appwrite
|
|
7
5
|
const SYSTEM_ATTRIBUTES = ['$id', '$createdAt', '$updatedAt', '$permissions'];
|
|
8
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Databases, type Models } from "node-appwrite";
|
|
2
2
|
import type { AppwriteConfig, CollectionCreate } from "appwrite-utils";
|
|
3
|
-
import type { DatabaseAdapter } from "
|
|
3
|
+
import type { DatabaseAdapter } from "appwrite-utils-helpers";
|
|
4
4
|
export { wipeDatabase, wipeCollection, wipeAllTables, wipeTableRows, } from "./wipeOperations.js";
|
|
5
5
|
export { transferDocumentsBetweenDbsLocalToLocal, transferDocumentsBetweenDbsLocalToRemote, } from "./transferOperations.js";
|
|
6
6
|
export declare const documentExists: (db: Databases | DatabaseAdapter, dbId: string, targetCollectionId: string, toCreateObject: any) => Promise<Models.Document | null>;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
import { Databases, ID, Permission, Query, } from "node-appwrite";
|
|
2
|
-
import { getAdapterFromConfig } from "
|
|
2
|
+
import { getAdapterFromConfig } from "appwrite-utils-helpers";
|
|
3
3
|
import { nameToIdMapping, processQueue, queuedOperations, clearProcessingState, isCollectionProcessed, markCollectionProcessed, enqueueOperation } from "../shared/operationQueue.js";
|
|
4
|
-
import { logger } from "
|
|
4
|
+
import { logger, SchemaGenerator } from "appwrite-utils-helpers";
|
|
5
5
|
// Legacy attribute/index helpers removed in favor of unified adapter path
|
|
6
|
-
import { SchemaGenerator } from "../shared/schemaGenerator.js";
|
|
7
6
|
import { isNull, isUndefined, isNil, isPlainObject, isString, } from "es-toolkit";
|
|
8
|
-
import { delay, tryAwaitWithRetry } from "
|
|
9
|
-
import { MessageFormatter } from "
|
|
10
|
-
import { isLegacyDatabases } from "
|
|
11
|
-
import { mapToCreateAttributeParams, mapToUpdateAttributeParams } from "../shared/attributeMapper.js";
|
|
7
|
+
import { delay, tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
8
|
+
import { MessageFormatter, mapToCreateAttributeParams, mapToUpdateAttributeParams } from "appwrite-utils-helpers";
|
|
9
|
+
import { isLegacyDatabases } from "appwrite-utils-helpers";
|
|
12
10
|
import { diffTableColumns, isIndexEqualToIndex, diffColumnsDetailed, executeColumnOperations } from "./tableOperations.js";
|
|
13
11
|
import { createOrUpdateIndexesViaAdapter, deleteObsoleteIndexesViaAdapter } from "../tables/indexManager.js";
|
|
14
12
|
// Re-export wipe operations
|
|
@@ -63,18 +61,20 @@ export const documentExists = async (db, dbId, targetCollectionId, toCreateObjec
|
|
|
63
61
|
};
|
|
64
62
|
export const checkForCollection = async (db, dbId, collection) => {
|
|
65
63
|
try {
|
|
66
|
-
|
|
67
|
-
const
|
|
64
|
+
const isLegacy = isLegacyDatabases(db);
|
|
65
|
+
const entityType = isLegacy ? "Collection" : "Table";
|
|
66
|
+
MessageFormatter.progress(`Checking for ${entityType.toLowerCase()} with name: ${collection.name}`, { prefix: entityType + "s" });
|
|
67
|
+
const response = await tryAwaitWithRetry(async () => isLegacy ?
|
|
68
68
|
await db.listCollections(dbId, [Query.equal("name", collection.name)]) :
|
|
69
69
|
await db.listTables({ databaseId: dbId, queries: [Query.equal("name", collection.name)] }));
|
|
70
|
-
const items =
|
|
70
|
+
const items = isLegacy ? response.collections : (response.tables || response.collections);
|
|
71
71
|
if (items && items.length > 0) {
|
|
72
|
-
MessageFormatter.info(
|
|
72
|
+
MessageFormatter.info(`${entityType} found: ${items[0].$id}`, { prefix: entityType + "s" });
|
|
73
73
|
// Return remote collection for update operations (don't merge local config over it)
|
|
74
74
|
return items[0];
|
|
75
75
|
}
|
|
76
76
|
else {
|
|
77
|
-
MessageFormatter.info(`No
|
|
77
|
+
MessageFormatter.info(`No ${entityType.toLowerCase()} found with name: ${collection.name}`, { prefix: entityType + "s" });
|
|
78
78
|
return null;
|
|
79
79
|
}
|
|
80
80
|
}
|
|
@@ -92,27 +92,29 @@ export const checkForCollection = async (db, dbId, collection) => {
|
|
|
92
92
|
};
|
|
93
93
|
// Helper function to fetch and cache collection by name
|
|
94
94
|
export const fetchAndCacheCollectionByName = async (db, dbId, collectionName) => {
|
|
95
|
+
const isLegacy = isLegacyDatabases(db);
|
|
96
|
+
const entityType = isLegacy ? "Collection" : "Table";
|
|
95
97
|
if (nameToIdMapping.has(collectionName)) {
|
|
96
98
|
const collectionId = nameToIdMapping.get(collectionName);
|
|
97
|
-
MessageFormatter.debug(
|
|
98
|
-
return await tryAwaitWithRetry(async () =>
|
|
99
|
+
MessageFormatter.debug(`${entityType} found in cache: ${collectionId}`, undefined, { prefix: entityType + "s" });
|
|
100
|
+
return await tryAwaitWithRetry(async () => isLegacy ?
|
|
99
101
|
await db.getCollection(dbId, collectionId) :
|
|
100
102
|
await db.getTable({ databaseId: dbId, tableId: collectionId }));
|
|
101
103
|
}
|
|
102
104
|
else {
|
|
103
|
-
MessageFormatter.progress(`Fetching
|
|
104
|
-
const collectionsPulled = await tryAwaitWithRetry(async () =>
|
|
105
|
+
MessageFormatter.progress(`Fetching ${entityType.toLowerCase()} by name: ${collectionName}`, { prefix: entityType + "s" });
|
|
106
|
+
const collectionsPulled = await tryAwaitWithRetry(async () => isLegacy ?
|
|
105
107
|
await db.listCollections(dbId, [Query.equal("name", collectionName)]) :
|
|
106
108
|
await db.listTables({ databaseId: dbId, queries: [Query.equal("name", collectionName)] }));
|
|
107
|
-
const items =
|
|
109
|
+
const items = isLegacy ? collectionsPulled.collections : (collectionsPulled.tables || collectionsPulled.collections);
|
|
108
110
|
if ((collectionsPulled.total || items?.length) > 0) {
|
|
109
111
|
const collection = items[0];
|
|
110
|
-
MessageFormatter.info(
|
|
112
|
+
MessageFormatter.info(`${entityType} found: ${collection.$id}`, { prefix: entityType + "s" });
|
|
111
113
|
nameToIdMapping.set(collectionName, collection.$id);
|
|
112
114
|
return collection;
|
|
113
115
|
}
|
|
114
116
|
else {
|
|
115
|
-
MessageFormatter.warning(
|
|
117
|
+
MessageFormatter.warning(`${entityType} not found by name: ${collectionName}`, { prefix: entityType + "s" });
|
|
116
118
|
return undefined;
|
|
117
119
|
}
|
|
118
120
|
}
|
|
@@ -433,10 +435,26 @@ export const createOrUpdateCollectionsViaAdapter = async (adapter, databaseId, c
|
|
|
433
435
|
// Deletions: remove columns/attributes that are present remotely but not in desired config
|
|
434
436
|
try {
|
|
435
437
|
const desiredKeys = new Set((attributes || []).map((a) => a.key));
|
|
438
|
+
// Also track case-insensitive keys to avoid double-deletion of renames (handled as recreates)
|
|
439
|
+
const desiredKeysLower = new Set((attributes || []).map((a) => a.key?.toLowerCase()));
|
|
436
440
|
const tableInfo3 = await adapter.getTable({ databaseId, tableId });
|
|
437
441
|
const existingCols3 = tableInfo3.data?.columns || tableInfo3.data?.attributes || [];
|
|
438
442
|
const toDelete = existingCols3
|
|
439
|
-
.filter((col) =>
|
|
443
|
+
.filter((col) => {
|
|
444
|
+
if (!col?.key)
|
|
445
|
+
return false;
|
|
446
|
+
// Exact match - keep it
|
|
447
|
+
if (desiredKeys.has(col.key))
|
|
448
|
+
return false;
|
|
449
|
+
// Case-insensitive match (rename scenario) - already handled as recreate, don't delete again
|
|
450
|
+
if (desiredKeysLower.has(col.key?.toLowerCase()))
|
|
451
|
+
return false;
|
|
452
|
+
// Don't delete child-side relationship attributes - they're auto-managed by Appwrite
|
|
453
|
+
// for two-way relationships and deleting them would break the parent relationship
|
|
454
|
+
if (col.type === 'relationship' && col.side === 'child')
|
|
455
|
+
return false;
|
|
456
|
+
return true;
|
|
457
|
+
})
|
|
440
458
|
.map((col) => col.key);
|
|
441
459
|
if (toDelete.length > 0) {
|
|
442
460
|
MessageFormatter.info(`Plan → 🗑️ ${toDelete.length} (${toDelete.join(', ')})`, { prefix: 'Attributes' });
|
|
@@ -45,6 +45,7 @@ export declare function isIndexEqualToIndex(a: any, b: any): boolean;
|
|
|
45
45
|
/**
|
|
46
46
|
* Enhanced version of columns diff with detailed change analysis
|
|
47
47
|
* Order: desired first, then existing (matches internal usage here)
|
|
48
|
+
* Handles case-insensitive key matches as renames (recreates)
|
|
48
49
|
*/
|
|
49
50
|
export declare function diffColumnsDetailed(desiredAttributes: Attribute[], existingColumns: any[]): ColumnOperationPlan;
|
|
50
51
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mapToCreateAttributeParams, mapToUpdateAttributeParams } from "
|
|
1
|
+
import { mapToCreateAttributeParams, mapToUpdateAttributeParams } from "appwrite-utils-helpers";
|
|
2
2
|
import { Decimal } from "decimal.js";
|
|
3
3
|
const EXTREME_BOUND = new Decimal('1e12');
|
|
4
4
|
// Property configuration for different column types
|
|
@@ -312,29 +312,48 @@ function analyzeColumnChanges(oldColumn, newAttribute) {
|
|
|
312
312
|
/**
|
|
313
313
|
* Enhanced version of columns diff with detailed change analysis
|
|
314
314
|
* Order: desired first, then existing (matches internal usage here)
|
|
315
|
+
* Handles case-insensitive key matches as renames (recreates)
|
|
315
316
|
*/
|
|
316
317
|
export function diffColumnsDetailed(desiredAttributes, existingColumns) {
|
|
318
|
+
// Exact key lookup (case-sensitive)
|
|
317
319
|
const byKey = new Map((existingColumns || []).map((col) => [col?.key, col]));
|
|
320
|
+
// Case-insensitive key lookup for detecting renames
|
|
321
|
+
const byKeyLower = new Map((existingColumns || []).map((col) => [col?.key?.toLowerCase(), col]));
|
|
318
322
|
const toCreate = [];
|
|
319
323
|
const toUpdate = [];
|
|
320
324
|
const toRecreate = [];
|
|
321
325
|
const unchanged = [];
|
|
326
|
+
const handledExistingKeys = new Set(); // Track which existing columns we've handled
|
|
322
327
|
for (const attr of desiredAttributes || []) {
|
|
323
328
|
const key = attr?.key;
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
329
|
+
if (!key)
|
|
330
|
+
continue;
|
|
331
|
+
// First try exact match
|
|
332
|
+
const exactMatch = byKey.get(key);
|
|
333
|
+
if (exactMatch) {
|
|
334
|
+
handledExistingKeys.add(key);
|
|
335
|
+
const analysis = analyzeColumnChanges(exactMatch, attr);
|
|
336
|
+
if (!analysis.hasChanges)
|
|
337
|
+
unchanged.push(analysis.columnKey);
|
|
338
|
+
else if (analysis.requiresRecreate)
|
|
339
|
+
toRecreate.push({ oldAttribute: exactMatch, newAttribute: attr });
|
|
340
|
+
else
|
|
341
|
+
toUpdate.push({ attribute: attr, changes: analysis.changes });
|
|
327
342
|
continue;
|
|
328
343
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
344
|
+
// Check for case-insensitive match (rename scenario like oAuthAccounts -> oauthAccounts)
|
|
345
|
+
const caseInsensitiveMatch = byKeyLower.get(key.toLowerCase());
|
|
346
|
+
if (caseInsensitiveMatch && caseInsensitiveMatch.key !== key) {
|
|
347
|
+
// This is a rename - treat as recreate (delete old, create new)
|
|
348
|
+
handledExistingKeys.add(caseInsensitiveMatch.key);
|
|
349
|
+
toRecreate.push({ oldAttribute: caseInsensitiveMatch, newAttribute: attr });
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
// No match - it's a new attribute
|
|
353
|
+
toCreate.push(attr);
|
|
336
354
|
}
|
|
337
355
|
// Note: we keep toDelete empty for now (conservative behavior)
|
|
356
|
+
// Deletions are handled separately in methods.ts
|
|
338
357
|
return { toCreate, toUpdate, toRecreate, toDelete: [], unchanged };
|
|
339
358
|
}
|
|
340
359
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Databases } from "node-appwrite";
|
|
2
|
-
import type { DatabaseAdapter } from "
|
|
2
|
+
import type { DatabaseAdapter } from "appwrite-utils-helpers";
|
|
3
3
|
/**
|
|
4
4
|
* Transfers all documents from one collection to another in a different database
|
|
5
5
|
* within the same Appwrite Project
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Client, Databases, ID, Query, } from "node-appwrite";
|
|
2
|
-
import { tryAwaitWithRetry, delay, calculateExponentialBackoff } from "
|
|
3
|
-
import { MessageFormatter } from "../shared/messageFormatter.js";
|
|
2
|
+
import { tryAwaitWithRetry, delay, calculateExponentialBackoff, MessageFormatter } from "appwrite-utils-helpers";
|
|
4
3
|
import { chunk } from "es-toolkit";
|
|
5
|
-
import { isLegacyDatabases } from "
|
|
6
|
-
import { getAdapter } from "
|
|
4
|
+
import { isLegacyDatabases } from "appwrite-utils-helpers";
|
|
5
|
+
import { getAdapter } from "appwrite-utils-helpers";
|
|
7
6
|
/**
|
|
8
7
|
* Transfers all documents from one collection to another in a different database
|
|
9
8
|
* within the same Appwrite Project
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Databases } from "node-appwrite";
|
|
2
|
-
import type { DatabaseAdapter } from "
|
|
2
|
+
import type { DatabaseAdapter } from "appwrite-utils-helpers";
|
|
3
3
|
export declare const wipeDatabase: (database: Databases, databaseId: string) => Promise<{
|
|
4
4
|
collectionId: string;
|
|
5
5
|
collectionName: string;
|
|
@@ -10,7 +10,8 @@ export declare const wipeAllTables: (adapter: DatabaseAdapter, databaseId: strin
|
|
|
10
10
|
tableName: string;
|
|
11
11
|
}[]>;
|
|
12
12
|
/**
|
|
13
|
-
* Optimized deletion of all rows from a table
|
|
14
|
-
* Uses
|
|
13
|
+
* Optimized deletion of all rows from a table.
|
|
14
|
+
* Uses bulk deletion when possible, but falls back to individual row deletion
|
|
15
|
+
* for tables with relationship columns (bulk delete not supported for those).
|
|
15
16
|
*/
|
|
16
17
|
export declare const wipeTableRows: (adapter: DatabaseAdapter, databaseId: string, tableId: string) => Promise<void>;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { Databases, Query, } from "node-appwrite";
|
|
2
|
-
import { tryAwaitWithRetry } from "
|
|
3
|
-
import { MessageFormatter } from "
|
|
2
|
+
import { tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
3
|
+
import { MessageFormatter, isRetryableError, isCriticalError } from "appwrite-utils-helpers";
|
|
4
4
|
import { ProgressManager } from "../shared/progressManager.js";
|
|
5
|
-
import {
|
|
6
|
-
import { delay } from "../utils/helperFunctions.js";
|
|
5
|
+
import { delay } from "appwrite-utils-helpers";
|
|
7
6
|
import { chunk } from "es-toolkit";
|
|
8
7
|
import pLimit from "p-limit";
|
|
9
8
|
import { fetchAllCollections } from "./methods.js";
|
|
@@ -167,52 +166,126 @@ export const wipeAllTables = async (adapter, databaseId) => {
|
|
|
167
166
|
return deleted;
|
|
168
167
|
};
|
|
169
168
|
/**
|
|
170
|
-
* Optimized deletion of all rows from a table
|
|
171
|
-
* Uses
|
|
169
|
+
* Optimized deletion of all rows from a table.
|
|
170
|
+
* Uses bulk deletion when possible, but falls back to individual row deletion
|
|
171
|
+
* for tables with relationship columns (bulk delete not supported for those).
|
|
172
172
|
*/
|
|
173
173
|
export const wipeTableRows = async (adapter, databaseId, tableId) => {
|
|
174
174
|
try {
|
|
175
|
-
// Check if bulk
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
const DELETE_BATCH_SIZE = 250; // How many rows to delete per batch
|
|
175
|
+
// Check if the table has relationship columns — bulk delete is not supported for those
|
|
176
|
+
const tableInfo = await adapter.getTable({ databaseId, tableId });
|
|
177
|
+
const columns = tableInfo.data?.columns || [];
|
|
178
|
+
const hasRelationships = columns.some((col) => col.type === "relationship");
|
|
179
|
+
const DELETE_BATCH_SIZE = 250;
|
|
181
180
|
let totalDeleted = 0;
|
|
182
181
|
let hasMoreRows = true;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
182
|
+
const progress = ProgressManager.create(`delete-${tableId}`, 1, { title: "Deleting table rows" });
|
|
183
|
+
if (hasRelationships) {
|
|
184
|
+
// ── Relationship table: fetch rows then delete individually ──
|
|
185
|
+
MessageFormatter.info("Table has relationship columns — using individual row deletion (bulk delete not supported)", { prefix: "Wipe" });
|
|
186
|
+
const FETCH_BATCH_SIZE = 1000;
|
|
187
|
+
const MAX_CONCURRENT_DELETES = 25;
|
|
188
|
+
const limit = pLimit(MAX_CONCURRENT_DELETES);
|
|
189
|
+
// Pipeline: prefetch the first batch, then overlap fetch+delete
|
|
190
|
+
let pendingRows = [];
|
|
191
|
+
let totalDiscovered = 0;
|
|
192
|
+
// Fetch helper — always fetches from the top since we're deleting everything
|
|
193
|
+
const fetchBatch = async () => {
|
|
194
|
+
const queries = [Query.limit(FETCH_BATCH_SIZE)];
|
|
195
|
+
const response = await tryAwaitWithRetry(async () => adapter.listRows({ databaseId, tableId, queries }));
|
|
196
|
+
return response.rows || response.data || [];
|
|
197
|
+
};
|
|
198
|
+
// Kick off the first fetch
|
|
199
|
+
let nextFetchPromise = fetchBatch();
|
|
200
|
+
while (hasMoreRows) {
|
|
201
|
+
// Await the prefetched batch
|
|
202
|
+
const rows = nextFetchPromise ? await nextFetchPromise : [];
|
|
203
|
+
nextFetchPromise = null;
|
|
204
|
+
if (rows.length === 0) {
|
|
197
205
|
hasMoreRows = false;
|
|
198
206
|
break;
|
|
199
207
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
208
|
+
totalDiscovered += rows.length;
|
|
209
|
+
const isLastBatch = rows.length < FETCH_BATCH_SIZE;
|
|
210
|
+
if (!isLastBatch) {
|
|
211
|
+
progress.setTotal(totalDiscovered + 1000);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
progress.setTotal(totalDiscovered);
|
|
215
|
+
}
|
|
216
|
+
MessageFormatter.progress(`Fetched ${rows.length} rows (${totalDiscovered} discovered, ${totalDeleted} deleted so far)`, { prefix: "Wipe" });
|
|
217
|
+
// Start deleting this batch — and prefetch the next one concurrently
|
|
218
|
+
// (only prefetch if we expect more rows)
|
|
219
|
+
if (!isLastBatch) {
|
|
220
|
+
// Wait a moment before prefetching so the first few deletes free up API capacity
|
|
221
|
+
nextFetchPromise = delay(200).then(() => fetchBatch());
|
|
222
|
+
}
|
|
223
|
+
// Delete each row with concurrency limit
|
|
224
|
+
const deletePromises = rows.map((row) => limit(async () => {
|
|
225
|
+
try {
|
|
226
|
+
await tryAwaitWithRetry(async () => adapter.deleteRow({ databaseId, tableId, id: row.$id }));
|
|
227
|
+
totalDeleted++;
|
|
228
|
+
progress.update(totalDeleted);
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
const errorMessage = error.message || String(error);
|
|
232
|
+
if (errorMessage.includes("could not be found")) {
|
|
233
|
+
totalDeleted++;
|
|
234
|
+
progress.update(totalDeleted);
|
|
235
|
+
}
|
|
236
|
+
else if (isCriticalError(errorMessage)) {
|
|
237
|
+
MessageFormatter.error(`Critical error deleting row ${row.$id}: ${errorMessage}`, error, { prefix: "Wipe" });
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
MessageFormatter.error(`Failed to delete row ${row.$id}: ${errorMessage}`, error, { prefix: "Wipe" });
|
|
242
|
+
totalDeleted++;
|
|
243
|
+
progress.update(totalDeleted);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}));
|
|
247
|
+
await Promise.all(deletePromises);
|
|
248
|
+
if (isLastBatch) {
|
|
249
|
+
hasMoreRows = false;
|
|
250
|
+
}
|
|
205
251
|
await delay(10);
|
|
206
252
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// ── No relationships: use fast bulk deletion ──
|
|
256
|
+
if (!adapter.bulkDeleteRows) {
|
|
257
|
+
MessageFormatter.error("Bulk deletion not available for this adapter - wipe operation not supported", new Error("bulkDeleteRows not available"), { prefix: "Wipe" });
|
|
258
|
+
throw new Error("Bulk deletion required for wipe operations");
|
|
259
|
+
}
|
|
260
|
+
MessageFormatter.info("Starting optimized table row deletion...", { prefix: "Wipe" });
|
|
261
|
+
while (hasMoreRows) {
|
|
262
|
+
try {
|
|
263
|
+
const result = await tryAwaitWithRetry(async () => adapter.bulkDeleteRows({
|
|
264
|
+
databaseId,
|
|
265
|
+
tableId,
|
|
266
|
+
rowIds: [],
|
|
267
|
+
batchSize: DELETE_BATCH_SIZE
|
|
268
|
+
}));
|
|
269
|
+
const deletedCount = result.total || 0;
|
|
270
|
+
if (deletedCount === 0) {
|
|
271
|
+
hasMoreRows = false;
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
totalDeleted += deletedCount;
|
|
275
|
+
progress.setTotal(totalDeleted + 100);
|
|
276
|
+
progress.update(totalDeleted);
|
|
277
|
+
MessageFormatter.progress(`Deleted ${deletedCount} rows (${totalDeleted} total so far)`, { prefix: "Wipe" });
|
|
278
|
+
await delay(10);
|
|
212
279
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
280
|
+
catch (error) {
|
|
281
|
+
const errorMessage = error.message || String(error);
|
|
282
|
+
if (isCriticalError(errorMessage)) {
|
|
283
|
+
MessageFormatter.error(`Critical error during bulk deletion: ${errorMessage}`, error, { prefix: "Wipe" });
|
|
284
|
+
throw error;
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
MessageFormatter.error(`Error during deletion batch: ${errorMessage}`, error, { prefix: "Wipe" });
|
|
288
|
+
}
|
|
216
289
|
}
|
|
217
290
|
}
|
|
218
291
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Databases, Query } from "node-appwrite";
|
|
2
|
-
import { delay, tryAwaitWithRetry } from "
|
|
2
|
+
import { delay, tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
3
3
|
import { fetchAllCollections } from "../collections/methods.js";
|
|
4
|
-
import { MessageFormatter } from "
|
|
4
|
+
import { MessageFormatter } from "appwrite-utils-helpers";
|
|
5
5
|
export const fetchAllDatabases = async (database) => {
|
|
6
6
|
const databases = await tryAwaitWithRetry(async () => await database.list([Query.limit(25)]));
|
|
7
7
|
const allDatabases = databases.databases;
|
package/dist/databases/setup.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Databases, Query } from "node-appwrite";
|
|
2
|
-
import { tryAwaitWithRetry } from "
|
|
2
|
+
import { tryAwaitWithRetry } from "appwrite-utils-helpers";
|
|
3
3
|
import {} from "appwrite-utils";
|
|
4
4
|
import { ulid } from "ulidx";
|
|
5
|
-
import { MessageFormatter } from "
|
|
5
|
+
import { MessageFormatter } from "appwrite-utils-helpers";
|
|
6
6
|
export const ensureDatabasesExist = async (config, databasesToEnsure) => {
|
|
7
7
|
if (!config.appwriteClient) {
|
|
8
8
|
throw new Error("Appwrite client is not initialized in the config");
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
* 3. Validate terminology consistency
|
|
8
8
|
* 4. Migrate between formats
|
|
9
9
|
*/
|
|
10
|
-
import { collectionToYaml, generateYamlTemplate, generateExampleYamls, convertTerminology, normalizeYamlData, usesTableTerminology } from "
|
|
11
|
-
import { createYamlLoader } from "
|
|
10
|
+
import { collectionToYaml, generateYamlTemplate, generateExampleYamls, convertTerminology, normalizeYamlData, usesTableTerminology } from "appwrite-utils-helpers";
|
|
11
|
+
import { createYamlLoader } from "appwrite-utils-helpers";
|
|
12
12
|
import { YamlImportIntegration } from "../migrations/yaml/YamlImportIntegration.js";
|
|
13
13
|
import { createImportSchemas } from "../migrations/yaml/generateImportSchemas.js";
|
|
14
14
|
import { CollectionCreateSchema } from "appwrite-utils";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Client, type Models } from "node-appwrite";
|
|
2
2
|
import { type AppwriteFunction } from "appwrite-utils";
|
|
3
3
|
export declare const deployFunction: (client: Client, functionId: string, codePath: string, activate?: boolean, entrypoint?: string, commands?: string, ignored?: string[]) => Promise<Models.Deployment>;
|
|
4
|
-
export declare const deployLocalFunction: (client: Client, functionName: string, functionConfig: AppwriteFunction, functionPath?: string) => Promise<Models.Deployment>;
|
|
4
|
+
export declare const deployLocalFunction: (client: Client, functionName: string, functionConfig: AppwriteFunction, functionPath?: string, configDirPath?: string) => Promise<Models.Deployment>;
|