appwrite-utils-cli 0.10.85 → 1.0.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.
Files changed (178) hide show
  1. package/.appwrite/.yaml_schemas/appwrite-config.schema.json +380 -0
  2. package/.appwrite/.yaml_schemas/collection.schema.json +255 -0
  3. package/.appwrite/collections/Categories.yaml +182 -0
  4. package/.appwrite/collections/ExampleCollection.yaml +36 -0
  5. package/.appwrite/collections/Posts.yaml +227 -0
  6. package/.appwrite/collections/Users.yaml +149 -0
  7. package/.appwrite/config.yaml +109 -0
  8. package/.appwrite/import/README.md +148 -0
  9. package/.appwrite/import/categories-import.yaml +129 -0
  10. package/.appwrite/import/posts-import.yaml +208 -0
  11. package/.appwrite/import/users-import.yaml +130 -0
  12. package/.appwrite/importData/categories.json +194 -0
  13. package/.appwrite/importData/posts.json +270 -0
  14. package/.appwrite/importData/users.json +220 -0
  15. package/.appwrite/schemas/categories.json +128 -0
  16. package/.appwrite/schemas/exampleCollection.json +52 -0
  17. package/.appwrite/schemas/posts.json +173 -0
  18. package/.appwrite/schemas/users.json +125 -0
  19. package/README.md +261 -33
  20. package/dist/collections/attributes.js +3 -2
  21. package/dist/collections/methods.js +56 -38
  22. package/dist/config/yamlConfig.d.ts +501 -0
  23. package/dist/config/yamlConfig.js +452 -0
  24. package/dist/databases/setup.d.ts +6 -0
  25. package/dist/databases/setup.js +119 -0
  26. package/dist/functions/methods.d.ts +1 -1
  27. package/dist/functions/methods.js +5 -2
  28. package/dist/functions/openapi.d.ts +4 -0
  29. package/dist/functions/openapi.js +60 -0
  30. package/dist/interactiveCLI.d.ts +5 -0
  31. package/dist/interactiveCLI.js +196 -52
  32. package/dist/main.js +91 -30
  33. package/dist/migrations/afterImportActions.js +2 -2
  34. package/dist/migrations/appwriteToX.d.ts +10 -0
  35. package/dist/migrations/appwriteToX.js +15 -4
  36. package/dist/migrations/backup.d.ts +16 -16
  37. package/dist/migrations/dataLoader.d.ts +83 -1
  38. package/dist/migrations/dataLoader.js +4 -4
  39. package/dist/migrations/importController.js +25 -18
  40. package/dist/migrations/importDataActions.js +2 -2
  41. package/dist/migrations/logging.d.ts +9 -1
  42. package/dist/migrations/logging.js +41 -22
  43. package/dist/migrations/migrationHelper.d.ts +4 -4
  44. package/dist/migrations/relationships.js +1 -1
  45. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  46. package/dist/migrations/services/DataTransformationService.js +158 -0
  47. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  48. package/dist/migrations/services/FileHandlerService.js +236 -0
  49. package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
  50. package/dist/migrations/services/ImportOrchestrator.js +488 -0
  51. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  52. package/dist/migrations/services/RateLimitManager.js +279 -0
  53. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  54. package/dist/migrations/services/RelationshipResolver.js +332 -0
  55. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  56. package/dist/migrations/services/UserMappingService.js +277 -0
  57. package/dist/migrations/services/ValidationService.d.ts +74 -0
  58. package/dist/migrations/services/ValidationService.js +260 -0
  59. package/dist/migrations/transfer.d.ts +0 -6
  60. package/dist/migrations/transfer.js +16 -132
  61. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +384 -0
  62. package/dist/migrations/yaml/YamlImportConfigLoader.js +375 -0
  63. package/dist/migrations/yaml/YamlImportIntegration.d.ts +87 -0
  64. package/dist/migrations/yaml/YamlImportIntegration.js +330 -0
  65. package/dist/migrations/yaml/generateImportSchemas.d.ts +17 -0
  66. package/dist/migrations/yaml/generateImportSchemas.js +575 -0
  67. package/dist/schemas/authUser.d.ts +9 -9
  68. package/dist/shared/attributeManager.d.ts +17 -0
  69. package/dist/shared/attributeManager.js +273 -0
  70. package/dist/shared/confirmationDialogs.d.ts +75 -0
  71. package/dist/shared/confirmationDialogs.js +236 -0
  72. package/dist/shared/functionManager.d.ts +48 -0
  73. package/dist/shared/functionManager.js +322 -0
  74. package/dist/shared/indexManager.d.ts +24 -0
  75. package/dist/shared/indexManager.js +150 -0
  76. package/dist/shared/jsonSchemaGenerator.d.ts +51 -0
  77. package/dist/shared/jsonSchemaGenerator.js +313 -0
  78. package/dist/shared/logging.d.ts +10 -0
  79. package/dist/shared/logging.js +46 -0
  80. package/dist/shared/messageFormatter.d.ts +37 -0
  81. package/dist/shared/messageFormatter.js +152 -0
  82. package/dist/shared/migrationHelpers.d.ts +173 -0
  83. package/dist/shared/migrationHelpers.js +142 -0
  84. package/dist/shared/operationLogger.d.ts +3 -0
  85. package/dist/shared/operationLogger.js +25 -0
  86. package/dist/shared/operationQueue.d.ts +13 -0
  87. package/dist/shared/operationQueue.js +79 -0
  88. package/dist/shared/progressManager.d.ts +62 -0
  89. package/dist/shared/progressManager.js +215 -0
  90. package/dist/shared/schemaGenerator.d.ts +18 -0
  91. package/dist/shared/schemaGenerator.js +523 -0
  92. package/dist/storage/methods.d.ts +3 -1
  93. package/dist/storage/methods.js +144 -55
  94. package/dist/storage/schemas.d.ts +56 -16
  95. package/dist/types.d.ts +2 -2
  96. package/dist/types.js +1 -1
  97. package/dist/users/methods.d.ts +16 -0
  98. package/dist/users/methods.js +276 -0
  99. package/dist/utils/configMigration.d.ts +1 -0
  100. package/dist/utils/configMigration.js +156 -0
  101. package/dist/utils/dataConverters.d.ts +46 -0
  102. package/dist/utils/dataConverters.js +139 -0
  103. package/dist/utils/loadConfigs.d.ts +15 -4
  104. package/dist/utils/loadConfigs.js +377 -51
  105. package/dist/utils/schemaStrings.js +2 -1
  106. package/dist/utils/setupFiles.d.ts +2 -1
  107. package/dist/utils/setupFiles.js +723 -28
  108. package/dist/utils/validationRules.d.ts +43 -0
  109. package/dist/utils/validationRules.js +42 -0
  110. package/dist/utils/yamlConverter.d.ts +48 -0
  111. package/dist/utils/yamlConverter.js +98 -0
  112. package/dist/utilsController.js +65 -43
  113. package/package.json +19 -15
  114. package/src/collections/attributes.ts +3 -2
  115. package/src/collections/methods.ts +85 -51
  116. package/src/config/yamlConfig.ts +488 -0
  117. package/src/{migrations/setupDatabase.ts → databases/setup.ts} +11 -5
  118. package/src/functions/methods.ts +8 -4
  119. package/src/functions/templates/count-docs-in-collection/package.json +25 -0
  120. package/src/functions/templates/count-docs-in-collection/tsconfig.json +28 -0
  121. package/src/functions/templates/typescript-node/package.json +24 -0
  122. package/src/functions/templates/typescript-node/tsconfig.json +28 -0
  123. package/src/functions/templates/uv/README.md +31 -0
  124. package/src/functions/templates/uv/pyproject.toml +29 -0
  125. package/src/interactiveCLI.ts +230 -63
  126. package/src/main.ts +111 -37
  127. package/src/migrations/afterImportActions.ts +2 -2
  128. package/src/migrations/appwriteToX.ts +17 -4
  129. package/src/migrations/dataLoader.ts +4 -4
  130. package/src/migrations/importController.ts +30 -22
  131. package/src/migrations/importDataActions.ts +2 -2
  132. package/src/migrations/relationships.ts +1 -1
  133. package/src/migrations/services/DataTransformationService.ts +196 -0
  134. package/src/migrations/services/FileHandlerService.ts +311 -0
  135. package/src/migrations/services/ImportOrchestrator.ts +669 -0
  136. package/src/migrations/services/RateLimitManager.ts +363 -0
  137. package/src/migrations/services/RelationshipResolver.ts +461 -0
  138. package/src/migrations/services/UserMappingService.ts +345 -0
  139. package/src/migrations/services/ValidationService.ts +349 -0
  140. package/src/migrations/transfer.ts +22 -228
  141. package/src/migrations/yaml/YamlImportConfigLoader.ts +427 -0
  142. package/src/migrations/yaml/YamlImportIntegration.ts +419 -0
  143. package/src/migrations/yaml/generateImportSchemas.ts +589 -0
  144. package/src/shared/attributeManager.ts +429 -0
  145. package/src/shared/confirmationDialogs.ts +327 -0
  146. package/src/shared/functionManager.ts +515 -0
  147. package/src/shared/indexManager.ts +253 -0
  148. package/src/shared/jsonSchemaGenerator.ts +403 -0
  149. package/src/shared/logging.ts +74 -0
  150. package/src/shared/messageFormatter.ts +195 -0
  151. package/src/{migrations/migrationHelper.ts → shared/migrationHelpers.ts} +22 -4
  152. package/src/{migrations/helper.ts → shared/operationLogger.ts} +7 -2
  153. package/src/{migrations/queue.ts → shared/operationQueue.ts} +1 -1
  154. package/src/shared/progressManager.ts +278 -0
  155. package/src/{migrations/schemaStrings.ts → shared/schemaGenerator.ts} +71 -17
  156. package/src/storage/methods.ts +199 -78
  157. package/src/types.ts +2 -2
  158. package/src/{migrations/users.ts → users/methods.ts} +2 -2
  159. package/src/utils/configMigration.ts +212 -0
  160. package/src/utils/loadConfigs.ts +414 -52
  161. package/src/utils/schemaStrings.ts +2 -1
  162. package/src/utils/setupFiles.ts +742 -40
  163. package/src/{migrations → utils}/validationRules.ts +1 -1
  164. package/src/utils/yamlConverter.ts +131 -0
  165. package/src/utilsController.ts +75 -54
  166. package/src/functions/templates/poetry/README.md +0 -30
  167. package/src/functions/templates/poetry/pyproject.toml +0 -16
  168. package/src/migrations/attributes.ts +0 -561
  169. package/src/migrations/backup.ts +0 -205
  170. package/src/migrations/databases.ts +0 -39
  171. package/src/migrations/dbHelpers.ts +0 -92
  172. package/src/migrations/indexes.ts +0 -40
  173. package/src/migrations/logging.ts +0 -29
  174. package/src/migrations/storage.ts +0 -538
  175. /package/src/{migrations → functions}/openapi.ts +0 -0
  176. /package/src/functions/templates/{poetry → uv}/src/__init__.py +0 -0
  177. /package/src/functions/templates/{poetry → uv}/src/index.py +0 -0
  178. /package/src/{migrations/converters.ts → utils/dataConverters.ts} +0 -0
@@ -0,0 +1,212 @@
1
+ import { promises as fs } from "fs";
2
+ import path from "path";
3
+ import { existsSync } from "fs";
4
+ import { MessageFormatter } from "../shared/messageFormatter.js";
5
+ import { ConfirmationDialogs } from "../shared/confirmationDialogs.js";
6
+ import yaml from "js-yaml";
7
+
8
+ interface AppwriteConfigTS {
9
+ appwriteEndpoint: string;
10
+ appwriteProject: string;
11
+ appwriteKey: string;
12
+ enableBackups?: boolean;
13
+ backupInterval?: number;
14
+ backupRetention?: number;
15
+ enableBackupCleanup?: boolean;
16
+ enableMockData?: boolean;
17
+ documentBucketId?: string;
18
+ usersCollectionName?: string;
19
+ databases: Array<{ $id: string; name: string }>;
20
+ buckets: Array<any>;
21
+ [key: string]: any;
22
+ }
23
+
24
+ interface AppwriteConfigYAML {
25
+ appwriteEndpoint: string;
26
+ appwriteProject: string;
27
+ appwriteKey: string;
28
+ enableBackups?: boolean;
29
+ backupInterval?: number;
30
+ backupRetention?: number;
31
+ enableBackupCleanup?: boolean;
32
+ enableMockData?: boolean;
33
+ documentBucketId?: string;
34
+ usersCollectionName?: string;
35
+ databases: Array<{ $id: string; name: string }>;
36
+ buckets: Array<any>;
37
+ [key: string]: any;
38
+ }
39
+
40
+ export async function migrateConfig(workingDir: string): Promise<void> {
41
+ try {
42
+ // Look for appwriteConfig.ts files in the working directory and subdirectories
43
+ const configFiles = await findAppwriteConfigFiles(workingDir);
44
+
45
+ if (configFiles.length === 0) {
46
+ MessageFormatter.info("No appwriteConfig.ts files found to migrate", { prefix: "Migration" });
47
+ return;
48
+ }
49
+
50
+ MessageFormatter.info(`Found ${configFiles.length} appwriteConfig.ts file(s) to migrate`, { prefix: "Migration" });
51
+
52
+ for (const configFile of configFiles) {
53
+ await migrateConfigFile(configFile, workingDir);
54
+ }
55
+
56
+ MessageFormatter.success("Migration completed successfully", { prefix: "Migration" });
57
+ } catch (error) {
58
+ MessageFormatter.error("Migration failed", error instanceof Error ? error : new Error(String(error)), { prefix: "Migration" });
59
+ throw error;
60
+ }
61
+ }
62
+
63
+ async function findAppwriteConfigFiles(dir: string): Promise<string[]> {
64
+ const configFiles: string[] = [];
65
+
66
+ const checkDir = async (currentDir: string) => {
67
+ try {
68
+ const entries = await fs.readdir(currentDir, { withFileTypes: true });
69
+
70
+ for (const entry of entries) {
71
+ const fullPath = path.join(currentDir, entry.name);
72
+
73
+ if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {
74
+ await checkDir(fullPath);
75
+ } else if (entry.isFile() && entry.name === 'appwriteConfig.ts') {
76
+ configFiles.push(fullPath);
77
+ }
78
+ }
79
+ } catch (error) {
80
+ // Ignore directory access errors
81
+ }
82
+ };
83
+
84
+ await checkDir(dir);
85
+ return configFiles;
86
+ }
87
+
88
+ async function migrateConfigFile(configFilePath: string, workingDir: string): Promise<void> {
89
+ const configDir = path.dirname(configFilePath);
90
+ const appwriteDir = path.join(configDir, '.appwrite');
91
+
92
+ MessageFormatter.info(`Migrating ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
93
+
94
+ // Check if .appwrite directory already exists
95
+ if (existsSync(appwriteDir)) {
96
+ const shouldOverwrite = await ConfirmationDialogs.confirmOverwrite(
97
+ `.appwrite directory already exists at ${path.relative(workingDir, appwriteDir)}`
98
+ );
99
+ if (!shouldOverwrite) {
100
+ MessageFormatter.info("Skipping migration for this config", { prefix: "Migration" });
101
+ return;
102
+ }
103
+ }
104
+
105
+ // Read and parse the TypeScript config
106
+ const configContent = await fs.readFile(configFilePath, 'utf8');
107
+ const config = await parseTypeScriptConfig(configContent);
108
+
109
+ // Create .appwrite directory
110
+ await fs.mkdir(appwriteDir, { recursive: true });
111
+
112
+ // Convert config to YAML and save
113
+ const yamlConfig = convertToYAMLConfig(config);
114
+ const yamlContent = yaml.dump(yamlConfig, {
115
+ indent: 2,
116
+ lineWidth: 120,
117
+ noRefs: true
118
+ });
119
+ await fs.writeFile(path.join(appwriteDir, 'appwriteConfig.yaml'), yamlContent);
120
+
121
+ // Move related directories
122
+ const foldersToMove = ['collections', 'schemas', 'importData', 'functions'];
123
+ for (const folder of foldersToMove) {
124
+ const sourcePath = path.join(configDir, folder);
125
+ const targetPath = path.join(appwriteDir, folder);
126
+
127
+ if (existsSync(sourcePath)) {
128
+ await fs.rename(sourcePath, targetPath);
129
+ MessageFormatter.info(`Moved ${folder}/ to .appwrite/${folder}/`, { prefix: "Migration" });
130
+ }
131
+ }
132
+
133
+ // Backup original config file
134
+ const backupPath = configFilePath + '.backup';
135
+ await fs.copyFile(configFilePath, backupPath);
136
+ MessageFormatter.info(`Created backup at ${path.relative(workingDir, backupPath)}`, { prefix: "Migration" });
137
+
138
+ // Optionally remove original config file
139
+ const shouldRemoveOriginal = await ConfirmationDialogs.confirmRemoval(
140
+ `Remove original ${path.relative(workingDir, configFilePath)}?`
141
+ );
142
+ if (shouldRemoveOriginal) {
143
+ await fs.unlink(configFilePath);
144
+ MessageFormatter.info(`Removed original ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
145
+ }
146
+
147
+ MessageFormatter.success(`Migration completed for ${path.relative(workingDir, configFilePath)}`, { prefix: "Migration" });
148
+ }
149
+
150
+ async function parseTypeScriptConfig(content: string): Promise<AppwriteConfigTS> {
151
+ // This is a simplified parser - in a real implementation, you might want to use a proper TypeScript parser
152
+ // For now, we'll use a regex-based approach to extract the config object
153
+
154
+ try {
155
+ // Remove comments and imports
156
+ const cleanContent = content
157
+ .replace(/\/\*[\s\S]*?\*\//g, '') // Remove block comments
158
+ .replace(/\/\/.*$/gm, '') // Remove line comments
159
+ .replace(/^import.*$/gm, '') // Remove imports
160
+ .replace(/^export.*$/gm, ''); // Remove exports
161
+
162
+ // Find the config object
163
+ const configMatch = cleanContent.match(/const\s+\w+\s*:\s*\w+\s*=\s*({[\s\S]*?});/);
164
+ if (!configMatch) {
165
+ throw new Error('Could not find config object in TypeScript file');
166
+ }
167
+
168
+ // Convert to JSON-like format and parse
169
+ let configStr = configMatch[1];
170
+
171
+ // Replace TypeScript-specific syntax
172
+ configStr = configStr
173
+ .replace(/(\w+):/g, '"$1":') // Quote property names
174
+ .replace(/'/g, '"') // Convert single quotes to double quotes
175
+ .replace(/,(\s*[}\]])/g, '$1'); // Remove trailing commas
176
+
177
+ const config = JSON.parse(configStr);
178
+ return config as AppwriteConfigTS;
179
+ } catch (error) {
180
+ MessageFormatter.error("Could not parse TypeScript config", error instanceof Error ? error : new Error(String(error)), { prefix: "Migration" });
181
+ throw new Error('Failed to parse TypeScript configuration file. Please ensure it follows standard format.');
182
+ }
183
+ }
184
+
185
+ function convertToYAMLConfig(config: AppwriteConfigTS): AppwriteConfigYAML {
186
+ // Convert the config to YAML-friendly format
187
+ const yamlConfig: AppwriteConfigYAML = {
188
+ appwriteEndpoint: config.appwriteEndpoint,
189
+ appwriteProject: config.appwriteProject,
190
+ appwriteKey: config.appwriteKey,
191
+ databases: config.databases || [],
192
+ buckets: config.buckets || [],
193
+ };
194
+
195
+ // Add optional properties if they exist
196
+ if (config.enableBackups !== undefined) yamlConfig.enableBackups = config.enableBackups;
197
+ if (config.backupInterval !== undefined) yamlConfig.backupInterval = config.backupInterval;
198
+ if (config.backupRetention !== undefined) yamlConfig.backupRetention = config.backupRetention;
199
+ if (config.enableBackupCleanup !== undefined) yamlConfig.enableBackupCleanup = config.enableBackupCleanup;
200
+ if (config.enableMockData !== undefined) yamlConfig.enableMockData = config.enableMockData;
201
+ if (config.documentBucketId !== undefined) yamlConfig.documentBucketId = config.documentBucketId;
202
+ if (config.usersCollectionName !== undefined) yamlConfig.usersCollectionName = config.usersCollectionName;
203
+
204
+ // Copy any additional properties
205
+ for (const [key, value] of Object.entries(config)) {
206
+ if (!(key in yamlConfig)) {
207
+ yamlConfig[key] = value;
208
+ }
209
+ }
210
+
211
+ return yamlConfig;
212
+ }