@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,446 @@
|
|
|
1
|
+
import type { CollectionCreate, ImportDef } from "@njdamstra/appwrite-utils";
|
|
2
|
+
import { YamlImportConfigLoader, type YamlImportConfig } from "./YamlImportConfigLoader.js";
|
|
3
|
+
import { createImportSchemas, createImportExamples } from "./generateImportSchemas.js";
|
|
4
|
+
import { logger } from "../../shared/logging.js";
|
|
5
|
+
import { normalizeYamlData, usesTableTerminology, convertTerminology, type YamlCollectionData } from "../../utils/yamlConverter.js";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import fs from "fs";
|
|
8
|
+
import yaml from "js-yaml";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Integration service that bridges YAML import configurations with the existing import system.
|
|
12
|
+
* Provides seamless integration between new YAML configs and legacy TypeScript collection definitions.
|
|
13
|
+
*/
|
|
14
|
+
export class YamlImportIntegration {
|
|
15
|
+
private configLoader: YamlImportConfigLoader;
|
|
16
|
+
private appwriteFolderPath: string;
|
|
17
|
+
|
|
18
|
+
constructor(appwriteFolderPath: string) {
|
|
19
|
+
this.appwriteFolderPath = appwriteFolderPath;
|
|
20
|
+
this.configLoader = new YamlImportConfigLoader(appwriteFolderPath);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Initializes the YAML import system.
|
|
25
|
+
* Creates necessary directories, schemas, and example files.
|
|
26
|
+
*/
|
|
27
|
+
async initialize(): Promise<void> {
|
|
28
|
+
try {
|
|
29
|
+
// Create import directory structure
|
|
30
|
+
await this.configLoader.createImportStructure();
|
|
31
|
+
|
|
32
|
+
// Generate JSON schemas for IntelliSense
|
|
33
|
+
await createImportSchemas(this.appwriteFolderPath);
|
|
34
|
+
|
|
35
|
+
// Create example configurations
|
|
36
|
+
await createImportExamples(this.appwriteFolderPath);
|
|
37
|
+
|
|
38
|
+
logger.info("YAML import system initialized successfully");
|
|
39
|
+
} catch (error) {
|
|
40
|
+
logger.error("Failed to initialize YAML import system:", error);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Merges YAML import configurations with existing collection definitions.
|
|
47
|
+
* Allows collections to have both TypeScript and YAML import definitions.
|
|
48
|
+
*
|
|
49
|
+
* @param collections - Existing collection configurations
|
|
50
|
+
* @returns Collections with merged import definitions
|
|
51
|
+
*/
|
|
52
|
+
async mergeWithCollections(collections: CollectionCreate[]): Promise<CollectionCreate[]> {
|
|
53
|
+
try {
|
|
54
|
+
// Load all YAML import configurations
|
|
55
|
+
const yamlConfigs = await this.configLoader.loadAllImportConfigs();
|
|
56
|
+
|
|
57
|
+
if (yamlConfigs.size === 0) {
|
|
58
|
+
logger.info("No YAML import configurations found, using existing collection definitions");
|
|
59
|
+
return collections;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
logger.info(`Found YAML import configurations for ${yamlConfigs.size} collections`);
|
|
63
|
+
|
|
64
|
+
const mergedCollections = [...collections];
|
|
65
|
+
|
|
66
|
+
// Process each collection with YAML configs
|
|
67
|
+
for (const [collectionName, yamlConfigList] of yamlConfigs.entries()) {
|
|
68
|
+
const existingCollection = mergedCollections.find(c => c.name === collectionName);
|
|
69
|
+
|
|
70
|
+
if (existingCollection) {
|
|
71
|
+
// Merge with existing collection
|
|
72
|
+
const yamlImportDefs = yamlConfigList.map(yamlConfig =>
|
|
73
|
+
this.configLoader.convertToImportDef(yamlConfig)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// Combine existing and YAML import definitions
|
|
77
|
+
const existingImportDefs = existingCollection.importDefs || [];
|
|
78
|
+
existingCollection.importDefs = [...existingImportDefs, ...yamlImportDefs];
|
|
79
|
+
|
|
80
|
+
logger.info(`Merged ${yamlImportDefs.length} YAML import definitions with collection: ${collectionName}`);
|
|
81
|
+
} else {
|
|
82
|
+
// Create new collection from YAML config
|
|
83
|
+
const yamlImportDefs = yamlConfigList.map(yamlConfig =>
|
|
84
|
+
this.configLoader.convertToImportDef(yamlConfig)
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const newCollection: CollectionCreate = {
|
|
88
|
+
name: collectionName,
|
|
89
|
+
$id: collectionName.toLowerCase().replace(/\s+/g, '_'),
|
|
90
|
+
enabled: true,
|
|
91
|
+
documentSecurity: false,
|
|
92
|
+
$permissions: [],
|
|
93
|
+
attributes: [], // Will be populated from existing collection or schema
|
|
94
|
+
indexes: [],
|
|
95
|
+
importDefs: yamlImportDefs,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
mergedCollections.push(newCollection);
|
|
99
|
+
logger.info(`Created new collection from YAML config: ${collectionName}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return mergedCollections;
|
|
104
|
+
} catch (error) {
|
|
105
|
+
logger.error("Failed to merge YAML configurations with collections:", error);
|
|
106
|
+
// Return original collections on error to avoid breaking existing functionality
|
|
107
|
+
return collections;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Validates YAML import configurations against existing collection schemas.
|
|
113
|
+
* Ensures that all target fields exist in the collection definitions.
|
|
114
|
+
*
|
|
115
|
+
* @param collections - Collection definitions to validate against
|
|
116
|
+
* @returns Validation results with errors and warnings
|
|
117
|
+
*/
|
|
118
|
+
async validateConfigurations(collections: CollectionCreate[]): Promise<{
|
|
119
|
+
isValid: boolean;
|
|
120
|
+
errors: string[];
|
|
121
|
+
warnings: string[];
|
|
122
|
+
}> {
|
|
123
|
+
const errors: string[] = [];
|
|
124
|
+
const warnings: string[] = [];
|
|
125
|
+
|
|
126
|
+
try {
|
|
127
|
+
const yamlConfigs = await this.configLoader.loadAllImportConfigs();
|
|
128
|
+
|
|
129
|
+
for (const [collectionName, yamlConfigList] of yamlConfigs.entries()) {
|
|
130
|
+
const collection = collections.find(c => c.name === collectionName);
|
|
131
|
+
|
|
132
|
+
if (!collection) {
|
|
133
|
+
warnings.push(`YAML import config references non-existent collection: ${collectionName}`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
for (let i = 0; i < yamlConfigList.length; i++) {
|
|
138
|
+
const yamlConfig = yamlConfigList[i];
|
|
139
|
+
const configErrors = this.configLoader.validateAgainstCollection(
|
|
140
|
+
yamlConfig,
|
|
141
|
+
collection.attributes || []
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
errors.push(...configErrors.map(err =>
|
|
145
|
+
`${collectionName}[${i}]: ${err}`
|
|
146
|
+
));
|
|
147
|
+
|
|
148
|
+
// Additional validation
|
|
149
|
+
this.validateSourceFiles(yamlConfig, errors, collectionName, i);
|
|
150
|
+
this.validateConverters(yamlConfig, warnings, collectionName, i);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
isValid: errors.length === 0,
|
|
156
|
+
errors,
|
|
157
|
+
warnings,
|
|
158
|
+
};
|
|
159
|
+
} catch (error) {
|
|
160
|
+
errors.push(`Failed to validate YAML configurations: ${error}`);
|
|
161
|
+
return {
|
|
162
|
+
isValid: false,
|
|
163
|
+
errors,
|
|
164
|
+
warnings,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Validates that source files exist for import configurations.
|
|
171
|
+
*/
|
|
172
|
+
private validateSourceFiles(
|
|
173
|
+
yamlConfig: YamlImportConfig,
|
|
174
|
+
errors: string[],
|
|
175
|
+
collectionName: string,
|
|
176
|
+
configIndex: number
|
|
177
|
+
): void {
|
|
178
|
+
const sourceFilePath = path.resolve(this.appwriteFolderPath, yamlConfig.source.file);
|
|
179
|
+
|
|
180
|
+
if (!fs.existsSync(sourceFilePath)) {
|
|
181
|
+
errors.push(
|
|
182
|
+
`${collectionName}[${configIndex}]: Source file not found: ${yamlConfig.source.file}`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Validates that converter functions are available.
|
|
189
|
+
*/
|
|
190
|
+
private validateConverters(
|
|
191
|
+
yamlConfig: YamlImportConfig,
|
|
192
|
+
warnings: string[],
|
|
193
|
+
collectionName: string,
|
|
194
|
+
configIndex: number
|
|
195
|
+
): void {
|
|
196
|
+
const availableConverters = [
|
|
197
|
+
"anyToString",
|
|
198
|
+
"anyToNumber",
|
|
199
|
+
"anyToBoolean",
|
|
200
|
+
"anyToDate",
|
|
201
|
+
"stringToLowerCase",
|
|
202
|
+
"stringToUpperCase",
|
|
203
|
+
"stringTrim",
|
|
204
|
+
"numberToString",
|
|
205
|
+
"booleanToString",
|
|
206
|
+
"dateToString",
|
|
207
|
+
"dateToTimestamp",
|
|
208
|
+
"timestampToDate",
|
|
209
|
+
"arrayToString",
|
|
210
|
+
"stringToArray",
|
|
211
|
+
"removeNulls",
|
|
212
|
+
"removeEmpty"
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
for (const mapping of yamlConfig.mapping.attributes) {
|
|
216
|
+
for (const converter of mapping.converters) {
|
|
217
|
+
const cleanConverter = converter.replace(/\[arr\]/gi, "").replace(/\[Arr\]/gi, "");
|
|
218
|
+
if (!availableConverters.includes(cleanConverter)) {
|
|
219
|
+
warnings.push(
|
|
220
|
+
`${collectionName}[${configIndex}]: Unknown converter '${converter}' in mapping for '${mapping.targetKey}'`
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Generates a YAML import configuration from an existing ImportDef.
|
|
229
|
+
* Useful for migrating TypeScript configurations to YAML.
|
|
230
|
+
* Supports both collection and table terminology.
|
|
231
|
+
*
|
|
232
|
+
* @param importDef - Existing ImportDef to convert
|
|
233
|
+
* @param collectionName - Name of the collection
|
|
234
|
+
* @param useTableTerminology - Whether to use table terminology
|
|
235
|
+
* @returns YAML configuration string
|
|
236
|
+
*/
|
|
237
|
+
convertImportDefToYaml(
|
|
238
|
+
importDef: ImportDef,
|
|
239
|
+
collectionName: string,
|
|
240
|
+
useTableTerminology = false
|
|
241
|
+
): string {
|
|
242
|
+
const yamlConfig: YamlImportConfig = {
|
|
243
|
+
source: {
|
|
244
|
+
file: importDef.filePath,
|
|
245
|
+
basePath: importDef.basePath,
|
|
246
|
+
type: "json",
|
|
247
|
+
},
|
|
248
|
+
target: {
|
|
249
|
+
collection: collectionName,
|
|
250
|
+
type: importDef.type || "create",
|
|
251
|
+
primaryKey: importDef.primaryKeyField,
|
|
252
|
+
createUsers: importDef.createUsers || false,
|
|
253
|
+
},
|
|
254
|
+
mapping: {
|
|
255
|
+
attributes: importDef.attributeMappings.map(attr => ({
|
|
256
|
+
oldKey: attr.oldKey,
|
|
257
|
+
oldKeys: attr.oldKeys,
|
|
258
|
+
targetKey: attr.targetKey,
|
|
259
|
+
valueToSet: attr.valueToSet,
|
|
260
|
+
fileData: attr.fileData,
|
|
261
|
+
converters: attr.converters || [],
|
|
262
|
+
validation: (attr.validationActions || []).map(v => ({
|
|
263
|
+
rule: v.action,
|
|
264
|
+
params: v.params,
|
|
265
|
+
})),
|
|
266
|
+
afterImport: (attr.postImportActions || []).map(a => ({
|
|
267
|
+
action: a.action,
|
|
268
|
+
params: a.params,
|
|
269
|
+
})),
|
|
270
|
+
})),
|
|
271
|
+
relationships: (importDef.idMappings || []).map(rel => ({
|
|
272
|
+
sourceField: rel.sourceField,
|
|
273
|
+
targetField: rel.targetField,
|
|
274
|
+
targetCollection: rel.targetCollection,
|
|
275
|
+
fieldToSet: rel.fieldToSet,
|
|
276
|
+
targetFieldToMatch: rel.targetFieldToMatch,
|
|
277
|
+
})),
|
|
278
|
+
},
|
|
279
|
+
options: {
|
|
280
|
+
batchSize: 50,
|
|
281
|
+
skipValidation: false,
|
|
282
|
+
dryRun: false,
|
|
283
|
+
continueOnError: true,
|
|
284
|
+
updateMapping: importDef.updateMapping,
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const yamlContent = yaml.dump(yamlConfig, {
|
|
289
|
+
indent: 2,
|
|
290
|
+
lineWidth: 120,
|
|
291
|
+
sortKeys: false,
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
const entityType = useTableTerminology ? 'Table' : 'Collection';
|
|
295
|
+
return `# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json\n# Import Configuration for ${entityType}: ${collectionName}\n\n${yamlContent}`;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Exports existing TypeScript import configurations to YAML files.
|
|
300
|
+
* Helps migrate from TypeScript to YAML-based configurations.
|
|
301
|
+
* Supports both collection and table terminology.
|
|
302
|
+
*
|
|
303
|
+
* @param collections - Collections with existing import definitions
|
|
304
|
+
* @param useTableTerminology - Whether to use table terminology
|
|
305
|
+
*/
|
|
306
|
+
async exportToYaml(
|
|
307
|
+
collections: CollectionCreate[],
|
|
308
|
+
useTableTerminology = false
|
|
309
|
+
): Promise<void> {
|
|
310
|
+
const exportDir = path.join(this.appwriteFolderPath, "import", "exported");
|
|
311
|
+
|
|
312
|
+
if (!fs.existsSync(exportDir)) {
|
|
313
|
+
fs.mkdirSync(exportDir, { recursive: true });
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
let exportedCount = 0;
|
|
317
|
+
|
|
318
|
+
for (const collection of collections) {
|
|
319
|
+
if (!collection.importDefs || collection.importDefs.length === 0) {
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
for (let i = 0; i < collection.importDefs.length; i++) {
|
|
324
|
+
const importDef = collection.importDefs[i];
|
|
325
|
+
const yamlContent = this.convertImportDefToYaml(
|
|
326
|
+
importDef,
|
|
327
|
+
collection.name,
|
|
328
|
+
useTableTerminology
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
const entityType = useTableTerminology ? 'table' : 'collection';
|
|
332
|
+
const filename = collection.importDefs.length > 1
|
|
333
|
+
? `${collection.name}-${entityType}-${i + 1}.yaml`
|
|
334
|
+
: `${collection.name}-${entityType}.yaml`;
|
|
335
|
+
|
|
336
|
+
const filePath = path.join(exportDir, filename);
|
|
337
|
+
fs.writeFileSync(filePath, yamlContent);
|
|
338
|
+
exportedCount++;
|
|
339
|
+
|
|
340
|
+
logger.info(`Exported import configuration: ${filePath}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
logger.info(`Exported ${exportedCount} import configurations to YAML`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Gets statistics about YAML import configurations.
|
|
349
|
+
*/
|
|
350
|
+
async getStatistics(): Promise<{
|
|
351
|
+
hasYamlConfigs: boolean;
|
|
352
|
+
totalConfigurations: number;
|
|
353
|
+
collectionsWithConfigs: number;
|
|
354
|
+
configurationsByType: { [type: string]: number };
|
|
355
|
+
totalAttributeMappings: number;
|
|
356
|
+
totalRelationshipMappings: number;
|
|
357
|
+
}> {
|
|
358
|
+
try {
|
|
359
|
+
const yamlConfigs = await this.configLoader.loadAllImportConfigs();
|
|
360
|
+
const stats = this.configLoader.getStatistics(yamlConfigs);
|
|
361
|
+
|
|
362
|
+
return {
|
|
363
|
+
hasYamlConfigs: yamlConfigs.size > 0,
|
|
364
|
+
totalConfigurations: stats.totalConfigurations,
|
|
365
|
+
collectionsWithConfigs: stats.collectionsWithConfigs,
|
|
366
|
+
configurationsByType: stats.configsByType,
|
|
367
|
+
totalAttributeMappings: stats.totalAttributeMappings,
|
|
368
|
+
totalRelationshipMappings: stats.totalRelationshipMappings,
|
|
369
|
+
};
|
|
370
|
+
} catch (error) {
|
|
371
|
+
logger.error("Failed to get YAML import statistics:", error);
|
|
372
|
+
return {
|
|
373
|
+
hasYamlConfigs: false,
|
|
374
|
+
totalConfigurations: 0,
|
|
375
|
+
collectionsWithConfigs: 0,
|
|
376
|
+
configurationsByType: {},
|
|
377
|
+
totalAttributeMappings: 0,
|
|
378
|
+
totalRelationshipMappings: 0,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Creates a new YAML import configuration from a template.
|
|
385
|
+
* Supports both collection and table terminology.
|
|
386
|
+
*
|
|
387
|
+
* @param collectionName - Name of the collection
|
|
388
|
+
* @param sourceFile - Source data file name
|
|
389
|
+
* @param useTableTerminology - Whether to use table terminology
|
|
390
|
+
* @param outputPath - Output file path (optional)
|
|
391
|
+
*/
|
|
392
|
+
async createFromTemplate(
|
|
393
|
+
collectionName: string,
|
|
394
|
+
sourceFile: string,
|
|
395
|
+
useTableTerminology = false,
|
|
396
|
+
outputPath?: string
|
|
397
|
+
): Promise<string> {
|
|
398
|
+
const template = this.configLoader.generateTemplate(
|
|
399
|
+
collectionName,
|
|
400
|
+
sourceFile,
|
|
401
|
+
useTableTerminology
|
|
402
|
+
);
|
|
403
|
+
|
|
404
|
+
const entityType = useTableTerminology ? 'table' : 'collection';
|
|
405
|
+
const fileName = outputPath || `${collectionName.toLowerCase()}-${entityType}-import.yaml`;
|
|
406
|
+
const fullPath = path.join(this.appwriteFolderPath, "import", fileName);
|
|
407
|
+
|
|
408
|
+
// Add schema reference to template with entity type comment
|
|
409
|
+
const schemaHeader = "# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json\n";
|
|
410
|
+
const entityComment = `# Import Configuration for ${useTableTerminology ? 'Table' : 'Collection'}: ${collectionName}\n`;
|
|
411
|
+
const templateWithSchema = schemaHeader + entityComment + template;
|
|
412
|
+
|
|
413
|
+
fs.writeFileSync(fullPath, templateWithSchema);
|
|
414
|
+
logger.info(`Created YAML import configuration: ${fullPath}`);
|
|
415
|
+
|
|
416
|
+
return fullPath;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Checks if YAML import system is properly set up.
|
|
421
|
+
*/
|
|
422
|
+
async isSetupComplete(): Promise<{
|
|
423
|
+
isComplete: boolean;
|
|
424
|
+
missingComponents: string[];
|
|
425
|
+
}> {
|
|
426
|
+
const missingComponents: string[] = [];
|
|
427
|
+
|
|
428
|
+
// Check import directory
|
|
429
|
+
const importDir = path.join(this.appwriteFolderPath, "import");
|
|
430
|
+
if (!fs.existsSync(importDir)) {
|
|
431
|
+
missingComponents.push("import directory");
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Check schema files
|
|
435
|
+
const schemaDir = path.join(this.appwriteFolderPath, ".yaml_schemas");
|
|
436
|
+
const importSchemaPath = path.join(schemaDir, "import-config.schema.json");
|
|
437
|
+
if (!fs.existsSync(importSchemaPath)) {
|
|
438
|
+
missingComponents.push("import configuration schema");
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return {
|
|
442
|
+
isComplete: missingComponents.length === 0,
|
|
443
|
+
missingComponents,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
}
|