appwrite-utils-cli 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -1,446 +0,0 @@
1
- import type { CollectionCreate, ImportDef } from "appwrite-utils";
2
- import { YamlImportConfigLoader, type YamlImportConfig } from "./YamlImportConfigLoader.js";
3
- import { createImportSchemas, createImportExamples } from "./generateImportSchemas.js";
4
- import { logger } from 'appwrite-utils-helpers';
5
- import { normalizeYamlData, usesTableTerminology, convertTerminology, type YamlCollectionData } from "appwrite-utils-helpers";
6
- import path from "path";
7
- import fs from "fs";
8
- import yaml from "js-yaml";
9
-
10
- /**
11
- * Integration service that bridges YAML import configurations with the existing import system.
12
- * Provides seamless integration between new YAML configs and legacy TypeScript collection definitions.
13
- */
14
- export class YamlImportIntegration {
15
- private configLoader: YamlImportConfigLoader;
16
- private appwriteFolderPath: string;
17
-
18
- constructor(appwriteFolderPath: string) {
19
- this.appwriteFolderPath = appwriteFolderPath;
20
- this.configLoader = new YamlImportConfigLoader(appwriteFolderPath);
21
- }
22
-
23
- /**
24
- * Initializes the YAML import system.
25
- * Creates necessary directories, schemas, and example files.
26
- */
27
- async initialize(): Promise<void> {
28
- try {
29
- // Create import directory structure
30
- await this.configLoader.createImportStructure();
31
-
32
- // Generate JSON schemas for IntelliSense
33
- await createImportSchemas(this.appwriteFolderPath);
34
-
35
- // Create example configurations
36
- await createImportExamples(this.appwriteFolderPath);
37
-
38
- logger.info("YAML import system initialized successfully");
39
- } catch (error) {
40
- logger.error("Failed to initialize YAML import system:", error);
41
- throw error;
42
- }
43
- }
44
-
45
- /**
46
- * Merges YAML import configurations with existing collection definitions.
47
- * Allows collections to have both TypeScript and YAML import definitions.
48
- *
49
- * @param collections - Existing collection configurations
50
- * @returns Collections with merged import definitions
51
- */
52
- async mergeWithCollections(collections: CollectionCreate[]): Promise<CollectionCreate[]> {
53
- try {
54
- // Load all YAML import configurations
55
- const yamlConfigs = await this.configLoader.loadAllImportConfigs();
56
-
57
- if (yamlConfigs.size === 0) {
58
- logger.info("No YAML import configurations found, using existing collection definitions");
59
- return collections;
60
- }
61
-
62
- logger.info(`Found YAML import configurations for ${yamlConfigs.size} collections`);
63
-
64
- const mergedCollections = [...collections];
65
-
66
- // Process each collection with YAML configs
67
- for (const [collectionName, yamlConfigList] of yamlConfigs.entries()) {
68
- const existingCollection = mergedCollections.find(c => c.name === collectionName);
69
-
70
- if (existingCollection) {
71
- // Merge with existing collection
72
- const yamlImportDefs = yamlConfigList.map(yamlConfig =>
73
- this.configLoader.convertToImportDef(yamlConfig)
74
- );
75
-
76
- // Combine existing and YAML import definitions
77
- const existingImportDefs = existingCollection.importDefs || [];
78
- existingCollection.importDefs = [...existingImportDefs, ...yamlImportDefs];
79
-
80
- logger.info(`Merged ${yamlImportDefs.length} YAML import definitions with collection: ${collectionName}`);
81
- } else {
82
- // Create new collection from YAML config
83
- const yamlImportDefs = yamlConfigList.map(yamlConfig =>
84
- this.configLoader.convertToImportDef(yamlConfig)
85
- );
86
-
87
- const newCollection: CollectionCreate = {
88
- name: collectionName,
89
- $id: collectionName.toLowerCase().replace(/\s+/g, '_'),
90
- enabled: true,
91
- documentSecurity: false,
92
- $permissions: [],
93
- attributes: [], // Will be populated from existing collection or schema
94
- indexes: [],
95
- importDefs: yamlImportDefs,
96
- };
97
-
98
- mergedCollections.push(newCollection);
99
- logger.info(`Created new collection from YAML config: ${collectionName}`);
100
- }
101
- }
102
-
103
- return mergedCollections;
104
- } catch (error) {
105
- logger.error("Failed to merge YAML configurations with collections:", error);
106
- // Return original collections on error to avoid breaking existing functionality
107
- return collections;
108
- }
109
- }
110
-
111
- /**
112
- * Validates YAML import configurations against existing collection schemas.
113
- * Ensures that all target fields exist in the collection definitions.
114
- *
115
- * @param collections - Collection definitions to validate against
116
- * @returns Validation results with errors and warnings
117
- */
118
- async validateConfigurations(collections: CollectionCreate[]): Promise<{
119
- isValid: boolean;
120
- errors: string[];
121
- warnings: string[];
122
- }> {
123
- const errors: string[] = [];
124
- const warnings: string[] = [];
125
-
126
- try {
127
- const yamlConfigs = await this.configLoader.loadAllImportConfigs();
128
-
129
- for (const [collectionName, yamlConfigList] of yamlConfigs.entries()) {
130
- const collection = collections.find(c => c.name === collectionName);
131
-
132
- if (!collection) {
133
- warnings.push(`YAML import config references non-existent collection: ${collectionName}`);
134
- continue;
135
- }
136
-
137
- for (let i = 0; i < yamlConfigList.length; i++) {
138
- const yamlConfig = yamlConfigList[i];
139
- const configErrors = this.configLoader.validateAgainstCollection(
140
- yamlConfig,
141
- collection.attributes || []
142
- );
143
-
144
- errors.push(...configErrors.map(err =>
145
- `${collectionName}[${i}]: ${err}`
146
- ));
147
-
148
- // Additional validation
149
- this.validateSourceFiles(yamlConfig, errors, collectionName, i);
150
- this.validateConverters(yamlConfig, warnings, collectionName, i);
151
- }
152
- }
153
-
154
- return {
155
- isValid: errors.length === 0,
156
- errors,
157
- warnings,
158
- };
159
- } catch (error) {
160
- errors.push(`Failed to validate YAML configurations: ${error}`);
161
- return {
162
- isValid: false,
163
- errors,
164
- warnings,
165
- };
166
- }
167
- }
168
-
169
- /**
170
- * Validates that source files exist for import configurations.
171
- */
172
- private validateSourceFiles(
173
- yamlConfig: YamlImportConfig,
174
- errors: string[],
175
- collectionName: string,
176
- configIndex: number
177
- ): void {
178
- const sourceFilePath = path.resolve(this.appwriteFolderPath, yamlConfig.source.file);
179
-
180
- if (!fs.existsSync(sourceFilePath)) {
181
- errors.push(
182
- `${collectionName}[${configIndex}]: Source file not found: ${yamlConfig.source.file}`
183
- );
184
- }
185
- }
186
-
187
- /**
188
- * Validates that converter functions are available.
189
- */
190
- private validateConverters(
191
- yamlConfig: YamlImportConfig,
192
- warnings: string[],
193
- collectionName: string,
194
- configIndex: number
195
- ): void {
196
- const availableConverters = [
197
- "anyToString",
198
- "anyToNumber",
199
- "anyToBoolean",
200
- "anyToDate",
201
- "stringToLowerCase",
202
- "stringToUpperCase",
203
- "stringTrim",
204
- "numberToString",
205
- "booleanToString",
206
- "dateToString",
207
- "dateToTimestamp",
208
- "timestampToDate",
209
- "arrayToString",
210
- "stringToArray",
211
- "removeNulls",
212
- "removeEmpty"
213
- ];
214
-
215
- for (const mapping of yamlConfig.mapping.attributes) {
216
- for (const converter of mapping.converters) {
217
- const cleanConverter = converter.replace(/\[arr\]/gi, "").replace(/\[Arr\]/gi, "");
218
- if (!availableConverters.includes(cleanConverter)) {
219
- warnings.push(
220
- `${collectionName}[${configIndex}]: Unknown converter '${converter}' in mapping for '${mapping.targetKey}'`
221
- );
222
- }
223
- }
224
- }
225
- }
226
-
227
- /**
228
- * Generates a YAML import configuration from an existing ImportDef.
229
- * Useful for migrating TypeScript configurations to YAML.
230
- * Supports both collection and table terminology.
231
- *
232
- * @param importDef - Existing ImportDef to convert
233
- * @param collectionName - Name of the collection
234
- * @param useTableTerminology - Whether to use table terminology
235
- * @returns YAML configuration string
236
- */
237
- convertImportDefToYaml(
238
- importDef: ImportDef,
239
- collectionName: string,
240
- useTableTerminology = false
241
- ): string {
242
- const yamlConfig: YamlImportConfig = {
243
- source: {
244
- file: importDef.filePath,
245
- basePath: importDef.basePath,
246
- type: "json",
247
- },
248
- target: {
249
- collection: collectionName,
250
- type: importDef.type || "create",
251
- primaryKey: importDef.primaryKeyField,
252
- createUsers: importDef.createUsers || false,
253
- },
254
- mapping: {
255
- attributes: importDef.attributeMappings.map(attr => ({
256
- oldKey: attr.oldKey,
257
- oldKeys: attr.oldKeys,
258
- targetKey: attr.targetKey,
259
- valueToSet: attr.valueToSet,
260
- fileData: attr.fileData,
261
- converters: attr.converters || [],
262
- validation: (attr.validationActions || []).map(v => ({
263
- rule: v.action,
264
- params: v.params,
265
- })),
266
- afterImport: (attr.postImportActions || []).map(a => ({
267
- action: a.action,
268
- params: a.params,
269
- })),
270
- })),
271
- relationships: (importDef.idMappings || []).map(rel => ({
272
- sourceField: rel.sourceField,
273
- targetField: rel.targetField,
274
- targetCollection: rel.targetCollection,
275
- fieldToSet: rel.fieldToSet,
276
- targetFieldToMatch: rel.targetFieldToMatch,
277
- })),
278
- },
279
- options: {
280
- batchSize: 50,
281
- skipValidation: false,
282
- dryRun: false,
283
- continueOnError: true,
284
- updateMapping: importDef.updateMapping,
285
- },
286
- };
287
-
288
- const yamlContent = yaml.dump(yamlConfig, {
289
- indent: 2,
290
- lineWidth: 120,
291
- sortKeys: false,
292
- });
293
-
294
- const entityType = useTableTerminology ? 'Table' : 'Collection';
295
- return `# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json\n# Import Configuration for ${entityType}: ${collectionName}\n\n${yamlContent}`;
296
- }
297
-
298
- /**
299
- * Exports existing TypeScript import configurations to YAML files.
300
- * Helps migrate from TypeScript to YAML-based configurations.
301
- * Supports both collection and table terminology.
302
- *
303
- * @param collections - Collections with existing import definitions
304
- * @param useTableTerminology - Whether to use table terminology
305
- */
306
- async exportToYaml(
307
- collections: CollectionCreate[],
308
- useTableTerminology = false
309
- ): Promise<void> {
310
- const exportDir = path.join(this.appwriteFolderPath, "import", "exported");
311
-
312
- if (!fs.existsSync(exportDir)) {
313
- fs.mkdirSync(exportDir, { recursive: true });
314
- }
315
-
316
- let exportedCount = 0;
317
-
318
- for (const collection of collections) {
319
- if (!collection.importDefs || collection.importDefs.length === 0) {
320
- continue;
321
- }
322
-
323
- for (let i = 0; i < collection.importDefs.length; i++) {
324
- const importDef = collection.importDefs[i];
325
- const yamlContent = this.convertImportDefToYaml(
326
- importDef,
327
- collection.name,
328
- useTableTerminology
329
- );
330
-
331
- const entityType = useTableTerminology ? 'table' : 'collection';
332
- const filename = collection.importDefs.length > 1
333
- ? `${collection.name}-${entityType}-${i + 1}.yaml`
334
- : `${collection.name}-${entityType}.yaml`;
335
-
336
- const filePath = path.join(exportDir, filename);
337
- fs.writeFileSync(filePath, yamlContent);
338
- exportedCount++;
339
-
340
- logger.info(`Exported import configuration: ${filePath}`);
341
- }
342
- }
343
-
344
- logger.info(`Exported ${exportedCount} import configurations to YAML`);
345
- }
346
-
347
- /**
348
- * Gets statistics about YAML import configurations.
349
- */
350
- async getStatistics(): Promise<{
351
- hasYamlConfigs: boolean;
352
- totalConfigurations: number;
353
- collectionsWithConfigs: number;
354
- configurationsByType: { [type: string]: number };
355
- totalAttributeMappings: number;
356
- totalRelationshipMappings: number;
357
- }> {
358
- try {
359
- const yamlConfigs = await this.configLoader.loadAllImportConfigs();
360
- const stats = this.configLoader.getStatistics(yamlConfigs);
361
-
362
- return {
363
- hasYamlConfigs: yamlConfigs.size > 0,
364
- totalConfigurations: stats.totalConfigurations,
365
- collectionsWithConfigs: stats.collectionsWithConfigs,
366
- configurationsByType: stats.configsByType,
367
- totalAttributeMappings: stats.totalAttributeMappings,
368
- totalRelationshipMappings: stats.totalRelationshipMappings,
369
- };
370
- } catch (error) {
371
- logger.error("Failed to get YAML import statistics:", error);
372
- return {
373
- hasYamlConfigs: false,
374
- totalConfigurations: 0,
375
- collectionsWithConfigs: 0,
376
- configurationsByType: {},
377
- totalAttributeMappings: 0,
378
- totalRelationshipMappings: 0,
379
- };
380
- }
381
- }
382
-
383
- /**
384
- * Creates a new YAML import configuration from a template.
385
- * Supports both collection and table terminology.
386
- *
387
- * @param collectionName - Name of the collection
388
- * @param sourceFile - Source data file name
389
- * @param useTableTerminology - Whether to use table terminology
390
- * @param outputPath - Output file path (optional)
391
- */
392
- async createFromTemplate(
393
- collectionName: string,
394
- sourceFile: string,
395
- useTableTerminology = false,
396
- outputPath?: string
397
- ): Promise<string> {
398
- const template = this.configLoader.generateTemplate(
399
- collectionName,
400
- sourceFile,
401
- useTableTerminology
402
- );
403
-
404
- const entityType = useTableTerminology ? 'table' : 'collection';
405
- const fileName = outputPath || `${collectionName.toLowerCase()}-${entityType}-import.yaml`;
406
- const fullPath = path.join(this.appwriteFolderPath, "import", fileName);
407
-
408
- // Add schema reference to template with entity type comment
409
- const schemaHeader = "# yaml-language-server: $schema=../.yaml_schemas/import-config.schema.json\n";
410
- const entityComment = `# Import Configuration for ${useTableTerminology ? 'Table' : 'Collection'}: ${collectionName}\n`;
411
- const templateWithSchema = schemaHeader + entityComment + template;
412
-
413
- fs.writeFileSync(fullPath, templateWithSchema);
414
- logger.info(`Created YAML import configuration: ${fullPath}`);
415
-
416
- return fullPath;
417
- }
418
-
419
- /**
420
- * Checks if YAML import system is properly set up.
421
- */
422
- async isSetupComplete(): Promise<{
423
- isComplete: boolean;
424
- missingComponents: string[];
425
- }> {
426
- const missingComponents: string[] = [];
427
-
428
- // Check import directory
429
- const importDir = path.join(this.appwriteFolderPath, "import");
430
- if (!fs.existsSync(importDir)) {
431
- missingComponents.push("import directory");
432
- }
433
-
434
- // Check schema files
435
- const schemaDir = path.join(this.appwriteFolderPath, ".yaml_schemas");
436
- const importSchemaPath = path.join(schemaDir, "import-config.schema.json");
437
- if (!fs.existsSync(importSchemaPath)) {
438
- missingComponents.push("import configuration schema");
439
- }
440
-
441
- return {
442
- isComplete: missingComponents.length === 0,
443
- missingComponents,
444
- };
445
- }
446
- }