@njdamstra/appwrite-utils-cli 1.8.9

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 (392) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +1133 -0
  3. package/dist/adapters/AdapterFactory.d.ts +94 -0
  4. package/dist/adapters/AdapterFactory.js +405 -0
  5. package/dist/adapters/DatabaseAdapter.d.ts +233 -0
  6. package/dist/adapters/DatabaseAdapter.js +50 -0
  7. package/dist/adapters/LegacyAdapter.d.ts +50 -0
  8. package/dist/adapters/LegacyAdapter.js +612 -0
  9. package/dist/adapters/TablesDBAdapter.d.ts +45 -0
  10. package/dist/adapters/TablesDBAdapter.js +571 -0
  11. package/dist/adapters/index.d.ts +11 -0
  12. package/dist/adapters/index.js +12 -0
  13. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  14. package/dist/backups/operations/bucketBackup.js +197 -0
  15. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  16. package/dist/backups/operations/collectionBackup.js +201 -0
  17. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  18. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  19. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  20. package/dist/backups/schemas/bucketManifest.js +33 -0
  21. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  22. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  23. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  24. package/dist/backups/tracking/centralizedTracking.js +274 -0
  25. package/dist/cli/commands/configCommands.d.ts +8 -0
  26. package/dist/cli/commands/configCommands.js +166 -0
  27. package/dist/cli/commands/databaseCommands.d.ts +13 -0
  28. package/dist/cli/commands/databaseCommands.js +554 -0
  29. package/dist/cli/commands/functionCommands.d.ts +7 -0
  30. package/dist/cli/commands/functionCommands.js +330 -0
  31. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  32. package/dist/cli/commands/schemaCommands.js +169 -0
  33. package/dist/cli/commands/storageCommands.d.ts +5 -0
  34. package/dist/cli/commands/storageCommands.js +143 -0
  35. package/dist/cli/commands/transferCommands.d.ts +5 -0
  36. package/dist/cli/commands/transferCommands.js +384 -0
  37. package/dist/collections/attributes.d.ts +13 -0
  38. package/dist/collections/attributes.js +1364 -0
  39. package/dist/collections/indexes.d.ts +12 -0
  40. package/dist/collections/indexes.js +217 -0
  41. package/dist/collections/methods.d.ts +19 -0
  42. package/dist/collections/methods.js +682 -0
  43. package/dist/collections/tableOperations.d.ts +86 -0
  44. package/dist/collections/tableOperations.js +434 -0
  45. package/dist/collections/transferOperations.d.ts +8 -0
  46. package/dist/collections/transferOperations.js +412 -0
  47. package/dist/collections/wipeOperations.d.ts +16 -0
  48. package/dist/collections/wipeOperations.js +233 -0
  49. package/dist/config/ConfigManager.d.ts +445 -0
  50. package/dist/config/ConfigManager.js +625 -0
  51. package/dist/config/configMigration.d.ts +87 -0
  52. package/dist/config/configMigration.js +390 -0
  53. package/dist/config/configValidation.d.ts +66 -0
  54. package/dist/config/configValidation.js +358 -0
  55. package/dist/config/index.d.ts +8 -0
  56. package/dist/config/index.js +7 -0
  57. package/dist/config/services/ConfigDiscoveryService.d.ts +126 -0
  58. package/dist/config/services/ConfigDiscoveryService.js +374 -0
  59. package/dist/config/services/ConfigLoaderService.d.ts +129 -0
  60. package/dist/config/services/ConfigLoaderService.js +540 -0
  61. package/dist/config/services/ConfigMergeService.d.ts +208 -0
  62. package/dist/config/services/ConfigMergeService.js +308 -0
  63. package/dist/config/services/ConfigValidationService.d.ts +214 -0
  64. package/dist/config/services/ConfigValidationService.js +310 -0
  65. package/dist/config/services/SessionAuthService.d.ts +225 -0
  66. package/dist/config/services/SessionAuthService.js +456 -0
  67. package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +1 -0
  68. package/dist/config/services/__tests__/ConfigMergeService.test.js +271 -0
  69. package/dist/config/services/index.d.ts +13 -0
  70. package/dist/config/services/index.js +10 -0
  71. package/dist/config/yamlConfig.d.ts +722 -0
  72. package/dist/config/yamlConfig.js +702 -0
  73. package/dist/databases/methods.d.ts +6 -0
  74. package/dist/databases/methods.js +35 -0
  75. package/dist/databases/setup.d.ts +5 -0
  76. package/dist/databases/setup.js +45 -0
  77. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  78. package/dist/examples/yamlTerminologyExample.js +272 -0
  79. package/dist/functions/deployments.d.ts +4 -0
  80. package/dist/functions/deployments.js +146 -0
  81. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  82. package/dist/functions/fnConfigDiscovery.js +108 -0
  83. package/dist/functions/methods.d.ts +16 -0
  84. package/dist/functions/methods.js +162 -0
  85. package/dist/functions/pathResolution.d.ts +37 -0
  86. package/dist/functions/pathResolution.js +185 -0
  87. package/dist/functions/templates/count-docs-in-collection/README.md +54 -0
  88. package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -0
  89. package/dist/functions/templates/count-docs-in-collection/src/request.ts +9 -0
  90. package/dist/functions/templates/hono-typescript/README.md +286 -0
  91. package/dist/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
  92. package/dist/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
  93. package/dist/functions/templates/hono-typescript/src/app.ts +180 -0
  94. package/dist/functions/templates/hono-typescript/src/context.ts +103 -0
  95. package/dist/functions/templates/hono-typescript/src/index.ts +54 -0
  96. package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
  97. package/dist/functions/templates/typescript-node/README.md +32 -0
  98. package/dist/functions/templates/typescript-node/src/context.ts +103 -0
  99. package/dist/functions/templates/typescript-node/src/index.ts +29 -0
  100. package/dist/functions/templates/uv/README.md +31 -0
  101. package/dist/functions/templates/uv/pyproject.toml +30 -0
  102. package/dist/functions/templates/uv/src/__init__.py +0 -0
  103. package/dist/functions/templates/uv/src/context.py +125 -0
  104. package/dist/functions/templates/uv/src/index.py +46 -0
  105. package/dist/init.d.ts +2 -0
  106. package/dist/init.js +57 -0
  107. package/dist/interactiveCLI.d.ts +31 -0
  108. package/dist/interactiveCLI.js +898 -0
  109. package/dist/main.d.ts +2 -0
  110. package/dist/main.js +1172 -0
  111. package/dist/migrations/afterImportActions.d.ts +17 -0
  112. package/dist/migrations/afterImportActions.js +306 -0
  113. package/dist/migrations/appwriteToX.d.ts +211 -0
  114. package/dist/migrations/appwriteToX.js +491 -0
  115. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  116. package/dist/migrations/comprehensiveTransfer.js +1317 -0
  117. package/dist/migrations/dataLoader.d.ts +753 -0
  118. package/dist/migrations/dataLoader.js +1250 -0
  119. package/dist/migrations/importController.d.ts +23 -0
  120. package/dist/migrations/importController.js +268 -0
  121. package/dist/migrations/importDataActions.d.ts +50 -0
  122. package/dist/migrations/importDataActions.js +230 -0
  123. package/dist/migrations/relationships.d.ts +29 -0
  124. package/dist/migrations/relationships.js +204 -0
  125. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  126. package/dist/migrations/services/DataTransformationService.js +158 -0
  127. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  128. package/dist/migrations/services/FileHandlerService.js +236 -0
  129. package/dist/migrations/services/ImportOrchestrator.d.ts +97 -0
  130. package/dist/migrations/services/ImportOrchestrator.js +485 -0
  131. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  132. package/dist/migrations/services/RateLimitManager.js +279 -0
  133. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  134. package/dist/migrations/services/RelationshipResolver.js +332 -0
  135. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  136. package/dist/migrations/services/UserMappingService.js +277 -0
  137. package/dist/migrations/services/ValidationService.d.ts +74 -0
  138. package/dist/migrations/services/ValidationService.js +260 -0
  139. package/dist/migrations/transfer.d.ts +26 -0
  140. package/dist/migrations/transfer.js +608 -0
  141. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  142. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  143. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  144. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  145. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  146. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  147. package/dist/schemas/authUser.d.ts +24 -0
  148. package/dist/schemas/authUser.js +17 -0
  149. package/dist/setup.d.ts +2 -0
  150. package/dist/setup.js +5 -0
  151. package/dist/setupCommands.d.ts +58 -0
  152. package/dist/setupCommands.js +490 -0
  153. package/dist/setupController.d.ts +9 -0
  154. package/dist/setupController.js +34 -0
  155. package/dist/shared/attributeMapper.d.ts +20 -0
  156. package/dist/shared/attributeMapper.js +203 -0
  157. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  158. package/dist/shared/backupMetadataSchema.js +38 -0
  159. package/dist/shared/backupTracking.d.ts +18 -0
  160. package/dist/shared/backupTracking.js +176 -0
  161. package/dist/shared/confirmationDialogs.d.ts +75 -0
  162. package/dist/shared/confirmationDialogs.js +236 -0
  163. package/dist/shared/errorUtils.d.ts +54 -0
  164. package/dist/shared/errorUtils.js +95 -0
  165. package/dist/shared/functionManager.d.ts +48 -0
  166. package/dist/shared/functionManager.js +336 -0
  167. package/dist/shared/indexManager.d.ts +24 -0
  168. package/dist/shared/indexManager.js +151 -0
  169. package/dist/shared/jsonSchemaGenerator.d.ts +50 -0
  170. package/dist/shared/jsonSchemaGenerator.js +290 -0
  171. package/dist/shared/logging.d.ts +61 -0
  172. package/dist/shared/logging.js +116 -0
  173. package/dist/shared/messageFormatter.d.ts +39 -0
  174. package/dist/shared/messageFormatter.js +162 -0
  175. package/dist/shared/migrationHelpers.d.ts +61 -0
  176. package/dist/shared/migrationHelpers.js +145 -0
  177. package/dist/shared/operationLogger.d.ts +10 -0
  178. package/dist/shared/operationLogger.js +12 -0
  179. package/dist/shared/operationQueue.d.ts +40 -0
  180. package/dist/shared/operationQueue.js +311 -0
  181. package/dist/shared/operationsTable.d.ts +26 -0
  182. package/dist/shared/operationsTable.js +286 -0
  183. package/dist/shared/operationsTableSchema.d.ts +48 -0
  184. package/dist/shared/operationsTableSchema.js +35 -0
  185. package/dist/shared/progressManager.d.ts +62 -0
  186. package/dist/shared/progressManager.js +215 -0
  187. package/dist/shared/pydanticModelGenerator.d.ts +17 -0
  188. package/dist/shared/pydanticModelGenerator.js +615 -0
  189. package/dist/shared/relationshipExtractor.d.ts +56 -0
  190. package/dist/shared/relationshipExtractor.js +138 -0
  191. package/dist/shared/schemaGenerator.d.ts +40 -0
  192. package/dist/shared/schemaGenerator.js +556 -0
  193. package/dist/shared/selectionDialogs.d.ts +214 -0
  194. package/dist/shared/selectionDialogs.js +544 -0
  195. package/dist/storage/backupCompression.d.ts +20 -0
  196. package/dist/storage/backupCompression.js +67 -0
  197. package/dist/storage/methods.d.ts +32 -0
  198. package/dist/storage/methods.js +472 -0
  199. package/dist/storage/schemas.d.ts +842 -0
  200. package/dist/storage/schemas.js +175 -0
  201. package/dist/types.d.ts +4 -0
  202. package/dist/types.js +3 -0
  203. package/dist/users/methods.d.ts +16 -0
  204. package/dist/users/methods.js +277 -0
  205. package/dist/utils/ClientFactory.d.ts +87 -0
  206. package/dist/utils/ClientFactory.js +212 -0
  207. package/dist/utils/configDiscovery.d.ts +78 -0
  208. package/dist/utils/configDiscovery.js +472 -0
  209. package/dist/utils/configMigration.d.ts +1 -0
  210. package/dist/utils/configMigration.js +261 -0
  211. package/dist/utils/constantsGenerator.d.ts +31 -0
  212. package/dist/utils/constantsGenerator.js +321 -0
  213. package/dist/utils/dataConverters.d.ts +46 -0
  214. package/dist/utils/dataConverters.js +139 -0
  215. package/dist/utils/directoryUtils.d.ts +22 -0
  216. package/dist/utils/directoryUtils.js +59 -0
  217. package/dist/utils/getClientFromConfig.d.ts +39 -0
  218. package/dist/utils/getClientFromConfig.js +199 -0
  219. package/dist/utils/helperFunctions.d.ts +63 -0
  220. package/dist/utils/helperFunctions.js +156 -0
  221. package/dist/utils/index.d.ts +2 -0
  222. package/dist/utils/index.js +2 -0
  223. package/dist/utils/loadConfigs.d.ts +50 -0
  224. package/dist/utils/loadConfigs.js +358 -0
  225. package/dist/utils/pathResolvers.d.ts +53 -0
  226. package/dist/utils/pathResolvers.js +72 -0
  227. package/dist/utils/projectConfig.d.ts +119 -0
  228. package/dist/utils/projectConfig.js +171 -0
  229. package/dist/utils/retryFailedPromises.d.ts +2 -0
  230. package/dist/utils/retryFailedPromises.js +23 -0
  231. package/dist/utils/sessionAuth.d.ts +48 -0
  232. package/dist/utils/sessionAuth.js +164 -0
  233. package/dist/utils/setupFiles.d.ts +4 -0
  234. package/dist/utils/setupFiles.js +1192 -0
  235. package/dist/utils/typeGuards.d.ts +35 -0
  236. package/dist/utils/typeGuards.js +57 -0
  237. package/dist/utils/validationRules.d.ts +43 -0
  238. package/dist/utils/validationRules.js +42 -0
  239. package/dist/utils/versionDetection.d.ts +58 -0
  240. package/dist/utils/versionDetection.js +251 -0
  241. package/dist/utils/yamlConverter.d.ts +100 -0
  242. package/dist/utils/yamlConverter.js +428 -0
  243. package/dist/utils/yamlLoader.d.ts +70 -0
  244. package/dist/utils/yamlLoader.js +267 -0
  245. package/dist/utilsController.d.ts +106 -0
  246. package/dist/utilsController.js +863 -0
  247. package/package.json +75 -0
  248. package/scripts/copy-templates.ts +23 -0
  249. package/src/adapters/AdapterFactory.ts +510 -0
  250. package/src/adapters/DatabaseAdapter.ts +306 -0
  251. package/src/adapters/LegacyAdapter.ts +841 -0
  252. package/src/adapters/TablesDBAdapter.ts +773 -0
  253. package/src/adapters/index.ts +37 -0
  254. package/src/backups/operations/bucketBackup.ts +277 -0
  255. package/src/backups/operations/collectionBackup.ts +310 -0
  256. package/src/backups/operations/comprehensiveBackup.ts +342 -0
  257. package/src/backups/schemas/bucketManifest.ts +78 -0
  258. package/src/backups/schemas/comprehensiveManifest.ts +76 -0
  259. package/src/backups/tracking/centralizedTracking.ts +352 -0
  260. package/src/cli/commands/configCommands.ts +201 -0
  261. package/src/cli/commands/databaseCommands.ts +749 -0
  262. package/src/cli/commands/functionCommands.ts +418 -0
  263. package/src/cli/commands/schemaCommands.ts +200 -0
  264. package/src/cli/commands/storageCommands.ts +152 -0
  265. package/src/cli/commands/transferCommands.ts +457 -0
  266. package/src/collections/attributes.ts +2054 -0
  267. package/src/collections/attributes.ts.backup +1555 -0
  268. package/src/collections/indexes.ts +352 -0
  269. package/src/collections/methods.ts +745 -0
  270. package/src/collections/tableOperations.ts +506 -0
  271. package/src/collections/transferOperations.ts +590 -0
  272. package/src/collections/wipeOperations.ts +346 -0
  273. package/src/config/ConfigManager.ts +808 -0
  274. package/src/config/README.md +274 -0
  275. package/src/config/configMigration.ts +575 -0
  276. package/src/config/configValidation.ts +445 -0
  277. package/src/config/index.ts +10 -0
  278. package/src/config/services/ConfigDiscoveryService.ts +463 -0
  279. package/src/config/services/ConfigLoaderService.ts +740 -0
  280. package/src/config/services/ConfigMergeService.ts +388 -0
  281. package/src/config/services/ConfigValidationService.ts +394 -0
  282. package/src/config/services/SessionAuthService.ts +565 -0
  283. package/src/config/services/__tests__/ConfigMergeService.test.ts +351 -0
  284. package/src/config/services/index.ts +29 -0
  285. package/src/config/yamlConfig.ts +761 -0
  286. package/src/databases/methods.ts +49 -0
  287. package/src/databases/setup.ts +77 -0
  288. package/src/examples/yamlTerminologyExample.ts +346 -0
  289. package/src/functions/deployments.ts +220 -0
  290. package/src/functions/fnConfigDiscovery.ts +103 -0
  291. package/src/functions/methods.ts +271 -0
  292. package/src/functions/pathResolution.ts +227 -0
  293. package/src/functions/templates/count-docs-in-collection/README.md +54 -0
  294. package/src/functions/templates/count-docs-in-collection/src/main.ts +159 -0
  295. package/src/functions/templates/count-docs-in-collection/src/request.ts +9 -0
  296. package/src/functions/templates/hono-typescript/README.md +286 -0
  297. package/src/functions/templates/hono-typescript/src/adapters/request.ts +74 -0
  298. package/src/functions/templates/hono-typescript/src/adapters/response.ts +106 -0
  299. package/src/functions/templates/hono-typescript/src/app.ts +180 -0
  300. package/src/functions/templates/hono-typescript/src/context.ts +103 -0
  301. package/src/functions/templates/hono-typescript/src/index.ts +54 -0
  302. package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +119 -0
  303. package/src/functions/templates/typescript-node/README.md +32 -0
  304. package/src/functions/templates/typescript-node/src/context.ts +103 -0
  305. package/src/functions/templates/typescript-node/src/index.ts +29 -0
  306. package/src/functions/templates/uv/README.md +31 -0
  307. package/src/functions/templates/uv/pyproject.toml +30 -0
  308. package/src/functions/templates/uv/src/__init__.py +0 -0
  309. package/src/functions/templates/uv/src/context.py +125 -0
  310. package/src/functions/templates/uv/src/index.py +46 -0
  311. package/src/init.ts +62 -0
  312. package/src/interactiveCLI.ts +1136 -0
  313. package/src/main.ts +1661 -0
  314. package/src/migrations/afterImportActions.ts +580 -0
  315. package/src/migrations/appwriteToX.ts +664 -0
  316. package/src/migrations/comprehensiveTransfer.ts +2285 -0
  317. package/src/migrations/dataLoader.ts +1702 -0
  318. package/src/migrations/importController.ts +428 -0
  319. package/src/migrations/importDataActions.ts +315 -0
  320. package/src/migrations/relationships.ts +334 -0
  321. package/src/migrations/services/DataTransformationService.ts +196 -0
  322. package/src/migrations/services/FileHandlerService.ts +311 -0
  323. package/src/migrations/services/ImportOrchestrator.ts +666 -0
  324. package/src/migrations/services/RateLimitManager.ts +363 -0
  325. package/src/migrations/services/RelationshipResolver.ts +461 -0
  326. package/src/migrations/services/UserMappingService.ts +345 -0
  327. package/src/migrations/services/ValidationService.ts +349 -0
  328. package/src/migrations/transfer.ts +1068 -0
  329. package/src/migrations/yaml/YamlImportConfigLoader.ts +439 -0
  330. package/src/migrations/yaml/YamlImportIntegration.ts +446 -0
  331. package/src/migrations/yaml/generateImportSchemas.ts +1354 -0
  332. package/src/schemas/authUser.ts +23 -0
  333. package/src/setup.ts +8 -0
  334. package/src/setupCommands.ts +603 -0
  335. package/src/setupController.ts +43 -0
  336. package/src/shared/attributeMapper.ts +229 -0
  337. package/src/shared/backupMetadataSchema.ts +93 -0
  338. package/src/shared/backupTracking.ts +211 -0
  339. package/src/shared/confirmationDialogs.ts +327 -0
  340. package/src/shared/errorUtils.ts +110 -0
  341. package/src/shared/functionManager.ts +525 -0
  342. package/src/shared/indexManager.ts +254 -0
  343. package/src/shared/jsonSchemaGenerator.ts +383 -0
  344. package/src/shared/logging.ts +149 -0
  345. package/src/shared/messageFormatter.ts +208 -0
  346. package/src/shared/migrationHelpers.ts +232 -0
  347. package/src/shared/operationLogger.ts +20 -0
  348. package/src/shared/operationQueue.ts +377 -0
  349. package/src/shared/operationsTable.ts +338 -0
  350. package/src/shared/operationsTableSchema.ts +60 -0
  351. package/src/shared/progressManager.ts +278 -0
  352. package/src/shared/pydanticModelGenerator.ts +618 -0
  353. package/src/shared/relationshipExtractor.ts +214 -0
  354. package/src/shared/schemaGenerator.ts +644 -0
  355. package/src/shared/selectionDialogs.ts +749 -0
  356. package/src/storage/backupCompression.ts +88 -0
  357. package/src/storage/methods.ts +698 -0
  358. package/src/storage/schemas.ts +205 -0
  359. package/src/types/node-appwrite-tablesdb.d.ts +44 -0
  360. package/src/types.ts +9 -0
  361. package/src/users/methods.ts +359 -0
  362. package/src/utils/ClientFactory.ts +240 -0
  363. package/src/utils/configDiscovery.ts +557 -0
  364. package/src/utils/configMigration.ts +348 -0
  365. package/src/utils/constantsGenerator.ts +369 -0
  366. package/src/utils/dataConverters.ts +159 -0
  367. package/src/utils/directoryUtils.ts +61 -0
  368. package/src/utils/getClientFromConfig.ts +257 -0
  369. package/src/utils/helperFunctions.ts +228 -0
  370. package/src/utils/index.ts +2 -0
  371. package/src/utils/loadConfigs.ts +449 -0
  372. package/src/utils/pathResolvers.ts +81 -0
  373. package/src/utils/projectConfig.ts +299 -0
  374. package/src/utils/retryFailedPromises.ts +29 -0
  375. package/src/utils/sessionAuth.ts +230 -0
  376. package/src/utils/setupFiles.ts +1238 -0
  377. package/src/utils/typeGuards.ts +65 -0
  378. package/src/utils/validationRules.ts +88 -0
  379. package/src/utils/versionDetection.ts +292 -0
  380. package/src/utils/yamlConverter.ts +542 -0
  381. package/src/utils/yamlLoader.ts +371 -0
  382. package/src/utilsController.ts +1203 -0
  383. package/tests/README.md +497 -0
  384. package/tests/adapters/AdapterFactory.test.ts +277 -0
  385. package/tests/integration/syncOperations.test.ts +463 -0
  386. package/tests/jest.config.js +25 -0
  387. package/tests/migration/configMigration.test.ts +546 -0
  388. package/tests/setup.ts +62 -0
  389. package/tests/testUtils.ts +340 -0
  390. package/tests/utils/loadConfigs.test.ts +350 -0
  391. package/tests/validation/configValidation.test.ts +412 -0
  392. package/tsconfig.json +44 -0
@@ -0,0 +1,439 @@
1
+ import { z } from "zod";
2
+ import path from "path";
3
+ import fs from "fs";
4
+ import yaml from "js-yaml";
5
+ import { logger } from "../../shared/logging.js";
6
+ import type { ImportDef, AttributeMappings } from "@njdamstra/appwrite-utils";
7
+
8
+ // YAML Import Configuration Schema
9
+ export const YamlImportConfigSchema = z.object({
10
+ source: z.object({
11
+ file: z.string().describe("Path to the data file relative to .appwrite directory"),
12
+ basePath: z.string().optional().describe("JSON path to the data array (e.g., 'RECORDS')"),
13
+ type: z.enum(["json", "csv", "yaml"]).default("json").describe("Source file type"),
14
+ }),
15
+
16
+ target: z.object({
17
+ collection: z.string().describe("Name of the target collection"),
18
+ type: z.enum(["create", "update"]).default("create").describe("Import operation type"),
19
+ primaryKey: z.string().default("id").describe("Primary key field name in source data"),
20
+ createUsers: z.boolean().default(false).describe("Whether to create user accounts"),
21
+ }),
22
+
23
+ mapping: z.object({
24
+ attributes: z.array(z.object({
25
+ // Source mapping
26
+ oldKey: z.string().optional().describe("Source field name"),
27
+ oldKeys: z.array(z.string()).optional().describe("Multiple source field names"),
28
+
29
+ // Target mapping
30
+ targetKey: z.string().describe("Target field name in collection"),
31
+ valueToSet: z.any().optional().describe("Static value to set"),
32
+
33
+ // File handling
34
+ fileData: z.object({
35
+ path: z.string().describe("File path template (supports {field} placeholders)"),
36
+ name: z.string().describe("File name template (supports {field} placeholders)"),
37
+ }).optional(),
38
+
39
+ // Data transformation
40
+ converters: z.array(z.string()).default([]).describe("Converter function names"),
41
+
42
+ // Validation
43
+ validation: z.array(z.object({
44
+ rule: z.string().describe("Validation rule name"),
45
+ params: z.array(z.string()).describe("Validation parameters with {field} placeholders"),
46
+ })).default([]).describe("Validation rules"),
47
+
48
+ // Post-import actions
49
+ afterImport: z.array(z.object({
50
+ action: z.string().describe("Action name"),
51
+ params: z.array(z.union([z.string(), z.record(z.string(), z.any())])).describe("Action parameters"),
52
+ })).default([]).describe("Actions to execute after import"),
53
+ })).describe("Field mapping configuration"),
54
+
55
+ relationships: z.array(z.object({
56
+ sourceField: z.string().describe("Source field containing old ID"),
57
+ targetField: z.string().describe("Target field to set new ID"),
58
+ targetCollection: z.string().describe("Collection to find new ID in"),
59
+ fieldToSet: z.string().optional().describe("Field to set (defaults to sourceField)"),
60
+ targetFieldToMatch: z.string().optional().describe("Field to match in target collection"),
61
+ })).default([]).describe("Relationship mappings"),
62
+ }),
63
+
64
+ options: z.object({
65
+ batchSize: z.number().min(1).max(1000).default(50).describe("Batch size for processing"),
66
+ skipValidation: z.boolean().default(false).describe("Skip data validation"),
67
+ dryRun: z.boolean().default(false).describe("Perform dry run without actual import"),
68
+ continueOnError: z.boolean().default(true).describe("Continue processing if individual items fail"),
69
+ updateMapping: z.object({
70
+ originalIdField: z.string().describe("Field in source data for matching"),
71
+ targetField: z.string().describe("Field in collection to match against"),
72
+ }).optional().describe("Configuration for update operations"),
73
+ }).default(() => ({
74
+ batchSize: 50,
75
+ skipValidation: false,
76
+ dryRun: false,
77
+ continueOnError: true
78
+ })),
79
+ });
80
+
81
+ export type YamlImportConfig = z.infer<typeof YamlImportConfigSchema>;
82
+
83
+ /**
84
+ * Service for loading and converting YAML import configurations.
85
+ * Integrates with existing .appwrite YAML structure while providing
86
+ * enhanced import configuration capabilities.
87
+ */
88
+ export class YamlImportConfigLoader {
89
+ private appwriteFolderPath: string;
90
+
91
+ constructor(appwriteFolderPath: string) {
92
+ this.appwriteFolderPath = appwriteFolderPath;
93
+ }
94
+
95
+ /**
96
+ * Loads a YAML import configuration file.
97
+ *
98
+ * @param configPath - Path to the YAML config file relative to .appwrite/import/
99
+ * @returns Parsed and validated YAML import configuration
100
+ */
101
+ async loadImportConfig(configPath: string): Promise<YamlImportConfig> {
102
+ const fullPath = path.resolve(this.appwriteFolderPath, "import", configPath);
103
+
104
+ if (!fs.existsSync(fullPath)) {
105
+ throw new Error(`Import configuration file not found: ${fullPath}`);
106
+ }
107
+
108
+ try {
109
+ const yamlContent = fs.readFileSync(fullPath, "utf8");
110
+ const rawConfig = yaml.load(yamlContent) as any;
111
+
112
+ // Validate against schema
113
+ const validatedConfig = YamlImportConfigSchema.parse(rawConfig);
114
+
115
+ logger.info(`Loaded import configuration: ${configPath}`);
116
+ return validatedConfig;
117
+
118
+ } catch (error) {
119
+ if (error instanceof z.ZodError) {
120
+ const errorMessages = error.issues.map(err => `${err.path.join('.')}: ${err.message}`);
121
+ throw new Error(`Invalid import configuration in ${configPath}:\n${errorMessages.join('\n')}`);
122
+ }
123
+ throw new Error(`Failed to load import configuration ${configPath}: ${error}`);
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Loads all import configurations from the .appwrite/import directory.
129
+ *
130
+ * @returns Map of collection names to their import configurations
131
+ */
132
+ async loadAllImportConfigs(): Promise<Map<string, YamlImportConfig[]>> {
133
+ const importDir = path.join(this.appwriteFolderPath, "import");
134
+ const configs = new Map<string, YamlImportConfig[]>();
135
+
136
+ if (!fs.existsSync(importDir)) {
137
+ logger.info("No import directory found, skipping YAML import configurations");
138
+ return configs;
139
+ }
140
+
141
+ try {
142
+ const files = fs.readdirSync(importDir, { withFileTypes: true });
143
+
144
+ for (const file of files) {
145
+ if (file.isFile() && file.name.endsWith('.yaml')) {
146
+ try {
147
+ const config = await this.loadImportConfig(file.name);
148
+ const collectionName = config.target.collection;
149
+
150
+ if (!configs.has(collectionName)) {
151
+ configs.set(collectionName, []);
152
+ }
153
+ configs.get(collectionName)!.push(config);
154
+
155
+ } catch (error) {
156
+ logger.error(`Failed to load import config ${file.name}:`, error);
157
+ }
158
+ }
159
+ }
160
+
161
+ logger.info(`Loaded import configurations for ${configs.size} collections`);
162
+ return configs;
163
+
164
+ } catch (error) {
165
+ logger.error("Failed to scan import directory:", error);
166
+ return configs;
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Converts YAML import configuration to legacy ImportDef format.
172
+ * Maintains compatibility with existing import system.
173
+ *
174
+ * @param yamlConfig - YAML import configuration
175
+ * @returns Legacy ImportDef object
176
+ */
177
+ convertToImportDef(yamlConfig: YamlImportConfig): ImportDef {
178
+ const attributeMappings: AttributeMappings = yamlConfig.mapping.attributes.map(attr => ({
179
+ oldKey: attr.oldKey,
180
+ oldKeys: attr.oldKeys,
181
+ targetKey: attr.targetKey,
182
+ valueToSet: attr.valueToSet,
183
+ fileData: attr.fileData,
184
+ converters: attr.converters,
185
+ validationActions: attr.validation.map(v => ({
186
+ action: v.rule,
187
+ params: v.params,
188
+ })),
189
+ postImportActions: attr.afterImport.map(a => ({
190
+ action: a.action,
191
+ params: a.params,
192
+ })),
193
+ }));
194
+
195
+ const idMappings = yamlConfig.mapping.relationships.map(rel => ({
196
+ sourceField: rel.sourceField,
197
+ targetField: rel.targetField,
198
+ targetCollection: rel.targetCollection,
199
+ fieldToSet: rel.fieldToSet,
200
+ targetFieldToMatch: rel.targetFieldToMatch,
201
+ }));
202
+
203
+ return {
204
+ type: yamlConfig.target.type,
205
+ filePath: yamlConfig.source.file,
206
+ basePath: yamlConfig.source.basePath,
207
+ primaryKeyField: yamlConfig.target.primaryKey,
208
+ createUsers: yamlConfig.target.createUsers,
209
+ attributeMappings,
210
+ idMappings: idMappings.length > 0 ? idMappings : undefined,
211
+ updateMapping: yamlConfig.options.updateMapping,
212
+ };
213
+ }
214
+
215
+ /**
216
+ * Generates a template YAML import configuration.
217
+ * Useful for getting started with YAML-based imports.
218
+ * Supports both collection and table terminology.
219
+ *
220
+ * @param collectionName - Name of the collection
221
+ * @param sourceFile - Source data file name
222
+ * @param useTableTerminology - Whether to use table terminology
223
+ * @returns YAML configuration template
224
+ */
225
+ generateTemplate(
226
+ collectionName: string,
227
+ sourceFile: string,
228
+ useTableTerminology = false
229
+ ): string {
230
+ const entityType = useTableTerminology ? 'table' : 'collection';
231
+ const template = {
232
+ source: {
233
+ file: `importData/${sourceFile}`,
234
+ basePath: "RECORDS",
235
+ type: "json"
236
+ },
237
+ target: {
238
+ [entityType]: collectionName,
239
+ type: "create",
240
+ primaryKey: "id",
241
+ createUsers: false
242
+ },
243
+ mapping: {
244
+ attributes: [
245
+ {
246
+ oldKey: "id",
247
+ targetKey: "id",
248
+ converters: ["anyToString"]
249
+ },
250
+ {
251
+ oldKey: "name",
252
+ targetKey: "name",
253
+ converters: ["anyToString"],
254
+ validation: [
255
+ {
256
+ rule: "required",
257
+ params: ["{name}"]
258
+ }
259
+ ]
260
+ },
261
+ {
262
+ oldKey: "avatar_url",
263
+ targetKey: "avatar",
264
+ fileData: {
265
+ path: "{avatar_url}",
266
+ name: "{name}_avatar"
267
+ },
268
+ afterImport: [
269
+ {
270
+ action: "createFileAndUpdateField",
271
+ params: ["{dbId}", "{collId}", "{docId}", "avatar", "{bucketId}", "{filePath}", "{fileName}"]
272
+ }
273
+ ]
274
+ }
275
+ ],
276
+ relationships: [
277
+ {
278
+ sourceField: "user_id",
279
+ targetField: "userId",
280
+ [useTableTerminology ? 'targetTable' : 'targetCollection']: "Users"
281
+ }
282
+ ]
283
+ },
284
+ options: {
285
+ batchSize: 50,
286
+ skipValidation: false,
287
+ dryRun: false,
288
+ continueOnError: true
289
+ }
290
+ };
291
+
292
+ return yaml.dump(template, {
293
+ indent: 2,
294
+ lineWidth: 120,
295
+ sortKeys: false,
296
+ });
297
+ }
298
+
299
+ /**
300
+ * Creates the import directory structure if it doesn't exist.
301
+ * Sets up the recommended directory layout for YAML import configurations.
302
+ */
303
+ async createImportStructure(): Promise<void> {
304
+ const importDir = path.join(this.appwriteFolderPath, "import");
305
+ const collectionsDir = path.join(importDir, "collections");
306
+ const templatesDir = path.join(importDir, "templates");
307
+
308
+ // Create directories
309
+ for (const dir of [importDir, collectionsDir, templatesDir]) {
310
+ if (!fs.existsSync(dir)) {
311
+ fs.mkdirSync(dir, { recursive: true });
312
+ logger.info(`Created directory: ${dir}`);
313
+ }
314
+ }
315
+
316
+ // Create README file
317
+ const readmePath = path.join(importDir, "README.md");
318
+ if (!fs.existsSync(readmePath)) {
319
+ const readmeContent = `# Import Configurations
320
+
321
+ This directory contains YAML-based import configurations for the Appwrite Utils CLI.
322
+
323
+ ## Structure
324
+
325
+ - \`collections/\` - Collection-specific import configurations
326
+ - \`templates/\` - Template configurations for reference
327
+ - \`*.yaml\` - Individual import configuration files
328
+
329
+ ## Configuration Format
330
+
331
+ Each YAML file defines:
332
+ - **source**: Data source configuration (file, type, basePath)
333
+ - **target**: Target collection and operation type
334
+ - **mapping**: Field mappings, transformations, and relationships
335
+ - **options**: Import options (batch size, validation, etc.)
336
+
337
+ ## Example
338
+
339
+ \`\`\`yaml
340
+ source:
341
+ file: "importData/users.json"
342
+ basePath: "RECORDS"
343
+ type: "json"
344
+
345
+ target:
346
+ collection: "Users"
347
+ type: "create"
348
+ primaryKey: "id"
349
+ createUsers: true
350
+
351
+ mapping:
352
+ attributes:
353
+ - oldKey: "user_id"
354
+ targetKey: "userId"
355
+ converters: ["anyToString"]
356
+ - oldKey: "profile_image"
357
+ targetKey: "avatar"
358
+ fileData:
359
+ path: "assets/profiles/{user_id}.jpg"
360
+ name: "{firstName}_{lastName}_avatar"
361
+
362
+ options:
363
+ batchSize: 50
364
+ continueOnError: true
365
+ \`\`\`
366
+
367
+ ## Usage
368
+
369
+ The CLI will automatically detect and load YAML import configurations during the import process.
370
+ `;
371
+
372
+ fs.writeFileSync(readmePath, readmeContent);
373
+ logger.info(`Created README: ${readmePath}`);
374
+ }
375
+ }
376
+
377
+ /**
378
+ * Validates import configuration against collection schema.
379
+ * Ensures that all target keys exist as attributes in the collection.
380
+ *
381
+ * @param yamlConfig - YAML import configuration
382
+ * @param collectionAttributes - Collection attribute definitions
383
+ * @returns Validation errors (empty if valid)
384
+ */
385
+ validateAgainstCollection(
386
+ yamlConfig: YamlImportConfig,
387
+ collectionAttributes: any[]
388
+ ): string[] {
389
+ const errors: string[] = [];
390
+ const attributeKeys = new Set(collectionAttributes.map(attr => attr.key));
391
+
392
+ for (const mapping of yamlConfig.mapping.attributes) {
393
+ if (!attributeKeys.has(mapping.targetKey)) {
394
+ errors.push(`Target key '${mapping.targetKey}' not found in collection attributes`);
395
+ }
396
+ }
397
+
398
+ return errors;
399
+ }
400
+
401
+ /**
402
+ * Gets statistics about import configurations.
403
+ *
404
+ * @param configs - Map of collection configurations
405
+ * @returns Statistics object
406
+ */
407
+ getStatistics(configs: Map<string, YamlImportConfig[]>): {
408
+ totalConfigurations: number;
409
+ collectionsWithConfigs: number;
410
+ totalAttributeMappings: number;
411
+ totalRelationshipMappings: number;
412
+ configsByType: { [type: string]: number };
413
+ } {
414
+ let totalConfigurations = 0;
415
+ let totalAttributeMappings = 0;
416
+ let totalRelationshipMappings = 0;
417
+ const configsByType: { [type: string]: number } = {};
418
+
419
+ for (const [collectionName, collectionConfigs] of configs.entries()) {
420
+ totalConfigurations += collectionConfigs.length;
421
+
422
+ for (const config of collectionConfigs) {
423
+ totalAttributeMappings += config.mapping.attributes.length;
424
+ totalRelationshipMappings += config.mapping.relationships.length;
425
+
426
+ const type = config.target.type;
427
+ configsByType[type] = (configsByType[type] || 0) + 1;
428
+ }
429
+ }
430
+
431
+ return {
432
+ totalConfigurations,
433
+ collectionsWithConfigs: configs.size,
434
+ totalAttributeMappings,
435
+ totalRelationshipMappings,
436
+ configsByType,
437
+ };
438
+ }
439
+ }