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
|
@@ -10,9 +10,9 @@ import cliProgress from "cli-progress";
|
|
|
10
10
|
import { execSync } from "child_process";
|
|
11
11
|
import { createFunction, getFunction, updateFunction, updateFunctionSpecifications, } from "./methods.js";
|
|
12
12
|
import ignore from "ignore";
|
|
13
|
-
import { MessageFormatter } from "
|
|
14
|
-
import { resolveFunctionDirectory, validateFunctionDirectory } from '
|
|
15
|
-
export const deployFunction = async (client, functionId, codePath, activate = true, entrypoint = "
|
|
13
|
+
import { MessageFormatter } from "appwrite-utils-helpers";
|
|
14
|
+
import { resolveFunctionDirectory, validateFunctionDirectory } from 'appwrite-utils-helpers';
|
|
15
|
+
export const deployFunction = async (client, functionId, codePath, activate = true, entrypoint = "main.js", commands = "npm install", ignored = [
|
|
16
16
|
"node_modules",
|
|
17
17
|
".git",
|
|
18
18
|
".vscode",
|
|
@@ -98,7 +98,7 @@ export const deployFunction = async (client, functionId, codePath, activate = tr
|
|
|
98
98
|
throw error;
|
|
99
99
|
}
|
|
100
100
|
};
|
|
101
|
-
export const deployLocalFunction = async (client, functionName, functionConfig, functionPath) => {
|
|
101
|
+
export const deployLocalFunction = async (client, functionName, functionConfig, functionPath, configDirPath) => {
|
|
102
102
|
let functionExists = true;
|
|
103
103
|
let functionThatExists;
|
|
104
104
|
try {
|
|
@@ -107,8 +107,8 @@ export const deployLocalFunction = async (client, functionName, functionConfig,
|
|
|
107
107
|
catch (error) {
|
|
108
108
|
functionExists = false;
|
|
109
109
|
}
|
|
110
|
-
const
|
|
111
|
-
const resolvedPath = resolveFunctionDirectory(functionName,
|
|
110
|
+
const resolvedConfigDir = configDirPath ?? process.cwd();
|
|
111
|
+
const resolvedPath = resolveFunctionDirectory(functionName, resolvedConfigDir, functionConfig.dirPath, functionPath);
|
|
112
112
|
if (!validateFunctionDirectory(resolvedPath)) {
|
|
113
113
|
throw new Error(`Function directory is invalid or missing required files: ${resolvedPath}`);
|
|
114
114
|
}
|
|
@@ -3,8 +3,8 @@ import path from 'node:path';
|
|
|
3
3
|
import yaml from 'js-yaml';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
5
|
import { AppwriteFunctionSchema } from 'appwrite-utils';
|
|
6
|
-
import { shouldIgnoreDirectory } from '
|
|
7
|
-
import { MessageFormatter } from '
|
|
6
|
+
import { shouldIgnoreDirectory } from 'appwrite-utils-helpers';
|
|
7
|
+
import { MessageFormatter } from 'appwrite-utils-helpers';
|
|
8
8
|
function findGitRoot(startDir) {
|
|
9
9
|
let dir = path.resolve(startDir);
|
|
10
10
|
while (dir !== path.parse(dir).root) {
|
|
@@ -5,8 +5,8 @@ import fs from "node:fs";
|
|
|
5
5
|
import { EventTypeSchema, } from "appwrite-utils";
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import { extract as extractTar } from "tar";
|
|
8
|
-
import { MessageFormatter } from "
|
|
9
|
-
import { expandTildePath, normalizeFunctionName } from
|
|
8
|
+
import { MessageFormatter } from "appwrite-utils-helpers";
|
|
9
|
+
import { expandTildePath, normalizeFunctionName } from 'appwrite-utils-helpers';
|
|
10
10
|
/**
|
|
11
11
|
* Validates and filters events array for Appwrite functions
|
|
12
12
|
* - Filters out empty/invalid strings
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
# Count Documents in Collection Function
|
|
2
|
-
|
|
3
|
-
A utility function that accurately counts documents in an Appwrite collection, even when there are more than 5,000 documents.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
- Handles collections with any number of documents
|
|
7
|
-
- Supports filtering using Appwrite queries
|
|
8
|
-
- Uses efficient binary search algorithm for large collections
|
|
9
|
-
- Provides detailed logging during the counting process
|
|
10
|
-
|
|
11
|
-
## Structure
|
|
12
|
-
- `src/main.ts`: Main function implementation with counting logic
|
|
13
|
-
- `src/request.ts`: Request validation schema using Zod
|
|
14
|
-
|
|
15
|
-
## Usage
|
|
16
|
-
Send a POST request with:
|
|
17
|
-
```json
|
|
18
|
-
{
|
|
19
|
-
"databaseId": "your-database-id",
|
|
20
|
-
"collectionId": "your-collection-id",
|
|
21
|
-
"queries": [Query.orderDesc("$createdAt"), Query.contains("name", "John")] // Or put the string array from after this, they are the same
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Response
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"success": true,
|
|
29
|
-
"count": 12345
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Development
|
|
34
|
-
1. Install dependencies: `npm|yarn|bun install`
|
|
35
|
-
2. Build: `npm|yarn|bun run build`
|
|
36
|
-
3. Deploy: Function will be built automatically during deployment
|
|
37
|
-
|
|
38
|
-
## Deployment
|
|
39
|
-
Make sure it's inside `appwriteConfig.ts` functions array, and if you want to build it FIRST, before Appwrite (using your system), you can
|
|
40
|
-
add the `predeployCommands` to the function in `appwriteConfig.ts`.
|
|
41
|
-
|
|
42
|
-
## Example Config
|
|
43
|
-
```typescript
|
|
44
|
-
{
|
|
45
|
-
$id: 'count-docs',
|
|
46
|
-
name: 'Count Documents',
|
|
47
|
-
runtime: 'node-18.0',
|
|
48
|
-
path: 'functions/count-docs',
|
|
49
|
-
entrypoint: './main.js',
|
|
50
|
-
execute: ['any'],
|
|
51
|
-
predeployCommands: ['npm install', 'npm run build'],
|
|
52
|
-
deployDir: './dist'
|
|
53
|
-
}
|
|
1
|
+
# Count Documents in Collection Function
|
|
2
|
+
|
|
3
|
+
A utility function that accurately counts documents in an Appwrite collection, even when there are more than 5,000 documents.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
- Handles collections with any number of documents
|
|
7
|
+
- Supports filtering using Appwrite queries
|
|
8
|
+
- Uses efficient binary search algorithm for large collections
|
|
9
|
+
- Provides detailed logging during the counting process
|
|
10
|
+
|
|
11
|
+
## Structure
|
|
12
|
+
- `src/main.ts`: Main function implementation with counting logic
|
|
13
|
+
- `src/request.ts`: Request validation schema using Zod
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
Send a POST request with:
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"databaseId": "your-database-id",
|
|
20
|
+
"collectionId": "your-collection-id",
|
|
21
|
+
"queries": [Query.orderDesc("$createdAt"), Query.contains("name", "John")] // Or put the string array from after this, they are the same
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Response
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"success": true,
|
|
29
|
+
"count": 12345
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Development
|
|
34
|
+
1. Install dependencies: `npm|yarn|bun install`
|
|
35
|
+
2. Build: `npm|yarn|bun run build`
|
|
36
|
+
3. Deploy: Function will be built automatically during deployment
|
|
37
|
+
|
|
38
|
+
## Deployment
|
|
39
|
+
Make sure it's inside `appwriteConfig.ts` functions array, and if you want to build it FIRST, before Appwrite (using your system), you can
|
|
40
|
+
add the `predeployCommands` to the function in `appwriteConfig.ts`.
|
|
41
|
+
|
|
42
|
+
## Example Config
|
|
43
|
+
```typescript
|
|
44
|
+
{
|
|
45
|
+
$id: 'count-docs',
|
|
46
|
+
name: 'Count Documents',
|
|
47
|
+
runtime: 'node-18.0',
|
|
48
|
+
path: 'functions/count-docs',
|
|
49
|
+
entrypoint: './main.js',
|
|
50
|
+
execute: ['any'],
|
|
51
|
+
predeployCommands: ['npm install', 'npm run build'],
|
|
52
|
+
deployDir: './dist'
|
|
53
|
+
}
|
|
54
54
|
```
|
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
import { Client, Databases, Query } from "node-appwrite";
|
|
2
|
-
import { AppwriteRequest, type AppwriteResponse } from "appwrite-utils";
|
|
3
|
-
import { requestSchema } from "./request.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Main function to handle document counting requests.
|
|
7
|
-
* @param {Object} params - The function parameters.
|
|
8
|
-
* @param {Object} params.req - The request object.
|
|
9
|
-
* @param {Object} params.res - The response object.
|
|
10
|
-
* @param {Function} params.log - Logging function.
|
|
11
|
-
* @param {Function} params.error - Error logging function.
|
|
12
|
-
* @returns {Promise<Object>} JSON response with count or error message.
|
|
13
|
-
*/
|
|
14
|
-
export default async ({
|
|
15
|
-
req,
|
|
16
|
-
res,
|
|
17
|
-
log,
|
|
18
|
-
error,
|
|
19
|
-
}: {
|
|
20
|
-
req: AppwriteRequest;
|
|
21
|
-
res: AppwriteResponse;
|
|
22
|
-
log: (message: string) => void;
|
|
23
|
-
error: (message: string) => void;
|
|
24
|
-
}) => {
|
|
25
|
-
// Initialize Appwrite client
|
|
26
|
-
const client = new Client()
|
|
27
|
-
.setEndpoint(process.env["APPWRITE_FUNCTION_ENDPOINT"]!)
|
|
28
|
-
.setProject(process.env["APPWRITE_FUNCTION_PROJECT_ID"]!)
|
|
29
|
-
.setKey(req.headers["x-appwrite-key"] || "");
|
|
30
|
-
|
|
31
|
-
const databases = new Databases(client);
|
|
32
|
-
|
|
33
|
-
try {
|
|
34
|
-
if (req.method === "POST") {
|
|
35
|
-
// Parse request body
|
|
36
|
-
const body = requestSchema.safeParse(
|
|
37
|
-
typeof req.body === "string" ? JSON.parse(req.body) : req.body
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
if (!body.success) {
|
|
41
|
-
return res.json({ success: false, error: body.error }, 400);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const { databaseId, collectionId, queries = [] } = body.data;
|
|
45
|
-
|
|
46
|
-
log(`Queries: ${JSON.stringify(queries)}`);
|
|
47
|
-
|
|
48
|
-
// Count documents in the specified collection
|
|
49
|
-
const count = await countAllDocuments(
|
|
50
|
-
log,
|
|
51
|
-
databases,
|
|
52
|
-
databaseId,
|
|
53
|
-
collectionId,
|
|
54
|
-
queries
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
// Return successful response with document count
|
|
58
|
-
return res.json({
|
|
59
|
-
success: true,
|
|
60
|
-
count: count,
|
|
61
|
-
});
|
|
62
|
-
} else {
|
|
63
|
-
// Return error for non-POST requests
|
|
64
|
-
return res.json({ success: false, error: "Method not allowed" }, 405);
|
|
65
|
-
}
|
|
66
|
-
} catch (err) {
|
|
67
|
-
// Log and return any errors
|
|
68
|
-
error(`Error processing request: ${err}`);
|
|
69
|
-
return res.json({ success: false, error: (err as Error).message }, 500);
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Counts all documents in a collection, handling large collections efficiently.
|
|
75
|
-
* @param {Function} log - Logging function.
|
|
76
|
-
* @param {Databases} databases - Appwrite Databases instance.
|
|
77
|
-
* @param {string} databaseId - ID of the database.
|
|
78
|
-
* @param {string} collectionId - ID of the collection.
|
|
79
|
-
* @param {string[]} queries - Array of query strings to filter documents.
|
|
80
|
-
* @param {number} batchSize - Size of batches for processing (default: 1000).
|
|
81
|
-
* @returns {Promise<number>} Total count of documents.
|
|
82
|
-
*/
|
|
83
|
-
async function countAllDocuments(
|
|
84
|
-
log: any,
|
|
85
|
-
databases: Databases,
|
|
86
|
-
databaseId: string,
|
|
87
|
-
collectionId: string,
|
|
88
|
-
queries: string[] = [],
|
|
89
|
-
batchSize: number = 1000
|
|
90
|
-
): Promise<number> {
|
|
91
|
-
// Filter out limit and offset queries
|
|
92
|
-
const initialQueries = queries.filter(
|
|
93
|
-
(q) => !(q.includes("limit") || q.includes("offset"))
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
// Initial query to check if total is less than 5000
|
|
97
|
-
const initialResponse = await databases.listDocuments(
|
|
98
|
-
databaseId,
|
|
99
|
-
collectionId,
|
|
100
|
-
[...initialQueries, Query.limit(1)]
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
if (initialResponse.total < 5000) {
|
|
104
|
-
log(`Total documents (from initial response): ${initialResponse.total}`);
|
|
105
|
-
return initialResponse.total;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// If total is 5000 or more, we need to count manually
|
|
109
|
-
let bound = 5000;
|
|
110
|
-
|
|
111
|
-
// Exponential search to find an upper bound
|
|
112
|
-
while (true) {
|
|
113
|
-
log(`Querying for offset ${bound}`);
|
|
114
|
-
try {
|
|
115
|
-
const response = await databases.listDocuments(databaseId, collectionId, [
|
|
116
|
-
...initialQueries,
|
|
117
|
-
Query.limit(1),
|
|
118
|
-
Query.offset(bound),
|
|
119
|
-
]);
|
|
120
|
-
|
|
121
|
-
if (response.documents.length === 0) {
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
bound *= 2;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
break;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Binary search to find the exact count
|
|
131
|
-
let low = Math.floor(bound / 2);
|
|
132
|
-
let high = bound;
|
|
133
|
-
let lastValidCount = low;
|
|
134
|
-
|
|
135
|
-
while (low <= high) {
|
|
136
|
-
const mid = Math.floor((low + high) / 2);
|
|
137
|
-
log(`Binary search: Querying for offset ${mid}`);
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
const response = await databases.listDocuments(databaseId, collectionId, [
|
|
141
|
-
...initialQueries,
|
|
142
|
-
Query.limit(1),
|
|
143
|
-
Query.offset(mid),
|
|
144
|
-
]);
|
|
145
|
-
|
|
146
|
-
if (response.documents.length > 0) {
|
|
147
|
-
lastValidCount = mid + 1; // +1 because offset is 0-based
|
|
148
|
-
low = mid + 1;
|
|
149
|
-
} else {
|
|
150
|
-
high = mid - 1;
|
|
151
|
-
}
|
|
152
|
-
} catch (error) {
|
|
153
|
-
high = mid - 1;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
log(`Total documents: ${lastValidCount}`);
|
|
158
|
-
return lastValidCount;
|
|
159
|
-
}
|
|
1
|
+
import { Client, Databases, Query } from "node-appwrite";
|
|
2
|
+
import { AppwriteRequest, type AppwriteResponse } from "appwrite-utils";
|
|
3
|
+
import { requestSchema } from "./request.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Main function to handle document counting requests.
|
|
7
|
+
* @param {Object} params - The function parameters.
|
|
8
|
+
* @param {Object} params.req - The request object.
|
|
9
|
+
* @param {Object} params.res - The response object.
|
|
10
|
+
* @param {Function} params.log - Logging function.
|
|
11
|
+
* @param {Function} params.error - Error logging function.
|
|
12
|
+
* @returns {Promise<Object>} JSON response with count or error message.
|
|
13
|
+
*/
|
|
14
|
+
export default async ({
|
|
15
|
+
req,
|
|
16
|
+
res,
|
|
17
|
+
log,
|
|
18
|
+
error,
|
|
19
|
+
}: {
|
|
20
|
+
req: AppwriteRequest;
|
|
21
|
+
res: AppwriteResponse;
|
|
22
|
+
log: (message: string) => void;
|
|
23
|
+
error: (message: string) => void;
|
|
24
|
+
}) => {
|
|
25
|
+
// Initialize Appwrite client
|
|
26
|
+
const client = new Client()
|
|
27
|
+
.setEndpoint(process.env["APPWRITE_FUNCTION_ENDPOINT"]!)
|
|
28
|
+
.setProject(process.env["APPWRITE_FUNCTION_PROJECT_ID"]!)
|
|
29
|
+
.setKey(req.headers["x-appwrite-key"] || "");
|
|
30
|
+
|
|
31
|
+
const databases = new Databases(client);
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
if (req.method === "POST") {
|
|
35
|
+
// Parse request body
|
|
36
|
+
const body = requestSchema.safeParse(
|
|
37
|
+
typeof req.body === "string" ? JSON.parse(req.body) : req.body
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
if (!body.success) {
|
|
41
|
+
return res.json({ success: false, error: body.error }, 400);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const { databaseId, collectionId, queries = [] } = body.data;
|
|
45
|
+
|
|
46
|
+
log(`Queries: ${JSON.stringify(queries)}`);
|
|
47
|
+
|
|
48
|
+
// Count documents in the specified collection
|
|
49
|
+
const count = await countAllDocuments(
|
|
50
|
+
log,
|
|
51
|
+
databases,
|
|
52
|
+
databaseId,
|
|
53
|
+
collectionId,
|
|
54
|
+
queries
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Return successful response with document count
|
|
58
|
+
return res.json({
|
|
59
|
+
success: true,
|
|
60
|
+
count: count,
|
|
61
|
+
});
|
|
62
|
+
} else {
|
|
63
|
+
// Return error for non-POST requests
|
|
64
|
+
return res.json({ success: false, error: "Method not allowed" }, 405);
|
|
65
|
+
}
|
|
66
|
+
} catch (err) {
|
|
67
|
+
// Log and return any errors
|
|
68
|
+
error(`Error processing request: ${err}`);
|
|
69
|
+
return res.json({ success: false, error: (err as Error).message }, 500);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Counts all documents in a collection, handling large collections efficiently.
|
|
75
|
+
* @param {Function} log - Logging function.
|
|
76
|
+
* @param {Databases} databases - Appwrite Databases instance.
|
|
77
|
+
* @param {string} databaseId - ID of the database.
|
|
78
|
+
* @param {string} collectionId - ID of the collection.
|
|
79
|
+
* @param {string[]} queries - Array of query strings to filter documents.
|
|
80
|
+
* @param {number} batchSize - Size of batches for processing (default: 1000).
|
|
81
|
+
* @returns {Promise<number>} Total count of documents.
|
|
82
|
+
*/
|
|
83
|
+
async function countAllDocuments(
|
|
84
|
+
log: any,
|
|
85
|
+
databases: Databases,
|
|
86
|
+
databaseId: string,
|
|
87
|
+
collectionId: string,
|
|
88
|
+
queries: string[] = [],
|
|
89
|
+
batchSize: number = 1000
|
|
90
|
+
): Promise<number> {
|
|
91
|
+
// Filter out limit and offset queries
|
|
92
|
+
const initialQueries = queries.filter(
|
|
93
|
+
(q) => !(q.includes("limit") || q.includes("offset"))
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Initial query to check if total is less than 5000
|
|
97
|
+
const initialResponse = await databases.listDocuments(
|
|
98
|
+
databaseId,
|
|
99
|
+
collectionId,
|
|
100
|
+
[...initialQueries, Query.limit(1)]
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (initialResponse.total < 5000) {
|
|
104
|
+
log(`Total documents (from initial response): ${initialResponse.total}`);
|
|
105
|
+
return initialResponse.total;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// If total is 5000 or more, we need to count manually
|
|
109
|
+
let bound = 5000;
|
|
110
|
+
|
|
111
|
+
// Exponential search to find an upper bound
|
|
112
|
+
while (true) {
|
|
113
|
+
log(`Querying for offset ${bound}`);
|
|
114
|
+
try {
|
|
115
|
+
const response = await databases.listDocuments(databaseId, collectionId, [
|
|
116
|
+
...initialQueries,
|
|
117
|
+
Query.limit(1),
|
|
118
|
+
Query.offset(bound),
|
|
119
|
+
]);
|
|
120
|
+
|
|
121
|
+
if (response.documents.length === 0) {
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
bound *= 2;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Binary search to find the exact count
|
|
131
|
+
let low = Math.floor(bound / 2);
|
|
132
|
+
let high = bound;
|
|
133
|
+
let lastValidCount = low;
|
|
134
|
+
|
|
135
|
+
while (low <= high) {
|
|
136
|
+
const mid = Math.floor((low + high) / 2);
|
|
137
|
+
log(`Binary search: Querying for offset ${mid}`);
|
|
138
|
+
|
|
139
|
+
try {
|
|
140
|
+
const response = await databases.listDocuments(databaseId, collectionId, [
|
|
141
|
+
...initialQueries,
|
|
142
|
+
Query.limit(1),
|
|
143
|
+
Query.offset(mid),
|
|
144
|
+
]);
|
|
145
|
+
|
|
146
|
+
if (response.documents.length > 0) {
|
|
147
|
+
lastValidCount = mid + 1; // +1 because offset is 0-based
|
|
148
|
+
low = mid + 1;
|
|
149
|
+
} else {
|
|
150
|
+
high = mid - 1;
|
|
151
|
+
}
|
|
152
|
+
} catch (error) {
|
|
153
|
+
high = mid - 1;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
log(`Total documents: ${lastValidCount}`);
|
|
158
|
+
return lastValidCount;
|
|
159
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
export const requestSchema = z.object({
|
|
4
|
-
databaseId: z.string(),
|
|
5
|
-
collectionId: z.string(),
|
|
6
|
-
queries: z.array(z.string()).optional(),
|
|
7
|
-
});
|
|
8
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const requestSchema = z.object({
|
|
4
|
+
databaseId: z.string(),
|
|
5
|
+
collectionId: z.string(),
|
|
6
|
+
queries: z.array(z.string()).optional(),
|
|
7
|
+
});
|
|
8
|
+
|
|
9
9
|
export type Request = z.infer<typeof requestSchema>;
|