@njdamstra/appwrite-utils-cli 1.8.9 → 1.10.1
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 +16 -0
- package/CONFIG_TODO.md +1189 -0
- package/SELECTION_DIALOGS.md +146 -0
- package/SERVICE_IMPLEMENTATION_REPORT.md +462 -0
- 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.d.ts +1 -0
- package/dist/cli/commands/databaseCommands.js +119 -9
- 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 +1 -1
- package/dist/collections/attributes.js +85 -35
- package/dist/collections/indexes.js +2 -4
- package/dist/collections/methods.d.ts +1 -1
- package/dist/collections/methods.js +111 -192
- package/dist/collections/tableOperations.d.ts +1 -0
- package/dist/collections/tableOperations.js +90 -23
- 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 +5 -5
- package/dist/functions/fnConfigDiscovery.js +2 -2
- package/dist/functions/methods.js +16 -4
- package/dist/init.js +1 -1
- package/dist/interactiveCLI.d.ts +6 -1
- package/dist/interactiveCLI.js +64 -10
- package/dist/main.js +130 -177
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +97 -1
- package/dist/migrations/appwriteToX.js +9 -7
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- package/dist/migrations/dataLoader.d.ts +194 -2
- package/dist/migrations/dataLoader.js +2 -5
- package/dist/migrations/importController.js +3 -4
- 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.js +4 -4
- 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 +106 -55
- package/dist/migrations/yaml/YamlImportConfigLoader.js +1 -1
- package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
- package/dist/migrations/yaml/generateImportSchemas.js +1 -1
- 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 +3 -3
- package/dist/shared/operationQueue.d.ts +1 -1
- package/dist/shared/operationQueue.js +2 -3
- package/dist/shared/operationsTable.d.ts +1 -1
- package/dist/shared/operationsTable.js +2 -2
- package/dist/shared/progressManager.js +1 -1
- package/dist/shared/selectionDialogs.js +9 -8
- package/dist/storage/methods.js +4 -4
- package/dist/storage/schemas.d.ts +386 -2
- package/dist/tables/indexManager.d.ts +65 -0
- package/dist/tables/indexManager.js +294 -0
- 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 +5 -7
- package/dist/utilsController.d.ts +15 -8
- package/dist/utilsController.js +57 -28
- package/package.json +8 -4
- package/src/adapters/index.ts +8 -34
- package/src/backups/operations/bucketBackup.ts +2 -2
- package/src/backups/operations/collectionBackup.ts +4 -4
- package/src/backups/operations/comprehensiveBackup.ts +3 -3
- package/src/backups/tracking/centralizedTracking.ts +3 -3
- package/src/cli/commands/configCommands.ts +72 -8
- package/src/cli/commands/databaseCommands.ts +161 -9
- package/src/cli/commands/functionCommands.ts +4 -3
- package/src/cli/commands/importFileCommands.ts +815 -0
- package/src/cli/commands/schemaCommands.ts +3 -3
- package/src/cli/commands/storageCommands.ts +2 -3
- package/src/cli/commands/transferCommands.ts +3 -6
- package/src/collections/attributes.ts +155 -39
- package/src/collections/indexes.ts +5 -7
- package/src/collections/methods.ts +115 -150
- package/src/collections/tableOperations.ts +92 -21
- package/src/collections/transferOperations.ts +4 -5
- package/src/collections/wipeOperations.ts +154 -51
- package/src/databases/methods.ts +2 -2
- package/src/databases/setup.ts +2 -2
- package/src/examples/yamlTerminologyExample.ts +2 -2
- package/src/functions/deployments.ts +6 -5
- package/src/functions/fnConfigDiscovery.ts +2 -2
- package/src/functions/methods.ts +19 -6
- package/src/init.ts +1 -1
- package/src/interactiveCLI.ts +78 -13
- package/src/main.ts +143 -287
- package/src/migrations/afterImportActions.ts +2 -3
- package/src/migrations/appwriteToX.ts +12 -8
- package/src/migrations/comprehensiveTransfer.ts +6 -6
- package/src/migrations/dataLoader.ts +2 -5
- package/src/migrations/importController.ts +3 -4
- package/src/migrations/importDataActions.ts +3 -3
- package/src/migrations/relationships.ts +1 -2
- package/src/migrations/services/DataTransformationService.ts +2 -2
- package/src/migrations/services/FileHandlerService.ts +1 -1
- package/src/migrations/services/ImportOrchestrator.ts +4 -4
- package/src/migrations/services/RateLimitManager.ts +1 -1
- package/src/migrations/services/RelationshipResolver.ts +1 -1
- package/src/migrations/services/UserMappingService.ts +1 -1
- package/src/migrations/services/ValidationService.ts +1 -1
- package/src/migrations/transfer.ts +126 -83
- package/src/migrations/yaml/YamlImportConfigLoader.ts +1 -1
- package/src/migrations/yaml/YamlImportIntegration.ts +2 -2
- package/src/migrations/yaml/generateImportSchemas.ts +1 -1
- package/src/setupCommands.ts +5 -6
- package/src/setupController.ts +1 -1
- package/src/shared/backupTracking.ts +3 -3
- package/src/shared/confirmationDialogs.ts +1 -1
- package/src/shared/migrationHelpers.ts +4 -4
- package/src/shared/operationQueue.ts +3 -4
- package/src/shared/operationsTable.ts +3 -3
- package/src/shared/progressManager.ts +1 -1
- package/src/shared/selectionDialogs.ts +9 -8
- package/src/storage/methods.ts +4 -4
- package/src/tables/indexManager.ts +409 -0
- package/src/types.ts +2 -2
- package/src/users/methods.ts +2 -3
- package/src/utils/configMigration.ts +1 -1
- package/src/utils/index.ts +1 -1
- package/src/utils/loadConfigs.ts +15 -7
- package/src/utils/setupFiles.ts +5 -7
- package/src/utilsController.ts +86 -32
- package/dist/adapters/AdapterFactory.d.ts +0 -94
- package/dist/adapters/AdapterFactory.js +0 -405
- package/dist/adapters/DatabaseAdapter.d.ts +0 -233
- package/dist/adapters/DatabaseAdapter.js +0 -50
- package/dist/adapters/LegacyAdapter.d.ts +0 -50
- package/dist/adapters/LegacyAdapter.js +0 -612
- package/dist/adapters/TablesDBAdapter.d.ts +0 -45
- package/dist/adapters/TablesDBAdapter.js +0 -571
- package/dist/config/ConfigManager.d.ts +0 -445
- package/dist/config/ConfigManager.js +0 -625
- 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 -126
- package/dist/config/services/ConfigDiscoveryService.js +0 -374
- package/dist/config/services/ConfigLoaderService.d.ts +0 -129
- package/dist/config/services/ConfigLoaderService.js +0 -540
- 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/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 -336
- package/dist/shared/indexManager.d.ts +0 -24
- package/dist/shared/indexManager.js +0 -151
- 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 -119
- package/dist/utils/projectConfig.js +0 -171
- 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/src/adapters/AdapterFactory.ts +0 -510
- package/src/adapters/DatabaseAdapter.ts +0 -306
- package/src/adapters/LegacyAdapter.ts +0 -841
- package/src/adapters/TablesDBAdapter.ts +0 -773
- package/src/config/ConfigManager.ts +0 -808
- 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 -463
- package/src/config/services/ConfigLoaderService.ts +0 -740
- package/src/config/services/ConfigMergeService.ts +0 -388
- package/src/config/services/ConfigValidationService.ts +0 -394
- package/src/config/services/SessionAuthService.ts +0 -565
- package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
- package/src/config/services/index.ts +0 -29
- package/src/config/yamlConfig.ts +0 -761
- package/src/functions/pathResolution.ts +0 -227
- package/src/shared/attributeMapper.ts +0 -229
- package/src/shared/errorUtils.ts +0 -110
- package/src/shared/functionManager.ts +0 -525
- package/src/shared/indexManager.ts +0 -254
- package/src/shared/jsonSchemaGenerator.ts +0 -383
- package/src/shared/logging.ts +0 -149
- package/src/shared/messageFormatter.ts +0 -208
- package/src/shared/pydanticModelGenerator.ts +0 -618
- package/src/shared/schemaGenerator.ts +0 -644
- package/src/utils/ClientFactory.ts +0 -240
- package/src/utils/configDiscovery.ts +0 -557
- package/src/utils/constantsGenerator.ts +0 -369
- package/src/utils/dataConverters.ts +0 -159
- package/src/utils/directoryUtils.ts +0 -61
- package/src/utils/getClientFromConfig.ts +0 -257
- package/src/utils/helperFunctions.ts +0 -228
- package/src/utils/pathResolvers.ts +0 -81
- package/src/utils/projectConfig.ts +0 -299
- package/src/utils/retryFailedPromises.ts +0 -29
- package/src/utils/sessionAuth.ts +0 -230
- package/src/utils/typeGuards.ts +0 -65
- package/src/utils/validationRules.ts +0 -88
- package/src/utils/versionDetection.ts +0 -292
- package/src/utils/yamlConverter.ts +0 -542
- package/src/utils/yamlLoader.ts +0 -371
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Version Detection Utility for Appwrite API Compatibility
|
|
3
|
-
*
|
|
4
|
-
* This module provides functions to detect whether an Appwrite instance
|
|
5
|
-
* supports the new TablesDB API or uses the legacy Databases API.
|
|
6
|
-
*
|
|
7
|
-
* Detection Strategy:
|
|
8
|
-
* 1. Primary: Test TablesDB-specific endpoint availability
|
|
9
|
-
* 2. Secondary: Health endpoint version check
|
|
10
|
-
* 3. Fallback: Default to legacy mode for safety
|
|
11
|
-
*/
|
|
12
|
-
import { logger } from '../shared/logging.js';
|
|
13
|
-
import { MessageFormatter } from '../shared/messageFormatter.js';
|
|
14
|
-
import { Client, Databases, TablesDB, Query } from 'node-appwrite';
|
|
15
|
-
/**
|
|
16
|
-
* Detects Appwrite API version and TablesDB support
|
|
17
|
-
*
|
|
18
|
-
* @param endpoint - Appwrite server endpoint URL
|
|
19
|
-
* @param project - Project ID
|
|
20
|
-
* @param apiKey - API key for authentication
|
|
21
|
-
* @returns Promise resolving to version detection result
|
|
22
|
-
*/
|
|
23
|
-
export async function detectAppwriteVersion(endpoint, project, apiKey) {
|
|
24
|
-
const startTime = Date.now();
|
|
25
|
-
// Clean endpoint URL
|
|
26
|
-
const cleanEndpoint = endpoint.replace(/\/$/, '');
|
|
27
|
-
logger.info('Starting Appwrite version detection', {
|
|
28
|
-
endpoint: cleanEndpoint,
|
|
29
|
-
project,
|
|
30
|
-
operation: 'detectAppwriteVersion'
|
|
31
|
-
});
|
|
32
|
-
// STEP 1: Check server version FIRST
|
|
33
|
-
const serverVersion = await fetchServerVersion(cleanEndpoint);
|
|
34
|
-
if (serverVersion && !isVersionAtLeast(serverVersion, '1.8.0')) {
|
|
35
|
-
// Server < 1.8.0 doesn't support TablesDB
|
|
36
|
-
logger.info('Server version below 1.8.0 - using legacy adapter', {
|
|
37
|
-
serverVersion,
|
|
38
|
-
operation: 'detectAppwriteVersion'
|
|
39
|
-
});
|
|
40
|
-
return {
|
|
41
|
-
apiMode: 'legacy',
|
|
42
|
-
detectionMethod: 'health_check',
|
|
43
|
-
serverVersion,
|
|
44
|
-
confidence: 'high'
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
// STEP 2: If version is unknown, use SDK probe (no fake HTTP endpoints)
|
|
48
|
-
try {
|
|
49
|
-
logger.debug('Attempting SDK-based TablesDB probe', {
|
|
50
|
-
endpoint: cleanEndpoint,
|
|
51
|
-
operation: 'detectAppwriteVersion'
|
|
52
|
-
});
|
|
53
|
-
const client = new Client().setEndpoint(cleanEndpoint).setProject(project);
|
|
54
|
-
if (apiKey && apiKey.trim().length > 0)
|
|
55
|
-
client.setKey(apiKey);
|
|
56
|
-
const databases = new Databases(client);
|
|
57
|
-
// Try to get a database id to probe tables listing
|
|
58
|
-
let dbId;
|
|
59
|
-
try {
|
|
60
|
-
const dbList = await databases.list([Query.limit(1)]);
|
|
61
|
-
dbId = dbList?.databases?.[0]?.$id || dbList?.databases?.[0]?.id || dbList?.[0]?.$id;
|
|
62
|
-
}
|
|
63
|
-
catch (e) {
|
|
64
|
-
// Ignore, we'll still attempt a conservative probe
|
|
65
|
-
logger.debug('Databases.list probe failed or returned no items', { operation: 'detectAppwriteVersion' });
|
|
66
|
-
}
|
|
67
|
-
const tables = new TablesDB(client);
|
|
68
|
-
if (dbId) {
|
|
69
|
-
// Probe listTables for the first database (limit 1)
|
|
70
|
-
await tables.listTables({ databaseId: dbId, queries: [Query.limit(1)] });
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
// No databases to probe; assume TablesDB available (cannot falsify-positively without a db)
|
|
74
|
-
logger.debug('No databases found to probe tables; assuming TablesDB if SDK available', { operation: 'detectAppwriteVersion' });
|
|
75
|
-
}
|
|
76
|
-
const result = {
|
|
77
|
-
apiMode: 'tablesdb',
|
|
78
|
-
detectionMethod: 'endpoint_probe', // repurpose label for SDK probe
|
|
79
|
-
confidence: 'medium',
|
|
80
|
-
serverVersion: serverVersion || undefined
|
|
81
|
-
};
|
|
82
|
-
logger.info('TablesDB detected via SDK probe', {
|
|
83
|
-
endpoint: cleanEndpoint,
|
|
84
|
-
result,
|
|
85
|
-
operation: 'detectAppwriteVersion'
|
|
86
|
-
});
|
|
87
|
-
return result;
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
91
|
-
logger.warn('SDK TablesDB probe failed; defaulting conservatively', {
|
|
92
|
-
endpoint: cleanEndpoint,
|
|
93
|
-
error: errorMessage,
|
|
94
|
-
operation: 'detectAppwriteVersion'
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
// Final fallback: default to tablesdb for modern environments when version unknown
|
|
98
|
-
const fallbackResult = {
|
|
99
|
-
apiMode: 'tablesdb',
|
|
100
|
-
detectionMethod: 'fallback',
|
|
101
|
-
confidence: 'low',
|
|
102
|
-
serverVersion: serverVersion || undefined
|
|
103
|
-
};
|
|
104
|
-
logger.info('Defaulting to TablesDB mode (fallback)', {
|
|
105
|
-
endpoint: cleanEndpoint,
|
|
106
|
-
result: fallbackResult,
|
|
107
|
-
operation: 'detectAppwriteVersion'
|
|
108
|
-
});
|
|
109
|
-
return fallbackResult;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Cached version detection to avoid repeated API calls
|
|
113
|
-
*/
|
|
114
|
-
class VersionDetectionCache {
|
|
115
|
-
cache = new Map();
|
|
116
|
-
CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
|
|
117
|
-
getCacheKey(endpoint, project) {
|
|
118
|
-
return `${endpoint}:${project}`;
|
|
119
|
-
}
|
|
120
|
-
get(endpoint, project) {
|
|
121
|
-
const key = this.getCacheKey(endpoint, project);
|
|
122
|
-
const cached = this.cache.get(key);
|
|
123
|
-
if (!cached) {
|
|
124
|
-
return null;
|
|
125
|
-
}
|
|
126
|
-
// Check if cache is expired
|
|
127
|
-
if (Date.now() - cached.timestamp > this.CACHE_DURATION) {
|
|
128
|
-
this.cache.delete(key);
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
return cached.result;
|
|
132
|
-
}
|
|
133
|
-
set(endpoint, project, result) {
|
|
134
|
-
const key = this.getCacheKey(endpoint, project);
|
|
135
|
-
this.cache.set(key, {
|
|
136
|
-
result,
|
|
137
|
-
timestamp: Date.now()
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
clear() {
|
|
141
|
-
this.cache.clear();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Global cache instance
|
|
145
|
-
const detectionCache = new VersionDetectionCache();
|
|
146
|
-
/**
|
|
147
|
-
* Cached version detection with automatic cache management
|
|
148
|
-
*
|
|
149
|
-
* @param endpoint - Appwrite server endpoint URL
|
|
150
|
-
* @param project - Project ID
|
|
151
|
-
* @param apiKey - API key for authentication
|
|
152
|
-
* @param forceRefresh - Skip cache and force fresh detection
|
|
153
|
-
* @returns Promise resolving to version detection result
|
|
154
|
-
*/
|
|
155
|
-
export async function detectAppwriteVersionCached(endpoint, project, apiKey, forceRefresh = false) {
|
|
156
|
-
const startTime = Date.now();
|
|
157
|
-
logger.debug('Version detection with cache requested', {
|
|
158
|
-
endpoint,
|
|
159
|
-
project,
|
|
160
|
-
forceRefresh,
|
|
161
|
-
operation: 'detectAppwriteVersionCached'
|
|
162
|
-
});
|
|
163
|
-
// Check cache first (unless force refresh)
|
|
164
|
-
if (!forceRefresh) {
|
|
165
|
-
const cached = detectionCache.get(endpoint, project);
|
|
166
|
-
if (cached) {
|
|
167
|
-
logger.info('Using cached version detection result', {
|
|
168
|
-
endpoint,
|
|
169
|
-
project,
|
|
170
|
-
cachedResult: cached,
|
|
171
|
-
operation: 'detectAppwriteVersionCached'
|
|
172
|
-
});
|
|
173
|
-
return cached;
|
|
174
|
-
}
|
|
175
|
-
logger.debug('No cached result found, performing fresh detection', {
|
|
176
|
-
endpoint,
|
|
177
|
-
project,
|
|
178
|
-
operation: 'detectAppwriteVersionCached'
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
logger.debug('Force refresh requested, bypassing cache', {
|
|
183
|
-
endpoint,
|
|
184
|
-
project,
|
|
185
|
-
operation: 'detectAppwriteVersionCached'
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
// Perform fresh detection
|
|
189
|
-
const result = await detectAppwriteVersion(endpoint, project, apiKey);
|
|
190
|
-
const totalDuration = Date.now() - startTime;
|
|
191
|
-
// Cache the result
|
|
192
|
-
detectionCache.set(endpoint, project, result);
|
|
193
|
-
logger.info('Version detection completed and cached', {
|
|
194
|
-
endpoint,
|
|
195
|
-
project,
|
|
196
|
-
result,
|
|
197
|
-
totalDuration,
|
|
198
|
-
operation: 'detectAppwriteVersionCached'
|
|
199
|
-
});
|
|
200
|
-
return result;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Quick check for cloud.appwrite.io instances (likely have TablesDB)
|
|
204
|
-
*
|
|
205
|
-
* @param endpoint - Appwrite server endpoint URL
|
|
206
|
-
* @returns boolean indicating if endpoint is likely cloud-hosted
|
|
207
|
-
*/
|
|
208
|
-
export function isCloudAppwriteEndpoint(endpoint) {
|
|
209
|
-
return endpoint.includes('cloud.appwrite.io');
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* SDK feature detection as a fallback method
|
|
213
|
-
* Attempts to dynamically import TablesDB to check availability
|
|
214
|
-
*/
|
|
215
|
-
// Removed dynamic SDK capability checks to avoid confusion and side effects.
|
|
216
|
-
/**
|
|
217
|
-
* Clear version detection cache (useful for testing)
|
|
218
|
-
*/
|
|
219
|
-
export function clearVersionDetectionCache() {
|
|
220
|
-
detectionCache.clear();
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Fetch server version from /health/version (no auth required)
|
|
224
|
-
*/
|
|
225
|
-
export async function fetchServerVersion(endpoint) {
|
|
226
|
-
try {
|
|
227
|
-
const clean = endpoint.replace(/\/$/, '');
|
|
228
|
-
const res = await fetch(`${clean}/health/version`, { method: 'GET', signal: AbortSignal.timeout(5000) });
|
|
229
|
-
if (!res.ok)
|
|
230
|
-
return null;
|
|
231
|
-
const data = await res.json().catch(() => null);
|
|
232
|
-
const version = (data && (data.version || data.build || data.release)) ?? null;
|
|
233
|
-
return typeof version === 'string' ? version : null;
|
|
234
|
-
}
|
|
235
|
-
catch {
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
/** Compare semantic versions (basic) */
|
|
240
|
-
export function isVersionAtLeast(current, target) {
|
|
241
|
-
if (!current)
|
|
242
|
-
return false;
|
|
243
|
-
const toNums = (v) => v.split('.').map(n => parseInt(n, 10));
|
|
244
|
-
const [a1 = 0, a2 = 0, a3 = 0] = toNums(current);
|
|
245
|
-
const [b1, b2, b3] = toNums(target);
|
|
246
|
-
if (a1 !== b1)
|
|
247
|
-
return a1 > b1;
|
|
248
|
-
if (a2 !== b2)
|
|
249
|
-
return a2 > b2;
|
|
250
|
-
return a3 >= b3;
|
|
251
|
-
}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import type { Collection, CollectionCreate } from "@njdamstra/appwrite-utils";
|
|
2
|
-
export interface YamlCollectionData {
|
|
3
|
-
name: string;
|
|
4
|
-
id?: string;
|
|
5
|
-
documentSecurity?: boolean;
|
|
6
|
-
rowSecurity?: boolean;
|
|
7
|
-
enabled?: boolean;
|
|
8
|
-
permissions?: Array<{
|
|
9
|
-
permission: string;
|
|
10
|
-
target: string;
|
|
11
|
-
}>;
|
|
12
|
-
attributes?: Array<{
|
|
13
|
-
key: string;
|
|
14
|
-
type: string;
|
|
15
|
-
size?: number;
|
|
16
|
-
required?: boolean;
|
|
17
|
-
array?: boolean;
|
|
18
|
-
encrypt?: boolean;
|
|
19
|
-
default?: any;
|
|
20
|
-
min?: number;
|
|
21
|
-
max?: number;
|
|
22
|
-
elements?: string[];
|
|
23
|
-
relatedCollection?: string;
|
|
24
|
-
relationType?: string;
|
|
25
|
-
twoWay?: boolean;
|
|
26
|
-
twoWayKey?: string;
|
|
27
|
-
onDelete?: string;
|
|
28
|
-
side?: string;
|
|
29
|
-
}>;
|
|
30
|
-
columns?: Array<{
|
|
31
|
-
key: string;
|
|
32
|
-
type: string;
|
|
33
|
-
size?: number;
|
|
34
|
-
required?: boolean;
|
|
35
|
-
array?: boolean;
|
|
36
|
-
encrypt?: boolean;
|
|
37
|
-
default?: any;
|
|
38
|
-
min?: number;
|
|
39
|
-
max?: number;
|
|
40
|
-
elements?: string[];
|
|
41
|
-
relatedTable?: string;
|
|
42
|
-
relationType?: string;
|
|
43
|
-
twoWay?: boolean;
|
|
44
|
-
twoWayKey?: string;
|
|
45
|
-
onDelete?: string;
|
|
46
|
-
side?: string;
|
|
47
|
-
}>;
|
|
48
|
-
indexes?: Array<{
|
|
49
|
-
key: string;
|
|
50
|
-
type: string;
|
|
51
|
-
attributes: string[];
|
|
52
|
-
columns?: string[];
|
|
53
|
-
orders?: string[];
|
|
54
|
-
}>;
|
|
55
|
-
importDefs?: any[];
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Configuration for terminology selection
|
|
59
|
-
*/
|
|
60
|
-
export interface YamlTerminologyConfig {
|
|
61
|
-
useTableTerminology: boolean;
|
|
62
|
-
entityType: 'collection' | 'table';
|
|
63
|
-
schemaPath?: string;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Converts a Collection object to YAML format with proper schema reference
|
|
67
|
-
* Supports both collection and table terminology based on configuration
|
|
68
|
-
*/
|
|
69
|
-
export declare function collectionToYaml(collection: Collection | CollectionCreate, config?: YamlTerminologyConfig): string;
|
|
70
|
-
/**
|
|
71
|
-
* Sanitizes a collection name for use as a filename
|
|
72
|
-
*/
|
|
73
|
-
export declare function sanitizeFilename(name: string): string;
|
|
74
|
-
/**
|
|
75
|
-
* Generates the filename for a collection/table YAML file
|
|
76
|
-
*/
|
|
77
|
-
export declare function getCollectionYamlFilename(collection: Collection | CollectionCreate, useTableTerminology?: boolean): string;
|
|
78
|
-
/**
|
|
79
|
-
* Converts column terminology back to attribute terminology for loading
|
|
80
|
-
*/
|
|
81
|
-
export declare function normalizeYamlData(yamlData: YamlCollectionData): YamlCollectionData;
|
|
82
|
-
/**
|
|
83
|
-
* Determines if YAML data uses table terminology
|
|
84
|
-
*/
|
|
85
|
-
export declare function usesTableTerminology(yamlData: YamlCollectionData): boolean;
|
|
86
|
-
/**
|
|
87
|
-
* Converts between attribute and column terminology
|
|
88
|
-
*/
|
|
89
|
-
export declare function convertTerminology(yamlData: YamlCollectionData, toTableTerminology: boolean): YamlCollectionData;
|
|
90
|
-
/**
|
|
91
|
-
* Generates a template YAML file for collections or tables
|
|
92
|
-
*/
|
|
93
|
-
export declare function generateYamlTemplate(entityName: string, config: YamlTerminologyConfig): string;
|
|
94
|
-
/**
|
|
95
|
-
* Generates example YAML files for both collection and table formats
|
|
96
|
-
*/
|
|
97
|
-
export declare function generateExampleYamls(entityName: string): {
|
|
98
|
-
collection: string;
|
|
99
|
-
table: string;
|
|
100
|
-
};
|