@njdamstra/appwrite-utils-cli 1.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +1133 -0
- package/dist/adapters/AdapterFactory.d.ts +94 -0
- package/dist/adapters/AdapterFactory.js +405 -0
- package/dist/adapters/DatabaseAdapter.d.ts +233 -0
- package/dist/adapters/DatabaseAdapter.js +50 -0
- package/dist/adapters/LegacyAdapter.d.ts +50 -0
- package/dist/adapters/LegacyAdapter.js +612 -0
- package/dist/adapters/TablesDBAdapter.d.ts +45 -0
- package/dist/adapters/TablesDBAdapter.js +571 -0
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.js +12 -0
- package/dist/backups/operations/bucketBackup.d.ts +19 -0
- package/dist/backups/operations/bucketBackup.js +197 -0
- package/dist/backups/operations/collectionBackup.d.ts +30 -0
- package/dist/backups/operations/collectionBackup.js +201 -0
- package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
- package/dist/backups/operations/comprehensiveBackup.js +238 -0
- package/dist/backups/schemas/bucketManifest.d.ts +93 -0
- package/dist/backups/schemas/bucketManifest.js +33 -0
- package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
- package/dist/backups/schemas/comprehensiveManifest.js +32 -0
- package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
- package/dist/backups/tracking/centralizedTracking.js +274 -0
- package/dist/cli/commands/configCommands.d.ts +8 -0
- package/dist/cli/commands/configCommands.js +166 -0
- package/dist/cli/commands/databaseCommands.d.ts +13 -0
- package/dist/cli/commands/databaseCommands.js +554 -0
- package/dist/cli/commands/functionCommands.d.ts +7 -0
- package/dist/cli/commands/functionCommands.js +330 -0
- package/dist/cli/commands/schemaCommands.d.ts +7 -0
- package/dist/cli/commands/schemaCommands.js +169 -0
- package/dist/cli/commands/storageCommands.d.ts +5 -0
- package/dist/cli/commands/storageCommands.js +143 -0
- package/dist/cli/commands/transferCommands.d.ts +5 -0
- package/dist/cli/commands/transferCommands.js +384 -0
- package/dist/collections/attributes.d.ts +13 -0
- package/dist/collections/attributes.js +1364 -0
- package/dist/collections/indexes.d.ts +12 -0
- package/dist/collections/indexes.js +217 -0
- package/dist/collections/methods.d.ts +19 -0
- package/dist/collections/methods.js +682 -0
- package/dist/collections/tableOperations.d.ts +86 -0
- package/dist/collections/tableOperations.js +434 -0
- package/dist/collections/transferOperations.d.ts +8 -0
- package/dist/collections/transferOperations.js +412 -0
- package/dist/collections/wipeOperations.d.ts +16 -0
- package/dist/collections/wipeOperations.js +233 -0
- package/dist/config/ConfigManager.d.ts +445 -0
- package/dist/config/ConfigManager.js +625 -0
- package/dist/config/configMigration.d.ts +87 -0
- package/dist/config/configMigration.js +390 -0
- package/dist/config/configValidation.d.ts +66 -0
- package/dist/config/configValidation.js +358 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.js +7 -0
- package/dist/config/services/ConfigDiscoveryService.d.ts +126 -0
- package/dist/config/services/ConfigDiscoveryService.js +374 -0
- package/dist/config/services/ConfigLoaderService.d.ts +129 -0
- package/dist/config/services/ConfigLoaderService.js +540 -0
- package/dist/config/services/ConfigMergeService.d.ts +208 -0
- package/dist/config/services/ConfigMergeService.js +308 -0
- package/dist/config/services/ConfigValidationService.d.ts +214 -0
- package/dist/config/services/ConfigValidationService.js +310 -0
- package/dist/config/services/SessionAuthService.d.ts +225 -0
- package/dist/config/services/SessionAuthService.js +456 -0
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +1 -0
- package/dist/config/services/__tests__/ConfigMergeService.test.js +271 -0
- package/dist/config/services/index.d.ts +13 -0
- package/dist/config/services/index.js +10 -0
- package/dist/config/yamlConfig.d.ts +722 -0
- package/dist/config/yamlConfig.js +702 -0
- package/dist/databases/methods.d.ts +6 -0
- package/dist/databases/methods.js +35 -0
- package/dist/databases/setup.d.ts +5 -0
- package/dist/databases/setup.js +45 -0
- package/dist/examples/yamlTerminologyExample.d.ts +42 -0
- package/dist/examples/yamlTerminologyExample.js +272 -0
- package/dist/functions/deployments.d.ts +4 -0
- package/dist/functions/deployments.js +146 -0
- package/dist/functions/fnConfigDiscovery.d.ts +3 -0
- package/dist/functions/fnConfigDiscovery.js +108 -0
- package/dist/functions/methods.d.ts +16 -0
- package/dist/functions/methods.js +162 -0
- package/dist/functions/pathResolution.d.ts +37 -0
- package/dist/functions/pathResolution.js +185 -0
- package/dist/functions/templates/count-docs-in-collection/README.md +54 -0
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -0
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +9 -0
- package/dist/functions/templates/hono-typescript/README.md +286 -0
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
- package/dist/functions/templates/hono-typescript/src/app.ts +180 -0
- package/dist/functions/templates/hono-typescript/src/context.ts +103 -0
- package/dist/functions/templates/hono-typescript/src/index.ts +54 -0
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
- package/dist/functions/templates/typescript-node/README.md +32 -0
- package/dist/functions/templates/typescript-node/src/context.ts +103 -0
- package/dist/functions/templates/typescript-node/src/index.ts +29 -0
- package/dist/functions/templates/uv/README.md +31 -0
- package/dist/functions/templates/uv/pyproject.toml +30 -0
- package/dist/functions/templates/uv/src/__init__.py +0 -0
- package/dist/functions/templates/uv/src/context.py +125 -0
- package/dist/functions/templates/uv/src/index.py +46 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.js +57 -0
- package/dist/interactiveCLI.d.ts +31 -0
- package/dist/interactiveCLI.js +898 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +1172 -0
- package/dist/migrations/afterImportActions.d.ts +17 -0
- package/dist/migrations/afterImportActions.js +306 -0
- package/dist/migrations/appwriteToX.d.ts +211 -0
- package/dist/migrations/appwriteToX.js +491 -0
- package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
- package/dist/migrations/comprehensiveTransfer.js +1317 -0
- package/dist/migrations/dataLoader.d.ts +753 -0
- package/dist/migrations/dataLoader.js +1250 -0
- package/dist/migrations/importController.d.ts +23 -0
- package/dist/migrations/importController.js +268 -0
- package/dist/migrations/importDataActions.d.ts +50 -0
- package/dist/migrations/importDataActions.js +230 -0
- package/dist/migrations/relationships.d.ts +29 -0
- package/dist/migrations/relationships.js +204 -0
- package/dist/migrations/services/DataTransformationService.d.ts +55 -0
- package/dist/migrations/services/DataTransformationService.js +158 -0
- package/dist/migrations/services/FileHandlerService.d.ts +75 -0
- package/dist/migrations/services/FileHandlerService.js +236 -0
- package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
- package/dist/migrations/services/ImportOrchestrator.js +485 -0
- package/dist/migrations/services/RateLimitManager.d.ts +138 -0
- package/dist/migrations/services/RateLimitManager.js +279 -0
- package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
- package/dist/migrations/services/RelationshipResolver.js +332 -0
- package/dist/migrations/services/UserMappingService.d.ts +109 -0
- package/dist/migrations/services/UserMappingService.js +277 -0
- package/dist/migrations/services/ValidationService.d.ts +74 -0
- package/dist/migrations/services/ValidationService.js +260 -0
- package/dist/migrations/transfer.d.ts +26 -0
- package/dist/migrations/transfer.js +608 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
- package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
- package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
- package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
- package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
- package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
- package/dist/schemas/authUser.d.ts +24 -0
- package/dist/schemas/authUser.js +17 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.js +5 -0
- package/dist/setupCommands.d.ts +58 -0
- package/dist/setupCommands.js +490 -0
- package/dist/setupController.d.ts +9 -0
- package/dist/setupController.js +34 -0
- package/dist/shared/attributeMapper.d.ts +20 -0
- package/dist/shared/attributeMapper.js +203 -0
- package/dist/shared/backupMetadataSchema.d.ts +94 -0
- package/dist/shared/backupMetadataSchema.js +38 -0
- package/dist/shared/backupTracking.d.ts +18 -0
- package/dist/shared/backupTracking.js +176 -0
- package/dist/shared/confirmationDialogs.d.ts +75 -0
- package/dist/shared/confirmationDialogs.js +236 -0
- package/dist/shared/errorUtils.d.ts +54 -0
- package/dist/shared/errorUtils.js +95 -0
- package/dist/shared/functionManager.d.ts +48 -0
- package/dist/shared/functionManager.js +336 -0
- package/dist/shared/indexManager.d.ts +24 -0
- package/dist/shared/indexManager.js +151 -0
- package/dist/shared/jsonSchemaGenerator.d.ts +50 -0
- package/dist/shared/jsonSchemaGenerator.js +290 -0
- package/dist/shared/logging.d.ts +61 -0
- package/dist/shared/logging.js +116 -0
- package/dist/shared/messageFormatter.d.ts +39 -0
- package/dist/shared/messageFormatter.js +162 -0
- package/dist/shared/migrationHelpers.d.ts +61 -0
- package/dist/shared/migrationHelpers.js +145 -0
- package/dist/shared/operationLogger.d.ts +10 -0
- package/dist/shared/operationLogger.js +12 -0
- package/dist/shared/operationQueue.d.ts +40 -0
- package/dist/shared/operationQueue.js +311 -0
- package/dist/shared/operationsTable.d.ts +26 -0
- package/dist/shared/operationsTable.js +286 -0
- package/dist/shared/operationsTableSchema.d.ts +48 -0
- package/dist/shared/operationsTableSchema.js +35 -0
- package/dist/shared/progressManager.d.ts +62 -0
- package/dist/shared/progressManager.js +215 -0
- package/dist/shared/pydanticModelGenerator.d.ts +17 -0
- package/dist/shared/pydanticModelGenerator.js +615 -0
- package/dist/shared/relationshipExtractor.d.ts +56 -0
- package/dist/shared/relationshipExtractor.js +138 -0
- package/dist/shared/schemaGenerator.d.ts +40 -0
- package/dist/shared/schemaGenerator.js +556 -0
- package/dist/shared/selectionDialogs.d.ts +214 -0
- package/dist/shared/selectionDialogs.js +544 -0
- package/dist/storage/backupCompression.d.ts +20 -0
- package/dist/storage/backupCompression.js +67 -0
- package/dist/storage/methods.d.ts +32 -0
- package/dist/storage/methods.js +472 -0
- package/dist/storage/schemas.d.ts +842 -0
- package/dist/storage/schemas.js +175 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.js +3 -0
- package/dist/users/methods.d.ts +16 -0
- package/dist/users/methods.js +277 -0
- package/dist/utils/ClientFactory.d.ts +87 -0
- package/dist/utils/ClientFactory.js +212 -0
- package/dist/utils/configDiscovery.d.ts +78 -0
- package/dist/utils/configDiscovery.js +472 -0
- package/dist/utils/configMigration.d.ts +1 -0
- package/dist/utils/configMigration.js +261 -0
- package/dist/utils/constantsGenerator.d.ts +31 -0
- package/dist/utils/constantsGenerator.js +321 -0
- package/dist/utils/dataConverters.d.ts +46 -0
- package/dist/utils/dataConverters.js +139 -0
- package/dist/utils/directoryUtils.d.ts +22 -0
- package/dist/utils/directoryUtils.js +59 -0
- package/dist/utils/getClientFromConfig.d.ts +39 -0
- package/dist/utils/getClientFromConfig.js +199 -0
- package/dist/utils/helperFunctions.d.ts +63 -0
- package/dist/utils/helperFunctions.js +156 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/loadConfigs.d.ts +50 -0
- package/dist/utils/loadConfigs.js +358 -0
- package/dist/utils/pathResolvers.d.ts +53 -0
- package/dist/utils/pathResolvers.js +72 -0
- package/dist/utils/projectConfig.d.ts +119 -0
- package/dist/utils/projectConfig.js +171 -0
- package/dist/utils/retryFailedPromises.d.ts +2 -0
- package/dist/utils/retryFailedPromises.js +23 -0
- package/dist/utils/sessionAuth.d.ts +48 -0
- package/dist/utils/sessionAuth.js +164 -0
- package/dist/utils/setupFiles.d.ts +4 -0
- package/dist/utils/setupFiles.js +1192 -0
- package/dist/utils/typeGuards.d.ts +35 -0
- package/dist/utils/typeGuards.js +57 -0
- package/dist/utils/validationRules.d.ts +43 -0
- package/dist/utils/validationRules.js +42 -0
- package/dist/utils/versionDetection.d.ts +58 -0
- package/dist/utils/versionDetection.js +251 -0
- package/dist/utils/yamlConverter.d.ts +100 -0
- package/dist/utils/yamlConverter.js +428 -0
- package/dist/utils/yamlLoader.d.ts +70 -0
- package/dist/utils/yamlLoader.js +267 -0
- package/dist/utilsController.d.ts +106 -0
- package/dist/utilsController.js +863 -0
- package/package.json +75 -0
- package/scripts/copy-templates.ts +23 -0
- package/src/adapters/AdapterFactory.ts +510 -0
- package/src/adapters/DatabaseAdapter.ts +306 -0
- package/src/adapters/LegacyAdapter.ts +841 -0
- package/src/adapters/TablesDBAdapter.ts +773 -0
- package/src/adapters/index.ts +37 -0
- package/src/backups/operations/bucketBackup.ts +277 -0
- package/src/backups/operations/collectionBackup.ts +310 -0
- package/src/backups/operations/comprehensiveBackup.ts +342 -0
- package/src/backups/schemas/bucketManifest.ts +78 -0
- package/src/backups/schemas/comprehensiveManifest.ts +76 -0
- package/src/backups/tracking/centralizedTracking.ts +352 -0
- package/src/cli/commands/configCommands.ts +201 -0
- package/src/cli/commands/databaseCommands.ts +749 -0
- package/src/cli/commands/functionCommands.ts +418 -0
- package/src/cli/commands/schemaCommands.ts +200 -0
- package/src/cli/commands/storageCommands.ts +152 -0
- package/src/cli/commands/transferCommands.ts +457 -0
- package/src/collections/attributes.ts +2054 -0
- package/src/collections/attributes.ts.backup +1555 -0
- package/src/collections/indexes.ts +352 -0
- package/src/collections/methods.ts +745 -0
- package/src/collections/tableOperations.ts +506 -0
- package/src/collections/transferOperations.ts +590 -0
- package/src/collections/wipeOperations.ts +346 -0
- package/src/config/ConfigManager.ts +808 -0
- package/src/config/README.md +274 -0
- package/src/config/configMigration.ts +575 -0
- package/src/config/configValidation.ts +445 -0
- package/src/config/index.ts +10 -0
- package/src/config/services/ConfigDiscoveryService.ts +463 -0
- package/src/config/services/ConfigLoaderService.ts +740 -0
- package/src/config/services/ConfigMergeService.ts +388 -0
- package/src/config/services/ConfigValidationService.ts +394 -0
- package/src/config/services/SessionAuthService.ts +565 -0
- package/src/config/services/__tests__/ConfigMergeService.test.ts +351 -0
- package/src/config/services/index.ts +29 -0
- package/src/config/yamlConfig.ts +761 -0
- package/src/databases/methods.ts +49 -0
- package/src/databases/setup.ts +77 -0
- package/src/examples/yamlTerminologyExample.ts +346 -0
- package/src/functions/deployments.ts +220 -0
- package/src/functions/fnConfigDiscovery.ts +103 -0
- package/src/functions/methods.ts +271 -0
- package/src/functions/pathResolution.ts +227 -0
- package/src/functions/templates/count-docs-in-collection/README.md +54 -0
- package/src/functions/templates/count-docs-in-collection/src/main.ts +159 -0
- package/src/functions/templates/count-docs-in-collection/src/request.ts +9 -0
- package/src/functions/templates/hono-typescript/README.md +286 -0
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
- package/src/functions/templates/hono-typescript/src/app.ts +180 -0
- package/src/functions/templates/hono-typescript/src/context.ts +103 -0
- package/src/functions/templates/hono-typescript/src/index.ts +54 -0
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
- package/src/functions/templates/typescript-node/README.md +32 -0
- package/src/functions/templates/typescript-node/src/context.ts +103 -0
- package/src/functions/templates/typescript-node/src/index.ts +29 -0
- package/src/functions/templates/uv/README.md +31 -0
- package/src/functions/templates/uv/pyproject.toml +30 -0
- package/src/functions/templates/uv/src/__init__.py +0 -0
- package/src/functions/templates/uv/src/context.py +125 -0
- package/src/functions/templates/uv/src/index.py +46 -0
- package/src/init.ts +62 -0
- package/src/interactiveCLI.ts +1136 -0
- package/src/main.ts +1661 -0
- package/src/migrations/afterImportActions.ts +580 -0
- package/src/migrations/appwriteToX.ts +664 -0
- package/src/migrations/comprehensiveTransfer.ts +2285 -0
- package/src/migrations/dataLoader.ts +1702 -0
- package/src/migrations/importController.ts +428 -0
- package/src/migrations/importDataActions.ts +315 -0
- package/src/migrations/relationships.ts +334 -0
- package/src/migrations/services/DataTransformationService.ts +196 -0
- package/src/migrations/services/FileHandlerService.ts +311 -0
- package/src/migrations/services/ImportOrchestrator.ts +666 -0
- package/src/migrations/services/RateLimitManager.ts +363 -0
- package/src/migrations/services/RelationshipResolver.ts +461 -0
- package/src/migrations/services/UserMappingService.ts +345 -0
- package/src/migrations/services/ValidationService.ts +349 -0
- package/src/migrations/transfer.ts +1068 -0
- package/src/migrations/yaml/YamlImportConfigLoader.ts +439 -0
- package/src/migrations/yaml/YamlImportIntegration.ts +446 -0
- package/src/migrations/yaml/generateImportSchemas.ts +1354 -0
- package/src/schemas/authUser.ts +23 -0
- package/src/setup.ts +8 -0
- package/src/setupCommands.ts +603 -0
- package/src/setupController.ts +43 -0
- package/src/shared/attributeMapper.ts +229 -0
- package/src/shared/backupMetadataSchema.ts +93 -0
- package/src/shared/backupTracking.ts +211 -0
- package/src/shared/confirmationDialogs.ts +327 -0
- package/src/shared/errorUtils.ts +110 -0
- package/src/shared/functionManager.ts +525 -0
- package/src/shared/indexManager.ts +254 -0
- package/src/shared/jsonSchemaGenerator.ts +383 -0
- package/src/shared/logging.ts +149 -0
- package/src/shared/messageFormatter.ts +208 -0
- package/src/shared/migrationHelpers.ts +232 -0
- package/src/shared/operationLogger.ts +20 -0
- package/src/shared/operationQueue.ts +377 -0
- package/src/shared/operationsTable.ts +338 -0
- package/src/shared/operationsTableSchema.ts +60 -0
- package/src/shared/progressManager.ts +278 -0
- package/src/shared/pydanticModelGenerator.ts +618 -0
- package/src/shared/relationshipExtractor.ts +214 -0
- package/src/shared/schemaGenerator.ts +644 -0
- package/src/shared/selectionDialogs.ts +749 -0
- package/src/storage/backupCompression.ts +88 -0
- package/src/storage/methods.ts +698 -0
- package/src/storage/schemas.ts +205 -0
- package/src/types/node-appwrite-tablesdb.d.ts +44 -0
- package/src/types.ts +9 -0
- package/src/users/methods.ts +359 -0
- package/src/utils/ClientFactory.ts +240 -0
- package/src/utils/configDiscovery.ts +557 -0
- package/src/utils/configMigration.ts +348 -0
- package/src/utils/constantsGenerator.ts +369 -0
- package/src/utils/dataConverters.ts +159 -0
- package/src/utils/directoryUtils.ts +61 -0
- package/src/utils/getClientFromConfig.ts +257 -0
- package/src/utils/helperFunctions.ts +228 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/loadConfigs.ts +449 -0
- package/src/utils/pathResolvers.ts +81 -0
- package/src/utils/projectConfig.ts +299 -0
- package/src/utils/retryFailedPromises.ts +29 -0
- package/src/utils/sessionAuth.ts +230 -0
- package/src/utils/setupFiles.ts +1238 -0
- package/src/utils/typeGuards.ts +65 -0
- package/src/utils/validationRules.ts +88 -0
- package/src/utils/versionDetection.ts +292 -0
- package/src/utils/yamlConverter.ts +542 -0
- package/src/utils/yamlLoader.ts +371 -0
- package/src/utilsController.ts +1203 -0
- package/tests/README.md +497 -0
- package/tests/adapters/AdapterFactory.test.ts +277 -0
- package/tests/integration/syncOperations.test.ts +463 -0
- package/tests/jest.config.js +25 -0
- package/tests/migration/configMigration.test.ts +546 -0
- package/tests/setup.ts +62 -0
- package/tests/testUtils.ts +340 -0
- package/tests/utils/loadConfigs.test.ts +350 -0
- package/tests/validation/configValidation.test.ts +412 -0
- package/tsconfig.json +44 -0
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { type AppwriteConfig, type Collection, type CollectionCreate, type Table, type TableCreate } from "@njdamstra/appwrite-utils";
|
|
4
|
+
import { register } from "tsx/esm/api"; // Import the register function
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { findYamlConfig, loadYamlConfig, loadYamlConfigWithSession, extractSessionOptionsFromConfig, type YamlSessionOptions } from "../config/yamlConfig.js";
|
|
8
|
+
import { detectAppwriteVersionCached, fetchServerVersion, isVersionAtLeast } from "./versionDetection.js";
|
|
9
|
+
import { MessageFormatter } from "../shared/messageFormatter.js";
|
|
10
|
+
import { validateCollectionsTablesConfig, reportValidationResults, type ValidationResult } from "../config/configValidation.js";
|
|
11
|
+
import { resolveCollectionsDir, resolveTablesDir } from "./pathResolvers.js";
|
|
12
|
+
import {
|
|
13
|
+
findAppwriteConfig,
|
|
14
|
+
findAppwriteConfigTS,
|
|
15
|
+
findFunctionsDir,
|
|
16
|
+
discoverCollections,
|
|
17
|
+
discoverTables,
|
|
18
|
+
discoverLegacyDirectory
|
|
19
|
+
} from "./configDiscovery.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Session authentication preservation options for config loading
|
|
23
|
+
*/
|
|
24
|
+
export interface SessionPreservationOptions {
|
|
25
|
+
sessionCookie?: string;
|
|
26
|
+
authMethod?: "session" | "apikey" | "auto";
|
|
27
|
+
sessionMetadata?: {
|
|
28
|
+
email?: string;
|
|
29
|
+
expiresAt?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Configuration loading options
|
|
35
|
+
*/
|
|
36
|
+
export interface ConfigLoadingOptions {
|
|
37
|
+
validate?: boolean;
|
|
38
|
+
strictMode?: boolean;
|
|
39
|
+
reportValidation?: boolean;
|
|
40
|
+
preserveAuth?: SessionPreservationOptions;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Helper function to create session preservation options from session data
|
|
45
|
+
* @param sessionCookie The session cookie string
|
|
46
|
+
* @param email Optional email associated with the session
|
|
47
|
+
* @param expiresAt Optional expiration timestamp
|
|
48
|
+
* @returns SessionPreservationOptions object
|
|
49
|
+
*/
|
|
50
|
+
export function createSessionPreservation(
|
|
51
|
+
sessionCookie: string,
|
|
52
|
+
email?: string,
|
|
53
|
+
expiresAt?: string
|
|
54
|
+
): SessionPreservationOptions {
|
|
55
|
+
return {
|
|
56
|
+
sessionCookie,
|
|
57
|
+
authMethod: "session",
|
|
58
|
+
sessionMetadata: {
|
|
59
|
+
...(email && { email }),
|
|
60
|
+
...(expiresAt && { expiresAt })
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Re-export config discovery functions for backward compatibility
|
|
66
|
+
export { findAppwriteConfig, findFunctionsDir } from "./configDiscovery.js";
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Loads the Appwrite configuration and returns both config and the path where it was found.
|
|
70
|
+
* @param configDir The directory to search for config files.
|
|
71
|
+
* @param options Loading options including validation settings and session preservation.
|
|
72
|
+
* @returns Object containing the config, path, and validation results.
|
|
73
|
+
*/
|
|
74
|
+
export const loadConfigWithPath = async (
|
|
75
|
+
configDir: string,
|
|
76
|
+
options: ConfigLoadingOptions = {}
|
|
77
|
+
): Promise<{
|
|
78
|
+
config: AppwriteConfig;
|
|
79
|
+
actualConfigPath: string;
|
|
80
|
+
validation?: ValidationResult;
|
|
81
|
+
}> => {
|
|
82
|
+
const { validate = true, strictMode = false, reportValidation = true } = options;
|
|
83
|
+
let config: AppwriteConfig | null = null;
|
|
84
|
+
let actualConfigPath: string | null = null;
|
|
85
|
+
|
|
86
|
+
// Convert session preservation options to YAML format
|
|
87
|
+
const yamlSessionOptions: YamlSessionOptions | undefined = options.preserveAuth ? {
|
|
88
|
+
sessionCookie: options.preserveAuth.sessionCookie,
|
|
89
|
+
authMethod: options.preserveAuth.authMethod,
|
|
90
|
+
sessionMetadata: options.preserveAuth.sessionMetadata,
|
|
91
|
+
} : undefined;
|
|
92
|
+
|
|
93
|
+
// Check if we're given the .appwrite directory directly
|
|
94
|
+
if (configDir.endsWith('.appwrite')) {
|
|
95
|
+
// Look for config files directly in this directory
|
|
96
|
+
const possibleYamlFiles = ['config.yaml', 'config.yml', 'appwriteConfig.yaml', 'appwriteConfig.yml'];
|
|
97
|
+
for (const fileName of possibleYamlFiles) {
|
|
98
|
+
const yamlPath = path.join(configDir, fileName);
|
|
99
|
+
if (fs.existsSync(yamlPath)) {
|
|
100
|
+
config = yamlSessionOptions
|
|
101
|
+
? await loadYamlConfigWithSession(yamlPath, yamlSessionOptions)
|
|
102
|
+
: await loadYamlConfig(yamlPath);
|
|
103
|
+
actualConfigPath = yamlPath;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} else {
|
|
108
|
+
// Original logic: search for .appwrite directories
|
|
109
|
+
const yamlConfigPath = findYamlConfig(configDir);
|
|
110
|
+
if (yamlConfigPath) {
|
|
111
|
+
config = yamlSessionOptions
|
|
112
|
+
? await loadYamlConfigWithSession(yamlConfigPath, yamlSessionOptions)
|
|
113
|
+
: await loadYamlConfig(yamlConfigPath);
|
|
114
|
+
actualConfigPath = yamlConfigPath;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fall back to TypeScript config if YAML not found or failed to load
|
|
119
|
+
if (!config) {
|
|
120
|
+
const configPath = path.join(configDir, "appwriteConfig.ts");
|
|
121
|
+
|
|
122
|
+
// Only try to load TypeScript config if the file exists
|
|
123
|
+
if (fs.existsSync(configPath)) {
|
|
124
|
+
const unregister = register(); // Register tsx enhancement
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
const configUrl = pathToFileURL(configPath).href;
|
|
128
|
+
const configModule = (await import(configUrl));
|
|
129
|
+
config = configModule.default?.default || configModule.default || configModule;
|
|
130
|
+
if (!config) {
|
|
131
|
+
throw new Error("Failed to load config");
|
|
132
|
+
}
|
|
133
|
+
actualConfigPath = configPath;
|
|
134
|
+
} finally {
|
|
135
|
+
unregister(); // Unregister tsx when done
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!config || !actualConfigPath) {
|
|
141
|
+
throw new Error("No valid configuration found");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Preserve session authentication if provided
|
|
145
|
+
// This allows maintaining session context when config is reloaded during CLI operations
|
|
146
|
+
if (options.preserveAuth) {
|
|
147
|
+
const { sessionCookie, authMethod, sessionMetadata } = options.preserveAuth;
|
|
148
|
+
|
|
149
|
+
// Inject session cookie into the loaded config
|
|
150
|
+
if (sessionCookie) {
|
|
151
|
+
config.sessionCookie = sessionCookie;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Set or override authentication method preference
|
|
155
|
+
if (authMethod) {
|
|
156
|
+
config.authMethod = authMethod;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Merge session metadata (email, expiration, etc.) with existing metadata
|
|
160
|
+
if (sessionMetadata) {
|
|
161
|
+
config.sessionMetadata = {
|
|
162
|
+
...config.sessionMetadata,
|
|
163
|
+
...sessionMetadata
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Auto-detect authentication method if not explicitly provided
|
|
168
|
+
// If we have a session cookie but no auth method specified, prefer session auth
|
|
169
|
+
if (!authMethod && sessionCookie) {
|
|
170
|
+
config.authMethod = "session";
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Enhanced dual folder support: Load from BOTH collections/ AND tables/ directories
|
|
175
|
+
const configFileDir = path.dirname(actualConfigPath);
|
|
176
|
+
// Look for collections/tables directories in the same directory as the config file
|
|
177
|
+
const collectionsDir = resolveCollectionsDir(configFileDir);
|
|
178
|
+
const tablesDir = resolveTablesDir(configFileDir);
|
|
179
|
+
|
|
180
|
+
// Initialize collections array
|
|
181
|
+
config.collections = [];
|
|
182
|
+
|
|
183
|
+
// Load from collections/ directory first (higher priority)
|
|
184
|
+
const collectionsResult = await discoverCollections(collectionsDir);
|
|
185
|
+
config.collections.push(...collectionsResult.collections);
|
|
186
|
+
|
|
187
|
+
// Load from tables/ directory second (lower priority, check for conflicts)
|
|
188
|
+
const tablesResult = await discoverTables(tablesDir, collectionsResult.loadedNames);
|
|
189
|
+
config.collections.push(...tablesResult.tables);
|
|
190
|
+
|
|
191
|
+
// Combine conflicts from both discovery operations
|
|
192
|
+
const allConflicts = [...collectionsResult.conflicts, ...tablesResult.conflicts];
|
|
193
|
+
|
|
194
|
+
// Report conflicts if any
|
|
195
|
+
if (allConflicts.length > 0) {
|
|
196
|
+
MessageFormatter.warning(`Found ${allConflicts.length} naming conflicts between collections/ and tables/`, { prefix: "Config" });
|
|
197
|
+
allConflicts.forEach(conflict => {
|
|
198
|
+
MessageFormatter.info(` - '${conflict.name}': ${conflict.source1} (used) vs ${conflict.source2} (skipped)`, { prefix: "Config" });
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Fallback: If neither directory exists, try legacy single-directory detection
|
|
203
|
+
if (!fs.existsSync(collectionsDir) && !fs.existsSync(tablesDir)) {
|
|
204
|
+
// Determine directory (collections or tables) based on server version / API mode
|
|
205
|
+
let dirName: 'collections' | 'tables' = "collections";
|
|
206
|
+
try {
|
|
207
|
+
const det = await detectAppwriteVersionCached(config.appwriteEndpoint, config.appwriteProject, config.appwriteKey);
|
|
208
|
+
if (det.apiMode === 'tablesdb' || isVersionAtLeast(det.serverVersion, '1.8.0')) {
|
|
209
|
+
dirName = 'tables';
|
|
210
|
+
} else {
|
|
211
|
+
// Try health version if not provided
|
|
212
|
+
const ver = await fetchServerVersion(config.appwriteEndpoint);
|
|
213
|
+
if (isVersionAtLeast(ver || undefined, '1.8.0')) dirName = 'tables';
|
|
214
|
+
}
|
|
215
|
+
} catch {}
|
|
216
|
+
|
|
217
|
+
const legacyItems = await discoverLegacyDirectory(configFileDir, dirName);
|
|
218
|
+
config.collections.push(...legacyItems);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Ensure array exists even if empty
|
|
222
|
+
config.collections = config.collections || [];
|
|
223
|
+
|
|
224
|
+
// Log the final result
|
|
225
|
+
const allCollections = config.collections || [];
|
|
226
|
+
const fromCollectionsDir = allCollections.filter((c: any) => !c._isFromTablesDir).length;
|
|
227
|
+
const fromTablesDir = allCollections.filter((c: any) => c._isFromTablesDir).length;
|
|
228
|
+
const totalLoaded = allCollections.length;
|
|
229
|
+
|
|
230
|
+
if (totalLoaded > 0) {
|
|
231
|
+
if (fromTablesDir > 0) {
|
|
232
|
+
MessageFormatter.success(`Successfully loaded ${totalLoaded} items total: ${fromCollectionsDir} from collections/ and ${fromTablesDir} from tables/`, { prefix: "Config" });
|
|
233
|
+
} else {
|
|
234
|
+
MessageFormatter.success(`Successfully loaded ${totalLoaded} collections from collections/`, { prefix: "Config" });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Validate configuration if requested
|
|
239
|
+
let validation: ValidationResult | undefined;
|
|
240
|
+
if (validate) {
|
|
241
|
+
validation = validateCollectionsTablesConfig(config);
|
|
242
|
+
|
|
243
|
+
// In strict mode, treat warnings as errors
|
|
244
|
+
if (strictMode && validation.warnings.length > 0) {
|
|
245
|
+
const strictValidation = {
|
|
246
|
+
...validation,
|
|
247
|
+
isValid: false,
|
|
248
|
+
errors: [...validation.errors, ...validation.warnings.map(w => ({ ...w, severity: "error" as const }))],
|
|
249
|
+
warnings: []
|
|
250
|
+
};
|
|
251
|
+
validation = strictValidation;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Report validation results if requested
|
|
255
|
+
if (reportValidation) {
|
|
256
|
+
reportValidationResults(validation, { verbose: true });
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Throw error if validation fails in strict mode
|
|
260
|
+
if (strictMode && !validation.isValid) {
|
|
261
|
+
throw new Error(`Configuration validation failed in strict mode. Found ${validation.errors.length} validation errors.`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return { config, actualConfigPath, validation };
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Loads the Appwrite configuration and all collection configurations from a specified directory.
|
|
270
|
+
* Supports both YAML and TypeScript config formats with backward compatibility.
|
|
271
|
+
* @param configDir The directory containing the config file and collections folder.
|
|
272
|
+
* @param options Loading options including validation settings and session preservation.
|
|
273
|
+
* @returns The loaded Appwrite configuration including collections.
|
|
274
|
+
*/
|
|
275
|
+
export const loadConfig = async (
|
|
276
|
+
configDir: string,
|
|
277
|
+
options: ConfigLoadingOptions = {}
|
|
278
|
+
): Promise<AppwriteConfig> => {
|
|
279
|
+
const { validate = false, strictMode = false, reportValidation = false } = options;
|
|
280
|
+
let config: AppwriteConfig | null = null;
|
|
281
|
+
let actualConfigPath: string | null = null;
|
|
282
|
+
|
|
283
|
+
// Convert session preservation options to YAML format
|
|
284
|
+
const yamlSessionOptions: YamlSessionOptions | undefined = options.preserveAuth ? {
|
|
285
|
+
sessionCookie: options.preserveAuth.sessionCookie,
|
|
286
|
+
authMethod: options.preserveAuth.authMethod,
|
|
287
|
+
sessionMetadata: options.preserveAuth.sessionMetadata,
|
|
288
|
+
} : undefined;
|
|
289
|
+
|
|
290
|
+
// First try to find and load YAML config
|
|
291
|
+
const yamlConfigPath = findYamlConfig(configDir);
|
|
292
|
+
if (yamlConfigPath) {
|
|
293
|
+
config = yamlSessionOptions
|
|
294
|
+
? await loadYamlConfigWithSession(yamlConfigPath, yamlSessionOptions)
|
|
295
|
+
: await loadYamlConfig(yamlConfigPath);
|
|
296
|
+
actualConfigPath = yamlConfigPath;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// Fall back to TypeScript config if YAML not found or failed to load
|
|
300
|
+
if (!config) {
|
|
301
|
+
const configPath = path.join(configDir, "appwriteConfig.ts");
|
|
302
|
+
|
|
303
|
+
// Only try to load TypeScript config if the file exists
|
|
304
|
+
if (fs.existsSync(configPath)) {
|
|
305
|
+
const unregister = register(); // Register tsx enhancement
|
|
306
|
+
|
|
307
|
+
try {
|
|
308
|
+
const configUrl = pathToFileURL(configPath).href;
|
|
309
|
+
const configModule = (await import(configUrl));
|
|
310
|
+
config = configModule.default?.default || configModule.default || configModule;
|
|
311
|
+
if (!config) {
|
|
312
|
+
throw new Error("Failed to load config");
|
|
313
|
+
}
|
|
314
|
+
actualConfigPath = configPath;
|
|
315
|
+
} finally {
|
|
316
|
+
unregister(); // Unregister tsx when done
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (!config) {
|
|
322
|
+
throw new Error("No valid configuration found");
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Preserve session authentication if provided
|
|
326
|
+
// This allows maintaining session context when config is reloaded during CLI operations
|
|
327
|
+
if (options.preserveAuth) {
|
|
328
|
+
const { sessionCookie, authMethod, sessionMetadata } = options.preserveAuth;
|
|
329
|
+
|
|
330
|
+
// Inject session cookie into the loaded config
|
|
331
|
+
if (sessionCookie) {
|
|
332
|
+
config.sessionCookie = sessionCookie;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Set or override authentication method preference
|
|
336
|
+
if (authMethod) {
|
|
337
|
+
config.authMethod = authMethod;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Merge session metadata (email, expiration, etc.) with existing metadata
|
|
341
|
+
if (sessionMetadata) {
|
|
342
|
+
config.sessionMetadata = {
|
|
343
|
+
...config.sessionMetadata,
|
|
344
|
+
...sessionMetadata
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Auto-detect authentication method if not explicitly provided
|
|
349
|
+
// If we have a session cookie but no auth method specified, prefer session auth
|
|
350
|
+
if (!authMethod && sessionCookie) {
|
|
351
|
+
config.authMethod = "session";
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Enhanced dual folder support: Load from BOTH collections/ AND tables/ directories
|
|
356
|
+
const configFileDir = actualConfigPath ? path.dirname(actualConfigPath) : configDir;
|
|
357
|
+
// Look for collections/tables directories in the same directory as the config file
|
|
358
|
+
const collectionsDir = resolveCollectionsDir(configFileDir);
|
|
359
|
+
const tablesDir = resolveTablesDir(configFileDir);
|
|
360
|
+
|
|
361
|
+
// Initialize collections array
|
|
362
|
+
config.collections = [];
|
|
363
|
+
|
|
364
|
+
// Load from collections/ directory first (higher priority)
|
|
365
|
+
const collectionsResult = await discoverCollections(collectionsDir);
|
|
366
|
+
config.collections.push(...collectionsResult.collections);
|
|
367
|
+
|
|
368
|
+
// Load from tables/ directory second (lower priority, check for conflicts)
|
|
369
|
+
const tablesResult = await discoverTables(tablesDir, collectionsResult.loadedNames);
|
|
370
|
+
config.collections.push(...tablesResult.tables);
|
|
371
|
+
|
|
372
|
+
// Combine conflicts from both discovery operations
|
|
373
|
+
const allConflicts = [...collectionsResult.conflicts, ...tablesResult.conflicts];
|
|
374
|
+
|
|
375
|
+
// Report conflicts if any
|
|
376
|
+
if (allConflicts.length > 0) {
|
|
377
|
+
MessageFormatter.warning(`Found ${allConflicts.length} naming conflicts between collections/ and tables/`, { prefix: "Config" });
|
|
378
|
+
allConflicts.forEach(conflict => {
|
|
379
|
+
MessageFormatter.info(` - '${conflict.name}': ${conflict.source1} (used) vs ${conflict.source2} (skipped)`, { prefix: "Config" });
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Fallback: If neither directory exists, try legacy single-directory detection
|
|
384
|
+
if (!fs.existsSync(collectionsDir) && !fs.existsSync(tablesDir)) {
|
|
385
|
+
// Determine directory (collections or tables) based on server version / API mode
|
|
386
|
+
let dirName: 'collections' | 'tables' = "collections";
|
|
387
|
+
try {
|
|
388
|
+
const det = await detectAppwriteVersionCached(config.appwriteEndpoint, config.appwriteProject, config.appwriteKey);
|
|
389
|
+
if (det.apiMode === 'tablesdb' || isVersionAtLeast(det.serverVersion, '1.8.0')) {
|
|
390
|
+
dirName = 'tables';
|
|
391
|
+
} else {
|
|
392
|
+
const ver = await fetchServerVersion(config.appwriteEndpoint);
|
|
393
|
+
if (isVersionAtLeast(ver || undefined, '1.8.0')) dirName = 'tables';
|
|
394
|
+
}
|
|
395
|
+
} catch {}
|
|
396
|
+
|
|
397
|
+
const legacyItems = await discoverLegacyDirectory(configFileDir, dirName);
|
|
398
|
+
config.collections.push(...legacyItems);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Ensure array exists even if empty
|
|
402
|
+
config.collections = config.collections || [];
|
|
403
|
+
|
|
404
|
+
// Log the final result
|
|
405
|
+
const allCollections = config.collections || [];
|
|
406
|
+
const fromCollectionsDir = allCollections.filter((c: any) => !c._isFromTablesDir).length;
|
|
407
|
+
const fromTablesDir = allCollections.filter((c: any) => c._isFromTablesDir).length;
|
|
408
|
+
const totalLoaded = allCollections.length;
|
|
409
|
+
|
|
410
|
+
if (totalLoaded > 0) {
|
|
411
|
+
if (fromTablesDir > 0) {
|
|
412
|
+
MessageFormatter.success(`Successfully loaded ${totalLoaded} items total: ${fromCollectionsDir} from collections/ and ${fromTablesDir} from tables/`, { prefix: "Config" });
|
|
413
|
+
} else {
|
|
414
|
+
MessageFormatter.success(`Successfully loaded ${totalLoaded} collections from collections/`, { prefix: "Config" });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Log successful config loading
|
|
419
|
+
if (actualConfigPath) {
|
|
420
|
+
MessageFormatter.success(`Loaded config from: ${actualConfigPath}`, { prefix: "Config" });
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// Validate configuration if requested
|
|
424
|
+
if (validate) {
|
|
425
|
+
let validation = validateCollectionsTablesConfig(config);
|
|
426
|
+
|
|
427
|
+
// In strict mode, treat warnings as errors
|
|
428
|
+
if (strictMode && validation.warnings.length > 0) {
|
|
429
|
+
validation = {
|
|
430
|
+
...validation,
|
|
431
|
+
isValid: false,
|
|
432
|
+
errors: [...validation.errors, ...validation.warnings.map(w => ({ ...w, severity: "error" as const }))],
|
|
433
|
+
warnings: []
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Report validation results if requested
|
|
438
|
+
if (reportValidation) {
|
|
439
|
+
reportValidationResults(validation, { verbose: true });
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Throw error if validation fails in strict mode
|
|
443
|
+
if (strictMode && !validation.isValid) {
|
|
444
|
+
throw new Error(`Configuration validation failed in strict mode. Found ${validation.errors.length} validation errors.`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return config;
|
|
449
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Path resolution utilities for Appwrite configuration and schema directories
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Resolves the schema output directory path
|
|
9
|
+
* @param configPath - Base configuration directory path
|
|
10
|
+
* @returns Full path to schemas directory
|
|
11
|
+
*/
|
|
12
|
+
export function resolveSchemaDir(configPath: string): string {
|
|
13
|
+
return path.join(configPath, "schemas");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the collections directory path
|
|
18
|
+
* @param configPath - Base configuration directory path
|
|
19
|
+
* @returns Full path to collections directory
|
|
20
|
+
*/
|
|
21
|
+
export function resolveCollectionsDir(configPath: string): string {
|
|
22
|
+
return path.join(configPath, "collections");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Resolves the tables directory path
|
|
27
|
+
* @param configPath - Base configuration directory path
|
|
28
|
+
* @returns Full path to tables directory
|
|
29
|
+
*/
|
|
30
|
+
export function resolveTablesDir(configPath: string): string {
|
|
31
|
+
return path.join(configPath, "tables");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Resolves the YAML schema directory path
|
|
36
|
+
* @param configPath - Base configuration directory path
|
|
37
|
+
* @returns Full path to .yaml_schemas directory
|
|
38
|
+
*/
|
|
39
|
+
export function resolveYamlSchemaDir(configPath: string): string {
|
|
40
|
+
return path.join(configPath, ".yaml_schemas");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Resolves the import data directory path
|
|
45
|
+
* @param configPath - Base configuration directory path
|
|
46
|
+
* @returns Full path to importData directory
|
|
47
|
+
*/
|
|
48
|
+
export function resolveImportDataDir(configPath: string): string {
|
|
49
|
+
return path.join(configPath, "importData");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Resolves the .appwrite configuration directory
|
|
54
|
+
* @param startDir - Directory to start searching from
|
|
55
|
+
* @returns Path to .appwrite directory or null if not found
|
|
56
|
+
*/
|
|
57
|
+
export function resolveAppwriteDir(startDir: string): string | null {
|
|
58
|
+
const appwriteDir = path.join(startDir, ".appwrite");
|
|
59
|
+
// Note: Actual existence check should be done by caller
|
|
60
|
+
return appwriteDir;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Resolves a collection file path within the collections directory
|
|
65
|
+
* @param configPath - Base configuration directory path
|
|
66
|
+
* @param fileName - Name of the collection file (e.g., "User.ts" or "User.yaml")
|
|
67
|
+
* @returns Full path to the collection file
|
|
68
|
+
*/
|
|
69
|
+
export function resolveCollectionFile(configPath: string, fileName: string): string {
|
|
70
|
+
return path.join(resolveCollectionsDir(configPath), fileName);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolves a table file path within the tables directory
|
|
75
|
+
* @param configPath - Base configuration directory path
|
|
76
|
+
* @param fileName - Name of the table file (e.g., "User.ts" or "User.yaml")
|
|
77
|
+
* @returns Full path to the table file
|
|
78
|
+
*/
|
|
79
|
+
export function resolveTableFile(configPath: string, fileName: string): string {
|
|
80
|
+
return path.join(resolveTablesDir(configPath), fileName);
|
|
81
|
+
}
|