appwrite-utils-cli 1.6.2 → 1.6.4
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/CONFIG_TODO.md +1189 -0
- package/SERVICE_IMPLEMENTATION_REPORT.md +462 -0
- package/dist/cli/commands/configCommands.js +7 -1
- package/dist/cli/commands/databaseCommands.js +23 -15
- package/dist/collections/attributes.d.ts +1 -1
- package/dist/collections/attributes.js +163 -66
- package/dist/collections/indexes.js +3 -17
- package/dist/collections/methods.js +38 -0
- package/dist/config/ConfigManager.d.ts +445 -0
- package/dist/config/ConfigManager.js +625 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.js +7 -0
- package/dist/config/services/ConfigDiscoveryService.d.ts +126 -0
- package/dist/config/services/ConfigDiscoveryService.js +374 -0
- package/dist/config/services/ConfigLoaderService.d.ts +105 -0
- package/dist/config/services/ConfigLoaderService.js +410 -0
- package/dist/config/services/ConfigMergeService.d.ts +208 -0
- package/dist/config/services/ConfigMergeService.js +307 -0
- package/dist/config/services/ConfigValidationService.d.ts +214 -0
- package/dist/config/services/ConfigValidationService.js +310 -0
- package/dist/config/services/SessionAuthService.d.ts +225 -0
- package/dist/config/services/SessionAuthService.js +456 -0
- package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +1 -0
- package/dist/config/services/__tests__/ConfigMergeService.test.js +271 -0
- package/dist/config/services/index.d.ts +13 -0
- package/dist/config/services/index.js +10 -0
- package/dist/interactiveCLI.js +8 -6
- package/dist/main.js +2 -2
- package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +1 -1
- package/dist/shared/operationQueue.js +1 -1
- package/dist/utils/ClientFactory.d.ts +87 -0
- package/dist/utils/ClientFactory.js +164 -0
- package/dist/utils/getClientFromConfig.js +4 -3
- package/dist/utils/helperFunctions.d.ts +1 -0
- package/dist/utils/helperFunctions.js +21 -5
- package/dist/utils/yamlConverter.d.ts +2 -0
- package/dist/utils/yamlConverter.js +21 -4
- package/dist/utilsController.d.ts +18 -15
- package/dist/utilsController.js +83 -131
- package/package.json +1 -1
- package/src/cli/commands/configCommands.ts +8 -1
- package/src/cli/commands/databaseCommands.ts +34 -20
- package/src/collections/attributes.ts +195 -150
- package/src/collections/indexes.ts +4 -19
- package/src/collections/methods.ts +46 -0
- package/src/config/ConfigManager.ts +808 -0
- package/src/config/index.ts +10 -0
- package/src/config/services/ConfigDiscoveryService.ts +463 -0
- package/src/config/services/ConfigLoaderService.ts +560 -0
- package/src/config/services/ConfigMergeService.ts +386 -0
- package/src/config/services/ConfigValidationService.ts +394 -0
- package/src/config/services/SessionAuthService.ts +565 -0
- package/src/config/services/__tests__/ConfigMergeService.test.ts +351 -0
- package/src/config/services/index.ts +29 -0
- package/src/interactiveCLI.ts +9 -7
- package/src/main.ts +2 -2
- package/src/shared/operationQueue.ts +1 -1
- package/src/utils/ClientFactory.ts +186 -0
- package/src/utils/getClientFromConfig.ts +4 -3
- package/src/utils/helperFunctions.ts +27 -7
- package/src/utils/yamlConverter.ts +28 -2
- package/src/utilsController.ts +99 -187
@@ -0,0 +1,126 @@
|
|
1
|
+
/**
|
2
|
+
* Result of discovering configuration files or collections/tables
|
3
|
+
*/
|
4
|
+
export interface DiscoveryResult {
|
5
|
+
found: boolean;
|
6
|
+
path?: string;
|
7
|
+
type: "yaml" | "typescript" | "json" | "none";
|
8
|
+
files?: string[];
|
9
|
+
}
|
10
|
+
/**
|
11
|
+
* Service for discovering Appwrite configuration files and collection/table definitions.
|
12
|
+
*
|
13
|
+
* Search Priority:
|
14
|
+
* 1. YAML configs (.appwrite/config.yaml, .appwrite/config.yml, etc.)
|
15
|
+
* 2. TypeScript configs (appwriteConfig.ts)
|
16
|
+
* 3. JSON configs (appwrite.json, appwrite.config.json)
|
17
|
+
*
|
18
|
+
* Features:
|
19
|
+
* - Searches up directory tree (max 5 levels)
|
20
|
+
* - Ignores common directories (node_modules, .git, etc.)
|
21
|
+
* - Discovers both collections/ and tables/ directories
|
22
|
+
* - Recursive subdirectory scanning for .appwrite folders
|
23
|
+
*/
|
24
|
+
export declare class ConfigDiscoveryService {
|
25
|
+
/**
|
26
|
+
* YAML configuration file names to search for
|
27
|
+
*/
|
28
|
+
private readonly YAML_FILENAMES;
|
29
|
+
/**
|
30
|
+
* TypeScript configuration file names to search for
|
31
|
+
*/
|
32
|
+
private readonly TS_FILENAMES;
|
33
|
+
/**
|
34
|
+
* JSON configuration file names to search for
|
35
|
+
*/
|
36
|
+
private readonly JSON_FILENAMES;
|
37
|
+
/**
|
38
|
+
* Maximum levels to search up the directory tree
|
39
|
+
*/
|
40
|
+
private readonly MAX_SEARCH_DEPTH;
|
41
|
+
/**
|
42
|
+
* Finds any configuration file with priority: YAML → TypeScript → JSON
|
43
|
+
* @param startDir The directory to start searching from
|
44
|
+
* @returns Path to the configuration file or null if not found
|
45
|
+
*/
|
46
|
+
findConfig(startDir: string): string | null;
|
47
|
+
/**
|
48
|
+
* Finds YAML configuration files
|
49
|
+
* Searches current directory, subdirectories, and parent directory
|
50
|
+
* @param startDir The directory to start searching from
|
51
|
+
* @returns Path to the YAML config file or null if not found
|
52
|
+
*/
|
53
|
+
findYamlConfig(startDir: string): string | null;
|
54
|
+
/**
|
55
|
+
* Recursively searches for YAML configs in .appwrite subdirectories
|
56
|
+
* @param dir The directory to search
|
57
|
+
* @param depth Current search depth
|
58
|
+
* @returns Path to YAML config or null
|
59
|
+
*/
|
60
|
+
private findYamlConfigRecursive;
|
61
|
+
/**
|
62
|
+
* Finds TypeScript configuration files (appwriteConfig.ts)
|
63
|
+
* @param startDir The directory to start searching from
|
64
|
+
* @returns Path to the TypeScript config file or null if not found
|
65
|
+
*/
|
66
|
+
findTypeScriptConfig(startDir: string): string | null;
|
67
|
+
/**
|
68
|
+
* Recursively searches for TypeScript configuration files
|
69
|
+
* @param dir The directory to search
|
70
|
+
* @param depth Current search depth
|
71
|
+
* @returns Path to TypeScript config or null
|
72
|
+
*/
|
73
|
+
private findTypeScriptConfigRecursive;
|
74
|
+
/**
|
75
|
+
* Finds project configuration JSON files (appwrite.json, appwrite.config.json)
|
76
|
+
* Searches up to 5 levels up the directory tree
|
77
|
+
* @param startDir The directory to start searching from
|
78
|
+
* @returns Path to the JSON config file or null if not found
|
79
|
+
*/
|
80
|
+
findProjectConfig(startDir?: string): string | null;
|
81
|
+
/**
|
82
|
+
* Discovers collection YAML files in a collections/ directory
|
83
|
+
* @param collectionsDir Path to the collections directory
|
84
|
+
* @returns Discovery result with file paths
|
85
|
+
*/
|
86
|
+
discoverCollections(collectionsDir: string): Promise<DiscoveryResult>;
|
87
|
+
/**
|
88
|
+
* Discovers table YAML files in a tables/ directory
|
89
|
+
* @param tablesDir Path to the tables directory
|
90
|
+
* @returns Discovery result with file paths
|
91
|
+
*/
|
92
|
+
discoverTables(tablesDir: string): Promise<DiscoveryResult>;
|
93
|
+
/**
|
94
|
+
* Finds the .appwrite configuration directory
|
95
|
+
* @param startDir The directory to start searching from
|
96
|
+
* @returns Path to .appwrite directory or null if not found
|
97
|
+
*/
|
98
|
+
findAppwriteDirectory(startDir: string): string | null;
|
99
|
+
/**
|
100
|
+
* Finds the functions directory
|
101
|
+
* @param startDir The directory to start searching from
|
102
|
+
* @returns Path to functions directory or null if not found
|
103
|
+
*/
|
104
|
+
findFunctionsDirectory(startDir: string): string | null;
|
105
|
+
/**
|
106
|
+
* Recursively searches for the functions directory
|
107
|
+
* @param dir The directory to search
|
108
|
+
* @param depth Current search depth
|
109
|
+
* @returns Path to functions directory or null
|
110
|
+
*/
|
111
|
+
private findFunctionsDirectoryRecursive;
|
112
|
+
/**
|
113
|
+
* Gets a summary of all discoverable configuration files
|
114
|
+
* Useful for debugging configuration issues
|
115
|
+
* @param startDir The directory to start searching from
|
116
|
+
* @returns Object containing paths to all discovered config types
|
117
|
+
*/
|
118
|
+
getConfigurationSummary(startDir: string): {
|
119
|
+
yaml: string | null;
|
120
|
+
typescript: string | null;
|
121
|
+
json: string | null;
|
122
|
+
appwriteDirectory: string | null;
|
123
|
+
functionsDirectory: string | null;
|
124
|
+
selectedConfig: string | null;
|
125
|
+
};
|
126
|
+
}
|
@@ -0,0 +1,374 @@
|
|
1
|
+
import fs from "fs";
|
2
|
+
import path from "path";
|
3
|
+
import { MessageFormatter } from "../../shared/messageFormatter.js";
|
4
|
+
import { shouldIgnoreDirectory } from "../../utils/directoryUtils.js";
|
5
|
+
/**
|
6
|
+
* Service for discovering Appwrite configuration files and collection/table definitions.
|
7
|
+
*
|
8
|
+
* Search Priority:
|
9
|
+
* 1. YAML configs (.appwrite/config.yaml, .appwrite/config.yml, etc.)
|
10
|
+
* 2. TypeScript configs (appwriteConfig.ts)
|
11
|
+
* 3. JSON configs (appwrite.json, appwrite.config.json)
|
12
|
+
*
|
13
|
+
* Features:
|
14
|
+
* - Searches up directory tree (max 5 levels)
|
15
|
+
* - Ignores common directories (node_modules, .git, etc.)
|
16
|
+
* - Discovers both collections/ and tables/ directories
|
17
|
+
* - Recursive subdirectory scanning for .appwrite folders
|
18
|
+
*/
|
19
|
+
export class ConfigDiscoveryService {
|
20
|
+
/**
|
21
|
+
* YAML configuration file names to search for
|
22
|
+
*/
|
23
|
+
YAML_FILENAMES = [
|
24
|
+
".appwrite/config.yaml",
|
25
|
+
".appwrite/config.yml",
|
26
|
+
".appwrite/appwriteConfig.yaml",
|
27
|
+
".appwrite/appwriteConfig.yml",
|
28
|
+
"appwrite.yaml",
|
29
|
+
"appwrite.yml",
|
30
|
+
];
|
31
|
+
/**
|
32
|
+
* TypeScript configuration file names to search for
|
33
|
+
*/
|
34
|
+
TS_FILENAMES = ["appwriteConfig.ts"];
|
35
|
+
/**
|
36
|
+
* JSON configuration file names to search for
|
37
|
+
*/
|
38
|
+
JSON_FILENAMES = ["appwrite.json", "appwrite.config.json"];
|
39
|
+
/**
|
40
|
+
* Maximum levels to search up the directory tree
|
41
|
+
*/
|
42
|
+
MAX_SEARCH_DEPTH = 5;
|
43
|
+
/**
|
44
|
+
* Finds any configuration file with priority: YAML → TypeScript → JSON
|
45
|
+
* @param startDir The directory to start searching from
|
46
|
+
* @returns Path to the configuration file or null if not found
|
47
|
+
*/
|
48
|
+
findConfig(startDir) {
|
49
|
+
// Try YAML first (highest priority)
|
50
|
+
const yamlConfig = this.findYamlConfig(startDir);
|
51
|
+
if (yamlConfig) {
|
52
|
+
return yamlConfig;
|
53
|
+
}
|
54
|
+
// Try TypeScript second
|
55
|
+
const tsConfig = this.findTypeScriptConfig(startDir);
|
56
|
+
if (tsConfig) {
|
57
|
+
return tsConfig;
|
58
|
+
}
|
59
|
+
// Try JSON last (lowest priority)
|
60
|
+
const jsonConfig = this.findProjectConfig(startDir);
|
61
|
+
if (jsonConfig) {
|
62
|
+
return jsonConfig;
|
63
|
+
}
|
64
|
+
return null;
|
65
|
+
}
|
66
|
+
/**
|
67
|
+
* Finds YAML configuration files
|
68
|
+
* Searches current directory, subdirectories, and parent directory
|
69
|
+
* @param startDir The directory to start searching from
|
70
|
+
* @returns Path to the YAML config file or null if not found
|
71
|
+
*/
|
72
|
+
findYamlConfig(startDir) {
|
73
|
+
// First check current directory for YAML configs
|
74
|
+
for (const fileName of this.YAML_FILENAMES) {
|
75
|
+
const configPath = path.join(startDir, fileName);
|
76
|
+
if (fs.existsSync(configPath)) {
|
77
|
+
return configPath;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
// Recursively search subdirectories for .appwrite folders
|
81
|
+
const yamlConfigInSubdirs = this.findYamlConfigRecursive(startDir);
|
82
|
+
if (yamlConfigInSubdirs) {
|
83
|
+
return yamlConfigInSubdirs;
|
84
|
+
}
|
85
|
+
// Check one level up to avoid infinite traversal
|
86
|
+
const parentDir = path.dirname(startDir);
|
87
|
+
if (parentDir !== startDir && path.basename(parentDir) !== "node_modules") {
|
88
|
+
for (const fileName of this.YAML_FILENAMES) {
|
89
|
+
const configPath = path.join(parentDir, fileName);
|
90
|
+
if (fs.existsSync(configPath)) {
|
91
|
+
return configPath;
|
92
|
+
}
|
93
|
+
}
|
94
|
+
}
|
95
|
+
return null;
|
96
|
+
}
|
97
|
+
/**
|
98
|
+
* Recursively searches for YAML configs in .appwrite subdirectories
|
99
|
+
* @param dir The directory to search
|
100
|
+
* @param depth Current search depth
|
101
|
+
* @returns Path to YAML config or null
|
102
|
+
*/
|
103
|
+
findYamlConfigRecursive(dir, depth = 0) {
|
104
|
+
// Limit search depth to prevent infinite recursion
|
105
|
+
if (depth > this.MAX_SEARCH_DEPTH) {
|
106
|
+
return null;
|
107
|
+
}
|
108
|
+
if (shouldIgnoreDirectory(path.basename(dir))) {
|
109
|
+
return null;
|
110
|
+
}
|
111
|
+
try {
|
112
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
113
|
+
for (const entry of entries) {
|
114
|
+
if (entry.isDirectory() && !shouldIgnoreDirectory(entry.name)) {
|
115
|
+
const fullPath = path.join(dir, entry.name);
|
116
|
+
// Check if this is an .appwrite directory
|
117
|
+
if (entry.name === ".appwrite") {
|
118
|
+
const configPaths = [
|
119
|
+
path.join(fullPath, "config.yaml"),
|
120
|
+
path.join(fullPath, "config.yml"),
|
121
|
+
path.join(fullPath, "appwriteConfig.yaml"),
|
122
|
+
path.join(fullPath, "appwriteConfig.yml"),
|
123
|
+
];
|
124
|
+
for (const configPath of configPaths) {
|
125
|
+
if (fs.existsSync(configPath)) {
|
126
|
+
return configPath;
|
127
|
+
}
|
128
|
+
}
|
129
|
+
}
|
130
|
+
// Recurse into other directories with increased depth
|
131
|
+
const result = this.findYamlConfigRecursive(fullPath, depth + 1);
|
132
|
+
if (result)
|
133
|
+
return result;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
catch (error) {
|
138
|
+
// Ignore directory access errors
|
139
|
+
}
|
140
|
+
return null;
|
141
|
+
}
|
142
|
+
/**
|
143
|
+
* Finds TypeScript configuration files (appwriteConfig.ts)
|
144
|
+
* @param startDir The directory to start searching from
|
145
|
+
* @returns Path to the TypeScript config file or null if not found
|
146
|
+
*/
|
147
|
+
findTypeScriptConfig(startDir) {
|
148
|
+
return this.findTypeScriptConfigRecursive(startDir);
|
149
|
+
}
|
150
|
+
/**
|
151
|
+
* Recursively searches for TypeScript configuration files
|
152
|
+
* @param dir The directory to search
|
153
|
+
* @param depth Current search depth
|
154
|
+
* @returns Path to TypeScript config or null
|
155
|
+
*/
|
156
|
+
findTypeScriptConfigRecursive(dir, depth = 0) {
|
157
|
+
// Limit search depth to prevent infinite recursion
|
158
|
+
if (depth > 10) {
|
159
|
+
return null;
|
160
|
+
}
|
161
|
+
if (shouldIgnoreDirectory(path.basename(dir))) {
|
162
|
+
return null;
|
163
|
+
}
|
164
|
+
try {
|
165
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
166
|
+
// First check current directory for appwriteConfig.ts
|
167
|
+
for (const entry of entries) {
|
168
|
+
if (entry.isFile() && this.TS_FILENAMES.includes(entry.name)) {
|
169
|
+
return path.join(dir, entry.name);
|
170
|
+
}
|
171
|
+
}
|
172
|
+
// Then search subdirectories
|
173
|
+
for (const entry of entries) {
|
174
|
+
if (entry.isDirectory() && !shouldIgnoreDirectory(entry.name)) {
|
175
|
+
const result = this.findTypeScriptConfigRecursive(path.join(dir, entry.name), depth + 1);
|
176
|
+
if (result)
|
177
|
+
return result;
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
catch (error) {
|
182
|
+
// Ignore directory access errors
|
183
|
+
}
|
184
|
+
return null;
|
185
|
+
}
|
186
|
+
/**
|
187
|
+
* Finds project configuration JSON files (appwrite.json, appwrite.config.json)
|
188
|
+
* Searches up to 5 levels up the directory tree
|
189
|
+
* @param startDir The directory to start searching from
|
190
|
+
* @returns Path to the JSON config file or null if not found
|
191
|
+
*/
|
192
|
+
findProjectConfig(startDir = process.cwd()) {
|
193
|
+
let currentDir = startDir;
|
194
|
+
// Search up to MAX_SEARCH_DEPTH levels up the directory tree
|
195
|
+
for (let i = 0; i < this.MAX_SEARCH_DEPTH; i++) {
|
196
|
+
for (const configName of this.JSON_FILENAMES) {
|
197
|
+
const configPath = path.join(currentDir, configName);
|
198
|
+
if (fs.existsSync(configPath)) {
|
199
|
+
return configPath;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
const parentDir = path.dirname(currentDir);
|
203
|
+
if (parentDir === currentDir) {
|
204
|
+
break; // Reached filesystem root
|
205
|
+
}
|
206
|
+
currentDir = parentDir;
|
207
|
+
}
|
208
|
+
return null;
|
209
|
+
}
|
210
|
+
/**
|
211
|
+
* Discovers collection YAML files in a collections/ directory
|
212
|
+
* @param collectionsDir Path to the collections directory
|
213
|
+
* @returns Discovery result with file paths
|
214
|
+
*/
|
215
|
+
async discoverCollections(collectionsDir) {
|
216
|
+
if (!fs.existsSync(collectionsDir)) {
|
217
|
+
return {
|
218
|
+
found: false,
|
219
|
+
type: "none",
|
220
|
+
files: [],
|
221
|
+
};
|
222
|
+
}
|
223
|
+
try {
|
224
|
+
const files = fs.readdirSync(collectionsDir);
|
225
|
+
const collectionFiles = files.filter((file) => (file.endsWith(".yaml") ||
|
226
|
+
file.endsWith(".yml") ||
|
227
|
+
file.endsWith(".ts")) &&
|
228
|
+
file !== "index.ts");
|
229
|
+
if (collectionFiles.length === 0) {
|
230
|
+
return {
|
231
|
+
found: false,
|
232
|
+
type: "none",
|
233
|
+
files: [],
|
234
|
+
};
|
235
|
+
}
|
236
|
+
MessageFormatter.success(`Discovered ${collectionFiles.length} collection file(s) in ${collectionsDir}`, { prefix: "Discovery" });
|
237
|
+
return {
|
238
|
+
found: true,
|
239
|
+
path: collectionsDir,
|
240
|
+
type: "yaml",
|
241
|
+
files: collectionFiles,
|
242
|
+
};
|
243
|
+
}
|
244
|
+
catch (error) {
|
245
|
+
MessageFormatter.error(`Error discovering collections in ${collectionsDir}`, error instanceof Error ? error : undefined, { prefix: "Discovery" });
|
246
|
+
return {
|
247
|
+
found: false,
|
248
|
+
type: "none",
|
249
|
+
files: [],
|
250
|
+
};
|
251
|
+
}
|
252
|
+
}
|
253
|
+
/**
|
254
|
+
* Discovers table YAML files in a tables/ directory
|
255
|
+
* @param tablesDir Path to the tables directory
|
256
|
+
* @returns Discovery result with file paths
|
257
|
+
*/
|
258
|
+
async discoverTables(tablesDir) {
|
259
|
+
if (!fs.existsSync(tablesDir)) {
|
260
|
+
return {
|
261
|
+
found: false,
|
262
|
+
type: "none",
|
263
|
+
files: [],
|
264
|
+
};
|
265
|
+
}
|
266
|
+
try {
|
267
|
+
const files = fs.readdirSync(tablesDir);
|
268
|
+
const tableFiles = files.filter((file) => (file.endsWith(".yaml") ||
|
269
|
+
file.endsWith(".yml") ||
|
270
|
+
file.endsWith(".ts")) &&
|
271
|
+
file !== "index.ts");
|
272
|
+
if (tableFiles.length === 0) {
|
273
|
+
return {
|
274
|
+
found: false,
|
275
|
+
type: "none",
|
276
|
+
files: [],
|
277
|
+
};
|
278
|
+
}
|
279
|
+
MessageFormatter.success(`Discovered ${tableFiles.length} table file(s) in ${tablesDir}`, { prefix: "Discovery" });
|
280
|
+
return {
|
281
|
+
found: true,
|
282
|
+
path: tablesDir,
|
283
|
+
type: "yaml",
|
284
|
+
files: tableFiles,
|
285
|
+
};
|
286
|
+
}
|
287
|
+
catch (error) {
|
288
|
+
MessageFormatter.error(`Error discovering tables in ${tablesDir}`, error instanceof Error ? error : undefined, { prefix: "Discovery" });
|
289
|
+
return {
|
290
|
+
found: false,
|
291
|
+
type: "none",
|
292
|
+
files: [],
|
293
|
+
};
|
294
|
+
}
|
295
|
+
}
|
296
|
+
/**
|
297
|
+
* Finds the .appwrite configuration directory
|
298
|
+
* @param startDir The directory to start searching from
|
299
|
+
* @returns Path to .appwrite directory or null if not found
|
300
|
+
*/
|
301
|
+
findAppwriteDirectory(startDir) {
|
302
|
+
let currentDir = startDir;
|
303
|
+
// Search up to MAX_SEARCH_DEPTH levels up the directory tree
|
304
|
+
for (let i = 0; i < this.MAX_SEARCH_DEPTH; i++) {
|
305
|
+
const appwriteDir = path.join(currentDir, ".appwrite");
|
306
|
+
if (fs.existsSync(appwriteDir) && fs.statSync(appwriteDir).isDirectory()) {
|
307
|
+
return appwriteDir;
|
308
|
+
}
|
309
|
+
const parentDir = path.dirname(currentDir);
|
310
|
+
if (parentDir === currentDir) {
|
311
|
+
break; // Reached filesystem root
|
312
|
+
}
|
313
|
+
currentDir = parentDir;
|
314
|
+
}
|
315
|
+
return null;
|
316
|
+
}
|
317
|
+
/**
|
318
|
+
* Finds the functions directory
|
319
|
+
* @param startDir The directory to start searching from
|
320
|
+
* @returns Path to functions directory or null if not found
|
321
|
+
*/
|
322
|
+
findFunctionsDirectory(startDir) {
|
323
|
+
return this.findFunctionsDirectoryRecursive(startDir);
|
324
|
+
}
|
325
|
+
/**
|
326
|
+
* Recursively searches for the functions directory
|
327
|
+
* @param dir The directory to search
|
328
|
+
* @param depth Current search depth
|
329
|
+
* @returns Path to functions directory or null
|
330
|
+
*/
|
331
|
+
findFunctionsDirectoryRecursive(dir, depth = 0) {
|
332
|
+
// Limit search depth to prevent infinite recursion
|
333
|
+
if (depth > this.MAX_SEARCH_DEPTH) {
|
334
|
+
return null;
|
335
|
+
}
|
336
|
+
if (shouldIgnoreDirectory(path.basename(dir))) {
|
337
|
+
return null;
|
338
|
+
}
|
339
|
+
try {
|
340
|
+
const files = fs.readdirSync(dir, { withFileTypes: true });
|
341
|
+
for (const entry of files) {
|
342
|
+
if (!entry.isDirectory() || shouldIgnoreDirectory(entry.name)) {
|
343
|
+
continue;
|
344
|
+
}
|
345
|
+
if (entry.name === "functions") {
|
346
|
+
return path.join(dir, entry.name);
|
347
|
+
}
|
348
|
+
const result = this.findFunctionsDirectoryRecursive(path.join(dir, entry.name), depth + 1);
|
349
|
+
if (result)
|
350
|
+
return result;
|
351
|
+
}
|
352
|
+
}
|
353
|
+
catch (error) {
|
354
|
+
// Ignore directory access errors
|
355
|
+
}
|
356
|
+
return null;
|
357
|
+
}
|
358
|
+
/**
|
359
|
+
* Gets a summary of all discoverable configuration files
|
360
|
+
* Useful for debugging configuration issues
|
361
|
+
* @param startDir The directory to start searching from
|
362
|
+
* @returns Object containing paths to all discovered config types
|
363
|
+
*/
|
364
|
+
getConfigurationSummary(startDir) {
|
365
|
+
return {
|
366
|
+
yaml: this.findYamlConfig(startDir),
|
367
|
+
typescript: this.findTypeScriptConfig(startDir),
|
368
|
+
json: this.findProjectConfig(startDir),
|
369
|
+
appwriteDirectory: this.findAppwriteDirectory(startDir),
|
370
|
+
functionsDirectory: this.findFunctionsDirectory(startDir),
|
371
|
+
selectedConfig: this.findConfig(startDir),
|
372
|
+
};
|
373
|
+
}
|
374
|
+
}
|
@@ -0,0 +1,105 @@
|
|
1
|
+
import type { AppwriteConfig, Collection } from "appwrite-utils";
|
2
|
+
import { type YamlSessionOptions } from "../yamlConfig.js";
|
3
|
+
/**
|
4
|
+
* Options for loading collections or tables
|
5
|
+
*/
|
6
|
+
export interface CollectionLoadOptions {
|
7
|
+
/**
|
8
|
+
* Whether to mark loaded items as coming from tables directory
|
9
|
+
*/
|
10
|
+
markAsTablesDir?: boolean;
|
11
|
+
/**
|
12
|
+
* Set of existing collection names to check for conflicts
|
13
|
+
*/
|
14
|
+
existingNames?: Set<string>;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Service for loading and parsing Appwrite configuration files.
|
18
|
+
*
|
19
|
+
* Supports:
|
20
|
+
* - YAML configuration files (.appwrite/config.yaml)
|
21
|
+
* - TypeScript configuration files (appwriteConfig.ts)
|
22
|
+
* - JSON project configuration files (appwrite.json)
|
23
|
+
* - Collection and table YAML/TypeScript definitions
|
24
|
+
*
|
25
|
+
* Features:
|
26
|
+
* - Auto-detects configuration file type
|
27
|
+
* - Converts between different configuration formats
|
28
|
+
* - Loads collections and tables from directories
|
29
|
+
* - Handles session preservation
|
30
|
+
* - Validates and normalizes configuration data
|
31
|
+
*/
|
32
|
+
export declare class ConfigLoaderService {
|
33
|
+
/**
|
34
|
+
* Loads configuration from a discovered path, auto-detecting the type
|
35
|
+
* @param configPath Path to the configuration file
|
36
|
+
* @param sessionOptions Optional session preservation options
|
37
|
+
* @returns Parsed AppwriteConfig
|
38
|
+
*/
|
39
|
+
loadFromPath(configPath: string, sessionOptions?: YamlSessionOptions): Promise<AppwriteConfig>;
|
40
|
+
/**
|
41
|
+
* Loads a YAML configuration file
|
42
|
+
* @param yamlPath Path to the YAML config file
|
43
|
+
* @param sessionOptions Optional session preservation options
|
44
|
+
* @returns Parsed AppwriteConfig
|
45
|
+
*/
|
46
|
+
loadYaml(yamlPath: string, sessionOptions?: YamlSessionOptions): Promise<AppwriteConfig>;
|
47
|
+
/**
|
48
|
+
* Loads a TypeScript configuration file
|
49
|
+
* @param tsPath Path to the TypeScript config file
|
50
|
+
* @returns Parsed AppwriteConfig
|
51
|
+
*/
|
52
|
+
loadTypeScript(tsPath: string): Promise<AppwriteConfig>;
|
53
|
+
/**
|
54
|
+
* Loads an appwrite.json project configuration file
|
55
|
+
* Converts projectId → appwriteProject and detects API mode
|
56
|
+
* @param jsonPath Path to the JSON config file
|
57
|
+
* @returns Partial AppwriteConfig (requires merging with defaults)
|
58
|
+
*/
|
59
|
+
loadProjectConfig(jsonPath: string): Promise<Partial<AppwriteConfig>>;
|
60
|
+
/**
|
61
|
+
* Loads all collections from a collections/ directory
|
62
|
+
* Supports both YAML (.yaml, .yml) and TypeScript (.ts) files
|
63
|
+
* @param collectionsDir Path to the collections directory
|
64
|
+
* @param options Loading options
|
65
|
+
* @returns Array of loaded Collection objects
|
66
|
+
*/
|
67
|
+
loadCollections(collectionsDir: string, options?: CollectionLoadOptions): Promise<Collection[]>;
|
68
|
+
/**
|
69
|
+
* Loads all tables from a tables/ directory
|
70
|
+
* Supports both YAML (.yaml, .yml) and TypeScript (.ts) files
|
71
|
+
* @param tablesDir Path to the tables directory
|
72
|
+
* @param options Loading options
|
73
|
+
* @returns Array of loaded table objects
|
74
|
+
*/
|
75
|
+
loadTables(tablesDir: string, options?: CollectionLoadOptions): Promise<any[]>;
|
76
|
+
/**
|
77
|
+
* Loads collections and tables with conflict detection
|
78
|
+
* Collections take priority over tables when names conflict
|
79
|
+
* @param collectionsDir Path to collections directory
|
80
|
+
* @param tablesDir Path to tables directory
|
81
|
+
* @returns Object containing combined arrays and conflict information
|
82
|
+
*/
|
83
|
+
loadCollectionsAndTables(collectionsDir: string, tablesDir: string): Promise<{
|
84
|
+
items: Collection[];
|
85
|
+
fromCollections: number;
|
86
|
+
fromTables: number;
|
87
|
+
conflicts: Array<{
|
88
|
+
name: string;
|
89
|
+
source1: string;
|
90
|
+
source2: string;
|
91
|
+
}>;
|
92
|
+
}>;
|
93
|
+
/**
|
94
|
+
* Validates that a configuration file can be loaded
|
95
|
+
* @param configPath Path to the configuration file
|
96
|
+
* @returns True if the file can be loaded, false otherwise
|
97
|
+
*/
|
98
|
+
canLoadConfig(configPath: string): boolean;
|
99
|
+
/**
|
100
|
+
* Gets the type of a configuration file
|
101
|
+
* @param configPath Path to the configuration file
|
102
|
+
* @returns Configuration type or null if unknown
|
103
|
+
*/
|
104
|
+
getConfigType(configPath: string): "yaml" | "typescript" | "json" | null;
|
105
|
+
}
|