appwrite-utils-cli 1.9.7 → 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 -10
- package/src/collections/indexes.ts +350 -352
- package/src/collections/methods.ts +714 -700
- package/src/collections/tableOperations.ts +29 -8
- 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 +408 -408
- 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 -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/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 -1333
- 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 -587
- package/dist/collections/tableOperations.d.ts +0 -86
- package/dist/collections/tableOperations.js +0 -447
- 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 -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/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/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/tables/indexManager.d.ts +0 -65
- package/dist/tables/indexManager.js +0 -294
- 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 -529
- package/src/adapters/DatabaseAdapter.ts +0 -319
- package/src/adapters/LegacyAdapter.ts +0 -844
- package/src/adapters/TablesDBAdapter.ts +0 -823
- 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/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/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,350 +1,350 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { jest } from '@jest/globals';
|
|
4
|
-
import { TestUtils } from '../testUtils';
|
|
5
|
-
import { loadConfig, loadConfigWithPath, findAppwriteConfig } from '../../src/utils/loadConfigs';
|
|
6
|
-
import { MessageFormatter } from '../../src/shared/messageFormatter';
|
|
7
|
-
|
|
8
|
-
// Mock MessageFormatter to capture log messages
|
|
9
|
-
jest.mock('../../src/shared/messageFormatter', () => ({
|
|
10
|
-
MessageFormatter: {
|
|
11
|
-
success: jest.fn(),
|
|
12
|
-
warning: jest.fn(),
|
|
13
|
-
info: jest.fn(),
|
|
14
|
-
error: jest.fn(),
|
|
15
|
-
},
|
|
16
|
-
}));
|
|
17
|
-
|
|
18
|
-
// Mock version detection
|
|
19
|
-
jest.mock('../../src/utils/versionDetection', () => ({
|
|
20
|
-
detectAppwriteVersionCached: jest.fn().mockResolvedValue({
|
|
21
|
-
serverVersion: '1.6.0',
|
|
22
|
-
apiMode: 'database',
|
|
23
|
-
}),
|
|
24
|
-
fetchServerVersion: jest.fn().mockResolvedValue('1.6.0'),
|
|
25
|
-
isVersionAtLeast: jest.fn((version, target) => {
|
|
26
|
-
if (!version) return false;
|
|
27
|
-
return version >= target;
|
|
28
|
-
}),
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
|
-
describe('loadConfigs - Dual Schema Support', () => {
|
|
32
|
-
let testDir: string;
|
|
33
|
-
|
|
34
|
-
beforeEach(() => {
|
|
35
|
-
jest.clearAllMocks();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
afterEach(() => {
|
|
39
|
-
TestUtils.cleanup();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
describe('findAppwriteConfig', () => {
|
|
43
|
-
it('should find YAML config in .appwrite directory', () => {
|
|
44
|
-
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
45
|
-
const configPath = findAppwriteConfig(testDir);
|
|
46
|
-
expect(configPath).toBe(testDir);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('should find TypeScript config as fallback', () => {
|
|
50
|
-
testDir = TestUtils.createTestProject({ useYaml: false });
|
|
51
|
-
const configPath = findAppwriteConfig(testDir);
|
|
52
|
-
expect(configPath).toBe(testDir);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it('should return null when no config found', () => {
|
|
56
|
-
testDir = TestUtils.createTempDir();
|
|
57
|
-
const configPath = findAppwriteConfig(testDir);
|
|
58
|
-
expect(configPath).toBeNull();
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
describe('Dual Folder Loading', () => {
|
|
63
|
-
it('should load collections from collections/ directory only', async () => {
|
|
64
|
-
testDir = TestUtils.createTestProject({
|
|
65
|
-
hasCollections: true,
|
|
66
|
-
hasTables: false,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
const config = await loadConfig(testDir);
|
|
70
|
-
|
|
71
|
-
expect(config.collections).toHaveLength(1);
|
|
72
|
-
expect(config.collections[0].name).toBe('TestCollection');
|
|
73
|
-
expect(config.collections[0]._isFromTablesDir).toBeUndefined();
|
|
74
|
-
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
75
|
-
'Loading from collections/ directory: 1 files found',
|
|
76
|
-
{ prefix: 'Config' }
|
|
77
|
-
);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('should load tables from tables/ directory only', async () => {
|
|
81
|
-
testDir = TestUtils.createTestProject({
|
|
82
|
-
hasCollections: false,
|
|
83
|
-
hasTables: true,
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
const config = await loadConfig(testDir);
|
|
87
|
-
|
|
88
|
-
expect(config.collections).toHaveLength(1);
|
|
89
|
-
expect(config.collections[0].name).toBe('TestTable');
|
|
90
|
-
expect(config.collections[0]._isFromTablesDir).toBe(true);
|
|
91
|
-
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
92
|
-
'Loading from tables/ directory: 1 files found',
|
|
93
|
-
{ prefix: 'Config' }
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('should load from both collections/ and tables/ directories', async () => {
|
|
98
|
-
testDir = TestUtils.createTestProject({
|
|
99
|
-
hasCollections: true,
|
|
100
|
-
hasTables: true,
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
const config = await loadConfig(testDir);
|
|
104
|
-
|
|
105
|
-
expect(config.collections).toHaveLength(2);
|
|
106
|
-
|
|
107
|
-
const collection = config.collections.find((c: any) => !c._isFromTablesDir);
|
|
108
|
-
const table = config.collections.find((c: any) => c._isFromTablesDir);
|
|
109
|
-
|
|
110
|
-
expect(collection).toBeDefined();
|
|
111
|
-
expect(collection.name).toBe('TestCollection');
|
|
112
|
-
|
|
113
|
-
expect(table).toBeDefined();
|
|
114
|
-
expect(table.name).toBe('TestTable');
|
|
115
|
-
expect(table._isFromTablesDir).toBe(true);
|
|
116
|
-
|
|
117
|
-
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
118
|
-
'Loading from collections/ directory: 1 files found',
|
|
119
|
-
{ prefix: 'Config' }
|
|
120
|
-
);
|
|
121
|
-
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
122
|
-
'Loading from tables/ directory: 1 files found',
|
|
123
|
-
{ prefix: 'Config' }
|
|
124
|
-
);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('should handle naming conflicts with collections/ taking priority', async () => {
|
|
128
|
-
testDir = TestUtils.createTestProject({
|
|
129
|
-
hasCollections: true,
|
|
130
|
-
hasTables: true,
|
|
131
|
-
hasConflicts: true,
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
const config = await loadConfig(testDir);
|
|
135
|
-
|
|
136
|
-
// Should have 2 items: original collection + one table (conflict skipped)
|
|
137
|
-
expect(config.collections).toHaveLength(2);
|
|
138
|
-
|
|
139
|
-
// Check that the collection takes priority
|
|
140
|
-
const collectionItems = config.collections.filter((c: any) => !c._isFromTablesDir);
|
|
141
|
-
expect(collectionItems).toHaveLength(1);
|
|
142
|
-
expect(collectionItems[0].name).toBe('TestCollection');
|
|
143
|
-
|
|
144
|
-
// Check warning was logged
|
|
145
|
-
expect(MessageFormatter.warning).toHaveBeenCalledWith(
|
|
146
|
-
expect.stringContaining('Found 1 naming conflicts'),
|
|
147
|
-
{ prefix: 'Config' }
|
|
148
|
-
);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
describe('YAML Support', () => {
|
|
153
|
-
it('should load YAML collections', async () => {
|
|
154
|
-
testDir = TestUtils.createTestProject({
|
|
155
|
-
hasCollections: true,
|
|
156
|
-
useYaml: true,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
const config = await loadConfig(testDir);
|
|
160
|
-
|
|
161
|
-
expect(config.collections).toHaveLength(1);
|
|
162
|
-
expect(config.collections[0].name).toBe('TestCollection');
|
|
163
|
-
expect(config.collections[0].$id).toBe('test-collection');
|
|
164
|
-
expect(config.collections[0].attributes).toHaveLength(2);
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('should load YAML tables', async () => {
|
|
168
|
-
testDir = TestUtils.createTestProject({
|
|
169
|
-
hasTables: true,
|
|
170
|
-
useYaml: true,
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
const config = await loadConfig(testDir);
|
|
174
|
-
|
|
175
|
-
expect(config.collections).toHaveLength(1);
|
|
176
|
-
expect(config.collections[0].name).toBe('TestTable');
|
|
177
|
-
expect(config.collections[0]._isFromTablesDir).toBe(true);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should load mixed YAML and TypeScript files', async () => {
|
|
181
|
-
testDir = TestUtils.createTestProject({
|
|
182
|
-
hasCollections: true,
|
|
183
|
-
useYaml: false,
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// Add a YAML table alongside TypeScript collection
|
|
187
|
-
const tablesDir = path.join(testDir, 'tables');
|
|
188
|
-
fs.mkdirSync(tablesDir);
|
|
189
|
-
|
|
190
|
-
const yamlContent = `
|
|
191
|
-
name: YamlTable
|
|
192
|
-
tableId: yaml-table
|
|
193
|
-
databaseId: test-db-id
|
|
194
|
-
documentSecurity: false
|
|
195
|
-
enabled: true
|
|
196
|
-
permissions: []
|
|
197
|
-
attributes:
|
|
198
|
-
- key: content
|
|
199
|
-
type: string
|
|
200
|
-
size: 1000
|
|
201
|
-
required: true
|
|
202
|
-
indexes: []
|
|
203
|
-
`;
|
|
204
|
-
fs.writeFileSync(path.join(tablesDir, 'YamlTable.yaml'), yamlContent);
|
|
205
|
-
|
|
206
|
-
const config = await loadConfig(testDir);
|
|
207
|
-
|
|
208
|
-
expect(config.collections).toHaveLength(2);
|
|
209
|
-
expect(config.collections.some((c: any) => c.name === 'TestCollection')).toBe(true);
|
|
210
|
-
expect(config.collections.some((c: any) => c.name === 'YamlTable')).toBe(true);
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
describe('Legacy Single Directory Support', () => {
|
|
215
|
-
it('should fall back to legacy collections/ directory when no dual directories', async () => {
|
|
216
|
-
testDir = TestUtils.createTempDir();
|
|
217
|
-
|
|
218
|
-
// Create config without .appwrite structure
|
|
219
|
-
const config = TestUtils.createTestAppwriteConfig();
|
|
220
|
-
const tsContent = `
|
|
221
|
-
import { type AppwriteConfig } from 'appwrite-utils';
|
|
222
|
-
const appwriteConfig: AppwriteConfig = ${JSON.stringify(config, null, 2)};
|
|
223
|
-
export default appwriteConfig;
|
|
224
|
-
`;
|
|
225
|
-
fs.writeFileSync(path.join(testDir, 'appwriteConfig.ts'), tsContent);
|
|
226
|
-
|
|
227
|
-
// Create only collections directory (legacy)
|
|
228
|
-
const collectionsDir = path.join(testDir, 'collections');
|
|
229
|
-
fs.mkdirSync(collectionsDir);
|
|
230
|
-
|
|
231
|
-
const collection = TestUtils.createTestCollection();
|
|
232
|
-
const collectionContent = `
|
|
233
|
-
const TestCollection = ${JSON.stringify(collection, null, 2)};
|
|
234
|
-
export default TestCollection;
|
|
235
|
-
`;
|
|
236
|
-
fs.writeFileSync(path.join(collectionsDir, 'TestCollection.ts'), collectionContent);
|
|
237
|
-
|
|
238
|
-
const loadedConfig = await loadConfig(testDir);
|
|
239
|
-
|
|
240
|
-
expect(loadedConfig.collections).toHaveLength(1);
|
|
241
|
-
expect(loadedConfig.collections[0].name).toBe('TestCollection');
|
|
242
|
-
expect(MessageFormatter.info).toHaveBeenCalledWith(
|
|
243
|
-
'Using legacy single directory: collections/',
|
|
244
|
-
{ prefix: 'Config' }
|
|
245
|
-
);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
describe('loadConfigWithPath', () => {
|
|
250
|
-
it('should return both config and actual config path', async () => {
|
|
251
|
-
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
252
|
-
|
|
253
|
-
const result = await loadConfigWithPath(testDir);
|
|
254
|
-
|
|
255
|
-
expect(result.config).toBeDefined();
|
|
256
|
-
expect(result.actualConfigPath).toContain('config.yaml');
|
|
257
|
-
expect(result.config.appwriteProject).toBe('test-project');
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
it('should handle .appwrite directory path directly', async () => {
|
|
261
|
-
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
262
|
-
const appwriteDir = path.join(testDir, '.appwrite');
|
|
263
|
-
|
|
264
|
-
const result = await loadConfigWithPath(appwriteDir);
|
|
265
|
-
|
|
266
|
-
expect(result.config).toBeDefined();
|
|
267
|
-
expect(result.actualConfigPath).toContain('config.yaml');
|
|
268
|
-
});
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
describe('Error Handling', () => {
|
|
272
|
-
it('should throw error when no config found', async () => {
|
|
273
|
-
testDir = TestUtils.createTempDir();
|
|
274
|
-
|
|
275
|
-
await expect(loadConfig(testDir)).rejects.toThrow('No valid configuration found');
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
it('should handle malformed YAML gracefully', async () => {
|
|
279
|
-
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
280
|
-
|
|
281
|
-
// Create malformed YAML collection
|
|
282
|
-
const collectionsDir = path.join(testDir, 'collections');
|
|
283
|
-
fs.writeFileSync(path.join(collectionsDir, 'BadCollection.yaml'), 'invalid: yaml: content:');
|
|
284
|
-
|
|
285
|
-
const config = await loadConfig(testDir);
|
|
286
|
-
|
|
287
|
-
// Should still load other valid collections
|
|
288
|
-
expect(config).toBeDefined();
|
|
289
|
-
// The malformed collection should be skipped
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
it('should handle missing TypeScript exports gracefully', async () => {
|
|
293
|
-
testDir = TestUtils.createTestProject({ useYaml: false });
|
|
294
|
-
|
|
295
|
-
// Create TypeScript file with no export
|
|
296
|
-
const collectionsDir = path.join(testDir, 'collections');
|
|
297
|
-
fs.writeFileSync(path.join(collectionsDir, 'NoExport.ts'), 'const collection = {};');
|
|
298
|
-
|
|
299
|
-
const config = await loadConfig(testDir);
|
|
300
|
-
|
|
301
|
-
expect(config).toBeDefined();
|
|
302
|
-
// Should still have the original test collection
|
|
303
|
-
expect(config.collections.length).toBeGreaterThanOrEqual(1);
|
|
304
|
-
});
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
describe('Performance and Scalability', () => {
|
|
308
|
-
it('should handle large numbers of collections and tables', async () => {
|
|
309
|
-
testDir = TestUtils.createTempDir();
|
|
310
|
-
|
|
311
|
-
// Create config
|
|
312
|
-
const config = TestUtils.createTestAppwriteConfig();
|
|
313
|
-
const tsContent = `export default ${JSON.stringify(config, null, 2)};`;
|
|
314
|
-
fs.writeFileSync(path.join(testDir, 'appwriteConfig.ts'), tsContent);
|
|
315
|
-
|
|
316
|
-
// Create many collections
|
|
317
|
-
const collectionsDir = path.join(testDir, 'collections');
|
|
318
|
-
fs.mkdirSync(collectionsDir);
|
|
319
|
-
|
|
320
|
-
for (let i = 0; i < 50; i++) {
|
|
321
|
-
const collection = TestUtils.createTestCollection({
|
|
322
|
-
name: `Collection${i}`,
|
|
323
|
-
$id: `collection-${i}`,
|
|
324
|
-
});
|
|
325
|
-
const content = `export default ${JSON.stringify(collection, null, 2)};`;
|
|
326
|
-
fs.writeFileSync(path.join(collectionsDir, `Collection${i}.ts`), content);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// Create many tables
|
|
330
|
-
const tablesDir = path.join(testDir, 'tables');
|
|
331
|
-
fs.mkdirSync(tablesDir);
|
|
332
|
-
|
|
333
|
-
for (let i = 0; i < 30; i++) {
|
|
334
|
-
const table = TestUtils.createTestTable({
|
|
335
|
-
name: `Table${i}`,
|
|
336
|
-
tableId: `table-${i}`,
|
|
337
|
-
});
|
|
338
|
-
const content = `export default ${JSON.stringify(table, null, 2)};`;
|
|
339
|
-
fs.writeFileSync(path.join(tablesDir, `Table${i}.ts`), content);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const startTime = Date.now();
|
|
343
|
-
const loadedConfig = await loadConfig(testDir);
|
|
344
|
-
const loadTime = Date.now() - startTime;
|
|
345
|
-
|
|
346
|
-
expect(loadedConfig.collections).toHaveLength(80); // 50 collections + 30 tables
|
|
347
|
-
expect(loadTime).toBeLessThan(5000); // Should load within 5 seconds
|
|
348
|
-
});
|
|
349
|
-
});
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { jest } from '@jest/globals';
|
|
4
|
+
import { TestUtils } from '../testUtils';
|
|
5
|
+
import { loadConfig, loadConfigWithPath, findAppwriteConfig } from '../../src/utils/loadConfigs';
|
|
6
|
+
import { MessageFormatter } from '../../src/shared/messageFormatter';
|
|
7
|
+
|
|
8
|
+
// Mock MessageFormatter to capture log messages
|
|
9
|
+
jest.mock('../../src/shared/messageFormatter', () => ({
|
|
10
|
+
MessageFormatter: {
|
|
11
|
+
success: jest.fn(),
|
|
12
|
+
warning: jest.fn(),
|
|
13
|
+
info: jest.fn(),
|
|
14
|
+
error: jest.fn(),
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
|
|
18
|
+
// Mock version detection
|
|
19
|
+
jest.mock('../../src/utils/versionDetection', () => ({
|
|
20
|
+
detectAppwriteVersionCached: jest.fn().mockResolvedValue({
|
|
21
|
+
serverVersion: '1.6.0',
|
|
22
|
+
apiMode: 'database',
|
|
23
|
+
}),
|
|
24
|
+
fetchServerVersion: jest.fn().mockResolvedValue('1.6.0'),
|
|
25
|
+
isVersionAtLeast: jest.fn((version, target) => {
|
|
26
|
+
if (!version) return false;
|
|
27
|
+
return version >= target;
|
|
28
|
+
}),
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
describe('loadConfigs - Dual Schema Support', () => {
|
|
32
|
+
let testDir: string;
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
jest.clearAllMocks();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
afterEach(() => {
|
|
39
|
+
TestUtils.cleanup();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('findAppwriteConfig', () => {
|
|
43
|
+
it('should find YAML config in .appwrite directory', () => {
|
|
44
|
+
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
45
|
+
const configPath = findAppwriteConfig(testDir);
|
|
46
|
+
expect(configPath).toBe(testDir);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('should find TypeScript config as fallback', () => {
|
|
50
|
+
testDir = TestUtils.createTestProject({ useYaml: false });
|
|
51
|
+
const configPath = findAppwriteConfig(testDir);
|
|
52
|
+
expect(configPath).toBe(testDir);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('should return null when no config found', () => {
|
|
56
|
+
testDir = TestUtils.createTempDir();
|
|
57
|
+
const configPath = findAppwriteConfig(testDir);
|
|
58
|
+
expect(configPath).toBeNull();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('Dual Folder Loading', () => {
|
|
63
|
+
it('should load collections from collections/ directory only', async () => {
|
|
64
|
+
testDir = TestUtils.createTestProject({
|
|
65
|
+
hasCollections: true,
|
|
66
|
+
hasTables: false,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const config = await loadConfig(testDir);
|
|
70
|
+
|
|
71
|
+
expect(config.collections).toHaveLength(1);
|
|
72
|
+
expect(config.collections[0].name).toBe('TestCollection');
|
|
73
|
+
expect(config.collections[0]._isFromTablesDir).toBeUndefined();
|
|
74
|
+
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
75
|
+
'Loading from collections/ directory: 1 files found',
|
|
76
|
+
{ prefix: 'Config' }
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should load tables from tables/ directory only', async () => {
|
|
81
|
+
testDir = TestUtils.createTestProject({
|
|
82
|
+
hasCollections: false,
|
|
83
|
+
hasTables: true,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const config = await loadConfig(testDir);
|
|
87
|
+
|
|
88
|
+
expect(config.collections).toHaveLength(1);
|
|
89
|
+
expect(config.collections[0].name).toBe('TestTable');
|
|
90
|
+
expect(config.collections[0]._isFromTablesDir).toBe(true);
|
|
91
|
+
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
92
|
+
'Loading from tables/ directory: 1 files found',
|
|
93
|
+
{ prefix: 'Config' }
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should load from both collections/ and tables/ directories', async () => {
|
|
98
|
+
testDir = TestUtils.createTestProject({
|
|
99
|
+
hasCollections: true,
|
|
100
|
+
hasTables: true,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const config = await loadConfig(testDir);
|
|
104
|
+
|
|
105
|
+
expect(config.collections).toHaveLength(2);
|
|
106
|
+
|
|
107
|
+
const collection = config.collections.find((c: any) => !c._isFromTablesDir);
|
|
108
|
+
const table = config.collections.find((c: any) => c._isFromTablesDir);
|
|
109
|
+
|
|
110
|
+
expect(collection).toBeDefined();
|
|
111
|
+
expect(collection.name).toBe('TestCollection');
|
|
112
|
+
|
|
113
|
+
expect(table).toBeDefined();
|
|
114
|
+
expect(table.name).toBe('TestTable');
|
|
115
|
+
expect(table._isFromTablesDir).toBe(true);
|
|
116
|
+
|
|
117
|
+
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
118
|
+
'Loading from collections/ directory: 1 files found',
|
|
119
|
+
{ prefix: 'Config' }
|
|
120
|
+
);
|
|
121
|
+
expect(MessageFormatter.success).toHaveBeenCalledWith(
|
|
122
|
+
'Loading from tables/ directory: 1 files found',
|
|
123
|
+
{ prefix: 'Config' }
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should handle naming conflicts with collections/ taking priority', async () => {
|
|
128
|
+
testDir = TestUtils.createTestProject({
|
|
129
|
+
hasCollections: true,
|
|
130
|
+
hasTables: true,
|
|
131
|
+
hasConflicts: true,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const config = await loadConfig(testDir);
|
|
135
|
+
|
|
136
|
+
// Should have 2 items: original collection + one table (conflict skipped)
|
|
137
|
+
expect(config.collections).toHaveLength(2);
|
|
138
|
+
|
|
139
|
+
// Check that the collection takes priority
|
|
140
|
+
const collectionItems = config.collections.filter((c: any) => !c._isFromTablesDir);
|
|
141
|
+
expect(collectionItems).toHaveLength(1);
|
|
142
|
+
expect(collectionItems[0].name).toBe('TestCollection');
|
|
143
|
+
|
|
144
|
+
// Check warning was logged
|
|
145
|
+
expect(MessageFormatter.warning).toHaveBeenCalledWith(
|
|
146
|
+
expect.stringContaining('Found 1 naming conflicts'),
|
|
147
|
+
{ prefix: 'Config' }
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe('YAML Support', () => {
|
|
153
|
+
it('should load YAML collections', async () => {
|
|
154
|
+
testDir = TestUtils.createTestProject({
|
|
155
|
+
hasCollections: true,
|
|
156
|
+
useYaml: true,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const config = await loadConfig(testDir);
|
|
160
|
+
|
|
161
|
+
expect(config.collections).toHaveLength(1);
|
|
162
|
+
expect(config.collections[0].name).toBe('TestCollection');
|
|
163
|
+
expect(config.collections[0].$id).toBe('test-collection');
|
|
164
|
+
expect(config.collections[0].attributes).toHaveLength(2);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('should load YAML tables', async () => {
|
|
168
|
+
testDir = TestUtils.createTestProject({
|
|
169
|
+
hasTables: true,
|
|
170
|
+
useYaml: true,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const config = await loadConfig(testDir);
|
|
174
|
+
|
|
175
|
+
expect(config.collections).toHaveLength(1);
|
|
176
|
+
expect(config.collections[0].name).toBe('TestTable');
|
|
177
|
+
expect(config.collections[0]._isFromTablesDir).toBe(true);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('should load mixed YAML and TypeScript files', async () => {
|
|
181
|
+
testDir = TestUtils.createTestProject({
|
|
182
|
+
hasCollections: true,
|
|
183
|
+
useYaml: false,
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Add a YAML table alongside TypeScript collection
|
|
187
|
+
const tablesDir = path.join(testDir, 'tables');
|
|
188
|
+
fs.mkdirSync(tablesDir);
|
|
189
|
+
|
|
190
|
+
const yamlContent = `
|
|
191
|
+
name: YamlTable
|
|
192
|
+
tableId: yaml-table
|
|
193
|
+
databaseId: test-db-id
|
|
194
|
+
documentSecurity: false
|
|
195
|
+
enabled: true
|
|
196
|
+
permissions: []
|
|
197
|
+
attributes:
|
|
198
|
+
- key: content
|
|
199
|
+
type: string
|
|
200
|
+
size: 1000
|
|
201
|
+
required: true
|
|
202
|
+
indexes: []
|
|
203
|
+
`;
|
|
204
|
+
fs.writeFileSync(path.join(tablesDir, 'YamlTable.yaml'), yamlContent);
|
|
205
|
+
|
|
206
|
+
const config = await loadConfig(testDir);
|
|
207
|
+
|
|
208
|
+
expect(config.collections).toHaveLength(2);
|
|
209
|
+
expect(config.collections.some((c: any) => c.name === 'TestCollection')).toBe(true);
|
|
210
|
+
expect(config.collections.some((c: any) => c.name === 'YamlTable')).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
describe('Legacy Single Directory Support', () => {
|
|
215
|
+
it('should fall back to legacy collections/ directory when no dual directories', async () => {
|
|
216
|
+
testDir = TestUtils.createTempDir();
|
|
217
|
+
|
|
218
|
+
// Create config without .appwrite structure
|
|
219
|
+
const config = TestUtils.createTestAppwriteConfig();
|
|
220
|
+
const tsContent = `
|
|
221
|
+
import { type AppwriteConfig } from 'appwrite-utils';
|
|
222
|
+
const appwriteConfig: AppwriteConfig = ${JSON.stringify(config, null, 2)};
|
|
223
|
+
export default appwriteConfig;
|
|
224
|
+
`;
|
|
225
|
+
fs.writeFileSync(path.join(testDir, 'appwriteConfig.ts'), tsContent);
|
|
226
|
+
|
|
227
|
+
// Create only collections directory (legacy)
|
|
228
|
+
const collectionsDir = path.join(testDir, 'collections');
|
|
229
|
+
fs.mkdirSync(collectionsDir);
|
|
230
|
+
|
|
231
|
+
const collection = TestUtils.createTestCollection();
|
|
232
|
+
const collectionContent = `
|
|
233
|
+
const TestCollection = ${JSON.stringify(collection, null, 2)};
|
|
234
|
+
export default TestCollection;
|
|
235
|
+
`;
|
|
236
|
+
fs.writeFileSync(path.join(collectionsDir, 'TestCollection.ts'), collectionContent);
|
|
237
|
+
|
|
238
|
+
const loadedConfig = await loadConfig(testDir);
|
|
239
|
+
|
|
240
|
+
expect(loadedConfig.collections).toHaveLength(1);
|
|
241
|
+
expect(loadedConfig.collections[0].name).toBe('TestCollection');
|
|
242
|
+
expect(MessageFormatter.info).toHaveBeenCalledWith(
|
|
243
|
+
'Using legacy single directory: collections/',
|
|
244
|
+
{ prefix: 'Config' }
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
describe('loadConfigWithPath', () => {
|
|
250
|
+
it('should return both config and actual config path', async () => {
|
|
251
|
+
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
252
|
+
|
|
253
|
+
const result = await loadConfigWithPath(testDir);
|
|
254
|
+
|
|
255
|
+
expect(result.config).toBeDefined();
|
|
256
|
+
expect(result.actualConfigPath).toContain('config.yaml');
|
|
257
|
+
expect(result.config.appwriteProject).toBe('test-project');
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('should handle .appwrite directory path directly', async () => {
|
|
261
|
+
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
262
|
+
const appwriteDir = path.join(testDir, '.appwrite');
|
|
263
|
+
|
|
264
|
+
const result = await loadConfigWithPath(appwriteDir);
|
|
265
|
+
|
|
266
|
+
expect(result.config).toBeDefined();
|
|
267
|
+
expect(result.actualConfigPath).toContain('config.yaml');
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
describe('Error Handling', () => {
|
|
272
|
+
it('should throw error when no config found', async () => {
|
|
273
|
+
testDir = TestUtils.createTempDir();
|
|
274
|
+
|
|
275
|
+
await expect(loadConfig(testDir)).rejects.toThrow('No valid configuration found');
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('should handle malformed YAML gracefully', async () => {
|
|
279
|
+
testDir = TestUtils.createTestProject({ useYaml: true });
|
|
280
|
+
|
|
281
|
+
// Create malformed YAML collection
|
|
282
|
+
const collectionsDir = path.join(testDir, 'collections');
|
|
283
|
+
fs.writeFileSync(path.join(collectionsDir, 'BadCollection.yaml'), 'invalid: yaml: content:');
|
|
284
|
+
|
|
285
|
+
const config = await loadConfig(testDir);
|
|
286
|
+
|
|
287
|
+
// Should still load other valid collections
|
|
288
|
+
expect(config).toBeDefined();
|
|
289
|
+
// The malformed collection should be skipped
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('should handle missing TypeScript exports gracefully', async () => {
|
|
293
|
+
testDir = TestUtils.createTestProject({ useYaml: false });
|
|
294
|
+
|
|
295
|
+
// Create TypeScript file with no export
|
|
296
|
+
const collectionsDir = path.join(testDir, 'collections');
|
|
297
|
+
fs.writeFileSync(path.join(collectionsDir, 'NoExport.ts'), 'const collection = {};');
|
|
298
|
+
|
|
299
|
+
const config = await loadConfig(testDir);
|
|
300
|
+
|
|
301
|
+
expect(config).toBeDefined();
|
|
302
|
+
// Should still have the original test collection
|
|
303
|
+
expect(config.collections.length).toBeGreaterThanOrEqual(1);
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
describe('Performance and Scalability', () => {
|
|
308
|
+
it('should handle large numbers of collections and tables', async () => {
|
|
309
|
+
testDir = TestUtils.createTempDir();
|
|
310
|
+
|
|
311
|
+
// Create config
|
|
312
|
+
const config = TestUtils.createTestAppwriteConfig();
|
|
313
|
+
const tsContent = `export default ${JSON.stringify(config, null, 2)};`;
|
|
314
|
+
fs.writeFileSync(path.join(testDir, 'appwriteConfig.ts'), tsContent);
|
|
315
|
+
|
|
316
|
+
// Create many collections
|
|
317
|
+
const collectionsDir = path.join(testDir, 'collections');
|
|
318
|
+
fs.mkdirSync(collectionsDir);
|
|
319
|
+
|
|
320
|
+
for (let i = 0; i < 50; i++) {
|
|
321
|
+
const collection = TestUtils.createTestCollection({
|
|
322
|
+
name: `Collection${i}`,
|
|
323
|
+
$id: `collection-${i}`,
|
|
324
|
+
});
|
|
325
|
+
const content = `export default ${JSON.stringify(collection, null, 2)};`;
|
|
326
|
+
fs.writeFileSync(path.join(collectionsDir, `Collection${i}.ts`), content);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Create many tables
|
|
330
|
+
const tablesDir = path.join(testDir, 'tables');
|
|
331
|
+
fs.mkdirSync(tablesDir);
|
|
332
|
+
|
|
333
|
+
for (let i = 0; i < 30; i++) {
|
|
334
|
+
const table = TestUtils.createTestTable({
|
|
335
|
+
name: `Table${i}`,
|
|
336
|
+
tableId: `table-${i}`,
|
|
337
|
+
});
|
|
338
|
+
const content = `export default ${JSON.stringify(table, null, 2)};`;
|
|
339
|
+
fs.writeFileSync(path.join(tablesDir, `Table${i}.ts`), content);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const startTime = Date.now();
|
|
343
|
+
const loadedConfig = await loadConfig(testDir);
|
|
344
|
+
const loadTime = Date.now() - startTime;
|
|
345
|
+
|
|
346
|
+
expect(loadedConfig.collections).toHaveLength(80); // 50 collections + 30 tables
|
|
347
|
+
expect(loadTime).toBeLessThan(5000); // Should load within 5 seconds
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
350
|
});
|