appwrite-utils-cli 1.9.6 → 1.11.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/CONFIG_TODO.md +1189 -1189
- package/README.md +1004 -1004
- package/SELECTION_DIALOGS.md +145 -145
- package/SERVICE_IMPLEMENTATION_REPORT.md +462 -462
- package/package.json +6 -3
- package/scripts/copy-templates.ts +23 -23
- package/src/adapters/index.ts +11 -37
- package/src/backups/operations/bucketBackup.ts +277 -277
- package/src/backups/operations/collectionBackup.ts +310 -310
- package/src/backups/operations/comprehensiveBackup.ts +342 -342
- package/src/backups/schemas/bucketManifest.ts +78 -78
- package/src/backups/schemas/comprehensiveManifest.ts +76 -76
- package/src/backups/tracking/centralizedTracking.ts +352 -352
- package/src/cli/commands/configCommands.ts +265 -201
- package/src/cli/commands/databaseCommands.ts +931 -879
- package/src/cli/commands/functionCommands.ts +333 -332
- package/src/cli/commands/importFileCommands.ts +815 -0
- package/src/cli/commands/schemaCommands.ts +141 -141
- package/src/cli/commands/storageCommands.ts +2 -3
- package/src/cli/commands/transferCommands.ts +454 -457
- package/src/collections/attributes.ts.backup +1555 -1555
- package/src/collections/{attributes.ts → columns.ts} +15 -44
- package/src/collections/indexes.ts +350 -352
- package/src/collections/methods.ts +714 -815
- package/src/collections/tableOperations.ts +57 -21
- package/src/collections/transferOperations.ts +376 -377
- package/src/collections/wipeOperations.ts +449 -346
- package/src/databases/methods.ts +49 -49
- package/src/databases/setup.ts +77 -77
- package/src/examples/yamlTerminologyExample.ts +346 -346
- package/src/functions/deployments.ts +221 -220
- package/src/functions/fnConfigDiscovery.ts +2 -2
- package/src/functions/methods.ts +284 -284
- package/src/functions/templates/count-docs-in-collection/README.md +53 -53
- package/src/functions/templates/count-docs-in-collection/src/main.ts +159 -159
- package/src/functions/templates/count-docs-in-collection/src/request.ts +8 -8
- package/src/functions/templates/hono-typescript/README.md +285 -285
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
- package/src/functions/templates/hono-typescript/src/app.ts +179 -179
- package/src/functions/templates/hono-typescript/src/context.ts +102 -102
- package/src/functions/templates/hono-typescript/src/{index.ts → main.ts} +53 -53
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
- package/src/functions/templates/typescript-node/README.md +31 -31
- package/src/functions/templates/typescript-node/src/context.ts +102 -102
- package/src/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
- package/src/functions/templates/uv/README.md +30 -30
- package/src/functions/templates/uv/pyproject.toml +29 -29
- package/src/functions/templates/uv/src/context.py +124 -124
- package/src/functions/templates/uv/src/{index.py → main.py} +45 -45
- package/src/init.ts +62 -62
- package/src/interactiveCLI.ts +1095 -1030
- package/src/main.ts +1517 -1670
- package/src/migrations/afterImportActions.ts +579 -580
- package/src/migrations/appwriteToX.ts +634 -630
- package/src/migrations/comprehensiveTransfer.ts +2149 -2149
- package/src/migrations/dataLoader.ts +1729 -1702
- package/src/migrations/importController.ts +440 -428
- package/src/migrations/importDataActions.ts +315 -315
- package/src/migrations/relationships.ts +333 -334
- package/src/migrations/services/DataTransformationService.ts +195 -195
- package/src/migrations/services/FileHandlerService.ts +310 -310
- package/src/migrations/services/ImportOrchestrator.ts +674 -665
- package/src/migrations/services/RateLimitManager.ts +362 -362
- package/src/migrations/services/RelationshipResolver.ts +460 -460
- package/src/migrations/services/UserMappingService.ts +344 -344
- package/src/migrations/services/ValidationService.ts +333 -333
- package/src/migrations/transfer.ts +987 -942
- package/src/migrations/yaml/YamlImportConfigLoader.ts +438 -438
- package/src/migrations/yaml/YamlImportIntegration.ts +438 -438
- package/src/migrations/yaml/generateImportSchemas.ts +1347 -1347
- package/src/schemas/authUser.ts +23 -23
- package/src/setup.ts +8 -8
- package/src/setupCommands.ts +5 -6
- package/src/setupController.ts +42 -42
- package/src/shared/backupMetadataSchema.ts +93 -93
- package/src/shared/backupTracking.ts +211 -211
- package/src/shared/confirmationDialogs.ts +326 -326
- package/src/shared/migrationHelpers.ts +232 -232
- package/src/shared/operationLogger.ts +20 -20
- package/src/shared/operationQueue.ts +326 -327
- package/src/shared/operationsTable.ts +338 -338
- package/src/shared/operationsTableSchema.ts +60 -60
- package/src/shared/progressManager.ts +277 -277
- package/src/shared/relationshipExtractor.ts +214 -214
- package/src/shared/selectionDialogs.ts +775 -722
- package/src/storage/backupCompression.ts +88 -88
- package/src/storage/methods.ts +695 -682
- package/src/storage/schemas.ts +205 -205
- package/src/tables/indexManager.ts +409 -0
- package/src/types/node-appwrite-tablesdb.d.ts +43 -43
- package/src/types.ts +9 -9
- package/src/users/methods.ts +358 -359
- package/src/utils/configMigration.ts +347 -347
- package/src/utils/index.ts +2 -2
- package/src/utils/loadConfigs.ts +457 -449
- package/src/utils/setupFiles.ts +1236 -1238
- package/src/utilsController.ts +1263 -1213
- package/tests/README.md +496 -496
- package/tests/adapters/AdapterFactory.test.ts +276 -276
- package/tests/integration/syncOperations.test.ts +462 -462
- package/tests/jest.config.js +24 -24
- package/tests/migration/configMigration.test.ts +545 -545
- package/tests/setup.ts +61 -61
- package/tests/testUtils.ts +339 -339
- package/tests/utils/loadConfigs.test.ts +349 -349
- package/tests/validation/configValidation.test.ts +411 -411
- package/tsconfig.json +44 -44
- 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/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -405
- package/dist/adapters/DatabaseAdapter.d.ts +0 -242
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -612
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -596
- package/dist/adapters/index.d.ts +0 -11
- package/dist/adapters/index.js +0 -12
- package/dist/backups/operations/bucketBackup.d.ts +0 -19
- package/dist/backups/operations/bucketBackup.js +0 -197
- package/dist/backups/operations/collectionBackup.d.ts +0 -30
- package/dist/backups/operations/collectionBackup.js +0 -201
- package/dist/backups/operations/comprehensiveBackup.d.ts +0 -25
- package/dist/backups/operations/comprehensiveBackup.js +0 -238
- package/dist/backups/schemas/bucketManifest.d.ts +0 -93
- package/dist/backups/schemas/bucketManifest.js +0 -33
- package/dist/backups/schemas/comprehensiveManifest.d.ts +0 -108
- package/dist/backups/schemas/comprehensiveManifest.js +0 -32
- package/dist/backups/tracking/centralizedTracking.d.ts +0 -34
- package/dist/backups/tracking/centralizedTracking.js +0 -274
- package/dist/cli/commands/configCommands.d.ts +0 -8
- package/dist/cli/commands/configCommands.js +0 -166
- package/dist/cli/commands/databaseCommands.d.ts +0 -14
- package/dist/cli/commands/databaseCommands.js +0 -644
- package/dist/cli/commands/functionCommands.d.ts +0 -7
- package/dist/cli/commands/functionCommands.js +0 -330
- package/dist/cli/commands/schemaCommands.d.ts +0 -7
- package/dist/cli/commands/schemaCommands.js +0 -169
- package/dist/cli/commands/storageCommands.d.ts +0 -5
- package/dist/cli/commands/storageCommands.js +0 -143
- package/dist/cli/commands/transferCommands.d.ts +0 -5
- package/dist/cli/commands/transferCommands.js +0 -384
- package/dist/collections/attributes.d.ts +0 -13
- package/dist/collections/attributes.js +0 -1364
- package/dist/collections/indexes.d.ts +0 -12
- package/dist/collections/indexes.js +0 -217
- package/dist/collections/methods.d.ts +0 -19
- package/dist/collections/methods.js +0 -734
- package/dist/collections/tableOperations.d.ts +0 -86
- package/dist/collections/tableOperations.js +0 -434
- package/dist/collections/transferOperations.d.ts +0 -8
- package/dist/collections/transferOperations.js +0 -412
- package/dist/collections/wipeOperations.d.ts +0 -16
- package/dist/collections/wipeOperations.js +0 -233
- package/dist/config/ConfigManager.d.ts +0 -450
- package/dist/config/ConfigManager.js +0 -625
- package/dist/config/configMigration.d.ts +0 -87
- package/dist/config/configMigration.js +0 -390
- package/dist/config/configValidation.d.ts +0 -66
- package/dist/config/configValidation.js +0 -358
- package/dist/config/index.d.ts +0 -8
- package/dist/config/index.js +0 -7
- package/dist/config/services/ConfigDiscoveryService.d.ts +0 -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/databases/methods.d.ts +0 -6
- package/dist/databases/methods.js +0 -35
- package/dist/databases/setup.d.ts +0 -5
- package/dist/databases/setup.js +0 -45
- package/dist/examples/yamlTerminologyExample.d.ts +0 -42
- package/dist/examples/yamlTerminologyExample.js +0 -272
- package/dist/functions/deployments.d.ts +0 -4
- package/dist/functions/deployments.js +0 -146
- package/dist/functions/fnConfigDiscovery.d.ts +0 -3
- package/dist/functions/fnConfigDiscovery.js +0 -108
- package/dist/functions/methods.d.ts +0 -16
- package/dist/functions/methods.js +0 -174
- package/dist/functions/pathResolution.d.ts +0 -37
- package/dist/functions/pathResolution.js +0 -185
- package/dist/functions/templates/count-docs-in-collection/README.md +0 -54
- package/dist/functions/templates/count-docs-in-collection/package.json +0 -25
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +0 -159
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +0 -9
- package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/dist/functions/templates/hono-typescript/README.md +0 -286
- package/dist/functions/templates/hono-typescript/package.json +0 -26
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
- package/dist/functions/templates/hono-typescript/src/app.ts +0 -180
- package/dist/functions/templates/hono-typescript/src/context.ts +0 -103
- package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
- package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/dist/functions/templates/typescript-node/README.md +0 -32
- package/dist/functions/templates/typescript-node/package.json +0 -25
- package/dist/functions/templates/typescript-node/src/context.ts +0 -103
- package/dist/functions/templates/typescript-node/src/index.ts +0 -29
- package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
- package/dist/functions/templates/uv/README.md +0 -31
- package/dist/functions/templates/uv/pyproject.toml +0 -30
- package/dist/functions/templates/uv/src/__init__.py +0 -0
- package/dist/functions/templates/uv/src/context.py +0 -125
- package/dist/functions/templates/uv/src/index.py +0 -46
- package/dist/init.d.ts +0 -2
- package/dist/init.js +0 -57
- package/dist/interactiveCLI.d.ts +0 -31
- package/dist/interactiveCLI.js +0 -898
- package/dist/main.d.ts +0 -2
- package/dist/main.js +0 -1180
- package/dist/migrations/afterImportActions.d.ts +0 -17
- package/dist/migrations/afterImportActions.js +0 -306
- package/dist/migrations/appwriteToX.d.ts +0 -211
- package/dist/migrations/appwriteToX.js +0 -491
- package/dist/migrations/comprehensiveTransfer.d.ts +0 -147
- package/dist/migrations/comprehensiveTransfer.js +0 -1317
- package/dist/migrations/dataLoader.d.ts +0 -753
- package/dist/migrations/dataLoader.js +0 -1250
- package/dist/migrations/importController.d.ts +0 -23
- package/dist/migrations/importController.js +0 -268
- package/dist/migrations/importDataActions.d.ts +0 -50
- package/dist/migrations/importDataActions.js +0 -230
- package/dist/migrations/relationships.d.ts +0 -29
- package/dist/migrations/relationships.js +0 -204
- package/dist/migrations/services/DataTransformationService.d.ts +0 -55
- package/dist/migrations/services/DataTransformationService.js +0 -158
- package/dist/migrations/services/FileHandlerService.d.ts +0 -75
- package/dist/migrations/services/FileHandlerService.js +0 -236
- package/dist/migrations/services/ImportOrchestrator.d.ts +0 -97
- package/dist/migrations/services/ImportOrchestrator.js +0 -485
- package/dist/migrations/services/RateLimitManager.d.ts +0 -138
- package/dist/migrations/services/RateLimitManager.js +0 -279
- package/dist/migrations/services/RelationshipResolver.d.ts +0 -120
- package/dist/migrations/services/RelationshipResolver.js +0 -332
- package/dist/migrations/services/UserMappingService.d.ts +0 -109
- package/dist/migrations/services/UserMappingService.js +0 -277
- package/dist/migrations/services/ValidationService.d.ts +0 -74
- package/dist/migrations/services/ValidationService.js +0 -260
- package/dist/migrations/transfer.d.ts +0 -26
- package/dist/migrations/transfer.js +0 -608
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +0 -131
- package/dist/migrations/yaml/YamlImportConfigLoader.js +0 -383
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +0 -93
- package/dist/migrations/yaml/YamlImportIntegration.js +0 -341
- package/dist/migrations/yaml/generateImportSchemas.d.ts +0 -30
- package/dist/migrations/yaml/generateImportSchemas.js +0 -1327
- package/dist/schemas/authUser.d.ts +0 -24
- package/dist/schemas/authUser.js +0 -17
- package/dist/setup.d.ts +0 -2
- package/dist/setup.js +0 -5
- package/dist/setupCommands.d.ts +0 -58
- package/dist/setupCommands.js +0 -490
- package/dist/setupController.d.ts +0 -9
- package/dist/setupController.js +0 -34
- package/dist/shared/attributeMapper.d.ts +0 -20
- package/dist/shared/attributeMapper.js +0 -203
- package/dist/shared/backupMetadataSchema.d.ts +0 -94
- package/dist/shared/backupMetadataSchema.js +0 -38
- package/dist/shared/backupTracking.d.ts +0 -18
- package/dist/shared/backupTracking.js +0 -176
- package/dist/shared/confirmationDialogs.d.ts +0 -75
- package/dist/shared/confirmationDialogs.js +0 -236
- 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/indexManager.d.ts +0 -24
- package/dist/shared/indexManager.js +0 -151
- package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
- package/dist/shared/jsonSchemaGenerator.js +0 -290
- package/dist/shared/logging.d.ts +0 -61
- package/dist/shared/logging.js +0 -116
- package/dist/shared/messageFormatter.d.ts +0 -39
- package/dist/shared/messageFormatter.js +0 -162
- package/dist/shared/migrationHelpers.d.ts +0 -61
- package/dist/shared/migrationHelpers.js +0 -145
- package/dist/shared/operationLogger.d.ts +0 -10
- package/dist/shared/operationLogger.js +0 -12
- package/dist/shared/operationQueue.d.ts +0 -40
- package/dist/shared/operationQueue.js +0 -311
- package/dist/shared/operationsTable.d.ts +0 -26
- package/dist/shared/operationsTable.js +0 -286
- package/dist/shared/operationsTableSchema.d.ts +0 -48
- package/dist/shared/operationsTableSchema.js +0 -35
- package/dist/shared/progressManager.d.ts +0 -62
- package/dist/shared/progressManager.js +0 -215
- package/dist/shared/pydanticModelGenerator.d.ts +0 -17
- package/dist/shared/pydanticModelGenerator.js +0 -615
- package/dist/shared/relationshipExtractor.d.ts +0 -56
- package/dist/shared/relationshipExtractor.js +0 -138
- package/dist/shared/schemaGenerator.d.ts +0 -40
- package/dist/shared/schemaGenerator.js +0 -556
- package/dist/shared/selectionDialogs.d.ts +0 -214
- package/dist/shared/selectionDialogs.js +0 -544
- package/dist/storage/backupCompression.d.ts +0 -20
- package/dist/storage/backupCompression.js +0 -67
- package/dist/storage/methods.d.ts +0 -32
- package/dist/storage/methods.js +0 -472
- package/dist/storage/schemas.d.ts +0 -842
- package/dist/storage/schemas.js +0 -175
- package/dist/types.d.ts +0 -4
- package/dist/types.js +0 -3
- package/dist/users/methods.d.ts +0 -16
- package/dist/users/methods.js +0 -277
- 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/configMigration.d.ts +0 -1
- package/dist/utils/configMigration.js +0 -261
- 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/index.d.ts +0 -2
- package/dist/utils/index.js +0 -2
- package/dist/utils/loadConfigs.d.ts +0 -50
- package/dist/utils/loadConfigs.js +0 -358
- 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/setupFiles.d.ts +0 -4
- package/dist/utils/setupFiles.js +0 -1192
- 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/dist/utilsController.d.ts +0 -107
- package/dist/utilsController.js +0 -873
- package/src/adapters/AdapterFactory.ts +0 -510
- package/src/adapters/DatabaseAdapter.ts +0 -318
- package/src/adapters/LegacyAdapter.ts +0 -841
- package/src/adapters/TablesDBAdapter.ts +0 -815
- package/src/config/ConfigManager.ts +0 -817
- 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/functions/pathResolution.ts +0 -227
- package/src/functions/templates/count-docs-in-collection/package.json +0 -25
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/src/functions/templates/hono-typescript/package.json +0 -26
- package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/src/functions/templates/typescript-node/package.json +0 -25
- package/src/functions/templates/typescript-node/tsconfig.json +0 -28
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -537
- package/src/shared/indexManager.ts +0 -254
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -340
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- package/src/utils/yamlLoader.ts +0 -371
- package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
|
@@ -1,143 +1,143 @@
|
|
|
1
|
-
import inquirer from "inquirer";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import os from "node:os";
|
|
5
|
-
import { ulid } from "ulidx";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
import { Query } from "node-appwrite";
|
|
8
|
-
import { MessageFormatter } from
|
|
9
|
-
import {
|
|
10
|
-
createFunctionTemplate,
|
|
11
|
-
deleteFunction,
|
|
12
|
-
downloadLatestFunctionDeployment,
|
|
13
|
-
listFunctions,
|
|
14
|
-
listSpecifications,
|
|
15
|
-
} from "../../functions/methods.js";
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import { ulid } from "ulidx";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { Query } from "node-appwrite";
|
|
8
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
9
|
+
import {
|
|
10
|
+
createFunctionTemplate,
|
|
11
|
+
deleteFunction,
|
|
12
|
+
downloadLatestFunctionDeployment,
|
|
13
|
+
listFunctions,
|
|
14
|
+
listSpecifications,
|
|
15
|
+
} from "../../functions/methods.js";
|
|
16
16
|
import { deployLocalFunction } from "../../functions/deployments.js";
|
|
17
17
|
import { discoverFnConfigs, mergeDiscoveredFunctions } from "../../functions/fnConfigDiscovery.js";
|
|
18
|
-
import { addFunctionToYamlConfig, findYamlConfig } from "
|
|
19
|
-
import { RuntimeSchema, type AppwriteFunction, type Runtime, type Specification } from "appwrite-utils";
|
|
20
|
-
import type { InteractiveCLI } from "../../interactiveCLI.js";
|
|
21
|
-
|
|
22
|
-
export const functionCommands = {
|
|
23
|
-
async createFunction(cli: InteractiveCLI): Promise<void> {
|
|
24
|
-
const { name } = await inquirer.prompt([
|
|
25
|
-
{
|
|
26
|
-
type: "input",
|
|
27
|
-
name: "name",
|
|
28
|
-
message: "Function name:",
|
|
29
|
-
validate: (input) => input.length > 0,
|
|
30
|
-
},
|
|
31
|
-
]);
|
|
32
|
-
|
|
33
|
-
const { template } = await inquirer.prompt([
|
|
34
|
-
{
|
|
35
|
-
type: "list",
|
|
36
|
-
name: "template",
|
|
37
|
-
message: "Select a template:",
|
|
38
|
-
choices: [
|
|
39
|
-
{ name: "TypeScript Node.js", value: "typescript-node" },
|
|
40
|
-
{ name: "TypeScript with Hono Web Framework", value: "hono-typescript" },
|
|
41
|
-
{ name: "Python with UV", value: "uv" },
|
|
42
|
-
{ name: "Count Documents in Collection", value: "count-docs-in-collection" },
|
|
43
|
-
{ name: "None (Empty Function)", value: "none" },
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
]);
|
|
47
|
-
|
|
48
|
-
// Get template defaults
|
|
49
|
-
const templateDefaults = (cli as any).getTemplateDefaults(template);
|
|
50
|
-
|
|
51
|
-
const { runtime } = await inquirer.prompt([
|
|
52
|
-
{
|
|
53
|
-
type: "list",
|
|
54
|
-
name: "runtime",
|
|
55
|
-
message: "Select runtime:",
|
|
56
|
-
choices: Object.values(RuntimeSchema.Values),
|
|
57
|
-
default: templateDefaults.runtime,
|
|
58
|
-
},
|
|
59
|
-
]);
|
|
60
|
-
|
|
61
|
-
const specifications = await listSpecifications(
|
|
62
|
-
(cli as any).controller!.appwriteServer!
|
|
63
|
-
);
|
|
64
|
-
const { specification } = await inquirer.prompt([
|
|
65
|
-
{
|
|
66
|
-
type: "list",
|
|
67
|
-
name: "specification",
|
|
68
|
-
message: "Select specification:",
|
|
69
|
-
choices: [
|
|
70
|
-
{ name: "None", value: undefined },
|
|
71
|
-
...specifications.specifications.map((s: any) => ({
|
|
72
|
-
name: s.slug,
|
|
73
|
-
value: s.slug,
|
|
74
|
-
})),
|
|
75
|
-
],
|
|
76
|
-
default: templateDefaults.specification,
|
|
77
|
-
},
|
|
78
|
-
]);
|
|
79
|
-
|
|
80
|
-
const functionConfig: AppwriteFunction = {
|
|
81
|
-
$id: ulid(),
|
|
82
|
-
name,
|
|
83
|
-
runtime,
|
|
84
|
-
events: [],
|
|
85
|
-
execute: ["any"],
|
|
86
|
-
enabled: true,
|
|
87
|
-
logging: true,
|
|
88
|
-
entrypoint: templateDefaults.entrypoint,
|
|
89
|
-
commands: templateDefaults.commands,
|
|
90
|
-
specification: specification || templateDefaults.specification,
|
|
91
|
-
scopes: [],
|
|
92
|
-
timeout: 15,
|
|
93
|
-
schedule: "",
|
|
94
|
-
installationId: "",
|
|
95
|
-
providerRepositoryId: "",
|
|
96
|
-
providerBranch: "",
|
|
97
|
-
providerSilentMode: false,
|
|
98
|
-
providerRootDirectory: "",
|
|
99
|
-
templateRepository: "",
|
|
100
|
-
templateOwner: "",
|
|
101
|
-
templateRootDirectory: "",
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
if (template !== "none") {
|
|
105
|
-
await createFunctionTemplate(
|
|
106
|
-
template as "typescript-node" | "uv" | "count-docs-in-collection" | "hono-typescript",
|
|
107
|
-
name,
|
|
108
|
-
"./functions"
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Add to in-memory config
|
|
113
|
-
if (!(cli as any).controller!.config!.functions) {
|
|
114
|
-
(cli as any).controller!.config!.functions = [];
|
|
115
|
-
}
|
|
116
|
-
(cli as any).controller!.config!.functions.push(functionConfig);
|
|
117
|
-
|
|
118
|
-
// If using YAML config, also add to YAML file
|
|
119
|
-
const yamlConfigPath = findYamlConfig((cli as any).currentDir);
|
|
120
|
-
if (yamlConfigPath) {
|
|
121
|
-
try {
|
|
122
|
-
await addFunctionToYamlConfig(yamlConfigPath, functionConfig);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
MessageFormatter.warning(
|
|
125
|
-
`Function created but failed to update YAML config: ${error instanceof Error ? error.message : error}`,
|
|
126
|
-
{ prefix: "Functions" }
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
MessageFormatter.success("Function created successfully!", { prefix: "Functions" });
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
async deployFunction(cli: InteractiveCLI): Promise<void> {
|
|
135
|
-
await (cli as any).initControllerIfNeeded();
|
|
136
|
-
if (!(cli as any).controller?.config) {
|
|
137
|
-
MessageFormatter.error("Failed to initialize controller or load config", undefined, { prefix: "Functions" });
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
|
|
18
|
+
import { addFunctionToYamlConfig, findYamlConfig } from "appwrite-utils-helpers";
|
|
19
|
+
import { RuntimeSchema, type AppwriteFunction, type Runtime, type Specification } from "appwrite-utils";
|
|
20
|
+
import type { InteractiveCLI } from "../../interactiveCLI.js";
|
|
21
|
+
|
|
22
|
+
export const functionCommands = {
|
|
23
|
+
async createFunction(cli: InteractiveCLI): Promise<void> {
|
|
24
|
+
const { name } = await inquirer.prompt([
|
|
25
|
+
{
|
|
26
|
+
type: "input",
|
|
27
|
+
name: "name",
|
|
28
|
+
message: "Function name:",
|
|
29
|
+
validate: (input) => input.length > 0,
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
const { template } = await inquirer.prompt([
|
|
34
|
+
{
|
|
35
|
+
type: "list",
|
|
36
|
+
name: "template",
|
|
37
|
+
message: "Select a template:",
|
|
38
|
+
choices: [
|
|
39
|
+
{ name: "TypeScript Node.js", value: "typescript-node" },
|
|
40
|
+
{ name: "TypeScript with Hono Web Framework", value: "hono-typescript" },
|
|
41
|
+
{ name: "Python with UV", value: "uv" },
|
|
42
|
+
{ name: "Count Documents in Collection", value: "count-docs-in-collection" },
|
|
43
|
+
{ name: "None (Empty Function)", value: "none" },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
// Get template defaults
|
|
49
|
+
const templateDefaults = (cli as any).getTemplateDefaults(template);
|
|
50
|
+
|
|
51
|
+
const { runtime } = await inquirer.prompt([
|
|
52
|
+
{
|
|
53
|
+
type: "list",
|
|
54
|
+
name: "runtime",
|
|
55
|
+
message: "Select runtime:",
|
|
56
|
+
choices: Object.values(RuntimeSchema.Values),
|
|
57
|
+
default: templateDefaults.runtime,
|
|
58
|
+
},
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
const specifications = await listSpecifications(
|
|
62
|
+
(cli as any).controller!.appwriteServer!
|
|
63
|
+
);
|
|
64
|
+
const { specification } = await inquirer.prompt([
|
|
65
|
+
{
|
|
66
|
+
type: "list",
|
|
67
|
+
name: "specification",
|
|
68
|
+
message: "Select specification:",
|
|
69
|
+
choices: [
|
|
70
|
+
{ name: "None", value: undefined },
|
|
71
|
+
...specifications.specifications.map((s: any) => ({
|
|
72
|
+
name: s.slug,
|
|
73
|
+
value: s.slug,
|
|
74
|
+
})),
|
|
75
|
+
],
|
|
76
|
+
default: templateDefaults.specification,
|
|
77
|
+
},
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
const functionConfig: AppwriteFunction = {
|
|
81
|
+
$id: ulid(),
|
|
82
|
+
name,
|
|
83
|
+
runtime,
|
|
84
|
+
events: [],
|
|
85
|
+
execute: ["any"],
|
|
86
|
+
enabled: true,
|
|
87
|
+
logging: true,
|
|
88
|
+
entrypoint: templateDefaults.entrypoint,
|
|
89
|
+
commands: templateDefaults.commands,
|
|
90
|
+
specification: specification || templateDefaults.specification,
|
|
91
|
+
scopes: [],
|
|
92
|
+
timeout: 15,
|
|
93
|
+
schedule: "",
|
|
94
|
+
installationId: "",
|
|
95
|
+
providerRepositoryId: "",
|
|
96
|
+
providerBranch: "",
|
|
97
|
+
providerSilentMode: false,
|
|
98
|
+
providerRootDirectory: "",
|
|
99
|
+
templateRepository: "",
|
|
100
|
+
templateOwner: "",
|
|
101
|
+
templateRootDirectory: "",
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
if (template !== "none") {
|
|
105
|
+
await createFunctionTemplate(
|
|
106
|
+
template as "typescript-node" | "uv" | "count-docs-in-collection" | "hono-typescript",
|
|
107
|
+
name,
|
|
108
|
+
"./functions"
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Add to in-memory config
|
|
113
|
+
if (!(cli as any).controller!.config!.functions) {
|
|
114
|
+
(cli as any).controller!.config!.functions = [];
|
|
115
|
+
}
|
|
116
|
+
(cli as any).controller!.config!.functions.push(functionConfig);
|
|
117
|
+
|
|
118
|
+
// If using YAML config, also add to YAML file
|
|
119
|
+
const yamlConfigPath = findYamlConfig((cli as any).currentDir);
|
|
120
|
+
if (yamlConfigPath) {
|
|
121
|
+
try {
|
|
122
|
+
await addFunctionToYamlConfig(yamlConfigPath, functionConfig);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
MessageFormatter.warning(
|
|
125
|
+
`Function created but failed to update YAML config: ${error instanceof Error ? error.message : error}`,
|
|
126
|
+
{ prefix: "Functions" }
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
MessageFormatter.success("Function created successfully!", { prefix: "Functions" });
|
|
132
|
+
},
|
|
133
|
+
|
|
134
|
+
async deployFunction(cli: InteractiveCLI): Promise<void> {
|
|
135
|
+
await (cli as any).initControllerIfNeeded();
|
|
136
|
+
if (!(cli as any).controller?.config) {
|
|
137
|
+
MessageFormatter.error("Failed to initialize controller or load config", undefined, { prefix: "Functions" });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
141
|
// Discover per-function .fnconfig.yaml definitions and merge with central list for selection
|
|
142
142
|
// No global prompt; we'll handle conflicts per-function if both exist.
|
|
143
143
|
let discovered: any[] = [];
|
|
@@ -153,18 +153,18 @@ export const functionCommands = {
|
|
|
153
153
|
true,
|
|
154
154
|
true
|
|
155
155
|
);
|
|
156
|
-
|
|
157
|
-
if (!functions?.length) {
|
|
158
|
-
MessageFormatter.error("No function selected", undefined, { prefix: "Functions" });
|
|
159
|
-
return;
|
|
160
|
-
}
|
|
161
|
-
|
|
156
|
+
|
|
157
|
+
if (!functions?.length) {
|
|
158
|
+
MessageFormatter.error("No function selected", undefined, { prefix: "Functions" });
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
162
|
for (const functionConfig of functions) {
|
|
163
|
-
if (!functionConfig) {
|
|
164
|
-
MessageFormatter.error("Invalid function configuration", undefined, { prefix: "Functions" });
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
163
|
+
if (!functionConfig) {
|
|
164
|
+
MessageFormatter.error("Invalid function configuration", undefined, { prefix: "Functions" });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
168
|
// Resolve effective config for this function (prefer per-function choice if both sources exist)
|
|
169
169
|
const byIdOrName = (arr: any[]) => arr.find((f:any) => f?.$id === functionConfig.$id || f?.name === functionConfig.name);
|
|
170
170
|
const centralDef = byIdOrName(central as any[]);
|
|
@@ -196,13 +196,13 @@ export const functionCommands = {
|
|
|
196
196
|
if (!(cli as any).controller.config.functions) {
|
|
197
197
|
(cli as any).controller.config.functions = [];
|
|
198
198
|
}
|
|
199
|
-
|
|
199
|
+
|
|
200
200
|
const functionNameLower = effectiveConfig.name
|
|
201
201
|
.toLowerCase()
|
|
202
202
|
.replace(/\s+/g, "-");
|
|
203
|
-
|
|
204
|
-
// Debug logging
|
|
205
|
-
MessageFormatter.info(`🔍 Function deployment debug:`, { prefix: "Functions" });
|
|
203
|
+
|
|
204
|
+
// Debug logging
|
|
205
|
+
MessageFormatter.info(`🔍 Function deployment debug:`, { prefix: "Functions" });
|
|
206
206
|
MessageFormatter.info(` Function name: ${effectiveConfig.name}`, { prefix: "Functions" });
|
|
207
207
|
MessageFormatter.info(` Function ID: ${effectiveConfig.$id}`, { prefix: "Functions" });
|
|
208
208
|
MessageFormatter.info(` Config dirPath: ${effectiveConfig.dirPath || 'undefined'}`, { prefix: "Functions" });
|
|
@@ -212,207 +212,208 @@ export const functionCommands = {
|
|
|
212
212
|
: effectiveConfig.dirPath;
|
|
213
213
|
MessageFormatter.info(` Expanded dirPath: ${expandedPath}`, { prefix: "Functions" });
|
|
214
214
|
}
|
|
215
|
-
MessageFormatter.info(` Appwrite folder: ${(cli as any).controller.getAppwriteFolderPath()}`, { prefix: "Functions" });
|
|
216
|
-
MessageFormatter.info(` Current working dir: ${process.cwd()}`, { prefix: "Functions" });
|
|
217
|
-
|
|
215
|
+
MessageFormatter.info(` Appwrite folder: ${(cli as any).controller.getAppwriteFolderPath()}`, { prefix: "Functions" });
|
|
216
|
+
MessageFormatter.info(` Current working dir: ${process.cwd()}`, { prefix: "Functions" });
|
|
217
|
+
|
|
218
218
|
// Resolve config dirPath relative to central YAML if it's relative
|
|
219
219
|
const yamlConfigPath = findYamlConfig((cli as any).currentDir);
|
|
220
220
|
const yamlBaseDir = yamlConfigPath ? require('node:path').dirname(yamlConfigPath) : process.cwd();
|
|
221
221
|
const expandTildePath = (p: string): string => (p?.startsWith('~/') ? p.replace('~', os.homedir()) : p);
|
|
222
|
-
|
|
223
|
-
// Check locations in priority order:
|
|
224
|
-
const priorityLocations = [
|
|
225
|
-
// 1. Config dirPath if specified (with tilde expansion)
|
|
222
|
+
|
|
223
|
+
// Check locations in priority order:
|
|
224
|
+
const priorityLocations = [
|
|
225
|
+
// 1. Config dirPath if specified (with tilde expansion)
|
|
226
226
|
effectiveConfig.dirPath
|
|
227
227
|
? (require('node:path').isAbsolute(expandTildePath(effectiveConfig.dirPath))
|
|
228
228
|
? expandTildePath(effectiveConfig.dirPath)
|
|
229
229
|
: require('node:path').resolve(yamlBaseDir, expandTildePath(effectiveConfig.dirPath)))
|
|
230
230
|
: undefined,
|
|
231
|
-
// 2. Appwrite config folder/functions/name
|
|
232
|
-
join(
|
|
233
|
-
(cli as any).controller.getAppwriteFolderPath()!,
|
|
234
|
-
"functions",
|
|
235
|
-
functionNameLower
|
|
236
|
-
),
|
|
237
|
-
// 3. Current working directory/functions/name
|
|
238
|
-
join(process.cwd(), "functions", functionNameLower),
|
|
239
|
-
// 4. Current working directory/name
|
|
240
|
-
join(process.cwd(), functionNameLower),
|
|
241
|
-
].filter((val): val is string => val !== undefined);
|
|
242
|
-
|
|
243
|
-
MessageFormatter.info(`🔍 Priority locations to check:`, { prefix: "Functions" });
|
|
244
|
-
priorityLocations.forEach((loc, i) => {
|
|
245
|
-
MessageFormatter.info(` ${i + 1}. ${loc}`, { prefix: "Functions" });
|
|
246
|
-
});
|
|
247
|
-
|
|
231
|
+
// 2. Appwrite config folder/functions/name
|
|
232
|
+
join(
|
|
233
|
+
(cli as any).controller.getAppwriteFolderPath()!,
|
|
234
|
+
"functions",
|
|
235
|
+
functionNameLower
|
|
236
|
+
),
|
|
237
|
+
// 3. Current working directory/functions/name
|
|
238
|
+
join(process.cwd(), "functions", functionNameLower),
|
|
239
|
+
// 4. Current working directory/name
|
|
240
|
+
join(process.cwd(), functionNameLower),
|
|
241
|
+
].filter((val): val is string => val !== undefined);
|
|
242
|
+
|
|
243
|
+
MessageFormatter.info(`🔍 Priority locations to check:`, { prefix: "Functions" });
|
|
244
|
+
priorityLocations.forEach((loc, i) => {
|
|
245
|
+
MessageFormatter.info(` ${i + 1}. ${loc}`, { prefix: "Functions" });
|
|
246
|
+
});
|
|
247
|
+
|
|
248
248
|
let functionPath: string | null = null;
|
|
249
|
-
|
|
250
|
-
// Check each priority location
|
|
251
|
-
for (const location of priorityLocations) {
|
|
252
|
-
MessageFormatter.info(` Checking: ${location} - ${fs.existsSync(location) ? 'EXISTS' : 'NOT FOUND'}`, { prefix: "Functions" });
|
|
253
|
-
if (fs.existsSync(location)) {
|
|
254
|
-
MessageFormatter.success(`✅ Found function at: ${location}`, { prefix: "Functions" });
|
|
255
|
-
functionPath = location;
|
|
256
|
-
break;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// If not found in priority locations, do a broader search
|
|
261
|
-
if (!functionPath) {
|
|
262
|
-
MessageFormatter.info(`Function not found in primary locations, searching subdirectories...`, { prefix: "Functions" });
|
|
263
|
-
|
|
264
|
-
// Search in both appwrite config directory and current working directory
|
|
265
|
-
functionPath = await (cli as any).findFunctionInSubdirectories(
|
|
266
|
-
[(cli as any).controller.getAppwriteFolderPath()!, process.cwd()],
|
|
267
|
-
functionNameLower
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
if (!functionPath) {
|
|
272
|
-
const { shouldDownload } = await inquirer.prompt([
|
|
273
|
-
{
|
|
274
|
-
type: "confirm",
|
|
275
|
-
name: "shouldDownload",
|
|
276
|
-
message:
|
|
277
|
-
"Function not found locally. Would you like to download the latest deployment?",
|
|
278
|
-
default: false,
|
|
279
|
-
},
|
|
280
|
-
]);
|
|
281
|
-
|
|
282
|
-
if (shouldDownload) {
|
|
283
|
-
try {
|
|
284
|
-
MessageFormatter.progress("Downloading latest deployment...", { prefix: "Functions" });
|
|
285
|
-
const { path: downloadedPath, function: remoteFunction } =
|
|
286
|
-
await downloadLatestFunctionDeployment(
|
|
287
|
-
(cli as any).controller.appwriteServer!,
|
|
249
|
+
|
|
250
|
+
// Check each priority location
|
|
251
|
+
for (const location of priorityLocations) {
|
|
252
|
+
MessageFormatter.info(` Checking: ${location} - ${fs.existsSync(location) ? 'EXISTS' : 'NOT FOUND'}`, { prefix: "Functions" });
|
|
253
|
+
if (fs.existsSync(location)) {
|
|
254
|
+
MessageFormatter.success(`✅ Found function at: ${location}`, { prefix: "Functions" });
|
|
255
|
+
functionPath = location;
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// If not found in priority locations, do a broader search
|
|
261
|
+
if (!functionPath) {
|
|
262
|
+
MessageFormatter.info(`Function not found in primary locations, searching subdirectories...`, { prefix: "Functions" });
|
|
263
|
+
|
|
264
|
+
// Search in both appwrite config directory and current working directory
|
|
265
|
+
functionPath = await (cli as any).findFunctionInSubdirectories(
|
|
266
|
+
[(cli as any).controller.getAppwriteFolderPath()!, process.cwd()],
|
|
267
|
+
functionNameLower
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (!functionPath) {
|
|
272
|
+
const { shouldDownload } = await inquirer.prompt([
|
|
273
|
+
{
|
|
274
|
+
type: "confirm",
|
|
275
|
+
name: "shouldDownload",
|
|
276
|
+
message:
|
|
277
|
+
"Function not found locally. Would you like to download the latest deployment?",
|
|
278
|
+
default: false,
|
|
279
|
+
},
|
|
280
|
+
]);
|
|
281
|
+
|
|
282
|
+
if (shouldDownload) {
|
|
283
|
+
try {
|
|
284
|
+
MessageFormatter.progress("Downloading latest deployment...", { prefix: "Functions" });
|
|
285
|
+
const { path: downloadedPath, function: remoteFunction } =
|
|
286
|
+
await downloadLatestFunctionDeployment(
|
|
287
|
+
(cli as any).controller.appwriteServer!,
|
|
288
288
|
effectiveConfig.$id,
|
|
289
289
|
join((cli as any).controller.getAppwriteFolderPath()!, "functions")
|
|
290
290
|
);
|
|
291
|
-
MessageFormatter.success(`✨ Function downloaded to ${downloadedPath}`, { prefix: "Functions" });
|
|
292
|
-
|
|
293
|
-
functionPath = downloadedPath;
|
|
291
|
+
MessageFormatter.success(`✨ Function downloaded to ${downloadedPath}`, { prefix: "Functions" });
|
|
292
|
+
|
|
293
|
+
functionPath = downloadedPath;
|
|
294
294
|
effectiveConfig.dirPath = downloadedPath;
|
|
295
|
-
|
|
296
|
-
const existingIndex = (cli as any).controller.config.functions.findIndex(
|
|
297
|
-
(f: any) => f?.$id === remoteFunction.$id
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
if (existingIndex >= 0) {
|
|
295
|
+
|
|
296
|
+
const existingIndex = (cli as any).controller.config.functions.findIndex(
|
|
297
|
+
(f: any) => f?.$id === remoteFunction.$id
|
|
298
|
+
);
|
|
299
|
+
|
|
300
|
+
if (existingIndex >= 0) {
|
|
301
301
|
(cli as any).controller.config.functions[existingIndex].dirPath =
|
|
302
302
|
downloadedPath;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
await (cli as any).reloadConfigWithSessionPreservation();
|
|
306
|
-
} catch (error) {
|
|
307
|
-
MessageFormatter.error("Failed to download function deployment", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
} else {
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
await (cli as any).reloadConfigWithSessionPreservation();
|
|
306
|
+
} catch (error) {
|
|
307
|
+
MessageFormatter.error("Failed to download function deployment", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
} else {
|
|
311
311
|
MessageFormatter.error(`Function ${effectiveConfig.name} not found locally. Cannot deploy.`, undefined, { prefix: "Functions" });
|
|
312
312
|
return;
|
|
313
313
|
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (!(cli as any).controller.appwriteServer) {
|
|
317
|
-
MessageFormatter.error("Appwrite server not initialized", undefined, { prefix: "Functions" });
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
try {
|
|
322
|
-
await deployLocalFunction(
|
|
323
|
-
(cli as any).controller.appwriteServer,
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (!(cli as any).controller.appwriteServer) {
|
|
317
|
+
MessageFormatter.error("Appwrite server not initialized", undefined, { prefix: "Functions" });
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
try {
|
|
322
|
+
await deployLocalFunction(
|
|
323
|
+
(cli as any).controller.appwriteServer,
|
|
324
324
|
effectiveConfig.name,
|
|
325
325
|
{
|
|
326
326
|
...effectiveConfig,
|
|
327
327
|
dirPath: functionPath,
|
|
328
328
|
},
|
|
329
|
-
functionPath
|
|
329
|
+
functionPath,
|
|
330
|
+
yamlBaseDir
|
|
330
331
|
);
|
|
331
|
-
MessageFormatter.success("Function deployed successfully!", { prefix: "Functions" });
|
|
332
|
-
} catch (error) {
|
|
333
|
-
MessageFormatter.error("Failed to deploy function", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
},
|
|
337
|
-
|
|
338
|
-
async deleteFunction(cli: InteractiveCLI): Promise<void> {
|
|
339
|
-
const functions = await (cli as any).selectFunctions(
|
|
340
|
-
"Select functions to delete:",
|
|
341
|
-
true,
|
|
342
|
-
false
|
|
343
|
-
);
|
|
344
|
-
|
|
345
|
-
if (!functions.length) {
|
|
346
|
-
MessageFormatter.error("No functions selected", undefined, { prefix: "Functions" });
|
|
347
|
-
return;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
for (const func of functions) {
|
|
351
|
-
try {
|
|
352
|
-
await deleteFunction((cli as any).controller!.appwriteServer!, func.$id);
|
|
353
|
-
MessageFormatter.success(`✨ Function ${func.name} deleted successfully!`, { prefix: "Functions" });
|
|
354
|
-
} catch (error) {
|
|
355
|
-
MessageFormatter.error(`Failed to delete function ${func.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
|
|
360
|
-
async updateFunctionSpec(cli: InteractiveCLI): Promise<void> {
|
|
361
|
-
const remoteFunctions = await listFunctions(
|
|
362
|
-
(cli as any).controller!.appwriteServer!,
|
|
363
|
-
[Query.limit(1000)]
|
|
364
|
-
);
|
|
365
|
-
const localFunctions = (cli as any).getLocalFunctions();
|
|
366
|
-
|
|
367
|
-
const allFunctions = [
|
|
368
|
-
...remoteFunctions.functions,
|
|
369
|
-
...localFunctions.filter(
|
|
370
|
-
(f: any) => !remoteFunctions.functions.some((rf: any) => rf.name === f.name)
|
|
371
|
-
),
|
|
372
|
-
];
|
|
373
|
-
|
|
374
|
-
const functionsToUpdate = await inquirer.prompt([
|
|
375
|
-
{
|
|
376
|
-
type: "checkbox",
|
|
377
|
-
name: "functionId",
|
|
378
|
-
message: "Select functions to update:",
|
|
379
|
-
choices: allFunctions.map((f: any) => ({
|
|
380
|
-
name: `${f.name} (${f.$id})${
|
|
381
|
-
localFunctions.some((lf: any) => lf.name === f.name)
|
|
382
|
-
? " (Local)"
|
|
383
|
-
: " (Remote)"
|
|
384
|
-
}`,
|
|
385
|
-
value: f.$id,
|
|
386
|
-
})),
|
|
387
|
-
loop: true,
|
|
388
|
-
},
|
|
389
|
-
]);
|
|
390
|
-
|
|
391
|
-
const specifications = await listSpecifications(
|
|
392
|
-
(cli as any).controller!.appwriteServer!
|
|
393
|
-
);
|
|
394
|
-
const { specification } = await inquirer.prompt([
|
|
395
|
-
{
|
|
396
|
-
type: "list",
|
|
397
|
-
name: "specification",
|
|
398
|
-
message: "Select new specification:",
|
|
399
|
-
choices: specifications.specifications.map((s: any) => ({
|
|
400
|
-
name: `${s.slug}`,
|
|
401
|
-
value: s.slug,
|
|
402
|
-
})),
|
|
403
|
-
},
|
|
404
|
-
]);
|
|
405
|
-
|
|
406
|
-
try {
|
|
407
|
-
for (const functionId of functionsToUpdate.functionId) {
|
|
408
|
-
await (cli as any).controller!.updateFunctionSpecifications(
|
|
409
|
-
functionId,
|
|
410
|
-
specification
|
|
411
|
-
);
|
|
412
|
-
MessageFormatter.success(`Successfully updated function specification to ${specification}`, { prefix: "Functions" });
|
|
413
|
-
}
|
|
414
|
-
} catch (error) {
|
|
415
|
-
MessageFormatter.error("Error updating function specification", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
};
|
|
332
|
+
MessageFormatter.success("Function deployed successfully!", { prefix: "Functions" });
|
|
333
|
+
} catch (error) {
|
|
334
|
+
MessageFormatter.error("Failed to deploy function", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
|
|
339
|
+
async deleteFunction(cli: InteractiveCLI): Promise<void> {
|
|
340
|
+
const functions = await (cli as any).selectFunctions(
|
|
341
|
+
"Select functions to delete:",
|
|
342
|
+
true,
|
|
343
|
+
false
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
if (!functions.length) {
|
|
347
|
+
MessageFormatter.error("No functions selected", undefined, { prefix: "Functions" });
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
for (const func of functions) {
|
|
352
|
+
try {
|
|
353
|
+
await deleteFunction((cli as any).controller!.appwriteServer!, func.$id);
|
|
354
|
+
MessageFormatter.success(`✨ Function ${func.name} deleted successfully!`, { prefix: "Functions" });
|
|
355
|
+
} catch (error) {
|
|
356
|
+
MessageFormatter.error(`Failed to delete function ${func.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
},
|
|
360
|
+
|
|
361
|
+
async updateFunctionSpec(cli: InteractiveCLI): Promise<void> {
|
|
362
|
+
const remoteFunctions = await listFunctions(
|
|
363
|
+
(cli as any).controller!.appwriteServer!,
|
|
364
|
+
[Query.limit(1000)]
|
|
365
|
+
);
|
|
366
|
+
const localFunctions = (cli as any).getLocalFunctions();
|
|
367
|
+
|
|
368
|
+
const allFunctions = [
|
|
369
|
+
...remoteFunctions.functions,
|
|
370
|
+
...localFunctions.filter(
|
|
371
|
+
(f: any) => !remoteFunctions.functions.some((rf: any) => rf.name === f.name)
|
|
372
|
+
),
|
|
373
|
+
];
|
|
374
|
+
|
|
375
|
+
const functionsToUpdate = await inquirer.prompt([
|
|
376
|
+
{
|
|
377
|
+
type: "checkbox",
|
|
378
|
+
name: "functionId",
|
|
379
|
+
message: "Select functions to update:",
|
|
380
|
+
choices: allFunctions.map((f: any) => ({
|
|
381
|
+
name: `${f.name} (${f.$id})${
|
|
382
|
+
localFunctions.some((lf: any) => lf.name === f.name)
|
|
383
|
+
? " (Local)"
|
|
384
|
+
: " (Remote)"
|
|
385
|
+
}`,
|
|
386
|
+
value: f.$id,
|
|
387
|
+
})),
|
|
388
|
+
loop: true,
|
|
389
|
+
},
|
|
390
|
+
]);
|
|
391
|
+
|
|
392
|
+
const specifications = await listSpecifications(
|
|
393
|
+
(cli as any).controller!.appwriteServer!
|
|
394
|
+
);
|
|
395
|
+
const { specification } = await inquirer.prompt([
|
|
396
|
+
{
|
|
397
|
+
type: "list",
|
|
398
|
+
name: "specification",
|
|
399
|
+
message: "Select new specification:",
|
|
400
|
+
choices: specifications.specifications.map((s: any) => ({
|
|
401
|
+
name: `${s.slug}`,
|
|
402
|
+
value: s.slug,
|
|
403
|
+
})),
|
|
404
|
+
},
|
|
405
|
+
]);
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
for (const functionId of functionsToUpdate.functionId) {
|
|
409
|
+
await (cli as any).controller!.updateFunctionSpecifications(
|
|
410
|
+
functionId,
|
|
411
|
+
specification
|
|
412
|
+
);
|
|
413
|
+
MessageFormatter.success(`Successfully updated function specification to ${specification}`, { prefix: "Functions" });
|
|
414
|
+
}
|
|
415
|
+
} catch (error) {
|
|
416
|
+
MessageFormatter.error("Error updating function specification", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
};
|