@njdamstra/appwrite-utils-cli 1.8.9 → 1.10.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/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 +2 -35
- package/dist/collections/indexes.js +1 -3
- 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 +55 -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 +63 -9
- package/dist/main.js +130 -177
- package/dist/migrations/afterImportActions.js +2 -3
- package/dist/migrations/appwriteToX.d.ts +1 -1
- package/dist/migrations/appwriteToX.js +9 -7
- package/dist/migrations/comprehensiveTransfer.js +3 -5
- 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 +2 -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 +7 -3
- 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 +3 -39
- package/src/collections/indexes.ts +2 -4
- package/src/collections/methods.ts +115 -150
- package/src/collections/tableOperations.ts +57 -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 +17 -4
- package/src/init.ts +1 -1
- package/src/interactiveCLI.ts +75 -10
- 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,472 +0,0 @@
|
|
|
1
|
-
import path from "path";
|
|
2
|
-
import fs from "fs";
|
|
3
|
-
import { CollectionCreateSchema } from "@njdamstra/appwrite-utils";
|
|
4
|
-
import { register } from "tsx/esm/api";
|
|
5
|
-
import { pathToFileURL } from "node:url";
|
|
6
|
-
import yaml from "js-yaml";
|
|
7
|
-
import { z } from "zod";
|
|
8
|
-
import { MessageFormatter } from "../shared/messageFormatter.js";
|
|
9
|
-
import { shouldIgnoreDirectory } from "./directoryUtils.js";
|
|
10
|
-
import { resolveCollectionsDir, resolveTablesDir } from "./pathResolvers.js";
|
|
11
|
-
import { findYamlConfig } from "../config/yamlConfig.js";
|
|
12
|
-
/**
|
|
13
|
-
* Recursively searches for TypeScript configuration files (appwriteConfig.ts)
|
|
14
|
-
* @param dir The directory to start the search from
|
|
15
|
-
* @param depth Current search depth for recursion limiting
|
|
16
|
-
* @returns Path to the config file or null if not found
|
|
17
|
-
*/
|
|
18
|
-
export const findAppwriteConfigTS = (dir, depth = 0) => {
|
|
19
|
-
// Limit search depth to prevent infinite recursion
|
|
20
|
-
if (depth > 10) {
|
|
21
|
-
return null;
|
|
22
|
-
}
|
|
23
|
-
if (shouldIgnoreDirectory(path.basename(dir))) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
try {
|
|
27
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
28
|
-
// First check current directory for appwriteConfig.ts
|
|
29
|
-
for (const entry of entries) {
|
|
30
|
-
if (entry.isFile() && entry.name === "appwriteConfig.ts") {
|
|
31
|
-
return path.join(dir, entry.name);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// Then search subdirectories
|
|
35
|
-
for (const entry of entries) {
|
|
36
|
-
if (entry.isDirectory() && !shouldIgnoreDirectory(entry.name)) {
|
|
37
|
-
const result = findAppwriteConfigTS(path.join(dir, entry.name), depth + 1);
|
|
38
|
-
if (result)
|
|
39
|
-
return result;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
// Ignore directory access errors
|
|
45
|
-
}
|
|
46
|
-
return null;
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Recursively searches for configuration files starting from the given directory.
|
|
50
|
-
* Priority: 1) YAML configs in .appwrite directories, 2) appwriteConfig.ts files in subdirectories
|
|
51
|
-
* @param dir The directory to start the search from
|
|
52
|
-
* @returns The directory path where the config was found, suitable for passing to loadConfig()
|
|
53
|
-
*/
|
|
54
|
-
export const findAppwriteConfig = (dir) => {
|
|
55
|
-
// First try to find YAML config (already searches recursively for .appwrite dirs)
|
|
56
|
-
const yamlConfig = findYamlConfig(dir);
|
|
57
|
-
if (yamlConfig) {
|
|
58
|
-
// Return the directory containing the config file
|
|
59
|
-
return path.dirname(yamlConfig);
|
|
60
|
-
}
|
|
61
|
-
// Fall back to TypeScript config search
|
|
62
|
-
const tsConfigPath = findAppwriteConfigTS(dir);
|
|
63
|
-
if (tsConfigPath) {
|
|
64
|
-
return path.dirname(tsConfigPath);
|
|
65
|
-
}
|
|
66
|
-
return null;
|
|
67
|
-
};
|
|
68
|
-
/**
|
|
69
|
-
* Recursively searches for the functions directory
|
|
70
|
-
* @param dir The directory to start searching from
|
|
71
|
-
* @param depth Current search depth for recursion limiting
|
|
72
|
-
* @returns Path to the functions directory or null if not found
|
|
73
|
-
*/
|
|
74
|
-
export const findFunctionsDir = (dir, depth = 0) => {
|
|
75
|
-
// Limit search depth to prevent infinite recursion
|
|
76
|
-
if (depth > 5) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
if (shouldIgnoreDirectory(path.basename(dir))) {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
try {
|
|
83
|
-
const files = fs.readdirSync(dir, { withFileTypes: true });
|
|
84
|
-
for (const entry of files) {
|
|
85
|
-
if (!entry.isDirectory() || shouldIgnoreDirectory(entry.name)) {
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
if (entry.name === "functions") {
|
|
89
|
-
return path.join(dir, entry.name);
|
|
90
|
-
}
|
|
91
|
-
const result = findFunctionsDir(path.join(dir, entry.name), depth + 1);
|
|
92
|
-
if (result)
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
catch (error) {
|
|
97
|
-
// Ignore directory access errors
|
|
98
|
-
}
|
|
99
|
-
return null;
|
|
100
|
-
};
|
|
101
|
-
// YAML Collection Schema
|
|
102
|
-
const YamlCollectionSchema = z.object({
|
|
103
|
-
name: z.string(),
|
|
104
|
-
id: z.string().optional(),
|
|
105
|
-
documentSecurity: z.boolean().default(false),
|
|
106
|
-
enabled: z.boolean().default(true),
|
|
107
|
-
permissions: z.array(z.object({
|
|
108
|
-
permission: z.string(),
|
|
109
|
-
target: z.string()
|
|
110
|
-
})).optional().default([]),
|
|
111
|
-
attributes: z.array(z.object({
|
|
112
|
-
key: z.string(),
|
|
113
|
-
type: z.string(),
|
|
114
|
-
size: z.number().optional(),
|
|
115
|
-
required: z.boolean().default(false),
|
|
116
|
-
array: z.boolean().optional(),
|
|
117
|
-
default: z.any().optional(),
|
|
118
|
-
min: z.number().optional(),
|
|
119
|
-
max: z.number().optional(),
|
|
120
|
-
elements: z.array(z.string()).optional(),
|
|
121
|
-
relatedCollection: z.string().optional(),
|
|
122
|
-
relationType: z.string().optional(),
|
|
123
|
-
twoWay: z.boolean().optional(),
|
|
124
|
-
twoWayKey: z.string().optional(),
|
|
125
|
-
onDelete: z.string().optional(),
|
|
126
|
-
side: z.string().optional(),
|
|
127
|
-
encrypt: z.boolean().optional(),
|
|
128
|
-
format: z.string().optional()
|
|
129
|
-
})).optional().default([]),
|
|
130
|
-
indexes: z.array(z.object({
|
|
131
|
-
key: z.string(),
|
|
132
|
-
type: z.string(),
|
|
133
|
-
attributes: z.array(z.string()),
|
|
134
|
-
orders: z.array(z.string()).optional()
|
|
135
|
-
})).optional().default([]),
|
|
136
|
-
importDefs: z.array(z.any()).optional().default([])
|
|
137
|
-
});
|
|
138
|
-
// YAML Table Schema - Supports table-specific terminology
|
|
139
|
-
const YamlTableSchema = z.object({
|
|
140
|
-
name: z.string(),
|
|
141
|
-
id: z.string().optional(),
|
|
142
|
-
rowSecurity: z.boolean().default(false), // Tables use rowSecurity
|
|
143
|
-
enabled: z.boolean().default(true),
|
|
144
|
-
permissions: z.array(z.object({
|
|
145
|
-
permission: z.string(),
|
|
146
|
-
target: z.string()
|
|
147
|
-
})).optional().default([]),
|
|
148
|
-
columns: z.array(// Tables use columns terminology
|
|
149
|
-
z.object({
|
|
150
|
-
key: z.string(),
|
|
151
|
-
type: z.string(),
|
|
152
|
-
size: z.number().optional(),
|
|
153
|
-
required: z.boolean().default(false),
|
|
154
|
-
array: z.boolean().optional(),
|
|
155
|
-
encrypt: z.boolean().optional(), // Tables support encrypt property
|
|
156
|
-
default: z.any().optional(),
|
|
157
|
-
min: z.number().optional(),
|
|
158
|
-
max: z.number().optional(),
|
|
159
|
-
elements: z.array(z.string()).optional(),
|
|
160
|
-
relatedTable: z.string().optional(), // Tables use relatedTable
|
|
161
|
-
relationType: z.string().optional(),
|
|
162
|
-
twoWay: z.boolean().optional(),
|
|
163
|
-
twoWayKey: z.string().optional(),
|
|
164
|
-
onDelete: z.string().optional(),
|
|
165
|
-
side: z.string().optional(),
|
|
166
|
-
format: z.string().optional()
|
|
167
|
-
})).optional().default([]),
|
|
168
|
-
indexes: z.array(z.object({
|
|
169
|
-
key: z.string(),
|
|
170
|
-
type: z.string(),
|
|
171
|
-
columns: z.array(z.string()), // Tables use columns in indexes
|
|
172
|
-
orders: z.array(z.string()).optional()
|
|
173
|
-
})).optional().default([]),
|
|
174
|
-
importDefs: z.array(z.any()).optional().default([])
|
|
175
|
-
});
|
|
176
|
-
/**
|
|
177
|
-
* Loads a YAML collection file and converts it to CollectionCreate format
|
|
178
|
-
* @param filePath Path to the YAML collection file
|
|
179
|
-
* @returns CollectionCreate object or null if loading fails
|
|
180
|
-
*/
|
|
181
|
-
export const loadYamlCollection = (filePath) => {
|
|
182
|
-
try {
|
|
183
|
-
const fileContent = fs.readFileSync(filePath, "utf8");
|
|
184
|
-
const yamlData = yaml.load(fileContent);
|
|
185
|
-
const parsedCollection = YamlCollectionSchema.parse(yamlData);
|
|
186
|
-
// Convert YAML collection to CollectionCreate format
|
|
187
|
-
const collectionInput = {
|
|
188
|
-
name: parsedCollection.name,
|
|
189
|
-
$id: parsedCollection.id || parsedCollection.name.toLowerCase().replace(/\s+/g, '_'),
|
|
190
|
-
documentSecurity: parsedCollection.documentSecurity,
|
|
191
|
-
enabled: parsedCollection.enabled,
|
|
192
|
-
$permissions: parsedCollection.permissions.map(p => ({
|
|
193
|
-
permission: p.permission,
|
|
194
|
-
target: p.target
|
|
195
|
-
})),
|
|
196
|
-
attributes: parsedCollection.attributes.map(attr => ({
|
|
197
|
-
key: attr.key,
|
|
198
|
-
type: attr.type,
|
|
199
|
-
size: attr.size,
|
|
200
|
-
required: attr.required,
|
|
201
|
-
array: attr.array,
|
|
202
|
-
xdefault: attr.default,
|
|
203
|
-
min: attr.min,
|
|
204
|
-
max: attr.max,
|
|
205
|
-
elements: attr.elements,
|
|
206
|
-
relatedCollection: attr.relatedCollection,
|
|
207
|
-
relationType: attr.relationType,
|
|
208
|
-
twoWay: attr.twoWay,
|
|
209
|
-
twoWayKey: attr.twoWayKey,
|
|
210
|
-
onDelete: attr.onDelete,
|
|
211
|
-
side: attr.side,
|
|
212
|
-
encrypt: attr.encrypt,
|
|
213
|
-
format: attr.format
|
|
214
|
-
})),
|
|
215
|
-
indexes: parsedCollection.indexes.map(idx => ({
|
|
216
|
-
key: idx.key,
|
|
217
|
-
type: idx.type,
|
|
218
|
-
attributes: idx.attributes,
|
|
219
|
-
orders: idx.orders
|
|
220
|
-
})),
|
|
221
|
-
importDefs: parsedCollection.importDefs && Array.isArray(parsedCollection.importDefs) && parsedCollection.importDefs.length > 0 ? parsedCollection.importDefs : []
|
|
222
|
-
};
|
|
223
|
-
const collection = CollectionCreateSchema.parse(collectionInput);
|
|
224
|
-
return collection;
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
MessageFormatter.error(`Error loading YAML collection from ${filePath}`, error, { prefix: "Config" });
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
/**
|
|
232
|
-
* Loads a YAML table file and converts it to CollectionCreate format
|
|
233
|
-
* @param filePath Path to the YAML table file
|
|
234
|
-
* @returns CollectionCreate object or null if loading fails
|
|
235
|
-
*/
|
|
236
|
-
export const loadYamlTable = (filePath) => {
|
|
237
|
-
try {
|
|
238
|
-
const fileContent = fs.readFileSync(filePath, "utf8");
|
|
239
|
-
const yamlData = yaml.load(fileContent);
|
|
240
|
-
// Use the new table-specific schema
|
|
241
|
-
const parsedTable = YamlTableSchema.parse(yamlData);
|
|
242
|
-
// Convert YAML table to CollectionCreate format (internal representation)
|
|
243
|
-
const table = {
|
|
244
|
-
name: parsedTable.name,
|
|
245
|
-
$id: yamlData.tableId || parsedTable.id || parsedTable.name.toLowerCase().replace(/\s+/g, '_'),
|
|
246
|
-
documentSecurity: parsedTable.rowSecurity, // Convert rowSecurity to documentSecurity
|
|
247
|
-
enabled: parsedTable.enabled,
|
|
248
|
-
$permissions: parsedTable.permissions.map(p => ({
|
|
249
|
-
permission: p.permission,
|
|
250
|
-
target: p.target
|
|
251
|
-
})),
|
|
252
|
-
attributes: parsedTable.columns.map(col => ({
|
|
253
|
-
key: col.key,
|
|
254
|
-
type: col.type,
|
|
255
|
-
size: col.size,
|
|
256
|
-
required: col.required,
|
|
257
|
-
array: col.array,
|
|
258
|
-
xdefault: col.default,
|
|
259
|
-
min: col.min,
|
|
260
|
-
max: col.max,
|
|
261
|
-
elements: col.elements,
|
|
262
|
-
relatedCollection: col.relatedTable, // Convert relatedTable to relatedCollection
|
|
263
|
-
relationType: col.relationType,
|
|
264
|
-
twoWay: col.twoWay,
|
|
265
|
-
twoWayKey: col.twoWayKey,
|
|
266
|
-
onDelete: col.onDelete,
|
|
267
|
-
side: col.side,
|
|
268
|
-
encrypt: col.encrypt,
|
|
269
|
-
format: col.format
|
|
270
|
-
})),
|
|
271
|
-
indexes: parsedTable.indexes.map(idx => ({
|
|
272
|
-
key: idx.key,
|
|
273
|
-
type: idx.type,
|
|
274
|
-
attributes: idx.columns, // Convert columns to attributes
|
|
275
|
-
orders: idx.orders
|
|
276
|
-
})),
|
|
277
|
-
importDefs: parsedTable.importDefs || []
|
|
278
|
-
};
|
|
279
|
-
return table;
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
MessageFormatter.error(`Error loading YAML table from ${filePath}`, error, { prefix: "Config" });
|
|
283
|
-
return null;
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
/**
|
|
287
|
-
* Discovers and loads collections from a collections/ directory
|
|
288
|
-
* @param collectionsDir Path to the collections directory
|
|
289
|
-
* @returns Discovery result with loaded collections and metadata
|
|
290
|
-
*/
|
|
291
|
-
export const discoverCollections = async (collectionsDir) => {
|
|
292
|
-
const collections = [];
|
|
293
|
-
const loadedNames = new Set();
|
|
294
|
-
const conflicts = [];
|
|
295
|
-
if (!fs.existsSync(collectionsDir)) {
|
|
296
|
-
return { collections, loadedNames, conflicts };
|
|
297
|
-
}
|
|
298
|
-
const unregister = register(); // Register tsx for collections
|
|
299
|
-
try {
|
|
300
|
-
const collectionFiles = fs.readdirSync(collectionsDir);
|
|
301
|
-
MessageFormatter.success(`Loading from collections/ directory: ${collectionFiles.length} files found`, { prefix: "Config" });
|
|
302
|
-
for (const file of collectionFiles) {
|
|
303
|
-
if (file === "index.ts") {
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
const filePath = path.join(collectionsDir, file);
|
|
307
|
-
let collection = null;
|
|
308
|
-
// Handle YAML collections
|
|
309
|
-
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
310
|
-
collection = loadYamlCollection(filePath);
|
|
311
|
-
}
|
|
312
|
-
// Handle TypeScript collections
|
|
313
|
-
else if (file.endsWith('.ts')) {
|
|
314
|
-
const fileUrl = pathToFileURL(filePath).href;
|
|
315
|
-
const collectionModule = (await import(fileUrl));
|
|
316
|
-
const importedCollection = collectionModule.default?.default || collectionModule.default || collectionModule;
|
|
317
|
-
if (importedCollection) {
|
|
318
|
-
collection = importedCollection;
|
|
319
|
-
// Ensure importDefs are properly loaded
|
|
320
|
-
if (collectionModule.importDefs || collection.importDefs) {
|
|
321
|
-
collection.importDefs = collectionModule.importDefs || collection.importDefs;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
if (collection) {
|
|
326
|
-
const collectionName = collection.name || collection.$id || file;
|
|
327
|
-
loadedNames.add(collectionName);
|
|
328
|
-
collections.push(collection);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
finally {
|
|
333
|
-
unregister(); // Unregister tsx when done
|
|
334
|
-
}
|
|
335
|
-
return { collections, loadedNames, conflicts };
|
|
336
|
-
};
|
|
337
|
-
/**
|
|
338
|
-
* Discovers and loads tables from a tables/ directory
|
|
339
|
-
* @param tablesDir Path to the tables directory
|
|
340
|
-
* @param existingNames Set of already-loaded collection names to check for conflicts
|
|
341
|
-
* @returns Discovery result with loaded tables and metadata
|
|
342
|
-
*/
|
|
343
|
-
export const discoverTables = async (tablesDir, existingNames = new Set()) => {
|
|
344
|
-
const tables = [];
|
|
345
|
-
const loadedNames = new Set();
|
|
346
|
-
const conflicts = [];
|
|
347
|
-
if (!fs.existsSync(tablesDir)) {
|
|
348
|
-
return { tables, loadedNames, conflicts };
|
|
349
|
-
}
|
|
350
|
-
const unregister = register(); // Register tsx for tables
|
|
351
|
-
try {
|
|
352
|
-
const tableFiles = fs.readdirSync(tablesDir);
|
|
353
|
-
MessageFormatter.success(`Loading from tables/ directory: ${tableFiles.length} files found`, { prefix: "Config" });
|
|
354
|
-
for (const file of tableFiles) {
|
|
355
|
-
if (file === "index.ts") {
|
|
356
|
-
continue;
|
|
357
|
-
}
|
|
358
|
-
const filePath = path.join(tablesDir, file);
|
|
359
|
-
let table = null;
|
|
360
|
-
// Handle YAML tables
|
|
361
|
-
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
362
|
-
table = loadYamlTable(filePath);
|
|
363
|
-
}
|
|
364
|
-
// Handle TypeScript tables
|
|
365
|
-
else if (file.endsWith('.ts')) {
|
|
366
|
-
const fileUrl = pathToFileURL(filePath).href;
|
|
367
|
-
const tableModule = (await import(fileUrl));
|
|
368
|
-
const importedTable = tableModule.default?.default || tableModule.default || tableModule;
|
|
369
|
-
if (importedTable) {
|
|
370
|
-
table = importedTable;
|
|
371
|
-
// Ensure importDefs are properly loaded
|
|
372
|
-
if (tableModule.importDefs || table.importDefs) {
|
|
373
|
-
table.importDefs = tableModule.importDefs || table.importDefs;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
if (table) {
|
|
378
|
-
const tableName = table.name || table.tableId || table.$id || file;
|
|
379
|
-
// Check for naming conflicts with existing collections
|
|
380
|
-
if (existingNames.has(tableName)) {
|
|
381
|
-
conflicts.push({
|
|
382
|
-
name: tableName,
|
|
383
|
-
source1: "collections/",
|
|
384
|
-
source2: "tables/"
|
|
385
|
-
});
|
|
386
|
-
MessageFormatter.warning(`Skipping duplicate '${tableName}' from tables/ (collections/ takes priority)`, { prefix: "Config" });
|
|
387
|
-
}
|
|
388
|
-
else {
|
|
389
|
-
loadedNames.add(tableName);
|
|
390
|
-
// Mark as coming from tables directory
|
|
391
|
-
table._isFromTablesDir = true;
|
|
392
|
-
tables.push(table);
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
finally {
|
|
398
|
-
unregister(); // Unregister tsx when done
|
|
399
|
-
}
|
|
400
|
-
return { tables, loadedNames, conflicts };
|
|
401
|
-
};
|
|
402
|
-
/**
|
|
403
|
-
* Discovers and loads collections/tables from legacy single directory structure
|
|
404
|
-
* @param configFileDir Directory containing the config file
|
|
405
|
-
* @param dirName Directory name to search for ('collections' or 'tables')
|
|
406
|
-
* @returns Array of discovered collections/tables
|
|
407
|
-
*/
|
|
408
|
-
export const discoverLegacyDirectory = async (configFileDir, dirName) => {
|
|
409
|
-
const legacyDir = path.join(configFileDir, dirName);
|
|
410
|
-
const items = [];
|
|
411
|
-
if (!fs.existsSync(legacyDir)) {
|
|
412
|
-
return items;
|
|
413
|
-
}
|
|
414
|
-
MessageFormatter.info(`Using legacy single directory: ${dirName}/`, { prefix: "Config" });
|
|
415
|
-
const unregister = register(); // Register tsx for legacy collections
|
|
416
|
-
try {
|
|
417
|
-
const collectionFiles = fs.readdirSync(legacyDir);
|
|
418
|
-
for (const file of collectionFiles) {
|
|
419
|
-
if (file === "index.ts") {
|
|
420
|
-
continue;
|
|
421
|
-
}
|
|
422
|
-
const filePath = path.join(legacyDir, file);
|
|
423
|
-
// Handle YAML collections
|
|
424
|
-
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
425
|
-
const collection = loadYamlCollection(filePath);
|
|
426
|
-
if (collection) {
|
|
427
|
-
if (dirName === 'tables') {
|
|
428
|
-
// Mark as coming from tables directory
|
|
429
|
-
const table = {
|
|
430
|
-
...collection,
|
|
431
|
-
_isFromTablesDir: true,
|
|
432
|
-
tableId: collection.$id || collection.name.toLowerCase().replace(/\s+/g, '_')
|
|
433
|
-
};
|
|
434
|
-
items.push(table);
|
|
435
|
-
}
|
|
436
|
-
else {
|
|
437
|
-
items.push(collection);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
continue;
|
|
441
|
-
}
|
|
442
|
-
// Handle TypeScript collections
|
|
443
|
-
if (file.endsWith('.ts')) {
|
|
444
|
-
const fileUrl = pathToFileURL(filePath).href;
|
|
445
|
-
const collectionModule = (await import(fileUrl));
|
|
446
|
-
const collection = collectionModule.default?.default || collectionModule.default || collectionModule;
|
|
447
|
-
if (collection) {
|
|
448
|
-
// Ensure importDefs are properly loaded
|
|
449
|
-
if (collectionModule.importDefs || collection.importDefs) {
|
|
450
|
-
collection.importDefs = collectionModule.importDefs || collection.importDefs;
|
|
451
|
-
}
|
|
452
|
-
if (dirName === 'tables') {
|
|
453
|
-
// Mark as coming from tables directory
|
|
454
|
-
const table = {
|
|
455
|
-
...collection,
|
|
456
|
-
_isFromTablesDir: true,
|
|
457
|
-
tableId: collection.$id || collection.name.toLowerCase().replace(/\s+/g, '_')
|
|
458
|
-
};
|
|
459
|
-
items.push(table);
|
|
460
|
-
}
|
|
461
|
-
else {
|
|
462
|
-
items.push(collection);
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
finally {
|
|
469
|
-
unregister(); // Unregister tsx when done
|
|
470
|
-
}
|
|
471
|
-
return items;
|
|
472
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { type AppwriteConfig } from "@njdamstra/appwrite-utils";
|
|
2
|
-
export type SupportedLanguage = "typescript" | "javascript" | "python" | "php" | "dart" | "json" | "env";
|
|
3
|
-
interface Constants {
|
|
4
|
-
databases: Record<string, string>;
|
|
5
|
-
collections: Record<string, string>;
|
|
6
|
-
buckets: Record<string, string>;
|
|
7
|
-
functions: Record<string, string>;
|
|
8
|
-
}
|
|
9
|
-
export declare class ConstantsGenerator {
|
|
10
|
-
private config;
|
|
11
|
-
private constants;
|
|
12
|
-
constructor(config: AppwriteConfig);
|
|
13
|
-
private extractConstants;
|
|
14
|
-
private toConstantName;
|
|
15
|
-
private toCamelCase;
|
|
16
|
-
private toSnakeCase;
|
|
17
|
-
generateTypeScript(constantsOverride?: Constants): string;
|
|
18
|
-
generateJavaScript(constantsOverride?: Constants): string;
|
|
19
|
-
generatePython(constantsOverride?: Constants): string;
|
|
20
|
-
generatePHP(constantsOverride?: Constants): string;
|
|
21
|
-
generateDart(constantsOverride?: Constants): string;
|
|
22
|
-
generateJSON(constantsOverride?: Constants): string;
|
|
23
|
-
generateEnv(constantsOverride?: Constants): string;
|
|
24
|
-
generateFiles(languages: SupportedLanguage[], outputDir: string, include?: {
|
|
25
|
-
databases?: boolean;
|
|
26
|
-
collections?: boolean;
|
|
27
|
-
buckets?: boolean;
|
|
28
|
-
functions?: boolean;
|
|
29
|
-
}): Promise<void>;
|
|
30
|
-
}
|
|
31
|
-
export {};
|