@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,229 @@
1
+ import type { CreateAttributeParams, UpdateAttributeParams } from "../adapters/DatabaseAdapter.js";
2
+ import type { Attribute } from "@njdamstra/appwrite-utils";
3
+
4
+ function ensureNumber(n: any): number | undefined {
5
+ if (n === null || n === undefined) return undefined;
6
+ const num = Number(n);
7
+ return Number.isFinite(num) ? num : undefined;
8
+ }
9
+
10
+ /**
11
+ * Map a schema Attribute into DatabaseAdapter CreateAttributeParams
12
+ * Only includes fields valid for the specific type to satisfy TS unions.
13
+ * Also normalizes min/max ordering for numeric types to avoid server errors.
14
+ */
15
+ export function mapToCreateAttributeParams(
16
+ attr: Attribute,
17
+ base: { databaseId: string; tableId: string }
18
+ ): CreateAttributeParams {
19
+ const type = String((attr as any).type || "").toLowerCase();
20
+ const required = !!(attr as any).required;
21
+ const array = !!(attr as any).array;
22
+ const xdefault = (attr as any).xdefault;
23
+ const encrypt = (attr as any).encrypt;
24
+
25
+ // Numeric helpers
26
+ const rawMin = ensureNumber((attr as any).min);
27
+ const rawMax = ensureNumber((attr as any).max);
28
+ let min = rawMin;
29
+ let max = rawMax;
30
+ if (min !== undefined && max !== undefined && min >= max) {
31
+ // Swap to satisfy server-side validation
32
+ const tmp = min;
33
+ min = Math.min(min, max);
34
+ max = Math.max(tmp, max);
35
+ if (min === max) {
36
+ // If still equal, unset max to avoid error
37
+ max = undefined;
38
+ }
39
+ }
40
+
41
+ switch (type) {
42
+ case "string":
43
+ return {
44
+ databaseId: base.databaseId,
45
+ tableId: base.tableId,
46
+ key: attr.key,
47
+ type,
48
+ size: (attr as any).size ?? 255,
49
+ required,
50
+ default: xdefault,
51
+ array,
52
+ encrypt: !!encrypt,
53
+ };
54
+
55
+ case "integer":
56
+ return {
57
+ databaseId: base.databaseId,
58
+ tableId: base.tableId,
59
+ key: attr.key,
60
+ type,
61
+ required,
62
+ default: xdefault,
63
+ array,
64
+ min,
65
+ max,
66
+ };
67
+
68
+ case "double":
69
+ case "float":
70
+ return {
71
+ databaseId: base.databaseId,
72
+ tableId: base.tableId,
73
+ key: attr.key,
74
+ type,
75
+ required,
76
+ default: xdefault,
77
+ array,
78
+ min,
79
+ max,
80
+ };
81
+
82
+ case "boolean":
83
+ return {
84
+ databaseId: base.databaseId,
85
+ tableId: base.tableId,
86
+ key: attr.key,
87
+ type,
88
+ required,
89
+ default: xdefault,
90
+ array,
91
+ };
92
+
93
+ case "datetime":
94
+ case "email":
95
+ case "ip":
96
+ case "url":
97
+ return {
98
+ databaseId: base.databaseId,
99
+ tableId: base.tableId,
100
+ key: attr.key,
101
+ type,
102
+ required,
103
+ default: xdefault,
104
+ array,
105
+ };
106
+
107
+ case "enum":
108
+ {
109
+ const elements = (attr as any).elements;
110
+ if (!Array.isArray(elements) || elements.length === 0) {
111
+ // Creating an enum without elements is invalid – fail fast with clear messaging
112
+ throw new Error(
113
+ `Enum attribute '${(attr as any).key}' requires a non-empty 'elements' array for creation`
114
+ );
115
+ }
116
+ }
117
+ return {
118
+ databaseId: base.databaseId,
119
+ tableId: base.tableId,
120
+ key: attr.key,
121
+ type,
122
+ required,
123
+ default: xdefault,
124
+ array,
125
+ elements: (attr as any).elements,
126
+ };
127
+
128
+ case "relationship": {
129
+ // Relationship attributes require related collection and metadata
130
+ return {
131
+ databaseId: base.databaseId,
132
+ tableId: base.tableId,
133
+ key: attr.key,
134
+ type,
135
+ relatedCollection: (attr as any).relatedCollection,
136
+ relationType: (attr as any).relationType,
137
+ twoWay: (attr as any).twoWay,
138
+ twoWayKey: (attr as any).twoWayKey,
139
+ onDelete: (attr as any).onDelete,
140
+ side: (attr as any).side,
141
+ } as unknown as CreateAttributeParams;
142
+ }
143
+
144
+ default:
145
+ return {
146
+ databaseId: base.databaseId,
147
+ tableId: base.tableId,
148
+ key: attr.key,
149
+ type,
150
+ required,
151
+ } as CreateAttributeParams;
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Map a schema Attribute into DatabaseAdapter UpdateAttributeParams
157
+ * Omits fields that are not explicitly provided, and guards enum updates
158
+ * so we never send an empty elements array (preserve existing on server).
159
+ */
160
+ export function mapToUpdateAttributeParams(
161
+ attr: Attribute,
162
+ base: { databaseId: string; tableId: string }
163
+ ): UpdateAttributeParams {
164
+ const type = String((attr as any).type || "").toLowerCase();
165
+ const params: UpdateAttributeParams = {
166
+ databaseId: base.databaseId,
167
+ tableId: base.tableId,
168
+ key: (attr as any).key,
169
+ };
170
+
171
+ const setIfDefined = <K extends keyof UpdateAttributeParams>(
172
+ key: K,
173
+ value: UpdateAttributeParams[K]
174
+ ) => {
175
+ if (value !== undefined) (params as any)[key] = value;
176
+ };
177
+
178
+ // Common fields
179
+ setIfDefined("type", type);
180
+ setIfDefined("required", (attr as any).required);
181
+ // Only send default if explicitly provided and not on required
182
+ if (!(attr as any).required && (attr as any).xdefault !== undefined) {
183
+ setIfDefined("default", (attr as any).xdefault as any);
184
+ }
185
+ setIfDefined("array", (attr as any).array);
186
+ // encrypt only applies to string types
187
+ if (type === "string") setIfDefined("encrypt", (attr as any).encrypt);
188
+
189
+ // Numeric normalization
190
+ const toNum = (n: any) => (n === null || n === undefined ? undefined : (Number(n)));
191
+ let min = toNum((attr as any).min);
192
+ let max = toNum((attr as any).max);
193
+ if (min !== undefined && max !== undefined && min >= max) {
194
+ const tmp = min;
195
+ min = Math.min(min, max);
196
+ max = Math.max(tmp, max);
197
+ if (min === max) max = undefined;
198
+ }
199
+
200
+ switch (type) {
201
+ case "string":
202
+ setIfDefined("size", (attr as any).size);
203
+ break;
204
+ case "integer":
205
+ case "float":
206
+ case "double":
207
+ setIfDefined("min", min);
208
+ setIfDefined("max", max);
209
+ break;
210
+ case "enum": {
211
+ const elements = (attr as any).elements;
212
+ if (Array.isArray(elements) && elements.length > 0) {
213
+ // Only include when non-empty; otherwise preserve existing on server
214
+ setIfDefined("elements", elements as string[]);
215
+ }
216
+ break;
217
+ }
218
+ case "relationship": {
219
+ setIfDefined("relatedCollection", (attr as any).relatedCollection);
220
+ setIfDefined("relationType", (attr as any).relationType);
221
+ setIfDefined("twoWay", (attr as any).twoWay);
222
+ setIfDefined("twoWayKey", (attr as any).twoWayKey);
223
+ setIfDefined("onDelete", (attr as any).onDelete);
224
+ break;
225
+ }
226
+ }
227
+
228
+ return params;
229
+ }
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+
3
+ /**
4
+ * Schema for centralized backup tracking table (_appwrite_backups)
5
+ *
6
+ * Tracks all backups created for databases, buckets, and comprehensive backups
7
+ */
8
+
9
+ export type BackupType = 'database' | 'bucket' | 'comprehensive';
10
+ export type BackupFormat = 'json' | 'zip';
11
+ export type BackupStatus = 'completed' | 'partial' | 'failed';
12
+ export type RestorationStatus = 'completed' | 'partial' | 'failed' | 'not_restored';
13
+
14
+ export const BACKUP_TYPES = ['database', 'bucket', 'comprehensive'] as const;
15
+ export const BACKUP_FORMATS = ['json', 'zip'] as const;
16
+ export const BACKUP_STATUSES = ['completed', 'partial', 'failed'] as const;
17
+ export const RESTORATION_STATUSES = ['completed', 'partial', 'failed', 'not_restored'] as const;
18
+
19
+ export const BackupTypeSchema = z.enum(['database', 'bucket', 'comprehensive']);
20
+ export const BackupFormatSchema = z.enum(['json', 'zip']);
21
+ export const BackupStatusSchema = z.enum(['completed', 'partial', 'failed']);
22
+ export const RestorationStatusSchema = z.enum(['completed', 'partial', 'failed', 'not_restored']);
23
+
24
+ export interface BackupMetadata {
25
+ $id: string;
26
+ $createdAt: string;
27
+ $updatedAt: string;
28
+
29
+ // Core backup info
30
+ backupType: BackupType; // Type of backup: database, bucket, or comprehensive
31
+ backupId: string; // File ID in storage bucket for the backup file
32
+ manifestFileId?: string; // File ID for the manifest JSON file
33
+ format: BackupFormat; // 'json' or 'zip'
34
+ sizeBytes: number; // Total backup file size
35
+
36
+ // Resource identification (at least one must be present)
37
+ databaseId?: string; // Database ID (for database backups)
38
+ bucketId?: string; // Bucket ID (for bucket backups)
39
+ comprehensiveBackupId?: string; // Parent comprehensive backup ID
40
+
41
+ // Database-specific metrics
42
+ collections?: number; // Number of collections backed up
43
+ documents?: number; // Number of documents backed up
44
+
45
+ // Bucket-specific metrics
46
+ fileCount?: number; // Number of files backed up (for bucket backups)
47
+
48
+ // Status tracking
49
+ status: BackupStatus; // 'completed', 'partial', or 'failed'
50
+ error?: string; // Error message if failed or partial
51
+
52
+ // Restoration tracking
53
+ restoredAt?: string; // ISO timestamp of restoration
54
+ restorationStatus: RestorationStatus; // Restoration status
55
+ restorationError?: string; // Error message if restoration failed
56
+ }
57
+
58
+ export const BackupMetadataSchema = z.object({
59
+ $id: z.string(),
60
+ $createdAt: z.string(),
61
+ $updatedAt: z.string(),
62
+
63
+ // Core backup info
64
+ backupType: BackupTypeSchema,
65
+ backupId: z.string(),
66
+ manifestFileId: z.string().optional(),
67
+ format: BackupFormatSchema,
68
+ sizeBytes: z.number(),
69
+
70
+ // Resource identification
71
+ databaseId: z.string().optional(),
72
+ bucketId: z.string().optional(),
73
+ comprehensiveBackupId: z.string().optional(),
74
+
75
+ // Database-specific metrics
76
+ collections: z.number().optional(),
77
+ documents: z.number().optional(),
78
+
79
+ // Bucket-specific metrics
80
+ fileCount: z.number().optional(),
81
+
82
+ // Status tracking
83
+ status: BackupStatusSchema,
84
+ error: z.string().optional(),
85
+
86
+ // Restoration tracking
87
+ restoredAt: z.string().optional(),
88
+ restorationStatus: RestorationStatusSchema.default('not_restored'),
89
+ restorationError: z.string().optional()
90
+ });
91
+
92
+ export const BACKUP_TABLE_ID = "appwrite_backups";
93
+ export const BACKUP_TABLE_NAME = "Backup Tracking";
@@ -0,0 +1,211 @@
1
+ import type { DatabaseAdapter } from "../adapters/DatabaseAdapter.js";
2
+ import { logger } from "./logging.js";
3
+ import { tryAwaitWithRetry } from "../utils/helperFunctions.js";
4
+ import { Query, ID } from "node-appwrite";
5
+ import {
6
+ BACKUP_TABLE_ID,
7
+ BACKUP_TABLE_NAME,
8
+ type BackupMetadata,
9
+ BackupMetadataSchema
10
+ } from "./backupMetadataSchema.js";
11
+
12
+ /**
13
+ * Checks if backup tracking table exists in database
14
+ */
15
+ async function tableExists(
16
+ db: DatabaseAdapter,
17
+ databaseId: string
18
+ ): Promise<boolean> {
19
+ try {
20
+ await db.getTable({ databaseId, tableId: BACKUP_TABLE_ID });
21
+ return true;
22
+ } catch (error) {
23
+ return false;
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Creates the backup tracking table in the specified database
29
+ */
30
+ export async function createBackupTrackingTable(
31
+ db: DatabaseAdapter,
32
+ databaseId: string
33
+ ): Promise<void> {
34
+ // Check if table already exists
35
+ const exists = await tableExists(db, databaseId);
36
+ if (exists) {
37
+ logger.debug("Backup tracking table already exists", {
38
+ databaseId,
39
+ tableId: BACKUP_TABLE_ID
40
+ });
41
+ return;
42
+ }
43
+
44
+ logger.info("Creating backup tracking table", {
45
+ databaseId,
46
+ tableId: BACKUP_TABLE_ID
47
+ });
48
+
49
+ // Create table
50
+ await tryAwaitWithRetry(async () => {
51
+ await db.createTable({
52
+ databaseId,
53
+ id: BACKUP_TABLE_ID,
54
+ name: BACKUP_TABLE_NAME
55
+ });
56
+ });
57
+
58
+ // Create attributes
59
+ const attributes = [
60
+ {
61
+ key: "backupId",
62
+ type: "string" as const,
63
+ size: 50,
64
+ required: true
65
+ },
66
+ {
67
+ key: "databaseId",
68
+ type: "string" as const,
69
+ size: 50,
70
+ required: true
71
+ },
72
+ {
73
+ key: "sizeBytes",
74
+ type: "integer" as const,
75
+ required: true
76
+ },
77
+ {
78
+ key: "collections",
79
+ type: "integer" as const,
80
+ required: true
81
+ },
82
+ {
83
+ key: "documents",
84
+ type: "integer" as const,
85
+ required: true
86
+ },
87
+ {
88
+ key: "format",
89
+ type: "enum" as const,
90
+ elements: ["json", "zip"],
91
+ required: true
92
+ },
93
+ {
94
+ key: "status",
95
+ type: "enum" as const,
96
+ elements: ["completed", "failed"],
97
+ required: true
98
+ },
99
+ {
100
+ key: "error",
101
+ type: "string" as const,
102
+ size: 10000,
103
+ required: false
104
+ }
105
+ ];
106
+
107
+ for (const attr of attributes) {
108
+ await tryAwaitWithRetry(async () => {
109
+ await db.createAttribute({
110
+ databaseId,
111
+ tableId: BACKUP_TABLE_ID,
112
+ ...attr
113
+ });
114
+ });
115
+ }
116
+
117
+ logger.info("Backup tracking table created successfully", {
118
+ databaseId,
119
+ tableId: BACKUP_TABLE_ID
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Records backup metadata in the tracking table
125
+ */
126
+ export async function recordBackup(
127
+ db: DatabaseAdapter,
128
+ databaseId: string,
129
+ metadata: Omit<BackupMetadata, '$id' | '$createdAt' | '$updatedAt'>
130
+ ): Promise<BackupMetadata> {
131
+ // Ensure tracking table exists
132
+ await createBackupTrackingTable(db, databaseId);
133
+
134
+ // Create backup record
135
+ const result = await db.createRow({
136
+ databaseId,
137
+ tableId: BACKUP_TABLE_ID,
138
+ id: ID.unique(),
139
+ data: {
140
+ backupId: metadata.backupId,
141
+ databaseId: metadata.databaseId,
142
+ sizeBytes: metadata.sizeBytes,
143
+ collections: metadata.collections,
144
+ documents: metadata.documents,
145
+ format: metadata.format,
146
+ status: metadata.status,
147
+ error: metadata.error
148
+ }
149
+ });
150
+
151
+ logger.info("Recorded backup metadata", {
152
+ backupId: metadata.backupId,
153
+ databaseId: metadata.databaseId,
154
+ format: metadata.format
155
+ });
156
+
157
+ return result.data as BackupMetadata;
158
+ }
159
+
160
+ /**
161
+ * Lists all backups for a database, sorted by creation date (newest first)
162
+ */
163
+ export async function listBackups(
164
+ db: DatabaseAdapter,
165
+ databaseId: string
166
+ ): Promise<BackupMetadata[]> {
167
+ try {
168
+ const result = await db.listRows({
169
+ databaseId,
170
+ tableId: BACKUP_TABLE_ID,
171
+ queries: [
172
+ Query.orderDesc("$createdAt"),
173
+ Query.limit(100) // Limit to last 100 backups
174
+ ]
175
+ });
176
+
177
+ return (result.rows || []) as BackupMetadata[];
178
+ } catch (error) {
179
+ // Table might not exist yet
180
+ logger.debug("No backup tracking table found", { databaseId });
181
+ return [];
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Gets the most recent backup for a database
187
+ */
188
+ export async function getLastBackup(
189
+ db: DatabaseAdapter,
190
+ databaseId: string
191
+ ): Promise<BackupMetadata | null> {
192
+ try {
193
+ const result = await db.listRows({
194
+ databaseId,
195
+ tableId: BACKUP_TABLE_ID,
196
+ queries: [
197
+ Query.orderDesc("$createdAt"),
198
+ Query.limit(1)
199
+ ]
200
+ });
201
+
202
+ if (result.rows && result.rows.length > 0) {
203
+ return result.rows[0] as BackupMetadata;
204
+ }
205
+
206
+ return null;
207
+ } catch (error) {
208
+ logger.debug("No backup found or table doesn't exist", { databaseId });
209
+ return null;
210
+ }
211
+ }