appwrite-utils-cli 1.9.7 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1004 -1004
- package/dist/adapters/index.d.ts +7 -8
- package/dist/adapters/index.js +7 -9
- package/dist/backups/operations/bucketBackup.js +2 -2
- package/dist/backups/operations/collectionBackup.d.ts +1 -1
- package/dist/backups/operations/collectionBackup.js +3 -3
- package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
- package/dist/backups/operations/comprehensiveBackup.js +2 -2
- package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
- package/dist/backups/tracking/centralizedTracking.js +2 -2
- package/dist/cli/commands/configCommands.js +51 -7
- package/dist/cli/commands/databaseCommands.js +156 -104
- package/dist/cli/commands/functionCommands.js +3 -3
- package/dist/cli/commands/importFileCommands.d.ts +7 -0
- package/dist/cli/commands/importFileCommands.js +674 -0
- package/dist/cli/commands/schemaCommands.js +3 -3
- package/dist/cli/commands/storageCommands.js +2 -3
- package/dist/cli/commands/transferCommands.js +3 -5
- package/dist/collections/{attributes.d.ts → columns.d.ts} +1 -1
- package/dist/collections/{attributes.js → columns.js} +15 -9
- package/dist/collections/indexes.js +1 -3
- package/dist/collections/methods.d.ts +1 -1
- package/dist/collections/methods.js +38 -20
- package/dist/collections/tableOperations.d.ts +1 -0
- package/dist/collections/tableOperations.js +30 -11
- package/dist/collections/transferOperations.d.ts +1 -1
- package/dist/collections/transferOperations.js +3 -4
- package/dist/collections/wipeOperations.d.ts +4 -3
- package/dist/collections/wipeOperations.js +112 -39
- package/dist/databases/methods.js +2 -2
- package/dist/databases/setup.js +2 -2
- package/dist/examples/yamlTerminologyExample.js +2 -2
- package/dist/functions/deployments.d.ts +1 -1
- package/dist/functions/deployments.js +6 -6
- package/dist/functions/fnConfigDiscovery.js +2 -2
- package/dist/functions/methods.js +2 -2
- package/dist/functions/templates/count-docs-in-collection/README.md +53 -53
- package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -159
- package/dist/functions/templates/count-docs-in-collection/src/request.ts +8 -8
- package/dist/functions/templates/hono-typescript/README.md +285 -285
- package/dist/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
- package/dist/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
- package/dist/functions/templates/hono-typescript/src/app.ts +179 -179
- package/dist/functions/templates/hono-typescript/src/context.ts +102 -102
- package/{src/functions/templates/hono-typescript/src/index.ts → dist/functions/templates/hono-typescript/src/main.ts} +53 -53
- package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
- package/dist/functions/templates/typescript-node/README.md +31 -31
- package/dist/functions/templates/typescript-node/src/context.ts +102 -102
- package/dist/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
- package/dist/functions/templates/uv/README.md +30 -30
- package/dist/functions/templates/uv/pyproject.toml +29 -29
- package/dist/functions/templates/uv/src/context.py +124 -124
- package/dist/functions/templates/uv/src/{index.py → main.py} +45 -45
- package/dist/init.js +1 -1
- package/dist/interactiveCLI.d.ts +6 -1
- package/dist/interactiveCLI.js +79 -25
- package/dist/main.js +125 -180
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +1 -1
- package/dist/migrations/appwriteToX.js +10 -8
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- package/dist/migrations/dataLoader.d.ts +4 -2
- package/dist/migrations/dataLoader.js +42 -20
- package/dist/migrations/importController.d.ts +2 -0
- package/dist/migrations/importController.js +39 -24
- package/dist/migrations/importDataActions.js +3 -3
- package/dist/migrations/relationships.js +1 -2
- package/dist/migrations/services/DataTransformationService.js +2 -2
- package/dist/migrations/services/FileHandlerService.js +1 -1
- package/dist/migrations/services/ImportOrchestrator.d.ts +2 -0
- package/dist/migrations/services/ImportOrchestrator.js +15 -7
- package/dist/migrations/services/RateLimitManager.js +1 -1
- package/dist/migrations/services/RelationshipResolver.js +1 -1
- package/dist/migrations/services/UserMappingService.js +1 -1
- package/dist/migrations/services/ValidationService.js +1 -1
- package/dist/migrations/transfer.d.ts +8 -4
- package/dist/migrations/transfer.js +108 -55
- package/dist/migrations/yaml/YamlImportConfigLoader.js +52 -52
- package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
- package/dist/migrations/yaml/generateImportSchemas.js +174 -174
- package/dist/setupCommands.d.ts +1 -1
- package/dist/setupCommands.js +5 -6
- package/dist/setupController.js +1 -1
- package/dist/shared/backupTracking.d.ts +1 -1
- package/dist/shared/backupTracking.js +2 -2
- package/dist/shared/confirmationDialogs.js +1 -1
- package/dist/shared/migrationHelpers.d.ts +1 -1
- package/dist/shared/migrationHelpers.js +4 -4
- package/dist/shared/operationQueue.d.ts +1 -1
- package/dist/shared/operationQueue.js +3 -4
- package/dist/shared/operationsTable.d.ts +1 -1
- package/dist/shared/operationsTable.js +35 -34
- package/dist/shared/operationsTableSchema.d.ts +3 -3
- package/dist/shared/operationsTableSchema.js +2 -2
- package/dist/shared/progressManager.js +1 -1
- package/dist/shared/selectionDialogs.d.ts +6 -0
- package/dist/shared/selectionDialogs.js +56 -12
- package/dist/storage/methods.d.ts +12 -0
- package/dist/storage/methods.js +92 -89
- package/dist/storage/schemas.d.ts +2 -2
- package/dist/tables/indexManager.d.ts +1 -1
- package/dist/tables/indexManager.js +2 -2
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/users/methods.js +2 -3
- package/dist/utils/configMigration.js +1 -1
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/loadConfigs.d.ts +2 -2
- package/dist/utils/loadConfigs.js +6 -7
- package/dist/utils/setupFiles.js +139 -141
- package/dist/utilsController.d.ts +16 -9
- package/dist/utilsController.js +93 -68
- package/package.json +9 -3
- package/.appwrite/.yaml_schemas/appwrite-config.schema.json +0 -380
- package/.appwrite/.yaml_schemas/collection.schema.json +0 -255
- package/.appwrite/collections/Categories.yaml +0 -182
- package/.appwrite/collections/ExampleCollection.yaml +0 -36
- package/.appwrite/collections/Posts.yaml +0 -227
- package/.appwrite/collections/Users.yaml +0 -149
- package/.appwrite/config.yaml +0 -109
- package/.appwrite/import/README.md +0 -148
- package/.appwrite/import/categories-import.yaml +0 -129
- package/.appwrite/import/posts-import.yaml +0 -208
- package/.appwrite/import/users-import.yaml +0 -130
- package/.appwrite/importData/categories.json +0 -194
- package/.appwrite/importData/posts.json +0 -270
- package/.appwrite/importData/users.json +0 -220
- package/.appwrite/schemas/categories.json +0 -128
- package/.appwrite/schemas/exampleCollection.json +0 -52
- package/.appwrite/schemas/posts.json +0 -173
- package/.appwrite/schemas/users.json +0 -125
- package/CHANGELOG.md +0 -35
- package/CONFIG_TODO.md +0 -1189
- package/SELECTION_DIALOGS.md +0 -146
- package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -420
- package/dist/adapters/DatabaseAdapter.d.ts +0 -243
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -615
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -611
- package/dist/config/ConfigManager.d.ts +0 -450
- package/dist/config/ConfigManager.js +0 -650
- package/dist/config/configMigration.d.ts +0 -87
- package/dist/config/configMigration.js +0 -390
- package/dist/config/configValidation.d.ts +0 -66
- package/dist/config/configValidation.js +0 -358
- package/dist/config/index.d.ts +0 -8
- package/dist/config/index.js +0 -7
- package/dist/config/services/ConfigDiscoveryService.d.ts +0 -122
- package/dist/config/services/ConfigDiscoveryService.js +0 -322
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -535
- package/dist/config/services/ConfigMergeService.d.ts +0 -208
- package/dist/config/services/ConfigMergeService.js +0 -308
- package/dist/config/services/ConfigValidationService.d.ts +0 -214
- package/dist/config/services/ConfigValidationService.js +0 -310
- package/dist/config/services/SessionAuthService.d.ts +0 -225
- package/dist/config/services/SessionAuthService.js +0 -456
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
- package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
- package/dist/config/services/index.d.ts +0 -13
- package/dist/config/services/index.js +0 -10
- package/dist/config/yamlConfig.d.ts +0 -722
- package/dist/config/yamlConfig.js +0 -702
- package/dist/functions/pathResolution.d.ts +0 -37
- package/dist/functions/pathResolution.js +0 -185
- package/dist/functions/templates/count-docs-in-collection/package.json +0 -25
- package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/dist/functions/templates/hono-typescript/package.json +0 -26
- package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
- package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/dist/functions/templates/typescript-node/package.json +0 -25
- package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
- package/dist/shared/attributeMapper.d.ts +0 -20
- package/dist/shared/attributeMapper.js +0 -203
- package/dist/shared/errorUtils.d.ts +0 -54
- package/dist/shared/errorUtils.js +0 -95
- package/dist/shared/functionManager.d.ts +0 -48
- package/dist/shared/functionManager.js +0 -348
- package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
- package/dist/shared/jsonSchemaGenerator.js +0 -290
- package/dist/shared/logging.d.ts +0 -61
- package/dist/shared/logging.js +0 -116
- package/dist/shared/messageFormatter.d.ts +0 -39
- package/dist/shared/messageFormatter.js +0 -162
- package/dist/shared/pydanticModelGenerator.d.ts +0 -17
- package/dist/shared/pydanticModelGenerator.js +0 -615
- package/dist/shared/schemaGenerator.d.ts +0 -40
- package/dist/shared/schemaGenerator.js +0 -556
- package/dist/utils/ClientFactory.d.ts +0 -87
- package/dist/utils/ClientFactory.js +0 -212
- package/dist/utils/configDiscovery.d.ts +0 -78
- package/dist/utils/configDiscovery.js +0 -472
- package/dist/utils/constantsGenerator.d.ts +0 -31
- package/dist/utils/constantsGenerator.js +0 -321
- package/dist/utils/dataConverters.d.ts +0 -46
- package/dist/utils/dataConverters.js +0 -139
- package/dist/utils/directoryUtils.d.ts +0 -22
- package/dist/utils/directoryUtils.js +0 -59
- package/dist/utils/getClientFromConfig.d.ts +0 -39
- package/dist/utils/getClientFromConfig.js +0 -199
- package/dist/utils/helperFunctions.d.ts +0 -63
- package/dist/utils/helperFunctions.js +0 -156
- package/dist/utils/pathResolvers.d.ts +0 -53
- package/dist/utils/pathResolvers.js +0 -72
- package/dist/utils/projectConfig.d.ts +0 -122
- package/dist/utils/projectConfig.js +0 -206
- package/dist/utils/retryFailedPromises.d.ts +0 -2
- package/dist/utils/retryFailedPromises.js +0 -23
- package/dist/utils/sessionAuth.d.ts +0 -48
- package/dist/utils/sessionAuth.js +0 -164
- package/dist/utils/typeGuards.d.ts +0 -35
- package/dist/utils/typeGuards.js +0 -57
- package/dist/utils/validationRules.d.ts +0 -43
- package/dist/utils/validationRules.js +0 -42
- package/dist/utils/versionDetection.d.ts +0 -58
- package/dist/utils/versionDetection.js +0 -251
- package/dist/utils/yamlConverter.d.ts +0 -100
- package/dist/utils/yamlConverter.js +0 -428
- package/dist/utils/yamlLoader.d.ts +0 -70
- package/dist/utils/yamlLoader.js +0 -267
- package/scripts/copy-templates.ts +0 -23
- package/src/adapters/AdapterFactory.ts +0 -529
- package/src/adapters/DatabaseAdapter.ts +0 -319
- package/src/adapters/LegacyAdapter.ts +0 -844
- package/src/adapters/TablesDBAdapter.ts +0 -823
- package/src/adapters/index.ts +0 -37
- package/src/backups/operations/bucketBackup.ts +0 -277
- package/src/backups/operations/collectionBackup.ts +0 -310
- package/src/backups/operations/comprehensiveBackup.ts +0 -342
- package/src/backups/schemas/bucketManifest.ts +0 -78
- package/src/backups/schemas/comprehensiveManifest.ts +0 -76
- package/src/backups/tracking/centralizedTracking.ts +0 -352
- package/src/cli/commands/configCommands.ts +0 -201
- package/src/cli/commands/databaseCommands.ts +0 -879
- package/src/cli/commands/functionCommands.ts +0 -418
- package/src/cli/commands/schemaCommands.ts +0 -200
- package/src/cli/commands/storageCommands.ts +0 -152
- package/src/cli/commands/transferCommands.ts +0 -457
- package/src/collections/attributes.ts +0 -2020
- package/src/collections/attributes.ts.backup +0 -1555
- package/src/collections/indexes.ts +0 -352
- package/src/collections/methods.ts +0 -700
- package/src/collections/tableOperations.ts +0 -521
- package/src/collections/transferOperations.ts +0 -590
- package/src/collections/wipeOperations.ts +0 -346
- package/src/config/ConfigManager.ts +0 -849
- package/src/config/README.md +0 -274
- package/src/config/configMigration.ts +0 -575
- package/src/config/configValidation.ts +0 -445
- package/src/config/index.ts +0 -10
- package/src/config/services/ConfigDiscoveryService.ts +0 -410
- package/src/config/services/ConfigLoaderService.ts +0 -732
- package/src/config/services/ConfigMergeService.ts +0 -388
- package/src/config/services/ConfigValidationService.ts +0 -394
- package/src/config/services/SessionAuthService.ts +0 -565
- package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
- package/src/config/services/index.ts +0 -29
- package/src/config/yamlConfig.ts +0 -761
- package/src/databases/methods.ts +0 -49
- package/src/databases/setup.ts +0 -77
- package/src/examples/yamlTerminologyExample.ts +0 -346
- package/src/functions/deployments.ts +0 -220
- package/src/functions/fnConfigDiscovery.ts +0 -103
- package/src/functions/methods.ts +0 -284
- package/src/functions/pathResolution.ts +0 -227
- package/src/functions/templates/count-docs-in-collection/README.md +0 -54
- package/src/functions/templates/count-docs-in-collection/package.json +0 -25
- package/src/functions/templates/count-docs-in-collection/src/main.ts +0 -159
- package/src/functions/templates/count-docs-in-collection/src/request.ts +0 -9
- package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
- package/src/functions/templates/hono-typescript/README.md +0 -286
- package/src/functions/templates/hono-typescript/package.json +0 -26
- package/src/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
- package/src/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
- package/src/functions/templates/hono-typescript/src/app.ts +0 -180
- package/src/functions/templates/hono-typescript/src/context.ts +0 -103
- package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
- package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
- package/src/functions/templates/typescript-node/README.md +0 -32
- package/src/functions/templates/typescript-node/package.json +0 -25
- package/src/functions/templates/typescript-node/src/context.ts +0 -103
- package/src/functions/templates/typescript-node/src/index.ts +0 -29
- package/src/functions/templates/typescript-node/tsconfig.json +0 -28
- package/src/functions/templates/uv/README.md +0 -31
- package/src/functions/templates/uv/pyproject.toml +0 -30
- package/src/functions/templates/uv/src/__init__.py +0 -0
- package/src/functions/templates/uv/src/context.py +0 -125
- package/src/functions/templates/uv/src/index.py +0 -46
- package/src/init.ts +0 -62
- package/src/interactiveCLI.ts +0 -1136
- package/src/main.ts +0 -1670
- package/src/migrations/afterImportActions.ts +0 -580
- package/src/migrations/appwriteToX.ts +0 -664
- package/src/migrations/comprehensiveTransfer.ts +0 -2285
- package/src/migrations/dataLoader.ts +0 -1702
- package/src/migrations/importController.ts +0 -428
- package/src/migrations/importDataActions.ts +0 -315
- package/src/migrations/relationships.ts +0 -334
- package/src/migrations/services/DataTransformationService.ts +0 -196
- package/src/migrations/services/FileHandlerService.ts +0 -311
- package/src/migrations/services/ImportOrchestrator.ts +0 -666
- package/src/migrations/services/RateLimitManager.ts +0 -363
- package/src/migrations/services/RelationshipResolver.ts +0 -461
- package/src/migrations/services/UserMappingService.ts +0 -345
- package/src/migrations/services/ValidationService.ts +0 -349
- package/src/migrations/transfer.ts +0 -1068
- package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
- package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
- package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
- package/src/schemas/authUser.ts +0 -23
- package/src/setup.ts +0 -8
- package/src/setupCommands.ts +0 -603
- package/src/setupController.ts +0 -43
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/backupMetadataSchema.ts +0 -93
- package/src/shared/backupTracking.ts +0 -211
- package/src/shared/confirmationDialogs.ts +0 -327
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -537
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/migrationHelpers.ts +0 -232
- package/src/shared/operationLogger.ts +0 -20
- package/src/shared/operationQueue.ts +0 -377
- package/src/shared/operationsTable.ts +0 -338
- package/src/shared/operationsTableSchema.ts +0 -60
- package/src/shared/progressManager.ts +0 -278
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/relationshipExtractor.ts +0 -214
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/shared/selectionDialogs.ts +0 -749
- package/src/storage/backupCompression.ts +0 -88
- package/src/storage/methods.ts +0 -698
- package/src/storage/schemas.ts +0 -205
- package/src/tables/indexManager.ts +0 -409
- package/src/types/node-appwrite-tablesdb.d.ts +0 -44
- package/src/types.ts +0 -9
- package/src/users/methods.ts +0 -359
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/configMigration.ts +0 -348
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/index.ts +0 -2
- package/src/utils/loadConfigs.ts +0 -449
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -340
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/setupFiles.ts +0 -1238
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- package/src/utils/yamlLoader.ts +0 -371
- package/src/utilsController.ts +0 -1213
- package/tests/README.md +0 -497
- package/tests/adapters/AdapterFactory.test.ts +0 -277
- package/tests/integration/syncOperations.test.ts +0 -463
- package/tests/jest.config.js +0 -25
- package/tests/migration/configMigration.test.ts +0 -546
- package/tests/setup.ts +0 -62
- package/tests/testUtils.ts +0 -340
- package/tests/utils/loadConfigs.test.ts +0 -350
- package/tests/validation/configValidation.test.ts +0 -412
- package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
- package/tsconfig.json +0 -44
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Expands tilde (~) in paths to the user's home directory
|
|
3
|
-
* @param pathStr - Path string that may contain ~
|
|
4
|
-
* @returns Expanded path with home directory
|
|
5
|
-
*/
|
|
6
|
-
export declare function expandTildePath(pathStr: string): string;
|
|
7
|
-
/**
|
|
8
|
-
* Normalizes function name to standard format (lowercase, dashes instead of spaces)
|
|
9
|
-
* @param name - Function name to normalize
|
|
10
|
-
* @returns Normalized function name
|
|
11
|
-
*/
|
|
12
|
-
export declare function normalizeFunctionName(name: string): string;
|
|
13
|
-
/**
|
|
14
|
-
* Validates that a directory exists and contains function markers
|
|
15
|
-
* @param dirPath - Directory path to validate
|
|
16
|
-
* @returns True if directory is a valid function directory
|
|
17
|
-
*/
|
|
18
|
-
export declare function validateFunctionDirectory(dirPath: string): boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Helper function to search for function in standard locations
|
|
21
|
-
* @param configDirPath - Directory where config file is located
|
|
22
|
-
* @param normalizedName - Normalized function name
|
|
23
|
-
* @returns First valid function directory path or undefined
|
|
24
|
-
*/
|
|
25
|
-
export declare function findFunctionInStandardLocations(configDirPath: string, normalizedName: string): string | undefined;
|
|
26
|
-
/**
|
|
27
|
-
* Resolves the absolute path to a function directory
|
|
28
|
-
* Handles multiple resolution strategies with proper priority
|
|
29
|
-
*
|
|
30
|
-
* @param functionName - Name of the function
|
|
31
|
-
* @param configDirPath - Directory where config file is located
|
|
32
|
-
* @param dirPath - Optional explicit dirPath from config
|
|
33
|
-
* @param explicitPath - Optional path passed as parameter (highest priority)
|
|
34
|
-
* @returns Absolute path to the function directory
|
|
35
|
-
* @throws Error if function directory cannot be found or is invalid
|
|
36
|
-
*/
|
|
37
|
-
export declare function resolveFunctionDirectory(functionName: string, configDirPath: string, dirPath?: string, explicitPath?: string): string;
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import { existsSync, statSync, readdirSync } from 'node:fs';
|
|
2
|
-
import { join, resolve, isAbsolute } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { MessageFormatter } from '../shared/messageFormatter.js';
|
|
5
|
-
import { logger } from '../shared/logging.js';
|
|
6
|
-
/**
|
|
7
|
-
* Expands tilde (~) in paths to the user's home directory
|
|
8
|
-
* @param pathStr - Path string that may contain ~
|
|
9
|
-
* @returns Expanded path with home directory
|
|
10
|
-
*/
|
|
11
|
-
export function expandTildePath(pathStr) {
|
|
12
|
-
if (!pathStr)
|
|
13
|
-
return pathStr;
|
|
14
|
-
if (pathStr.startsWith('~/') || pathStr === '~') {
|
|
15
|
-
const expandedPath = pathStr.replace(/^~(?=$|\/|\\)/, homedir());
|
|
16
|
-
logger.debug('Expanded tilde path', { original: pathStr, expanded: expandedPath });
|
|
17
|
-
return expandedPath;
|
|
18
|
-
}
|
|
19
|
-
return pathStr;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Normalizes function name to standard format (lowercase, dashes instead of spaces)
|
|
23
|
-
* @param name - Function name to normalize
|
|
24
|
-
* @returns Normalized function name
|
|
25
|
-
*/
|
|
26
|
-
export function normalizeFunctionName(name) {
|
|
27
|
-
if (!name)
|
|
28
|
-
return name;
|
|
29
|
-
const normalized = name.toLowerCase().replace(/\s+/g, '-');
|
|
30
|
-
if (normalized !== name) {
|
|
31
|
-
logger.debug('Normalized function name', { original: name, normalized });
|
|
32
|
-
}
|
|
33
|
-
return normalized;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Validates that a directory exists and contains function markers
|
|
37
|
-
* @param dirPath - Directory path to validate
|
|
38
|
-
* @returns True if directory is a valid function directory
|
|
39
|
-
*/
|
|
40
|
-
export function validateFunctionDirectory(dirPath) {
|
|
41
|
-
try {
|
|
42
|
-
// Check if directory exists
|
|
43
|
-
if (!existsSync(dirPath)) {
|
|
44
|
-
logger.debug('Directory does not exist', { dirPath });
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
// Check if it's actually a directory
|
|
48
|
-
const stats = statSync(dirPath);
|
|
49
|
-
if (!stats.isDirectory()) {
|
|
50
|
-
logger.debug('Path is not a directory', { dirPath });
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
// Check for function markers
|
|
54
|
-
const contents = readdirSync(dirPath);
|
|
55
|
-
const hasPackageJson = contents.includes('package.json');
|
|
56
|
-
const hasPyprojectToml = contents.includes('pyproject.toml');
|
|
57
|
-
const hasSrcDir = contents.includes('src');
|
|
58
|
-
const isValid = hasPackageJson || hasPyprojectToml || hasSrcDir;
|
|
59
|
-
logger.debug('Function directory validation', {
|
|
60
|
-
dirPath,
|
|
61
|
-
isValid,
|
|
62
|
-
markers: {
|
|
63
|
-
hasPackageJson,
|
|
64
|
-
hasPyprojectToml,
|
|
65
|
-
hasSrcDir
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
return isValid;
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
logger.debug('Error validating function directory', {
|
|
72
|
-
dirPath,
|
|
73
|
-
error: error instanceof Error ? error.message : String(error)
|
|
74
|
-
});
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Helper function to search for function in standard locations
|
|
80
|
-
* @param configDirPath - Directory where config file is located
|
|
81
|
-
* @param normalizedName - Normalized function name
|
|
82
|
-
* @returns First valid function directory path or undefined
|
|
83
|
-
*/
|
|
84
|
-
export function findFunctionInStandardLocations(configDirPath, normalizedName) {
|
|
85
|
-
const searchPaths = [
|
|
86
|
-
// Same directory as config
|
|
87
|
-
join(configDirPath, 'functions', normalizedName),
|
|
88
|
-
// Parent directory of config
|
|
89
|
-
join(configDirPath, '..', 'functions', normalizedName),
|
|
90
|
-
// Current working directory
|
|
91
|
-
join(process.cwd(), 'functions', normalizedName),
|
|
92
|
-
];
|
|
93
|
-
logger.debug('Searching for function in standard locations', {
|
|
94
|
-
normalizedName,
|
|
95
|
-
configDirPath,
|
|
96
|
-
searchPaths
|
|
97
|
-
});
|
|
98
|
-
for (const searchPath of searchPaths) {
|
|
99
|
-
const resolvedPath = resolve(searchPath);
|
|
100
|
-
logger.debug('Checking search path', { searchPath, resolvedPath });
|
|
101
|
-
if (validateFunctionDirectory(resolvedPath)) {
|
|
102
|
-
logger.debug('Found function in standard location', { resolvedPath });
|
|
103
|
-
return resolvedPath;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
logger.debug('Function not found in any standard location', { normalizedName });
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Resolves the absolute path to a function directory
|
|
111
|
-
* Handles multiple resolution strategies with proper priority
|
|
112
|
-
*
|
|
113
|
-
* @param functionName - Name of the function
|
|
114
|
-
* @param configDirPath - Directory where config file is located
|
|
115
|
-
* @param dirPath - Optional explicit dirPath from config
|
|
116
|
-
* @param explicitPath - Optional path passed as parameter (highest priority)
|
|
117
|
-
* @returns Absolute path to the function directory
|
|
118
|
-
* @throws Error if function directory cannot be found or is invalid
|
|
119
|
-
*/
|
|
120
|
-
export function resolveFunctionDirectory(functionName, configDirPath, dirPath, explicitPath) {
|
|
121
|
-
logger.debug('Resolving function directory', {
|
|
122
|
-
functionName,
|
|
123
|
-
configDirPath,
|
|
124
|
-
dirPath,
|
|
125
|
-
explicitPath
|
|
126
|
-
});
|
|
127
|
-
const normalizedName = normalizeFunctionName(functionName);
|
|
128
|
-
// Priority 1: Explicit path parameter (highest priority)
|
|
129
|
-
if (explicitPath) {
|
|
130
|
-
logger.debug('Using explicit path parameter');
|
|
131
|
-
const expandedPath = expandTildePath(explicitPath);
|
|
132
|
-
const resolvedPath = isAbsolute(expandedPath)
|
|
133
|
-
? expandedPath
|
|
134
|
-
: resolve(process.cwd(), expandedPath);
|
|
135
|
-
if (!validateFunctionDirectory(resolvedPath)) {
|
|
136
|
-
const errorMsg = `Explicit path is not a valid function directory: ${resolvedPath}`;
|
|
137
|
-
logger.error(errorMsg);
|
|
138
|
-
MessageFormatter.error('Invalid function directory', errorMsg, { prefix: 'Path Resolution' });
|
|
139
|
-
throw new Error(errorMsg);
|
|
140
|
-
}
|
|
141
|
-
logger.debug('Resolved using explicit path', { resolvedPath });
|
|
142
|
-
MessageFormatter.debug(`Resolved function directory using explicit path: ${resolvedPath}`, undefined, { prefix: 'Path Resolution' });
|
|
143
|
-
return resolvedPath;
|
|
144
|
-
}
|
|
145
|
-
// Priority 2: dirPath from config (relative to config location)
|
|
146
|
-
if (dirPath) {
|
|
147
|
-
logger.debug('Using dirPath from config');
|
|
148
|
-
const expandedPath = expandTildePath(dirPath);
|
|
149
|
-
const resolvedPath = isAbsolute(expandedPath)
|
|
150
|
-
? expandedPath
|
|
151
|
-
: resolve(configDirPath, expandedPath);
|
|
152
|
-
if (!validateFunctionDirectory(resolvedPath)) {
|
|
153
|
-
const errorMsg = `Config dirPath is not a valid function directory: ${resolvedPath}`;
|
|
154
|
-
logger.error(errorMsg);
|
|
155
|
-
MessageFormatter.error('Invalid function directory', errorMsg, { prefix: 'Path Resolution' });
|
|
156
|
-
throw new Error(errorMsg);
|
|
157
|
-
}
|
|
158
|
-
logger.debug('Resolved using config dirPath', { resolvedPath });
|
|
159
|
-
MessageFormatter.debug(`Resolved function directory using config dirPath: ${resolvedPath}`, undefined, { prefix: 'Path Resolution' });
|
|
160
|
-
return resolvedPath;
|
|
161
|
-
}
|
|
162
|
-
// Priority 3: Search standard locations
|
|
163
|
-
logger.debug('Searching standard locations for function');
|
|
164
|
-
const foundPath = findFunctionInStandardLocations(configDirPath, normalizedName);
|
|
165
|
-
if (foundPath) {
|
|
166
|
-
logger.debug('Resolved using standard location search', { foundPath });
|
|
167
|
-
MessageFormatter.debug(`Found function directory in standard location: ${foundPath}`, undefined, { prefix: 'Path Resolution' });
|
|
168
|
-
return foundPath;
|
|
169
|
-
}
|
|
170
|
-
// Priority 4: Not found - throw error
|
|
171
|
-
const searchedLocations = [
|
|
172
|
-
join(configDirPath, 'functions', normalizedName),
|
|
173
|
-
join(configDirPath, '..', 'functions', normalizedName),
|
|
174
|
-
join(process.cwd(), 'functions', normalizedName),
|
|
175
|
-
];
|
|
176
|
-
const errorMsg = `Function directory not found for '${functionName}' (normalized: '${normalizedName}'). ` +
|
|
177
|
-
`Searched locations:\n${searchedLocations.map(p => ` - ${p}`).join('\n')}`;
|
|
178
|
-
logger.error('Function directory not found', {
|
|
179
|
-
functionName,
|
|
180
|
-
normalizedName,
|
|
181
|
-
searchedLocations
|
|
182
|
-
});
|
|
183
|
-
MessageFormatter.error('Function directory not found', errorMsg, { prefix: 'Path Resolution' });
|
|
184
|
-
throw new Error(errorMsg);
|
|
185
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{functionName}}",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Appwrite function to count documents in a collection",
|
|
5
|
-
"main": "src/main.ts",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"build": "tsc",
|
|
9
|
-
"start": "node dist/main.js",
|
|
10
|
-
"dev": "tsx src/main.ts"
|
|
11
|
-
},
|
|
12
|
-
"dependencies": {
|
|
13
|
-
"node-appwrite": "^13.0.0",
|
|
14
|
-
"appwrite-utils": "latest",
|
|
15
|
-
"zod": "^3.23.0"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@types/node": "^20.0.0",
|
|
19
|
-
"typescript": "^5.0.0",
|
|
20
|
-
"tsx": "^4.0.0"
|
|
21
|
-
},
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": ">=18.0.0"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"allowSyntheticDefaultImports": true,
|
|
7
|
-
"esModuleInterop": true,
|
|
8
|
-
"allowJs": true,
|
|
9
|
-
"checkJs": false,
|
|
10
|
-
"outDir": "./dist",
|
|
11
|
-
"rootDir": "./src",
|
|
12
|
-
"strict": true,
|
|
13
|
-
"noImplicitAny": true,
|
|
14
|
-
"strictNullChecks": true,
|
|
15
|
-
"strictFunctionTypes": true,
|
|
16
|
-
"noImplicitThis": true,
|
|
17
|
-
"noImplicitReturns": true,
|
|
18
|
-
"noFallthroughCasesInSwitch": true,
|
|
19
|
-
"moduleDetection": "force",
|
|
20
|
-
"resolveJsonModule": true,
|
|
21
|
-
"isolatedModules": true,
|
|
22
|
-
"verbatimModuleSyntax": false,
|
|
23
|
-
"skipLibCheck": true,
|
|
24
|
-
"forceConsistentCasingInFileNames": true
|
|
25
|
-
},
|
|
26
|
-
"include": ["src/**/*"],
|
|
27
|
-
"exclude": ["node_modules", "dist"]
|
|
28
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{functionName}}",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Appwrite TypeScript function with Hono web framework",
|
|
5
|
-
"main": "src/index.ts",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"build": "tsc",
|
|
9
|
-
"start": "node dist/index.js",
|
|
10
|
-
"dev": "tsx src/index.ts"
|
|
11
|
-
},
|
|
12
|
-
"dependencies": {
|
|
13
|
-
"node-appwrite": "^13.0.0",
|
|
14
|
-
"appwrite-utils": "latest",
|
|
15
|
-
"hono": "^4.0.0",
|
|
16
|
-
"zod": "^3.22.0"
|
|
17
|
-
},
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@types/node": "^20.0.0",
|
|
20
|
-
"typescript": "^5.0.0",
|
|
21
|
-
"tsx": "^4.0.0"
|
|
22
|
-
},
|
|
23
|
-
"engines": {
|
|
24
|
-
"node": ">=18.0.0"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { app } from "./app.js";
|
|
2
|
-
import { AppwriteContext, AppwriteContextSchema } from "./context.js";
|
|
3
|
-
import { convertAppwriteToWebRequest } from "./adapters/request.js";
|
|
4
|
-
import { convertWebResponseToAppwrite } from "./adapters/response.js";
|
|
5
|
-
import { appwriteMiddleware } from "./middleware/appwrite.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Main Appwrite function entry point
|
|
9
|
-
* This function receives the Appwrite context and routes it through Hono
|
|
10
|
-
*/
|
|
11
|
-
export default async function (context: AppwriteContext) {
|
|
12
|
-
const { req, res, log, error } = context;
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
// Optional: Validate the context using Zod schema
|
|
16
|
-
AppwriteContextSchema.parse(context);
|
|
17
|
-
log("Context validation successful");
|
|
18
|
-
|
|
19
|
-
// Add Appwrite context middleware to the Hono app
|
|
20
|
-
app.use("*", appwriteMiddleware(context));
|
|
21
|
-
|
|
22
|
-
// Convert Appwrite request to Web API Request for Hono
|
|
23
|
-
const webRequest = convertAppwriteToWebRequest(req);
|
|
24
|
-
|
|
25
|
-
log(`Processing ${req.method} request to ${req.path || "/"}`);
|
|
26
|
-
|
|
27
|
-
// Create execution environment for Hono
|
|
28
|
-
const env = {
|
|
29
|
-
// Add any environment variables or context needed by Hono
|
|
30
|
-
APPWRITE_FUNCTION_ENDPOINT: process.env["APPWRITE_FUNCTION_ENDPOINT"],
|
|
31
|
-
APPWRITE_FUNCTION_PROJECT_ID: process.env["APPWRITE_FUNCTION_PROJECT_ID"],
|
|
32
|
-
APPWRITE_FUNCTION_API_KEY: process.env["APPWRITE_FUNCTION_API_KEY"],
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// Process request through Hono app
|
|
36
|
-
const honoResponse = await app.fetch(webRequest, env);
|
|
37
|
-
|
|
38
|
-
// Convert Hono response back to Appwrite response format
|
|
39
|
-
await convertWebResponseToAppwrite(honoResponse, res);
|
|
40
|
-
|
|
41
|
-
log(`Request completed with status ${honoResponse.status}`);
|
|
42
|
-
|
|
43
|
-
} catch (validationError) {
|
|
44
|
-
error(`Function execution failed: ${validationError}`);
|
|
45
|
-
|
|
46
|
-
// Return error response
|
|
47
|
-
return res.json({
|
|
48
|
-
error: "Function execution failed",
|
|
49
|
-
message: validationError instanceof Error ? validationError.message : String(validationError),
|
|
50
|
-
functionName: "{{functionName}}",
|
|
51
|
-
timestamp: new Date().toISOString(),
|
|
52
|
-
}, 500);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ES2022",
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"allowSyntheticDefaultImports": true,
|
|
7
|
-
"esModuleInterop": true,
|
|
8
|
-
"allowJs": true,
|
|
9
|
-
"strict": true,
|
|
10
|
-
"skipLibCheck": true,
|
|
11
|
-
"forceConsistentCasingInFileNames": true,
|
|
12
|
-
"declaration": true,
|
|
13
|
-
"outDir": "./dist",
|
|
14
|
-
"rootDir": "./src",
|
|
15
|
-
"resolveJsonModule": true,
|
|
16
|
-
"types": ["node"]
|
|
17
|
-
},
|
|
18
|
-
"include": ["src/**/*"],
|
|
19
|
-
"exclude": ["node_modules", "dist"]
|
|
20
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{functionName}}",
|
|
3
|
-
"version": "1.0.0",
|
|
4
|
-
"description": "Appwrite TypeScript Node.js function",
|
|
5
|
-
"main": "src/index.ts",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"build": "tsc",
|
|
9
|
-
"start": "node dist/index.js",
|
|
10
|
-
"dev": "tsx src/index.ts"
|
|
11
|
-
},
|
|
12
|
-
"dependencies": {
|
|
13
|
-
"node-appwrite": "^13.0.0",
|
|
14
|
-
"appwrite-utils": "latest",
|
|
15
|
-
"zod": "^3.22.0"
|
|
16
|
-
},
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@types/node": "^20.0.0",
|
|
19
|
-
"typescript": "^5.0.0",
|
|
20
|
-
"tsx": "^4.0.0"
|
|
21
|
-
},
|
|
22
|
-
"engines": {
|
|
23
|
-
"node": ">=18.0.0"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "node",
|
|
6
|
-
"allowSyntheticDefaultImports": true,
|
|
7
|
-
"esModuleInterop": true,
|
|
8
|
-
"allowJs": true,
|
|
9
|
-
"checkJs": false,
|
|
10
|
-
"outDir": "./dist",
|
|
11
|
-
"rootDir": "./src",
|
|
12
|
-
"strict": true,
|
|
13
|
-
"noImplicitAny": true,
|
|
14
|
-
"strictNullChecks": true,
|
|
15
|
-
"strictFunctionTypes": true,
|
|
16
|
-
"noImplicitThis": true,
|
|
17
|
-
"noImplicitReturns": true,
|
|
18
|
-
"noFallthroughCasesInSwitch": true,
|
|
19
|
-
"moduleDetection": "force",
|
|
20
|
-
"resolveJsonModule": true,
|
|
21
|
-
"isolatedModules": true,
|
|
22
|
-
"verbatimModuleSyntax": false,
|
|
23
|
-
"skipLibCheck": true,
|
|
24
|
-
"forceConsistentCasingInFileNames": true
|
|
25
|
-
},
|
|
26
|
-
"include": ["src/**/*"],
|
|
27
|
-
"exclude": ["node_modules", "dist"]
|
|
28
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { CreateAttributeParams, UpdateAttributeParams } from "../adapters/DatabaseAdapter.js";
|
|
2
|
-
import type { Attribute } from "appwrite-utils";
|
|
3
|
-
/**
|
|
4
|
-
* Map a schema Attribute into DatabaseAdapter CreateAttributeParams
|
|
5
|
-
* Only includes fields valid for the specific type to satisfy TS unions.
|
|
6
|
-
* Also normalizes min/max ordering for numeric types to avoid server errors.
|
|
7
|
-
*/
|
|
8
|
-
export declare function mapToCreateAttributeParams(attr: Attribute, base: {
|
|
9
|
-
databaseId: string;
|
|
10
|
-
tableId: string;
|
|
11
|
-
}): CreateAttributeParams;
|
|
12
|
-
/**
|
|
13
|
-
* Map a schema Attribute into DatabaseAdapter UpdateAttributeParams
|
|
14
|
-
* Omits fields that are not explicitly provided, and guards enum updates
|
|
15
|
-
* so we never send an empty elements array (preserve existing on server).
|
|
16
|
-
*/
|
|
17
|
-
export declare function mapToUpdateAttributeParams(attr: Attribute, base: {
|
|
18
|
-
databaseId: string;
|
|
19
|
-
tableId: string;
|
|
20
|
-
}): UpdateAttributeParams;
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
function ensureNumber(n) {
|
|
2
|
-
if (n === null || n === undefined)
|
|
3
|
-
return undefined;
|
|
4
|
-
const num = Number(n);
|
|
5
|
-
return Number.isFinite(num) ? num : undefined;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Map a schema Attribute into DatabaseAdapter CreateAttributeParams
|
|
9
|
-
* Only includes fields valid for the specific type to satisfy TS unions.
|
|
10
|
-
* Also normalizes min/max ordering for numeric types to avoid server errors.
|
|
11
|
-
*/
|
|
12
|
-
export function mapToCreateAttributeParams(attr, base) {
|
|
13
|
-
const type = String(attr.type || "").toLowerCase();
|
|
14
|
-
const required = !!attr.required;
|
|
15
|
-
const array = !!attr.array;
|
|
16
|
-
const xdefault = attr.xdefault;
|
|
17
|
-
const encrypt = attr.encrypt;
|
|
18
|
-
// Numeric helpers
|
|
19
|
-
const rawMin = ensureNumber(attr.min);
|
|
20
|
-
const rawMax = ensureNumber(attr.max);
|
|
21
|
-
let min = rawMin;
|
|
22
|
-
let max = rawMax;
|
|
23
|
-
if (min !== undefined && max !== undefined && min >= max) {
|
|
24
|
-
// Swap to satisfy server-side validation
|
|
25
|
-
const tmp = min;
|
|
26
|
-
min = Math.min(min, max);
|
|
27
|
-
max = Math.max(tmp, max);
|
|
28
|
-
if (min === max) {
|
|
29
|
-
// If still equal, unset max to avoid error
|
|
30
|
-
max = undefined;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
switch (type) {
|
|
34
|
-
case "string":
|
|
35
|
-
return {
|
|
36
|
-
databaseId: base.databaseId,
|
|
37
|
-
tableId: base.tableId,
|
|
38
|
-
key: attr.key,
|
|
39
|
-
type,
|
|
40
|
-
size: attr.size ?? 255,
|
|
41
|
-
required,
|
|
42
|
-
default: xdefault,
|
|
43
|
-
array,
|
|
44
|
-
encrypt: !!encrypt,
|
|
45
|
-
};
|
|
46
|
-
case "integer":
|
|
47
|
-
return {
|
|
48
|
-
databaseId: base.databaseId,
|
|
49
|
-
tableId: base.tableId,
|
|
50
|
-
key: attr.key,
|
|
51
|
-
type,
|
|
52
|
-
required,
|
|
53
|
-
default: xdefault,
|
|
54
|
-
array,
|
|
55
|
-
min,
|
|
56
|
-
max,
|
|
57
|
-
};
|
|
58
|
-
case "double":
|
|
59
|
-
case "float":
|
|
60
|
-
return {
|
|
61
|
-
databaseId: base.databaseId,
|
|
62
|
-
tableId: base.tableId,
|
|
63
|
-
key: attr.key,
|
|
64
|
-
type,
|
|
65
|
-
required,
|
|
66
|
-
default: xdefault,
|
|
67
|
-
array,
|
|
68
|
-
min,
|
|
69
|
-
max,
|
|
70
|
-
};
|
|
71
|
-
case "boolean":
|
|
72
|
-
return {
|
|
73
|
-
databaseId: base.databaseId,
|
|
74
|
-
tableId: base.tableId,
|
|
75
|
-
key: attr.key,
|
|
76
|
-
type,
|
|
77
|
-
required,
|
|
78
|
-
default: xdefault,
|
|
79
|
-
array,
|
|
80
|
-
};
|
|
81
|
-
case "datetime":
|
|
82
|
-
case "email":
|
|
83
|
-
case "ip":
|
|
84
|
-
case "url":
|
|
85
|
-
return {
|
|
86
|
-
databaseId: base.databaseId,
|
|
87
|
-
tableId: base.tableId,
|
|
88
|
-
key: attr.key,
|
|
89
|
-
type,
|
|
90
|
-
required,
|
|
91
|
-
default: xdefault,
|
|
92
|
-
array,
|
|
93
|
-
};
|
|
94
|
-
case "enum":
|
|
95
|
-
{
|
|
96
|
-
const elements = attr.elements;
|
|
97
|
-
if (!Array.isArray(elements) || elements.length === 0) {
|
|
98
|
-
// Creating an enum without elements is invalid – fail fast with clear messaging
|
|
99
|
-
throw new Error(`Enum attribute '${attr.key}' requires a non-empty 'elements' array for creation`);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
databaseId: base.databaseId,
|
|
104
|
-
tableId: base.tableId,
|
|
105
|
-
key: attr.key,
|
|
106
|
-
type,
|
|
107
|
-
required,
|
|
108
|
-
default: xdefault,
|
|
109
|
-
array,
|
|
110
|
-
elements: attr.elements,
|
|
111
|
-
};
|
|
112
|
-
case "relationship": {
|
|
113
|
-
// Relationship attributes require related collection and metadata
|
|
114
|
-
return {
|
|
115
|
-
databaseId: base.databaseId,
|
|
116
|
-
tableId: base.tableId,
|
|
117
|
-
key: attr.key,
|
|
118
|
-
type,
|
|
119
|
-
relatedCollection: attr.relatedCollection,
|
|
120
|
-
relationType: attr.relationType,
|
|
121
|
-
twoWay: attr.twoWay,
|
|
122
|
-
twoWayKey: attr.twoWayKey,
|
|
123
|
-
onDelete: attr.onDelete,
|
|
124
|
-
side: attr.side,
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
default:
|
|
128
|
-
return {
|
|
129
|
-
databaseId: base.databaseId,
|
|
130
|
-
tableId: base.tableId,
|
|
131
|
-
key: attr.key,
|
|
132
|
-
type,
|
|
133
|
-
required,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Map a schema Attribute into DatabaseAdapter UpdateAttributeParams
|
|
139
|
-
* Omits fields that are not explicitly provided, and guards enum updates
|
|
140
|
-
* so we never send an empty elements array (preserve existing on server).
|
|
141
|
-
*/
|
|
142
|
-
export function mapToUpdateAttributeParams(attr, base) {
|
|
143
|
-
const type = String((attr.type == 'string' && attr.format !== 'enum') || attr.type !== 'string' ? attr.type : 'enum').toLowerCase();
|
|
144
|
-
const params = {
|
|
145
|
-
databaseId: base.databaseId,
|
|
146
|
-
tableId: base.tableId,
|
|
147
|
-
key: attr.key,
|
|
148
|
-
};
|
|
149
|
-
const setIfDefined = (key, value) => {
|
|
150
|
-
if (value !== undefined)
|
|
151
|
-
params[key] = value;
|
|
152
|
-
};
|
|
153
|
-
// Common fields
|
|
154
|
-
setIfDefined("type", type);
|
|
155
|
-
setIfDefined("required", attr.required);
|
|
156
|
-
// Only send default if explicitly provided and not on required
|
|
157
|
-
if (!attr.required && attr.xdefault !== undefined) {
|
|
158
|
-
setIfDefined("default", attr.xdefault);
|
|
159
|
-
}
|
|
160
|
-
setIfDefined("array", attr.array);
|
|
161
|
-
// encrypt only applies to string types
|
|
162
|
-
if (type === "string")
|
|
163
|
-
setIfDefined("encrypt", attr.encrypt);
|
|
164
|
-
// Numeric normalization
|
|
165
|
-
const toNum = (n) => (n === null || n === undefined ? undefined : (Number(n)));
|
|
166
|
-
let min = toNum(attr.min);
|
|
167
|
-
let max = toNum(attr.max);
|
|
168
|
-
if (min !== undefined && max !== undefined && min >= max) {
|
|
169
|
-
const tmp = min;
|
|
170
|
-
min = Math.min(min, max);
|
|
171
|
-
max = Math.max(tmp, max);
|
|
172
|
-
if (min === max)
|
|
173
|
-
max = undefined;
|
|
174
|
-
}
|
|
175
|
-
switch (type) {
|
|
176
|
-
case "string":
|
|
177
|
-
setIfDefined("size", attr.size);
|
|
178
|
-
break;
|
|
179
|
-
case "integer":
|
|
180
|
-
case "float":
|
|
181
|
-
case "double":
|
|
182
|
-
setIfDefined("min", min);
|
|
183
|
-
setIfDefined("max", max);
|
|
184
|
-
break;
|
|
185
|
-
case "enum": {
|
|
186
|
-
const elements = attr.elements;
|
|
187
|
-
if (Array.isArray(elements) && elements.length > 0) {
|
|
188
|
-
// Only include when non-empty; otherwise preserve existing on server
|
|
189
|
-
setIfDefined("elements", elements);
|
|
190
|
-
}
|
|
191
|
-
break;
|
|
192
|
-
}
|
|
193
|
-
case "relationship": {
|
|
194
|
-
setIfDefined("relatedCollection", attr.relatedCollection);
|
|
195
|
-
setIfDefined("relationType", attr.relationType);
|
|
196
|
-
setIfDefined("twoWay", attr.twoWay);
|
|
197
|
-
setIfDefined("twoWayKey", attr.twoWayKey);
|
|
198
|
-
setIfDefined("onDelete", attr.onDelete);
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return params;
|
|
203
|
-
}
|