appwrite-utils-cli 1.9.7 → 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 (376) hide show
  1. package/README.md +1004 -1004
  2. package/dist/adapters/index.d.ts +7 -8
  3. package/dist/adapters/index.js +7 -9
  4. package/dist/backups/operations/bucketBackup.js +2 -2
  5. package/dist/backups/operations/collectionBackup.d.ts +1 -1
  6. package/dist/backups/operations/collectionBackup.js +3 -3
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
  8. package/dist/backups/operations/comprehensiveBackup.js +2 -2
  9. package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
  10. package/dist/backups/tracking/centralizedTracking.js +2 -2
  11. package/dist/cli/commands/configCommands.js +51 -7
  12. package/dist/cli/commands/databaseCommands.js +156 -104
  13. package/dist/cli/commands/functionCommands.js +3 -3
  14. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  15. package/dist/cli/commands/importFileCommands.js +674 -0
  16. package/dist/cli/commands/schemaCommands.js +3 -3
  17. package/dist/cli/commands/storageCommands.js +2 -3
  18. package/dist/cli/commands/transferCommands.js +3 -5
  19. package/dist/collections/{attributes.d.ts → columns.d.ts} +1 -1
  20. package/dist/collections/{attributes.js → columns.js} +15 -9
  21. package/dist/collections/indexes.js +1 -3
  22. package/dist/collections/methods.d.ts +1 -1
  23. package/dist/collections/methods.js +38 -20
  24. package/dist/collections/tableOperations.d.ts +1 -0
  25. package/dist/collections/tableOperations.js +30 -11
  26. package/dist/collections/transferOperations.d.ts +1 -1
  27. package/dist/collections/transferOperations.js +3 -4
  28. package/dist/collections/wipeOperations.d.ts +4 -3
  29. package/dist/collections/wipeOperations.js +112 -39
  30. package/dist/databases/methods.js +2 -2
  31. package/dist/databases/setup.js +2 -2
  32. package/dist/examples/yamlTerminologyExample.js +2 -2
  33. package/dist/functions/deployments.d.ts +1 -1
  34. package/dist/functions/deployments.js +6 -6
  35. package/dist/functions/fnConfigDiscovery.js +2 -2
  36. package/dist/functions/methods.js +2 -2
  37. package/dist/functions/templates/count-docs-in-collection/README.md +53 -53
  38. package/dist/functions/templates/count-docs-in-collection/src/main.ts +159 -159
  39. package/dist/functions/templates/count-docs-in-collection/src/request.ts +8 -8
  40. package/dist/functions/templates/hono-typescript/README.md +285 -285
  41. package/dist/functions/templates/hono-typescript/src/adapters/request.ts +73 -73
  42. package/dist/functions/templates/hono-typescript/src/adapters/response.ts +105 -105
  43. package/dist/functions/templates/hono-typescript/src/app.ts +179 -179
  44. package/dist/functions/templates/hono-typescript/src/context.ts +102 -102
  45. package/{src/functions/templates/hono-typescript/src/index.ts → dist/functions/templates/hono-typescript/src/main.ts} +53 -53
  46. package/dist/functions/templates/hono-typescript/src/middleware/appwrite.ts +118 -118
  47. package/dist/functions/templates/typescript-node/README.md +31 -31
  48. package/dist/functions/templates/typescript-node/src/context.ts +102 -102
  49. package/dist/functions/templates/typescript-node/src/{index.ts → main.ts} +29 -29
  50. package/dist/functions/templates/uv/README.md +30 -30
  51. package/dist/functions/templates/uv/pyproject.toml +29 -29
  52. package/dist/functions/templates/uv/src/context.py +124 -124
  53. package/dist/functions/templates/uv/src/{index.py → main.py} +45 -45
  54. package/dist/init.js +1 -1
  55. package/dist/interactiveCLI.d.ts +6 -1
  56. package/dist/interactiveCLI.js +79 -25
  57. package/dist/main.js +125 -180
  58. package/dist/migrations/afterImportActions.js +2 -3
  59. package/dist/migrations/appwriteToX.d.ts +1 -1
  60. package/dist/migrations/appwriteToX.js +10 -8
  61. package/dist/migrations/comprehensiveTransfer.js +3 -5
  62. package/dist/migrations/dataLoader.d.ts +4 -2
  63. package/dist/migrations/dataLoader.js +42 -20
  64. package/dist/migrations/importController.d.ts +2 -0
  65. package/dist/migrations/importController.js +39 -24
  66. package/dist/migrations/importDataActions.js +3 -3
  67. package/dist/migrations/relationships.js +1 -2
  68. package/dist/migrations/services/DataTransformationService.js +2 -2
  69. package/dist/migrations/services/FileHandlerService.js +1 -1
  70. package/dist/migrations/services/ImportOrchestrator.d.ts +2 -0
  71. package/dist/migrations/services/ImportOrchestrator.js +15 -7
  72. package/dist/migrations/services/RateLimitManager.js +1 -1
  73. package/dist/migrations/services/RelationshipResolver.js +1 -1
  74. package/dist/migrations/services/UserMappingService.js +1 -1
  75. package/dist/migrations/services/ValidationService.js +1 -1
  76. package/dist/migrations/transfer.d.ts +8 -4
  77. package/dist/migrations/transfer.js +108 -55
  78. package/dist/migrations/yaml/YamlImportConfigLoader.js +52 -52
  79. package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
  80. package/dist/migrations/yaml/generateImportSchemas.js +174 -174
  81. package/dist/setupCommands.d.ts +1 -1
  82. package/dist/setupCommands.js +5 -6
  83. package/dist/setupController.js +1 -1
  84. package/dist/shared/backupTracking.d.ts +1 -1
  85. package/dist/shared/backupTracking.js +2 -2
  86. package/dist/shared/confirmationDialogs.js +1 -1
  87. package/dist/shared/migrationHelpers.d.ts +1 -1
  88. package/dist/shared/migrationHelpers.js +4 -4
  89. package/dist/shared/operationQueue.d.ts +1 -1
  90. package/dist/shared/operationQueue.js +3 -4
  91. package/dist/shared/operationsTable.d.ts +1 -1
  92. package/dist/shared/operationsTable.js +35 -34
  93. package/dist/shared/operationsTableSchema.d.ts +3 -3
  94. package/dist/shared/operationsTableSchema.js +2 -2
  95. package/dist/shared/progressManager.js +1 -1
  96. package/dist/shared/selectionDialogs.d.ts +6 -0
  97. package/dist/shared/selectionDialogs.js +56 -12
  98. package/dist/storage/methods.d.ts +12 -0
  99. package/dist/storage/methods.js +92 -89
  100. package/dist/storage/schemas.d.ts +2 -2
  101. package/dist/tables/indexManager.d.ts +1 -1
  102. package/dist/tables/indexManager.js +2 -2
  103. package/dist/types.d.ts +2 -2
  104. package/dist/types.js +1 -1
  105. package/dist/users/methods.js +2 -3
  106. package/dist/utils/configMigration.js +1 -1
  107. package/dist/utils/index.d.ts +1 -1
  108. package/dist/utils/index.js +1 -1
  109. package/dist/utils/loadConfigs.d.ts +2 -2
  110. package/dist/utils/loadConfigs.js +6 -7
  111. package/dist/utils/setupFiles.js +139 -141
  112. package/dist/utilsController.d.ts +16 -9
  113. package/dist/utilsController.js +93 -68
  114. package/package.json +9 -3
  115. package/.appwrite/.yaml_schemas/appwrite-config.schema.json +0 -380
  116. package/.appwrite/.yaml_schemas/collection.schema.json +0 -255
  117. package/.appwrite/collections/Categories.yaml +0 -182
  118. package/.appwrite/collections/ExampleCollection.yaml +0 -36
  119. package/.appwrite/collections/Posts.yaml +0 -227
  120. package/.appwrite/collections/Users.yaml +0 -149
  121. package/.appwrite/config.yaml +0 -109
  122. package/.appwrite/import/README.md +0 -148
  123. package/.appwrite/import/categories-import.yaml +0 -129
  124. package/.appwrite/import/posts-import.yaml +0 -208
  125. package/.appwrite/import/users-import.yaml +0 -130
  126. package/.appwrite/importData/categories.json +0 -194
  127. package/.appwrite/importData/posts.json +0 -270
  128. package/.appwrite/importData/users.json +0 -220
  129. package/.appwrite/schemas/categories.json +0 -128
  130. package/.appwrite/schemas/exampleCollection.json +0 -52
  131. package/.appwrite/schemas/posts.json +0 -173
  132. package/.appwrite/schemas/users.json +0 -125
  133. package/CHANGELOG.md +0 -35
  134. package/CONFIG_TODO.md +0 -1189
  135. package/SELECTION_DIALOGS.md +0 -146
  136. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  137. package/dist/adapters/AdapterFactory.d.ts +0 -94
  138. package/dist/adapters/AdapterFactory.js +0 -420
  139. package/dist/adapters/DatabaseAdapter.d.ts +0 -243
  140. package/dist/adapters/DatabaseAdapter.js +0 -50
  141. package/dist/adapters/LegacyAdapter.d.ts +0 -50
  142. package/dist/adapters/LegacyAdapter.js +0 -615
  143. package/dist/adapters/TablesDBAdapter.d.ts +0 -45
  144. package/dist/adapters/TablesDBAdapter.js +0 -611
  145. package/dist/config/ConfigManager.d.ts +0 -450
  146. package/dist/config/ConfigManager.js +0 -650
  147. package/dist/config/configMigration.d.ts +0 -87
  148. package/dist/config/configMigration.js +0 -390
  149. package/dist/config/configValidation.d.ts +0 -66
  150. package/dist/config/configValidation.js +0 -358
  151. package/dist/config/index.d.ts +0 -8
  152. package/dist/config/index.js +0 -7
  153. package/dist/config/services/ConfigDiscoveryService.d.ts +0 -122
  154. package/dist/config/services/ConfigDiscoveryService.js +0 -322
  155. package/dist/config/services/ConfigLoaderService.d.ts +0 -129
  156. package/dist/config/services/ConfigLoaderService.js +0 -535
  157. package/dist/config/services/ConfigMergeService.d.ts +0 -208
  158. package/dist/config/services/ConfigMergeService.js +0 -308
  159. package/dist/config/services/ConfigValidationService.d.ts +0 -214
  160. package/dist/config/services/ConfigValidationService.js +0 -310
  161. package/dist/config/services/SessionAuthService.d.ts +0 -225
  162. package/dist/config/services/SessionAuthService.js +0 -456
  163. package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
  164. package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
  165. package/dist/config/services/index.d.ts +0 -13
  166. package/dist/config/services/index.js +0 -10
  167. package/dist/config/yamlConfig.d.ts +0 -722
  168. package/dist/config/yamlConfig.js +0 -702
  169. package/dist/functions/pathResolution.d.ts +0 -37
  170. package/dist/functions/pathResolution.js +0 -185
  171. package/dist/functions/templates/count-docs-in-collection/package.json +0 -25
  172. package/dist/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
  173. package/dist/functions/templates/hono-typescript/package.json +0 -26
  174. package/dist/functions/templates/hono-typescript/src/index.ts +0 -54
  175. package/dist/functions/templates/hono-typescript/tsconfig.json +0 -20
  176. package/dist/functions/templates/typescript-node/package.json +0 -25
  177. package/dist/functions/templates/typescript-node/tsconfig.json +0 -28
  178. package/dist/shared/attributeMapper.d.ts +0 -20
  179. package/dist/shared/attributeMapper.js +0 -203
  180. package/dist/shared/errorUtils.d.ts +0 -54
  181. package/dist/shared/errorUtils.js +0 -95
  182. package/dist/shared/functionManager.d.ts +0 -48
  183. package/dist/shared/functionManager.js +0 -348
  184. package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
  185. package/dist/shared/jsonSchemaGenerator.js +0 -290
  186. package/dist/shared/logging.d.ts +0 -61
  187. package/dist/shared/logging.js +0 -116
  188. package/dist/shared/messageFormatter.d.ts +0 -39
  189. package/dist/shared/messageFormatter.js +0 -162
  190. package/dist/shared/pydanticModelGenerator.d.ts +0 -17
  191. package/dist/shared/pydanticModelGenerator.js +0 -615
  192. package/dist/shared/schemaGenerator.d.ts +0 -40
  193. package/dist/shared/schemaGenerator.js +0 -556
  194. package/dist/utils/ClientFactory.d.ts +0 -87
  195. package/dist/utils/ClientFactory.js +0 -212
  196. package/dist/utils/configDiscovery.d.ts +0 -78
  197. package/dist/utils/configDiscovery.js +0 -472
  198. package/dist/utils/constantsGenerator.d.ts +0 -31
  199. package/dist/utils/constantsGenerator.js +0 -321
  200. package/dist/utils/dataConverters.d.ts +0 -46
  201. package/dist/utils/dataConverters.js +0 -139
  202. package/dist/utils/directoryUtils.d.ts +0 -22
  203. package/dist/utils/directoryUtils.js +0 -59
  204. package/dist/utils/getClientFromConfig.d.ts +0 -39
  205. package/dist/utils/getClientFromConfig.js +0 -199
  206. package/dist/utils/helperFunctions.d.ts +0 -63
  207. package/dist/utils/helperFunctions.js +0 -156
  208. package/dist/utils/pathResolvers.d.ts +0 -53
  209. package/dist/utils/pathResolvers.js +0 -72
  210. package/dist/utils/projectConfig.d.ts +0 -122
  211. package/dist/utils/projectConfig.js +0 -206
  212. package/dist/utils/retryFailedPromises.d.ts +0 -2
  213. package/dist/utils/retryFailedPromises.js +0 -23
  214. package/dist/utils/sessionAuth.d.ts +0 -48
  215. package/dist/utils/sessionAuth.js +0 -164
  216. package/dist/utils/typeGuards.d.ts +0 -35
  217. package/dist/utils/typeGuards.js +0 -57
  218. package/dist/utils/validationRules.d.ts +0 -43
  219. package/dist/utils/validationRules.js +0 -42
  220. package/dist/utils/versionDetection.d.ts +0 -58
  221. package/dist/utils/versionDetection.js +0 -251
  222. package/dist/utils/yamlConverter.d.ts +0 -100
  223. package/dist/utils/yamlConverter.js +0 -428
  224. package/dist/utils/yamlLoader.d.ts +0 -70
  225. package/dist/utils/yamlLoader.js +0 -267
  226. package/scripts/copy-templates.ts +0 -23
  227. package/src/adapters/AdapterFactory.ts +0 -529
  228. package/src/adapters/DatabaseAdapter.ts +0 -319
  229. package/src/adapters/LegacyAdapter.ts +0 -844
  230. package/src/adapters/TablesDBAdapter.ts +0 -823
  231. package/src/adapters/index.ts +0 -37
  232. package/src/backups/operations/bucketBackup.ts +0 -277
  233. package/src/backups/operations/collectionBackup.ts +0 -310
  234. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  235. package/src/backups/schemas/bucketManifest.ts +0 -78
  236. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  237. package/src/backups/tracking/centralizedTracking.ts +0 -352
  238. package/src/cli/commands/configCommands.ts +0 -201
  239. package/src/cli/commands/databaseCommands.ts +0 -879
  240. package/src/cli/commands/functionCommands.ts +0 -418
  241. package/src/cli/commands/schemaCommands.ts +0 -200
  242. package/src/cli/commands/storageCommands.ts +0 -152
  243. package/src/cli/commands/transferCommands.ts +0 -457
  244. package/src/collections/attributes.ts +0 -2020
  245. package/src/collections/attributes.ts.backup +0 -1555
  246. package/src/collections/indexes.ts +0 -352
  247. package/src/collections/methods.ts +0 -700
  248. package/src/collections/tableOperations.ts +0 -521
  249. package/src/collections/transferOperations.ts +0 -590
  250. package/src/collections/wipeOperations.ts +0 -346
  251. package/src/config/ConfigManager.ts +0 -849
  252. package/src/config/README.md +0 -274
  253. package/src/config/configMigration.ts +0 -575
  254. package/src/config/configValidation.ts +0 -445
  255. package/src/config/index.ts +0 -10
  256. package/src/config/services/ConfigDiscoveryService.ts +0 -410
  257. package/src/config/services/ConfigLoaderService.ts +0 -732
  258. package/src/config/services/ConfigMergeService.ts +0 -388
  259. package/src/config/services/ConfigValidationService.ts +0 -394
  260. package/src/config/services/SessionAuthService.ts +0 -565
  261. package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
  262. package/src/config/services/index.ts +0 -29
  263. package/src/config/yamlConfig.ts +0 -761
  264. package/src/databases/methods.ts +0 -49
  265. package/src/databases/setup.ts +0 -77
  266. package/src/examples/yamlTerminologyExample.ts +0 -346
  267. package/src/functions/deployments.ts +0 -220
  268. package/src/functions/fnConfigDiscovery.ts +0 -103
  269. package/src/functions/methods.ts +0 -284
  270. package/src/functions/pathResolution.ts +0 -227
  271. package/src/functions/templates/count-docs-in-collection/README.md +0 -54
  272. package/src/functions/templates/count-docs-in-collection/package.json +0 -25
  273. package/src/functions/templates/count-docs-in-collection/src/main.ts +0 -159
  274. package/src/functions/templates/count-docs-in-collection/src/request.ts +0 -9
  275. package/src/functions/templates/count-docs-in-collection/tsconfig.json +0 -28
  276. package/src/functions/templates/hono-typescript/README.md +0 -286
  277. package/src/functions/templates/hono-typescript/package.json +0 -26
  278. package/src/functions/templates/hono-typescript/src/adapters/request.ts +0 -74
  279. package/src/functions/templates/hono-typescript/src/adapters/response.ts +0 -106
  280. package/src/functions/templates/hono-typescript/src/app.ts +0 -180
  281. package/src/functions/templates/hono-typescript/src/context.ts +0 -103
  282. package/src/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -119
  283. package/src/functions/templates/hono-typescript/tsconfig.json +0 -20
  284. package/src/functions/templates/typescript-node/README.md +0 -32
  285. package/src/functions/templates/typescript-node/package.json +0 -25
  286. package/src/functions/templates/typescript-node/src/context.ts +0 -103
  287. package/src/functions/templates/typescript-node/src/index.ts +0 -29
  288. package/src/functions/templates/typescript-node/tsconfig.json +0 -28
  289. package/src/functions/templates/uv/README.md +0 -31
  290. package/src/functions/templates/uv/pyproject.toml +0 -30
  291. package/src/functions/templates/uv/src/__init__.py +0 -0
  292. package/src/functions/templates/uv/src/context.py +0 -125
  293. package/src/functions/templates/uv/src/index.py +0 -46
  294. package/src/init.ts +0 -62
  295. package/src/interactiveCLI.ts +0 -1136
  296. package/src/main.ts +0 -1670
  297. package/src/migrations/afterImportActions.ts +0 -580
  298. package/src/migrations/appwriteToX.ts +0 -664
  299. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  300. package/src/migrations/dataLoader.ts +0 -1702
  301. package/src/migrations/importController.ts +0 -428
  302. package/src/migrations/importDataActions.ts +0 -315
  303. package/src/migrations/relationships.ts +0 -334
  304. package/src/migrations/services/DataTransformationService.ts +0 -196
  305. package/src/migrations/services/FileHandlerService.ts +0 -311
  306. package/src/migrations/services/ImportOrchestrator.ts +0 -666
  307. package/src/migrations/services/RateLimitManager.ts +0 -363
  308. package/src/migrations/services/RelationshipResolver.ts +0 -461
  309. package/src/migrations/services/UserMappingService.ts +0 -345
  310. package/src/migrations/services/ValidationService.ts +0 -349
  311. package/src/migrations/transfer.ts +0 -1068
  312. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  313. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  314. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  315. package/src/schemas/authUser.ts +0 -23
  316. package/src/setup.ts +0 -8
  317. package/src/setupCommands.ts +0 -603
  318. package/src/setupController.ts +0 -43
  319. package/src/shared/attributeMapper.ts +0 -229
  320. package/src/shared/backupMetadataSchema.ts +0 -93
  321. package/src/shared/backupTracking.ts +0 -211
  322. package/src/shared/confirmationDialogs.ts +0 -327
  323. package/src/shared/errorUtils.ts +0 -110
  324. package/src/shared/functionManager.ts +0 -537
  325. package/src/shared/jsonSchemaGenerator.ts +0 -383
  326. package/src/shared/logging.ts +0 -149
  327. package/src/shared/messageFormatter.ts +0 -208
  328. package/src/shared/migrationHelpers.ts +0 -232
  329. package/src/shared/operationLogger.ts +0 -20
  330. package/src/shared/operationQueue.ts +0 -377
  331. package/src/shared/operationsTable.ts +0 -338
  332. package/src/shared/operationsTableSchema.ts +0 -60
  333. package/src/shared/progressManager.ts +0 -278
  334. package/src/shared/pydanticModelGenerator.ts +0 -618
  335. package/src/shared/relationshipExtractor.ts +0 -214
  336. package/src/shared/schemaGenerator.ts +0 -644
  337. package/src/shared/selectionDialogs.ts +0 -749
  338. package/src/storage/backupCompression.ts +0 -88
  339. package/src/storage/methods.ts +0 -698
  340. package/src/storage/schemas.ts +0 -205
  341. package/src/tables/indexManager.ts +0 -409
  342. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  343. package/src/types.ts +0 -9
  344. package/src/users/methods.ts +0 -359
  345. package/src/utils/ClientFactory.ts +0 -240
  346. package/src/utils/configDiscovery.ts +0 -557
  347. package/src/utils/configMigration.ts +0 -348
  348. package/src/utils/constantsGenerator.ts +0 -369
  349. package/src/utils/dataConverters.ts +0 -159
  350. package/src/utils/directoryUtils.ts +0 -61
  351. package/src/utils/getClientFromConfig.ts +0 -257
  352. package/src/utils/helperFunctions.ts +0 -228
  353. package/src/utils/index.ts +0 -2
  354. package/src/utils/loadConfigs.ts +0 -449
  355. package/src/utils/pathResolvers.ts +0 -81
  356. package/src/utils/projectConfig.ts +0 -340
  357. package/src/utils/retryFailedPromises.ts +0 -29
  358. package/src/utils/sessionAuth.ts +0 -230
  359. package/src/utils/setupFiles.ts +0 -1238
  360. package/src/utils/typeGuards.ts +0 -65
  361. package/src/utils/validationRules.ts +0 -88
  362. package/src/utils/versionDetection.ts +0 -292
  363. package/src/utils/yamlConverter.ts +0 -542
  364. package/src/utils/yamlLoader.ts +0 -371
  365. package/src/utilsController.ts +0 -1213
  366. package/tests/README.md +0 -497
  367. package/tests/adapters/AdapterFactory.test.ts +0 -277
  368. package/tests/integration/syncOperations.test.ts +0 -463
  369. package/tests/jest.config.js +0 -25
  370. package/tests/migration/configMigration.test.ts +0 -546
  371. package/tests/setup.ts +0 -62
  372. package/tests/testUtils.ts +0 -340
  373. package/tests/utils/loadConfigs.test.ts +0 -350
  374. package/tests/validation/configValidation.test.ts +0 -412
  375. package/tmp-sync-test/.appwrite/collections/TestCollection.yaml +0 -7
  376. package/tsconfig.json +0 -44
@@ -1,15 +1,13 @@
1
1
  import { mkdirSync, writeFileSync, existsSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { findAppwriteConfig } from "./loadConfigs.js";
4
- import { loadYamlConfig } from "../config/yamlConfig.js";
5
- import { fetchServerVersion, isVersionAtLeast } from "./versionDetection.js";
6
- import { findYamlConfig } from "../config/yamlConfig.js";
4
+ import { loadYamlConfig, findYamlConfig, generateYamlConfigTemplate } from "appwrite-utils-helpers";
5
+ import { fetchServerVersion, isVersionAtLeast } from 'appwrite-utils-helpers';
7
6
  import { ID } from "node-appwrite";
8
7
  import { ulid } from "ulidx";
9
- import { generateYamlConfigTemplate } from "../config/yamlConfig.js";
10
- import { loadAppwriteProjectConfig, findAppwriteProjectConfig, getProjectDirectoryName, isTablesDBProject } from "./projectConfig.js";
11
- import { hasSessionAuth, getSessionAuth } from "./sessionAuth.js";
12
- import { MessageFormatter } from "../shared/messageFormatter.js";
8
+ import { loadAppwriteProjectConfig, findAppwriteProjectConfig, getProjectDirectoryName, isTablesDBProject } from 'appwrite-utils-helpers';
9
+ import { hasSessionAuth, getSessionAuth } from 'appwrite-utils-helpers';
10
+ import { MessageFormatter } from "appwrite-utils-helpers";
13
11
  // Example base configuration using types from appwrite-utils
14
12
  const baseConfig = {
15
13
  appwriteEndpoint: "https://cloud.appwrite.io/v1",
@@ -86,31 +84,31 @@ const baseConfig = {
86
84
  const collectionsConfig = [
87
85
  {
88
86
  name: "ExampleCollection",
89
- content: `import type { CollectionCreate } from "appwrite-utils";
90
-
91
- const ExampleCollection: Partial<CollectionCreate> = {
92
- name: 'ExampleCollection',
93
- $id: '${ulid()}',
94
- documentSecurity: false,
95
- enabled: true,
96
- $permissions: [
97
- { permission: 'read', target: 'any' },
98
- { permission: 'create', target: 'users' },
99
- { permission: 'update', target: 'users' },
100
- { permission: 'delete', target: 'users' }
101
- ],
102
- attributes: [
103
- { key: 'alterEgoName', type: 'string', size: 255, required: false },
104
- // Add more attributes here
105
- ],
106
- indexes: [
107
- { key: 'alterEgoName_search', type: 'fulltext', attributes: ['alterEgoName'] }
108
- ],
109
- importDefs: [
110
- // Define import definitions here
111
- ]
112
- };
113
-
87
+ content: `import type { CollectionCreate } from "appwrite-utils";
88
+
89
+ const ExampleCollection: Partial<CollectionCreate> = {
90
+ name: 'ExampleCollection',
91
+ $id: '${ulid()}',
92
+ documentSecurity: false,
93
+ enabled: true,
94
+ $permissions: [
95
+ { permission: 'read', target: 'any' },
96
+ { permission: 'create', target: 'users' },
97
+ { permission: 'update', target: 'users' },
98
+ { permission: 'delete', target: 'users' }
99
+ ],
100
+ attributes: [
101
+ { key: 'alterEgoName', type: 'string', size: 255, required: false },
102
+ // Add more attributes here
103
+ ],
104
+ indexes: [
105
+ { key: 'alterEgoName_search', type: 'fulltext', attributes: ['alterEgoName'] }
106
+ ],
107
+ importDefs: [
108
+ // Define import definitions here
109
+ ]
110
+ };
111
+
114
112
  export default ExampleCollection;`,
115
113
  },
116
114
  // Add more collections here
@@ -118,16 +116,16 @@ export default ExampleCollection;`,
118
116
  // Define our YAML files
119
117
  // Define our YAML files
120
118
  const configFileExample = `d`;
121
- export const customDefinitionsFile = `import type { ConverterFunctions, ValidationRules, AfterImportActions } from "appwrite-utils";
122
-
123
- export const customConverterFunctions: ConverterFunctions = {
124
- // Add your custom converter functions here
125
- }
126
- export const customValidationRules: ValidationRules = {
127
- // Add your custom validation rules here
128
- }
129
- export const customAfterImportActions: AfterImportActions = {
130
- // Add your custom after import actions here
119
+ export const customDefinitionsFile = `import type { ConverterFunctions, ValidationRules, AfterImportActions } from "appwrite-utils";
120
+
121
+ export const customConverterFunctions: ConverterFunctions = {
122
+ // Add your custom converter functions here
123
+ }
124
+ export const customValidationRules: ValidationRules = {
125
+ // Add your custom validation rules here
126
+ }
127
+ export const customAfterImportActions: AfterImportActions = {
128
+ // Add your custom after import actions here
131
129
  }`;
132
130
  export const createEmptyCollection = (collectionName) => {
133
131
  const currentDir = process.cwd();
@@ -159,37 +157,37 @@ export const createEmptyCollection = (collectionName) => {
159
157
  }
160
158
  if (isYamlProject) {
161
159
  // Create YAML collection
162
- const yamlCollection = `# yaml-language-server: $schema=../.yaml_schemas/collection.schema.json
163
- # Collection Definition: ${collectionName}
164
- name: ${collectionName}
165
- id: ${ulid()}
166
- documentSecurity: false
167
- enabled: true
168
- permissions:
169
- - permission: read
170
- target: any
171
- - permission: create
172
- target: users
173
- - permission: update
174
- target: users
175
- - permission: delete
176
- target: users
177
- attributes:
178
- # Add your attributes here
179
- # Example:
180
- # - key: title
181
- # type: string
182
- # size: 255
183
- # required: true
184
- # description: "The title of the item"
185
- indexes:
186
- # Add your indexes here
187
- # Example:
188
- # - key: title_search
189
- # type: fulltext
190
- # attributes:
191
- # - title
192
- importDefs: []
160
+ const yamlCollection = `# yaml-language-server: $schema=../.yaml_schemas/collection.schema.json
161
+ # Collection Definition: ${collectionName}
162
+ name: ${collectionName}
163
+ id: ${ulid()}
164
+ documentSecurity: false
165
+ enabled: true
166
+ permissions:
167
+ - permission: read
168
+ target: any
169
+ - permission: create
170
+ target: users
171
+ - permission: update
172
+ target: users
173
+ - permission: delete
174
+ target: users
175
+ attributes:
176
+ # Add your attributes here
177
+ # Example:
178
+ # - key: title
179
+ # type: string
180
+ # size: 255
181
+ # required: true
182
+ # description: "The title of the item"
183
+ indexes:
184
+ # Add your indexes here
185
+ # Example:
186
+ # - key: title_search
187
+ # type: fulltext
188
+ # attributes:
189
+ # - title
190
+ importDefs: []
193
191
  `;
194
192
  const collectionFilePath = path.join(collectionsFolder, `${collectionName}.yaml`);
195
193
  writeFileSync(collectionFilePath, yamlCollection);
@@ -197,27 +195,27 @@ importDefs: []
197
195
  }
198
196
  else {
199
197
  // Create TypeScript collection
200
- const emptyCollection = `import type { CollectionCreate } from "appwrite-utils";
201
-
202
- const ${collectionName}: Partial<CollectionCreate> = {
203
- $id: '${ulid()}',
204
- documentSecurity: false,
205
- enabled: true,
206
- name: '${collectionName}',
207
- $permissions: [
208
- { permission: 'read', target: 'any' },
209
- { permission: 'create', target: 'users' },
210
- { permission: 'update', target: 'users' },
211
- { permission: 'delete', target: 'users' }
212
- ],
213
- attributes: [
214
- // Add more attributes here
215
- ],
216
- indexes: [
217
- // Add more indexes here
218
- ],
219
- };
220
-
198
+ const emptyCollection = `import type { CollectionCreate } from "appwrite-utils";
199
+
200
+ const ${collectionName}: Partial<CollectionCreate> = {
201
+ $id: '${ulid()}',
202
+ documentSecurity: false,
203
+ enabled: true,
204
+ name: '${collectionName}',
205
+ $permissions: [
206
+ { permission: 'read', target: 'any' },
207
+ { permission: 'create', target: 'users' },
208
+ { permission: 'update', target: 'users' },
209
+ { permission: 'delete', target: 'users' }
210
+ ],
211
+ attributes: [
212
+ // Add more attributes here
213
+ ],
214
+ indexes: [
215
+ // Add more indexes here
216
+ ],
217
+ };
218
+
221
219
  export default ${collectionName};`;
222
220
  const collectionFilePath = path.join(collectionsFolder, `${collectionName}.ts`);
223
221
  writeFileSync(collectionFilePath, emptyCollection);
@@ -307,11 +305,11 @@ export const setupDirsFiles = async (example = false, currentDir, useYaml = true
307
305
  writeFileSync(appwriteConfigFile, configFileExample);
308
306
  }
309
307
  else {
310
- const baseConfigContent = `import { type AppwriteConfig } from "appwrite-utils";
311
-
312
- const appwriteConfig: AppwriteConfig = ${JSON.stringify(baseConfig, null, 2)};
313
-
314
- export default appwriteConfig;
308
+ const baseConfigContent = `import { type AppwriteConfig } from "appwrite-utils";
309
+
310
+ const appwriteConfig: AppwriteConfig = ${JSON.stringify(baseConfig, null, 2)};
311
+
312
+ export default appwriteConfig;
315
313
  `;
316
314
  writeFileSync(appwriteConfigFile, baseConfigContent);
317
315
  }
@@ -342,48 +340,48 @@ export default appwriteConfig;
342
340
  containerName: "Collection",
343
341
  fieldName: "Attribute"
344
342
  };
345
- const yamlExample = `# yaml-language-server: $schema=../.yaml_schemas/${terminology.schemaRef}
346
- # Example ${terminology.containerName} Definition
347
- name: Example${terminology.containerName}
348
- id: example_${terminology.container}_${Date.now()}
349
- ${terminology.security}: false
350
- enabled: true
351
- permissions:
352
- - permission: read
353
- target: any
354
- - permission: create
355
- target: users
356
- - permission: update
357
- target: users
358
- - permission: delete
359
- target: users
360
- ${terminology.fields}:
361
- - key: title
362
- type: string
363
- size: 255
364
- required: true
365
- description: "The title of the item"
366
- - key: description
367
- type: string
368
- size: 1000
369
- required: false
370
- description: "A longer description"
371
- - key: isActive
372
- type: boolean
373
- required: false
374
- default: true${useTables ? `
375
- - key: uniqueCode
376
- type: string
377
- size: 50
378
- required: false
379
- unique: true
380
- description: "Unique identifier code (TablesDB feature)"` : ''}
381
- indexes:
382
- - key: title_search
383
- type: fulltext
384
- attributes:
385
- - title
386
- importDefs: []
343
+ const yamlExample = `# yaml-language-server: $schema=../.yaml_schemas/${terminology.schemaRef}
344
+ # Example ${terminology.containerName} Definition
345
+ name: Example${terminology.containerName}
346
+ id: example_${terminology.container}_${Date.now()}
347
+ ${terminology.security}: false
348
+ enabled: true
349
+ permissions:
350
+ - permission: read
351
+ target: any
352
+ - permission: create
353
+ target: users
354
+ - permission: update
355
+ target: users
356
+ - permission: delete
357
+ target: users
358
+ ${terminology.fields}:
359
+ - key: title
360
+ type: string
361
+ size: 255
362
+ required: true
363
+ description: "The title of the item"
364
+ - key: description
365
+ type: string
366
+ size: 1000
367
+ required: false
368
+ description: "A longer description"
369
+ - key: isActive
370
+ type: boolean
371
+ required: false
372
+ default: true${useTables ? `
373
+ - key: uniqueCode
374
+ type: string
375
+ size: 50
376
+ required: false
377
+ unique: true
378
+ description: "Unique identifier code (TablesDB feature)"` : ''}
379
+ indexes:
380
+ - key: title_search
381
+ type: fulltext
382
+ attributes:
383
+ - title
384
+ importDefs: []
387
385
  `;
388
386
  const yamlExamplePath = path.join(collectionsFolder, `Example${terminology.containerName}.yaml`);
389
387
  writeFileSync(yamlExamplePath, yamlExample);
@@ -2,8 +2,8 @@ import { Client, Databases, Storage, type Models } from "node-appwrite";
2
2
  import { type AppwriteConfig, type AppwriteFunction, type Specification } from "appwrite-utils";
3
3
  import { type AfterImportActions, type ConverterFunctions, type ValidationRules } from "appwrite-utils";
4
4
  import { type TransferOptions } from "./migrations/transfer.js";
5
- import type { DatabaseAdapter } from './adapters/DatabaseAdapter.js';
6
- import { type ValidationResult } from "./config/configValidation.js";
5
+ import type { DatabaseAdapter } from 'appwrite-utils-helpers';
6
+ import { type ValidationResult } from "appwrite-utils-helpers";
7
7
  import type { DatabaseSelection, BucketSelection } from "./shared/selectionDialogs.js";
8
8
  export interface SetupOptions {
9
9
  databases?: Models.Database[];
@@ -19,6 +19,18 @@ export interface SetupOptions {
19
19
  checkDuplicates?: boolean;
20
20
  shouldWriteFile?: boolean;
21
21
  }
22
+ export interface ControllerInitOptions {
23
+ validate?: boolean;
24
+ strictMode?: boolean;
25
+ useSession?: boolean;
26
+ sessionCookie?: string;
27
+ preferJson?: boolean;
28
+ overrides?: {
29
+ appwriteEndpoint?: string;
30
+ appwriteProject?: string;
31
+ appwriteKey?: string;
32
+ };
33
+ }
22
34
  export declare class UtilsController {
23
35
  private static instance;
24
36
  private isInitialized;
@@ -50,15 +62,10 @@ export declare class UtilsController {
50
62
  appwriteProject?: string;
51
63
  appwriteKey?: string;
52
64
  });
53
- init(options?: {
54
- validate?: boolean;
55
- strictMode?: boolean;
56
- useSession?: boolean;
57
- sessionCookie?: string;
58
- preferJson?: boolean;
59
- }): Promise<void>;
65
+ init(options?: ControllerInitOptions): Promise<void>;
60
66
  reloadConfig(): Promise<void>;
61
67
  ensureDatabaseConfigBucketsExist(databases?: Models.Database[]): Promise<void>;
68
+ pushGlobalBuckets(selectedBucketIds?: string[]): Promise<void>;
62
69
  ensureDatabasesExist(databases?: Models.Database[]): Promise<void>;
63
70
  ensureCollectionsExist(database: Models.Database, collections?: Models.Collection[]): Promise<void>;
64
71
  getDatabasesByIds(ids: string[]): Promise<Models.Database[] | undefined>;
@@ -1,7 +1,7 @@
1
1
  import { Client, Databases, Query, Storage, Users, } from "node-appwrite";
2
2
  import {} from "appwrite-utils";
3
3
  import { findAppwriteConfig, findFunctionsDir, } from "./utils/loadConfigs.js";
4
- import { normalizeFunctionName, validateFunctionDirectory } from './functions/pathResolution.js';
4
+ import { normalizeFunctionName, validateFunctionDirectory } from 'appwrite-utils-helpers';
5
5
  import { UsersController } from "./users/methods.js";
6
6
  import { AppwriteToX } from "./migrations/appwriteToX.js";
7
7
  import { ImportController } from "./migrations/importController.js";
@@ -9,27 +9,22 @@ import { ImportDataActions } from "./migrations/importDataActions.js";
9
9
  import { ensureDatabasesExist, wipeOtherDatabases, ensureCollectionsExist, } from "./databases/setup.js";
10
10
  import { createOrUpdateCollections, createOrUpdateCollectionsViaAdapter, wipeDatabase, generateSchemas, fetchAllCollections, wipeCollection, } from "./collections/methods.js";
11
11
  import { wipeAllTables, wipeTableRows } from "./collections/methods.js";
12
- import { backupDatabase, ensureDatabaseConfigBucketsExist, wipeDocumentStorage, } from "./storage/methods.js";
12
+ import { backupDatabase, ensureDatabaseConfigBucketsExist, ensureGlobalBucketsExist, wipeDocumentStorage, } from "./storage/methods.js";
13
13
  import path from "path";
14
14
  import { converterFunctions, validationRules, } from "appwrite-utils";
15
15
  import { afterImportActions } from "./migrations/afterImportActions.js";
16
16
  import { transferDatabaseLocalToLocal, transferDatabaseLocalToRemote, transferStorageLocalToLocal, transferStorageLocalToRemote, transferUsersLocalToRemote, } from "./migrations/transfer.js";
17
- import { getClient, getClientWithAuth } from "./utils/getClientFromConfig.js";
18
- import { getAdapterFromConfig } from "./utils/getClientFromConfig.js";
19
- import { hasSessionAuth, findSessionByEndpointAndProject, isValidSessionCookie } from "./utils/sessionAuth.js";
17
+ import { getClient, getClientWithAuth } from "appwrite-utils-helpers";
18
+ import { getAdapterFromConfig } from "appwrite-utils-helpers";
19
+ import { hasSessionAuth, findSessionByEndpointAndProject, isValidSessionCookie } from "appwrite-utils-helpers";
20
20
  import { fetchAllDatabases } from "./databases/methods.js";
21
21
  import { listFunctions, updateFunctionSpecifications, } from "./functions/methods.js";
22
22
  import chalk from "chalk";
23
23
  import { deployLocalFunction } from "./functions/deployments.js";
24
24
  import fs from "node:fs";
25
- import { configureLogging, updateLogger, logger } from "./shared/logging.js";
26
- import { MessageFormatter, Messages } from "./shared/messageFormatter.js";
27
- import { SchemaGenerator } from "./shared/schemaGenerator.js";
28
- import { findYamlConfig } from "./config/yamlConfig.js";
25
+ import { configureLogging, updateLogger, logger, MessageFormatter, Messages, SchemaGenerator, findYamlConfig, validateCollectionsTablesConfig, reportValidationResults, validateWithStrictMode, ConfigManager } from "appwrite-utils-helpers";
29
26
  import { createImportSchemas } from "./migrations/yaml/generateImportSchemas.js";
30
- import { validateCollectionsTablesConfig, reportValidationResults, validateWithStrictMode } from "./config/configValidation.js";
31
- import { ConfigManager } from "./config/ConfigManager.js";
32
- import { ClientFactory } from "./utils/ClientFactory.js";
27
+ import { ClientFactory } from "appwrite-utils-helpers";
33
28
  import { clearProcessingState, processQueue } from "./shared/operationQueue.js";
34
29
  export class UtilsController {
35
30
  // ──────────────────────────────────────────────────
@@ -152,7 +147,7 @@ export class UtilsController {
152
147
  }
153
148
  }
154
149
  async init(options = {}) {
155
- const { validate = false, strictMode = false, preferJson = false } = options;
150
+ const { validate = false, strictMode = false, preferJson = false, useSession, sessionCookie, overrides } = options;
156
151
  const configManager = ConfigManager.getInstance();
157
152
  // Load config if not already loaded
158
153
  if (!configManager.hasConfig()) {
@@ -161,6 +156,9 @@ export class UtilsController {
161
156
  validate,
162
157
  strictMode,
163
158
  preferJson,
159
+ useSession,
160
+ explicitSessionCookie: sessionCookie,
161
+ overrides,
164
162
  });
165
163
  }
166
164
  const config = configManager.getConfig();
@@ -224,6 +222,18 @@ export class UtilsController {
224
222
  }
225
223
  await ensureDatabaseConfigBucketsExist(this.storage, this.config, databases);
226
224
  }
225
+ async pushGlobalBuckets(selectedBucketIds) {
226
+ await this.init();
227
+ if (!this.storage) {
228
+ MessageFormatter.error("Storage not initialized", undefined, { prefix: "Controller" });
229
+ return;
230
+ }
231
+ if (!this.config) {
232
+ MessageFormatter.error("Config not initialized", undefined, { prefix: "Controller" });
233
+ return;
234
+ }
235
+ await ensureGlobalBucketsExist(this.storage, this.config, selectedBucketIds);
236
+ }
227
237
  async ensureDatabasesExist(databases) {
228
238
  await this.init();
229
239
  if (!this.config) {
@@ -353,7 +363,7 @@ export class UtilsController {
353
363
  MessageFormatter.error(`Function ${functionName} not found in config`, undefined, { prefix: "Controller" });
354
364
  return;
355
365
  }
356
- await deployLocalFunction(this.appwriteServer, functionName, functionConfig, functionPath);
366
+ await deployLocalFunction(this.appwriteServer, functionName, functionConfig, functionPath, this.appwriteFolderPath);
357
367
  }
358
368
  async syncFunctions() {
359
369
  await this.init();
@@ -648,72 +658,87 @@ export class UtilsController {
648
658
  MessageFormatter.progress("Starting selective push (local config → Appwrite)...", { prefix: "Controller" });
649
659
  // Convert database selections to Models.Database format
650
660
  const selectedDatabases = [];
661
+ const serverDatabases = await fetchAllDatabases(this.database);
662
+ const configuredDatabases = this.config?.databases || [];
651
663
  for (const dbSelection of databaseSelections) {
652
- // Get the full database object from the controller
653
- const databases = await fetchAllDatabases(this.database);
654
- const database = databases.find(db => db.$id === dbSelection.databaseId);
655
- if (database) {
656
- selectedDatabases.push(database);
657
- MessageFormatter.info(`Selected database: ${database.name} (${database.$id})`, { prefix: "Controller" });
658
- // Log selected tables for this database
659
- if (dbSelection.tableIds && dbSelection.tableIds.length > 0) {
660
- MessageFormatter.info(` Tables: ${dbSelection.tableIds.join(', ')}`, { prefix: "Controller" });
661
- }
664
+ // First try to find on server
665
+ const serverDb = serverDatabases.find(db => db.$id === dbSelection.databaseId);
666
+ if (serverDb) {
667
+ selectedDatabases.push(serverDb);
668
+ MessageFormatter.info(`Selected database: ${serverDb.name} (${serverDb.$id})`, { prefix: "Controller" });
662
669
  }
663
670
  else {
664
- MessageFormatter.warning(`Database with ID ${dbSelection.databaseId} not found`, { prefix: "Controller" });
671
+ // Database doesn't exist on server - check if it's in local config
672
+ const configDb = configuredDatabases.find((db) => db.$id === dbSelection.databaseId);
673
+ if (configDb) {
674
+ // Create a pseudo-database object that ensureDatabasesExist will create
675
+ const dbId = configDb.$id;
676
+ selectedDatabases.push({
677
+ $id: dbId,
678
+ name: configDb.name || dbId,
679
+ $createdAt: new Date().toISOString(),
680
+ $updatedAt: new Date().toISOString(),
681
+ enabled: true,
682
+ });
683
+ MessageFormatter.info(`Selected database: ${configDb.name || dbId} (${dbId}) [will be created]`, { prefix: "Controller" });
684
+ }
685
+ else {
686
+ MessageFormatter.warning(`Database with ID ${dbSelection.databaseId} not found in server or local config`, { prefix: "Controller" });
687
+ continue;
688
+ }
689
+ }
690
+ // Log selected tables for this database
691
+ if (dbSelection.tableIds && dbSelection.tableIds.length > 0) {
692
+ MessageFormatter.info(` Tables: ${dbSelection.tableIds.join(', ')}`, { prefix: "Controller" });
665
693
  }
666
694
  }
667
- if (selectedDatabases.length === 0) {
668
- MessageFormatter.warning("No valid databases selected for push", { prefix: "Controller" });
695
+ if (selectedDatabases.length === 0 && (!bucketSelections || bucketSelections.length === 0)) {
696
+ MessageFormatter.warning("No valid databases or buckets selected for push", { prefix: "Controller" });
669
697
  return;
670
698
  }
671
- // Log bucket selections if provided
699
+ // Push global/root-level buckets if any were selected
672
700
  if (bucketSelections && bucketSelections.length > 0) {
673
701
  MessageFormatter.info(`Selected ${bucketSelections.length} buckets:`, { prefix: "Controller" });
674
702
  for (const bucketSelection of bucketSelections) {
675
703
  const dbInfo = bucketSelection.databaseId ? ` (DB: ${bucketSelection.databaseId})` : '';
676
704
  MessageFormatter.info(` - ${bucketSelection.bucketName} (${bucketSelection.bucketId})${dbInfo}`, { prefix: "Controller" });
677
705
  }
678
- }
679
- // PUSH OPERATION: Push local configuration to Appwrite
680
- // Build database-specific collection mappings from databaseSelections
681
- const databaseCollectionsMap = new Map();
682
- // Get all collections/tables from config (they're at the root level, not nested in databases)
683
- const allCollections = this.config?.collections || this.config?.tables || [];
684
- // Create database-specific collection mapping to preserve relationships
685
- for (const dbSelection of databaseSelections) {
686
- const collectionsForDatabase = [];
687
- MessageFormatter.info(`Processing collections for database: ${dbSelection.databaseId}`, { prefix: "Controller" });
688
- // Filter collections that were selected for THIS specific database
689
- for (const collection of allCollections) {
690
- const collectionId = collection.$id || collection.id;
691
- // Check if this collection was selected for THIS database
692
- if (dbSelection.tableIds.includes(collectionId)) {
693
- collectionsForDatabase.push(collection);
694
- const source = collection._isFromTablesDir ? 'tables/' : 'collections/';
695
- MessageFormatter.info(` - Selected collection: ${collection.name || collectionId} for database ${dbSelection.databaseId} [source: ${source}]`, { prefix: "Controller" });
706
+ const selectedGlobalBucketIds = bucketSelections.map(bs => bs.bucketId);
707
+ await this.pushGlobalBuckets(selectedGlobalBucketIds);
708
+ }
709
+ // Database + tables push
710
+ if (selectedDatabases.length > 0) {
711
+ const databaseCollectionsMap = new Map();
712
+ const allCollections = [
713
+ ...(this.config?.collections || []),
714
+ ...(this.config?.tables || [])
715
+ ];
716
+ for (const dbSelection of databaseSelections) {
717
+ const collectionsForDatabase = [];
718
+ for (const collection of allCollections) {
719
+ const collectionId = collection.$id || collection.id;
720
+ if (dbSelection.tableIds.includes(collectionId)) {
721
+ collectionsForDatabase.push(collection);
722
+ const source = collection._isFromTablesDir ? 'tables/' : 'collections/';
723
+ MessageFormatter.info(` - Selected: ${collection.name || collectionId} ${dbSelection.databaseId} [${source}]`, { prefix: "Controller" });
724
+ }
725
+ }
726
+ databaseCollectionsMap.set(dbSelection.databaseId, collectionsForDatabase);
727
+ }
728
+ const totalSelectedCollections = Array.from(databaseCollectionsMap.values())
729
+ .reduce((total, collections) => total + collections.length, 0);
730
+ MessageFormatter.info(`Pushing ${totalSelectedCollections} selected tables to ${databaseCollectionsMap.size} databases`, { prefix: "Controller" });
731
+ await this.ensureDatabasesExist(selectedDatabases);
732
+ await this.ensureDatabaseConfigBucketsExist(selectedDatabases);
733
+ for (const database of selectedDatabases) {
734
+ const collectionsForThisDatabase = databaseCollectionsMap.get(database.$id) || [];
735
+ if (collectionsForThisDatabase.length > 0) {
736
+ MessageFormatter.info(`Pushing ${collectionsForThisDatabase.length} tables to database ${database.$id} (${database.name})`, { prefix: "Controller" });
737
+ await this.createOrUpdateCollections(database, undefined, collectionsForThisDatabase);
738
+ }
739
+ else {
740
+ MessageFormatter.info(`No tables selected for database ${database.$id} (${database.name})`, { prefix: "Controller" });
696
741
  }
697
- }
698
- databaseCollectionsMap.set(dbSelection.databaseId, collectionsForDatabase);
699
- MessageFormatter.info(`Database ${dbSelection.databaseId}: ${collectionsForDatabase.length} collections selected`, { prefix: "Controller" });
700
- }
701
- // Calculate total collections for logging
702
- const totalSelectedCollections = Array.from(databaseCollectionsMap.values())
703
- .reduce((total, collections) => total + collections.length, 0);
704
- MessageFormatter.info(`Pushing ${totalSelectedCollections} selected tables/collections to ${databaseCollectionsMap.size} databases`, { prefix: "Controller" });
705
- // Ensure databases exist
706
- await this.ensureDatabasesExist(selectedDatabases);
707
- await this.ensureDatabaseConfigBucketsExist(selectedDatabases);
708
- // Create/update collections with database-specific context
709
- for (const database of selectedDatabases) {
710
- const collectionsForThisDatabase = databaseCollectionsMap.get(database.$id) || [];
711
- if (collectionsForThisDatabase.length > 0) {
712
- MessageFormatter.info(`Pushing ${collectionsForThisDatabase.length} collections to database ${database.$id} (${database.name})`, { prefix: "Controller" });
713
- await this.createOrUpdateCollections(database, undefined, collectionsForThisDatabase);
714
- }
715
- else {
716
- MessageFormatter.info(`No collections selected for database ${database.$id} (${database.name})`, { prefix: "Controller" });
717
742
  }
718
743
  }
719
744
  MessageFormatter.success("Selective push completed successfully! Local config pushed to Appwrite.", { prefix: "Controller" });
@@ -770,10 +795,10 @@ export class UtilsController {
770
795
  return;
771
796
  }
772
797
  if (options.isRemote && targetClient) {
773
- await transferDatabaseLocalToRemote(sourceClient, options.transferEndpoint, options.transferProject, options.transferKey, fromDb.$id, targetDb.$id);
798
+ await transferDatabaseLocalToRemote(sourceClient, options.transferEndpoint, options.transferProject, options.transferKey, fromDb.$id, targetDb.$id, options.collections);
774
799
  }
775
800
  else {
776
- await transferDatabaseLocalToLocal(sourceClient, fromDb.$id, targetDb.$id);
801
+ await transferDatabaseLocalToLocal(sourceClient, fromDb.$id, targetDb.$id, options.collections, this.adapter);
777
802
  }
778
803
  }
779
804
  if (options.transferUsers) {
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "appwrite-utils-cli",
3
3
  "description": "Appwrite Utility Functions to help with database management, data conversion, data import, migrations, and much more. Meant to be used as a CLI tool, I do not recommend installing this in frontend environments.",
4
- "version": "1.9.7",
5
- "main": "src/main.ts",
4
+ "version": "1.12.0",
5
+ "main": "dist/main.js",
6
6
  "type": "module",
7
+ "files": [
8
+ "dist"
9
+ ],
7
10
  "repository": {
8
11
  "type": "git",
9
12
  "url": "https://github.com/zachhandley/AppwriteUtils"
@@ -39,7 +42,8 @@
39
42
  "@types/inquirer": "^9.0.8",
40
43
  "@types/json-schema": "^7.0.15",
41
44
  "@types/yargs": "^17.0.33",
42
- "appwrite-utils": "latest",
45
+ "appwrite-utils": "^1.9.0",
46
+ "appwrite-utils-helpers": "^0.3.0",
43
47
  "chalk": "^5.4.1",
44
48
  "cli-progress": "^3.12.0",
45
49
  "commander": "^12.1.0",
@@ -54,6 +58,7 @@
54
58
  "nanostores": "^0.10.3",
55
59
  "node-appwrite": "^20.2.1",
56
60
  "p-limit": "^6.2.0",
61
+ "papaparse": "^5.5.3",
57
62
  "tar": "^7.4.3",
58
63
  "tsx": "^4.20.3",
59
64
  "ulidx": "^2.4.1",
@@ -69,6 +74,7 @@
69
74
  "@types/jszip": "^3.4.1",
70
75
  "@types/lodash": "^4.17.18",
71
76
  "@types/luxon": "^3.6.2",
77
+ "@types/papaparse": "^5.5.2",
72
78
  "jest": "^29.7.0",
73
79
  "ts-jest": "^29.1.2",
74
80
  "typescript": "^5.8.3"