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
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Adapters Module -
|
|
2
|
+
* Adapters Module - Re-exported from appwrite-utils-helpers
|
|
3
3
|
*
|
|
4
|
-
* This module exports all adapter classes and utilities
|
|
5
|
-
*
|
|
4
|
+
* This module re-exports all adapter classes and utilities from the
|
|
5
|
+
* appwrite-utils-helpers package for backward compatibility.
|
|
6
|
+
*
|
|
7
|
+
* The adapters have been moved to the helpers package to make them
|
|
8
|
+
* available to other packages and reduce code duplication.
|
|
6
9
|
*/
|
|
7
|
-
export
|
|
8
|
-
export { type DatabaseAdapter, type CreateRowParams, type UpdateRowParams, type ListRowsParams, type DeleteRowParams, type CreateTableParams, type UpdateTableParams, type ListTablesParams, type DeleteTableParams, type GetTableParams, type BulkCreateRowsParams, type BulkUpsertRowsParams, type BulkDeleteRowsParams, type CreateIndexParams, type ListIndexesParams, type DeleteIndexParams, type CreateAttributeParams, type UpdateAttributeParams, type DeleteAttributeParams, type ApiResponse, type AdapterMetadata, BaseAdapter } from './DatabaseAdapter.js';
|
|
9
|
-
export { TablesDBAdapter } from './TablesDBAdapter.js';
|
|
10
|
-
export { LegacyAdapter } from './LegacyAdapter.js';
|
|
11
|
-
export { createDatabaseAdapter, getApiCapabilities } from './AdapterFactory.js';
|
|
10
|
+
export * from 'appwrite-utils-helpers';
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Adapters Module -
|
|
2
|
+
* Adapters Module - Re-exported from appwrite-utils-helpers
|
|
3
3
|
*
|
|
4
|
-
* This module exports all adapter classes and utilities
|
|
5
|
-
*
|
|
4
|
+
* This module re-exports all adapter classes and utilities from the
|
|
5
|
+
* appwrite-utils-helpers package for backward compatibility.
|
|
6
|
+
*
|
|
7
|
+
* The adapters have been moved to the helpers package to make them
|
|
8
|
+
* available to other packages and reduce code duplication.
|
|
6
9
|
*/
|
|
7
|
-
export
|
|
8
|
-
export { BaseAdapter } from './DatabaseAdapter.js';
|
|
9
|
-
export { TablesDBAdapter } from './TablesDBAdapter.js';
|
|
10
|
-
export { LegacyAdapter } from './LegacyAdapter.js';
|
|
11
|
-
// Convenience exports
|
|
12
|
-
export { createDatabaseAdapter, getApiCapabilities } from './AdapterFactory.js';
|
|
10
|
+
export * from 'appwrite-utils-helpers';
|
|
@@ -2,8 +2,8 @@ import JSZip from "jszip";
|
|
|
2
2
|
import { ID, Query } from "node-appwrite";
|
|
3
3
|
import { InputFile } from "node-appwrite/file";
|
|
4
4
|
import pLimit from "p-limit";
|
|
5
|
-
import { MessageFormatter } from
|
|
6
|
-
import { logger } from
|
|
5
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
6
|
+
import { logger } from 'appwrite-utils-helpers';
|
|
7
7
|
import { ulid } from "ulidx";
|
|
8
8
|
/**
|
|
9
9
|
* Downloads all files from a bucket in parallel and creates a ZIP backup
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Storage, Databases } from "node-appwrite";
|
|
2
|
-
import type { DatabaseAdapter } from
|
|
2
|
+
import type { DatabaseAdapter } from 'appwrite-utils-helpers';
|
|
3
3
|
import type { AppwriteConfig } from "appwrite-utils";
|
|
4
4
|
export interface CollectionBackupOptions {
|
|
5
5
|
trackingDatabaseId: string;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ID, Query } 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 'appwrite-utils-helpers';
|
|
5
|
+
import { logger } from 'appwrite-utils-helpers';
|
|
6
6
|
import { tryAwaitWithRetry } from "appwrite-utils";
|
|
7
7
|
import { splitIntoBatches } from "../../shared/migrationHelpers.js";
|
|
8
|
-
import { retryFailedPromises } from "
|
|
8
|
+
import { retryFailedPromises } from "appwrite-utils-helpers";
|
|
9
9
|
import { ProgressManager } from "../../shared/progressManager.js";
|
|
10
10
|
import { createBackupZip } from "../../storage/backupCompression.js";
|
|
11
11
|
import { recordCentralizedBackup, createCentralizedBackupTrackingTable } from "../tracking/centralizedTracking.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Storage, Databases } from "node-appwrite";
|
|
2
|
-
import type { DatabaseAdapter } from
|
|
2
|
+
import type { DatabaseAdapter } from 'appwrite-utils-helpers';
|
|
3
3
|
import type { DatabaseBackupReference, BucketBackupReference } from "../schemas/comprehensiveManifest.js";
|
|
4
4
|
import type { AppwriteConfig } from "appwrite-utils";
|
|
5
5
|
export interface ComprehensiveBackupOptions {
|
|
@@ -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 'appwrite-utils-helpers';
|
|
5
|
+
import { logger } from '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 '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 'appwrite-utils-helpers';
|
|
2
|
+
import { tryAwaitWithRetry } from "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 '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 "appwrite-utils-helpers";
|
|
7
|
+
import { createMigrationPlan, executeMigrationPlan, saveMigrationResult, } from '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("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 {
|
|
@@ -2,125 +2,177 @@ import inquirer from "inquirer";
|
|
|
2
2
|
import chalk from "chalk";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import { Query } from "node-appwrite";
|
|
5
|
-
import { MessageFormatter } from
|
|
5
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
6
6
|
import { ConfirmationDialogs } from "../../shared/confirmationDialogs.js";
|
|
7
7
|
import { SelectionDialogs } from "../../shared/selectionDialogs.js";
|
|
8
|
-
import { logger } from
|
|
8
|
+
import { logger } from 'appwrite-utils-helpers';
|
|
9
9
|
import { fetchAllDatabases } from "../../databases/methods.js";
|
|
10
10
|
import { listBuckets } from "../../storage/methods.js";
|
|
11
11
|
import { getFunction, downloadLatestFunctionDeployment } from "../../functions/methods.js";
|
|
12
12
|
import { wipeTableRows } from "../../collections/wipeOperations.js";
|
|
13
13
|
export const databaseCommands = {
|
|
14
14
|
async syncDb(cli) {
|
|
15
|
-
MessageFormatter.progress("Pushing local configuration to Appwrite...", { prefix: "
|
|
15
|
+
MessageFormatter.progress("Pushing local configuration to Appwrite...", { prefix: "Push" });
|
|
16
16
|
try {
|
|
17
17
|
// Initialize controller
|
|
18
18
|
await cli.controller.init();
|
|
19
|
-
//
|
|
20
|
-
const
|
|
21
|
-
const configuredDatabases = cli.controller.config?.databases || [];
|
|
22
|
-
// Get local collections for selection
|
|
23
|
-
const localCollections = cli.getLocalCollections();
|
|
24
|
-
// Push operations always use local configuration as source of truth
|
|
25
|
-
// Select databases
|
|
26
|
-
const selectedDatabaseIds = await SelectionDialogs.selectDatabases(availableDatabases, configuredDatabases, { showSelectAll: false, allowNewOnly: false, defaultSelected: [] });
|
|
27
|
-
if (selectedDatabaseIds.length === 0) {
|
|
28
|
-
MessageFormatter.warning("No databases selected. Skipping database sync.", { prefix: "Database" });
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
// Select tables/collections for each database using the existing method
|
|
32
|
-
const tableSelectionsMap = new Map();
|
|
33
|
-
const availableTablesMap = new Map();
|
|
34
|
-
for (const databaseId of selectedDatabaseIds) {
|
|
35
|
-
const database = availableDatabases.find(db => db.$id === databaseId);
|
|
36
|
-
// Use the existing selectCollectionsAndTables method
|
|
37
|
-
const selectedCollections = await cli.selectCollectionsAndTables(database, cli.controller.database, chalk.blue(`Select collections/tables to push to "${database.name}":`), true, // multiSelect
|
|
38
|
-
true, // prefer local
|
|
39
|
-
true // shouldFilterByDatabase
|
|
40
|
-
);
|
|
41
|
-
// Map selected collections to table IDs
|
|
42
|
-
const selectedTableIds = selectedCollections.map((c) => c.$id || c.id);
|
|
43
|
-
// Store selections
|
|
44
|
-
tableSelectionsMap.set(databaseId, selectedTableIds);
|
|
45
|
-
availableTablesMap.set(databaseId, selectedCollections);
|
|
46
|
-
if (selectedCollections.length === 0) {
|
|
47
|
-
MessageFormatter.warning(`No collections selected for database "${database.name}". Skipping.`, { prefix: "Database" });
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
// Ask if user wants to select buckets
|
|
52
|
-
const { selectBuckets } = await inquirer.prompt([
|
|
19
|
+
// Ask what to push first
|
|
20
|
+
const { pushTargets } = await inquirer.prompt([
|
|
53
21
|
{
|
|
54
|
-
type: "
|
|
55
|
-
name: "
|
|
56
|
-
message: "
|
|
57
|
-
|
|
22
|
+
type: "checkbox",
|
|
23
|
+
name: "pushTargets",
|
|
24
|
+
message: chalk.blue("What would you like to push to Appwrite?"),
|
|
25
|
+
choices: [
|
|
26
|
+
{ name: "Databases & Tables", value: "databases" },
|
|
27
|
+
{ name: "Storage Buckets", value: "buckets" },
|
|
28
|
+
{ name: "Functions", value: "functions" },
|
|
29
|
+
],
|
|
30
|
+
validate: (input) => {
|
|
31
|
+
if (input.length === 0) {
|
|
32
|
+
return "Please select at least one item to push.";
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
},
|
|
58
36
|
},
|
|
59
37
|
]);
|
|
38
|
+
const pushDatabases = pushTargets.includes("databases");
|
|
39
|
+
const pushBuckets = pushTargets.includes("buckets");
|
|
40
|
+
const pushFunctions = pushTargets.includes("functions");
|
|
41
|
+
let databaseSelections = [];
|
|
60
42
|
let bucketSelections = [];
|
|
61
|
-
|
|
62
|
-
|
|
43
|
+
let mergedDatabases = [];
|
|
44
|
+
// --- Databases & Tables sub-flow ---
|
|
45
|
+
if (pushDatabases) {
|
|
46
|
+
const serverDatabases = await fetchAllDatabases(cli.controller.database);
|
|
47
|
+
const configuredDatabases = cli.controller.config?.databases || [];
|
|
48
|
+
const serverDbIds = new Set(serverDatabases.map(db => db.$id));
|
|
49
|
+
mergedDatabases = [...serverDatabases];
|
|
50
|
+
for (const configDb of configuredDatabases) {
|
|
51
|
+
const dbId = configDb.$id;
|
|
52
|
+
if (dbId && !serverDbIds.has(dbId)) {
|
|
53
|
+
mergedDatabases.push({
|
|
54
|
+
$id: dbId,
|
|
55
|
+
name: configDb.name || dbId,
|
|
56
|
+
$createdAt: new Date().toISOString(),
|
|
57
|
+
$updatedAt: new Date().toISOString(),
|
|
58
|
+
enabled: true,
|
|
59
|
+
_isLocalOnly: true,
|
|
60
|
+
});
|
|
61
|
+
MessageFormatter.info(`Including local database "${configDb.name || dbId}" (not yet on server)`, { prefix: "Database" });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const selectedDatabaseIds = await SelectionDialogs.selectDatabases(mergedDatabases, configuredDatabases, { showSelectAll: false, allowNewOnly: false, defaultSelected: [] });
|
|
65
|
+
if (selectedDatabaseIds.length === 0) {
|
|
66
|
+
MessageFormatter.warning("No databases selected.", { prefix: "Database" });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const tableSelectionsMap = new Map();
|
|
70
|
+
const availableTablesMap = new Map();
|
|
71
|
+
for (const databaseId of selectedDatabaseIds) {
|
|
72
|
+
const database = mergedDatabases.find(db => db.$id === databaseId);
|
|
73
|
+
const selectedCollections = await cli.selectCollectionsAndTables(database, cli.controller.database, chalk.blue(`Select tables to push to "${database.name}":`), true, true, true);
|
|
74
|
+
const selectedTableIds = selectedCollections.map((c) => c.$id || c.id);
|
|
75
|
+
tableSelectionsMap.set(databaseId, selectedTableIds);
|
|
76
|
+
availableTablesMap.set(databaseId, selectedCollections);
|
|
77
|
+
if (selectedCollections.length === 0) {
|
|
78
|
+
MessageFormatter.warning(`No tables selected for database "${database.name}". Skipping.`, { prefix: "Database" });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
databaseSelections = SelectionDialogs.createDatabaseSelection(selectedDatabaseIds, mergedDatabases, tableSelectionsMap, configuredDatabases, availableTablesMap);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// --- Storage Buckets sub-flow ---
|
|
85
|
+
if (pushBuckets) {
|
|
63
86
|
try {
|
|
64
|
-
|
|
65
|
-
|
|
87
|
+
let remoteBuckets = [];
|
|
88
|
+
try {
|
|
89
|
+
const remoteBucketsResponse = await listBuckets(cli.controller.storage);
|
|
90
|
+
remoteBuckets = remoteBucketsResponse.buckets || [];
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
MessageFormatter.warning("Could not fetch remote buckets, showing local buckets only.", { prefix: "Buckets" });
|
|
94
|
+
}
|
|
66
95
|
const configuredBuckets = cli.controller.config?.buckets || [];
|
|
67
|
-
|
|
68
|
-
|
|
96
|
+
// Merge local + remote buckets
|
|
97
|
+
const remoteBucketIds = new Set(remoteBuckets.map((b) => b.$id));
|
|
98
|
+
const localBucketIds = new Set(configuredBuckets.map((b) => b.$id));
|
|
99
|
+
const mergedBuckets = [];
|
|
100
|
+
for (const rb of remoteBuckets) {
|
|
101
|
+
mergedBuckets.push({
|
|
102
|
+
...rb,
|
|
103
|
+
_isLocalOnly: false,
|
|
104
|
+
_isRemoteOnly: !localBucketIds.has(rb.$id),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
for (const lb of configuredBuckets) {
|
|
108
|
+
if (!remoteBucketIds.has(lb.$id)) {
|
|
109
|
+
mergedBuckets.push({
|
|
110
|
+
$id: lb.$id,
|
|
111
|
+
name: lb.name,
|
|
112
|
+
enabled: lb.enabled,
|
|
113
|
+
maximumFileSize: lb.maximumFileSize,
|
|
114
|
+
allowedFileExtensions: lb.allowedFileExtensions || [],
|
|
115
|
+
compression: lb.compression || 'none',
|
|
116
|
+
encryption: lb.encryption || false,
|
|
117
|
+
antivirus: lb.antivirus || false,
|
|
118
|
+
fileSecurity: lb.fileSecurity || false,
|
|
119
|
+
permissions: lb.permissions || [],
|
|
120
|
+
$permissions: [],
|
|
121
|
+
_isLocalOnly: true,
|
|
122
|
+
_isRemoteOnly: false,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (mergedBuckets.length === 0) {
|
|
127
|
+
MessageFormatter.warning("No storage buckets found (local or remote).", { prefix: "Buckets" });
|
|
69
128
|
}
|
|
70
129
|
else {
|
|
71
|
-
|
|
72
|
-
const selectedBucketIds = await SelectionDialogs.selectBucketsForDatabases(selectedDatabaseIds, availableBuckets, configuredBuckets, { showSelectAll: false, groupByDatabase: true, defaultSelected: [] });
|
|
130
|
+
const selectedBucketIds = await SelectionDialogs.selectBucketsForPush(mergedBuckets, configuredBuckets);
|
|
73
131
|
if (selectedBucketIds.length > 0) {
|
|
74
|
-
|
|
75
|
-
bucketSelections
|
|
76
|
-
MessageFormatter.info(`Selected ${bucketSelections.length} storage bucket(s)`, { prefix: "Database" });
|
|
132
|
+
bucketSelections = SelectionDialogs.createBucketSelection(selectedBucketIds, mergedBuckets, configuredBuckets, mergedDatabases);
|
|
133
|
+
MessageFormatter.info(`Selected ${bucketSelections.length} storage bucket(s)`, { prefix: "Buckets" });
|
|
77
134
|
}
|
|
78
135
|
}
|
|
79
136
|
}
|
|
80
137
|
catch (error) {
|
|
81
|
-
MessageFormatter.warning("Failed
|
|
82
|
-
logger.warn("
|
|
138
|
+
MessageFormatter.warning("Failed during bucket selection.", { prefix: "Buckets" });
|
|
139
|
+
logger.warn("Bucket selection failed during syncDb", { error: error instanceof Error ? error.message : String(error) });
|
|
83
140
|
}
|
|
84
141
|
}
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
142
|
+
// --- Confirmation ---
|
|
143
|
+
if (databaseSelections.length > 0 || bucketSelections.length > 0) {
|
|
144
|
+
const selectionSummary = SelectionDialogs.createSyncSelectionSummary(databaseSelections, bucketSelections);
|
|
145
|
+
const confirmed = await SelectionDialogs.confirmSyncSelection(selectionSummary, 'push');
|
|
146
|
+
if (!confirmed) {
|
|
147
|
+
MessageFormatter.info("Push operation cancelled by user", { prefix: "Push" });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
MessageFormatter.progress("Starting selective push...", { prefix: "Push" });
|
|
151
|
+
await cli.controller.selectivePush(databaseSelections, bucketSelections);
|
|
152
|
+
MessageFormatter.success("Configuration pushed successfully!", { prefix: "Push" });
|
|
93
153
|
}
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
110
|
-
for (const func of functions) {
|
|
111
|
-
try {
|
|
112
|
-
await cli.controller.deployFunction(func.name);
|
|
113
|
-
MessageFormatter.success(`Function ${func.name} deployed successfully`, { prefix: "Functions" });
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
MessageFormatter.error(`Failed to deploy function ${func.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
154
|
+
// --- Functions sub-flow ---
|
|
155
|
+
if (pushFunctions) {
|
|
156
|
+
if (!cli.controller.config?.functions?.length) {
|
|
157
|
+
MessageFormatter.warning("No functions defined in local config.", { prefix: "Functions" });
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const functions = await cli.selectFunctions(chalk.blue("Select local functions to push:"), true, true);
|
|
161
|
+
for (const func of functions) {
|
|
162
|
+
try {
|
|
163
|
+
await cli.controller.deployFunction(func.name);
|
|
164
|
+
MessageFormatter.success(`Function ${func.name} deployed successfully`, { prefix: "Functions" });
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
MessageFormatter.error(`Failed to deploy function ${func.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
168
|
+
}
|
|
117
169
|
}
|
|
118
170
|
}
|
|
119
171
|
}
|
|
120
|
-
MessageFormatter.success("
|
|
172
|
+
MessageFormatter.success("Push operation completed!", { prefix: "Push" });
|
|
121
173
|
}
|
|
122
174
|
catch (error) {
|
|
123
|
-
MessageFormatter.error("Failed to push local configuration", error instanceof Error ? error : new Error(String(error)), { prefix: "
|
|
175
|
+
MessageFormatter.error("Failed to push local configuration", error instanceof Error ? error : new Error(String(error)), { prefix: "Push" });
|
|
124
176
|
throw error;
|
|
125
177
|
}
|
|
126
178
|
},
|
|
@@ -132,7 +184,7 @@ export const databaseCommands = {
|
|
|
132
184
|
{
|
|
133
185
|
type: "confirm",
|
|
134
186
|
name: "syncDatabases",
|
|
135
|
-
message: "Do you want to synchronize databases,
|
|
187
|
+
message: "Do you want to synchronize databases, tables, and their buckets?",
|
|
136
188
|
default: true,
|
|
137
189
|
},
|
|
138
190
|
]);
|
|
@@ -153,7 +205,7 @@ export const databaseCommands = {
|
|
|
153
205
|
// Update controller config with bucket selections
|
|
154
206
|
cli.controller.config = configWithBuckets;
|
|
155
207
|
// Now synchronize configurations with the updated config that includes bucket selections
|
|
156
|
-
MessageFormatter.progress("Pulling
|
|
208
|
+
MessageFormatter.progress("Pulling tables and generating table files...", { prefix: "Tables" });
|
|
157
209
|
await cli.controller.synchronizeConfigurations(remoteDatabases, configWithBuckets);
|
|
158
210
|
}
|
|
159
211
|
// Then sync functions
|
|
@@ -209,7 +261,7 @@ export const databaseCommands = {
|
|
|
209
261
|
timeout: remoteFunction.timeout || 15,
|
|
210
262
|
enabled: remoteFunction.enabled !== false,
|
|
211
263
|
logging: remoteFunction.logging !== false,
|
|
212
|
-
entrypoint: remoteFunction.entrypoint || "src/
|
|
264
|
+
entrypoint: remoteFunction.entrypoint || "src/main.ts",
|
|
213
265
|
commands: remoteFunction.commands || "npm install",
|
|
214
266
|
scopes: remoteFunction.scopes || [],
|
|
215
267
|
installationId: remoteFunction.installationId,
|
|
@@ -275,7 +327,7 @@ export const databaseCommands = {
|
|
|
275
327
|
timeout: remoteFunction.timeout || 15,
|
|
276
328
|
enabled: remoteFunction.enabled !== false,
|
|
277
329
|
logging: remoteFunction.logging !== false,
|
|
278
|
-
entrypoint: remoteFunction.entrypoint || "src/
|
|
330
|
+
entrypoint: remoteFunction.entrypoint || "src/main.ts",
|
|
279
331
|
commands: remoteFunction.commands || "npm install",
|
|
280
332
|
scopes: remoteFunction.scopes || [],
|
|
281
333
|
installationId: remoteFunction.installationId,
|
|
@@ -360,7 +412,7 @@ export const databaseCommands = {
|
|
|
360
412
|
choices: [
|
|
361
413
|
{ name: "Comprehensive (ALL databases + ALL buckets)", value: "comprehensive" },
|
|
362
414
|
{ name: "Selective databases (choose specific databases)", value: "selective-databases" },
|
|
363
|
-
{ name: "Selective
|
|
415
|
+
{ name: "Selective tables (choose specific tables)", value: "selective-tables" }
|
|
364
416
|
]
|
|
365
417
|
}
|
|
366
418
|
]);
|
|
@@ -400,17 +452,17 @@ export const databaseCommands = {
|
|
|
400
452
|
buckets: selectedBuckets
|
|
401
453
|
};
|
|
402
454
|
}
|
|
403
|
-
if (scopeType === "selective-
|
|
455
|
+
if (scopeType === "selective-tables") {
|
|
404
456
|
const databases = await fetchAllDatabases(cli.controller.database);
|
|
405
|
-
const selectedDatabase = await cli.selectDatabases(databases, "Select database containing
|
|
457
|
+
const selectedDatabase = await cli.selectDatabases(databases, "Select database containing tables:", false // single selection
|
|
406
458
|
);
|
|
407
459
|
if (!selectedDatabase || selectedDatabase.length === 0) {
|
|
408
460
|
throw new Error("No database selected");
|
|
409
461
|
}
|
|
410
462
|
const db = selectedDatabase[0];
|
|
411
|
-
const collections = await cli.selectCollectionsAndTables(db, cli.controller.database, "Select
|
|
463
|
+
const collections = await cli.selectCollectionsAndTables(db, cli.controller.database, "Select tables to backup:", true, true, true);
|
|
412
464
|
return {
|
|
413
|
-
type: "selective-
|
|
465
|
+
type: "selective-tables",
|
|
414
466
|
databaseId: db.$id,
|
|
415
467
|
databaseName: db.name,
|
|
416
468
|
collections: collections
|
|
@@ -431,9 +483,9 @@ export const databaseCommands = {
|
|
|
431
483
|
summary += ` • ${scope.buckets.length} selected buckets\n`;
|
|
432
484
|
}
|
|
433
485
|
}
|
|
434
|
-
else if (scope.type === "selective-
|
|
486
|
+
else if (scope.type === "selective-tables") {
|
|
435
487
|
summary += ` • Database: ${scope.databaseName}\n`;
|
|
436
|
-
summary += ` • ${scope.collections.length} selected
|
|
488
|
+
summary += ` • ${scope.collections.length} selected tables\n`;
|
|
437
489
|
}
|
|
438
490
|
console.log(summary);
|
|
439
491
|
const { confirmed } = await inquirer.prompt([
|
|
@@ -472,7 +524,7 @@ export const databaseCommands = {
|
|
|
472
524
|
await backupBucket(cli.controller.storage, bucketId, "appwrite-backups", { parallelDownloads: 10 });
|
|
473
525
|
}
|
|
474
526
|
}
|
|
475
|
-
else if (scope.type === "selective-
|
|
527
|
+
else if (scope.type === "selective-tables") {
|
|
476
528
|
const { backupCollections } = await import("../../backups/operations/collectionBackup.js");
|
|
477
529
|
await backupCollections(cli.controller.config, cli.controller.database, cli.controller.storage, cli.controller.adapter, {
|
|
478
530
|
trackingDatabaseId,
|
|
@@ -535,23 +587,23 @@ export const databaseCommands = {
|
|
|
535
587
|
throw new Error("Database is not initialized, is the config file correct & created?");
|
|
536
588
|
}
|
|
537
589
|
const databases = await fetchAllDatabases(cli.controller.database);
|
|
538
|
-
const selectedDatabases = await cli.selectDatabases(databases, "Select the database(s) containing the
|
|
590
|
+
const selectedDatabases = await cli.selectDatabases(databases, "Select the database(s) containing the tables to wipe:", true);
|
|
539
591
|
for (const database of selectedDatabases) {
|
|
540
|
-
const collections = await cli.selectCollectionsAndTables(database, cli.controller.database, `Select
|
|
592
|
+
const collections = await cli.selectCollectionsAndTables(database, cli.controller.database, `Select tables to wipe from ${database.name}:`, true, undefined, true);
|
|
541
593
|
const collectionNames = collections.map((c) => c.name);
|
|
542
594
|
const confirmed = await ConfirmationDialogs.confirmCollectionWipe(database.name, collectionNames);
|
|
543
595
|
if (confirmed) {
|
|
544
|
-
MessageFormatter.info(`Wiping selected
|
|
596
|
+
MessageFormatter.info(`Wiping selected tables from ${database.name}...`, { prefix: "Wipe" });
|
|
545
597
|
for (const collection of collections) {
|
|
546
598
|
await cli.controller.wipeCollection(database, collection);
|
|
547
|
-
MessageFormatter.success(`
|
|
599
|
+
MessageFormatter.success(`Table ${collection.name} wiped successfully`, { prefix: "Wipe" });
|
|
548
600
|
}
|
|
549
601
|
}
|
|
550
602
|
else {
|
|
551
603
|
MessageFormatter.info(`Wipe operation cancelled for ${database.name}`, { prefix: "Wipe" });
|
|
552
604
|
}
|
|
553
605
|
}
|
|
554
|
-
MessageFormatter.success("Wipe
|
|
606
|
+
MessageFormatter.success("Wipe tables operation completed", { prefix: "Wipe" });
|
|
555
607
|
},
|
|
556
608
|
async wipeTablesData(cli) {
|
|
557
609
|
const controller = cli.controller;
|
|
@@ -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 '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 "appwrite-utils-helpers";
|
|
13
13
|
import { RuntimeSchema } from "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) {
|