@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,2 @@
1
+ export * from "./helperFunctions.js";
2
+ export * from "./setupFiles.js";
@@ -0,0 +1,2 @@
1
+ export * from "./helperFunctions.js";
2
+ export * from "./setupFiles.js";
@@ -0,0 +1,50 @@
1
+ import { type AppwriteConfig } from "@njdamstra/appwrite-utils";
2
+ import { type ValidationResult } from "../config/configValidation.js";
3
+ /**
4
+ * Session authentication preservation options for config loading
5
+ */
6
+ export interface SessionPreservationOptions {
7
+ sessionCookie?: string;
8
+ authMethod?: "session" | "apikey" | "auto";
9
+ sessionMetadata?: {
10
+ email?: string;
11
+ expiresAt?: string;
12
+ };
13
+ }
14
+ /**
15
+ * Configuration loading options
16
+ */
17
+ export interface ConfigLoadingOptions {
18
+ validate?: boolean;
19
+ strictMode?: boolean;
20
+ reportValidation?: boolean;
21
+ preserveAuth?: SessionPreservationOptions;
22
+ }
23
+ /**
24
+ * Helper function to create session preservation options from session data
25
+ * @param sessionCookie The session cookie string
26
+ * @param email Optional email associated with the session
27
+ * @param expiresAt Optional expiration timestamp
28
+ * @returns SessionPreservationOptions object
29
+ */
30
+ export declare function createSessionPreservation(sessionCookie: string, email?: string, expiresAt?: string): SessionPreservationOptions;
31
+ export { findAppwriteConfig, findFunctionsDir } from "./configDiscovery.js";
32
+ /**
33
+ * Loads the Appwrite configuration and returns both config and the path where it was found.
34
+ * @param configDir The directory to search for config files.
35
+ * @param options Loading options including validation settings and session preservation.
36
+ * @returns Object containing the config, path, and validation results.
37
+ */
38
+ export declare const loadConfigWithPath: (configDir: string, options?: ConfigLoadingOptions) => Promise<{
39
+ config: AppwriteConfig;
40
+ actualConfigPath: string;
41
+ validation?: ValidationResult;
42
+ }>;
43
+ /**
44
+ * Loads the Appwrite configuration and all collection configurations from a specified directory.
45
+ * Supports both YAML and TypeScript config formats with backward compatibility.
46
+ * @param configDir The directory containing the config file and collections folder.
47
+ * @param options Loading options including validation settings and session preservation.
48
+ * @returns The loaded Appwrite configuration including collections.
49
+ */
50
+ export declare const loadConfig: (configDir: string, options?: ConfigLoadingOptions) => Promise<AppwriteConfig>;
@@ -0,0 +1,358 @@
1
+ import path from "path";
2
+ import fs from "fs";
3
+ import {} from "@njdamstra/appwrite-utils";
4
+ import { register } from "tsx/esm/api"; // Import the register function
5
+ import { pathToFileURL } from "node:url";
6
+ import chalk from "chalk";
7
+ import { findYamlConfig, loadYamlConfig, loadYamlConfigWithSession, extractSessionOptionsFromConfig } from "../config/yamlConfig.js";
8
+ import { detectAppwriteVersionCached, fetchServerVersion, isVersionAtLeast } from "./versionDetection.js";
9
+ import { MessageFormatter } from "../shared/messageFormatter.js";
10
+ import { validateCollectionsTablesConfig, reportValidationResults } from "../config/configValidation.js";
11
+ import { resolveCollectionsDir, resolveTablesDir } from "./pathResolvers.js";
12
+ import { findAppwriteConfig, findAppwriteConfigTS, findFunctionsDir, discoverCollections, discoverTables, discoverLegacyDirectory } from "./configDiscovery.js";
13
+ /**
14
+ * Helper function to create session preservation options from session data
15
+ * @param sessionCookie The session cookie string
16
+ * @param email Optional email associated with the session
17
+ * @param expiresAt Optional expiration timestamp
18
+ * @returns SessionPreservationOptions object
19
+ */
20
+ export function createSessionPreservation(sessionCookie, email, expiresAt) {
21
+ return {
22
+ sessionCookie,
23
+ authMethod: "session",
24
+ sessionMetadata: {
25
+ ...(email && { email }),
26
+ ...(expiresAt && { expiresAt })
27
+ }
28
+ };
29
+ }
30
+ // Re-export config discovery functions for backward compatibility
31
+ export { findAppwriteConfig, findFunctionsDir } from "./configDiscovery.js";
32
+ /**
33
+ * Loads the Appwrite configuration and returns both config and the path where it was found.
34
+ * @param configDir The directory to search for config files.
35
+ * @param options Loading options including validation settings and session preservation.
36
+ * @returns Object containing the config, path, and validation results.
37
+ */
38
+ export const loadConfigWithPath = async (configDir, options = {}) => {
39
+ const { validate = true, strictMode = false, reportValidation = true } = options;
40
+ let config = null;
41
+ let actualConfigPath = null;
42
+ // Convert session preservation options to YAML format
43
+ const yamlSessionOptions = options.preserveAuth ? {
44
+ sessionCookie: options.preserveAuth.sessionCookie,
45
+ authMethod: options.preserveAuth.authMethod,
46
+ sessionMetadata: options.preserveAuth.sessionMetadata,
47
+ } : undefined;
48
+ // Check if we're given the .appwrite directory directly
49
+ if (configDir.endsWith('.appwrite')) {
50
+ // Look for config files directly in this directory
51
+ const possibleYamlFiles = ['config.yaml', 'config.yml', 'appwriteConfig.yaml', 'appwriteConfig.yml'];
52
+ for (const fileName of possibleYamlFiles) {
53
+ const yamlPath = path.join(configDir, fileName);
54
+ if (fs.existsSync(yamlPath)) {
55
+ config = yamlSessionOptions
56
+ ? await loadYamlConfigWithSession(yamlPath, yamlSessionOptions)
57
+ : await loadYamlConfig(yamlPath);
58
+ actualConfigPath = yamlPath;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ else {
64
+ // Original logic: search for .appwrite directories
65
+ const yamlConfigPath = findYamlConfig(configDir);
66
+ if (yamlConfigPath) {
67
+ config = yamlSessionOptions
68
+ ? await loadYamlConfigWithSession(yamlConfigPath, yamlSessionOptions)
69
+ : await loadYamlConfig(yamlConfigPath);
70
+ actualConfigPath = yamlConfigPath;
71
+ }
72
+ }
73
+ // Fall back to TypeScript config if YAML not found or failed to load
74
+ if (!config) {
75
+ const configPath = path.join(configDir, "appwriteConfig.ts");
76
+ // Only try to load TypeScript config if the file exists
77
+ if (fs.existsSync(configPath)) {
78
+ const unregister = register(); // Register tsx enhancement
79
+ try {
80
+ const configUrl = pathToFileURL(configPath).href;
81
+ const configModule = (await import(configUrl));
82
+ config = configModule.default?.default || configModule.default || configModule;
83
+ if (!config) {
84
+ throw new Error("Failed to load config");
85
+ }
86
+ actualConfigPath = configPath;
87
+ }
88
+ finally {
89
+ unregister(); // Unregister tsx when done
90
+ }
91
+ }
92
+ }
93
+ if (!config || !actualConfigPath) {
94
+ throw new Error("No valid configuration found");
95
+ }
96
+ // Preserve session authentication if provided
97
+ // This allows maintaining session context when config is reloaded during CLI operations
98
+ if (options.preserveAuth) {
99
+ const { sessionCookie, authMethod, sessionMetadata } = options.preserveAuth;
100
+ // Inject session cookie into the loaded config
101
+ if (sessionCookie) {
102
+ config.sessionCookie = sessionCookie;
103
+ }
104
+ // Set or override authentication method preference
105
+ if (authMethod) {
106
+ config.authMethod = authMethod;
107
+ }
108
+ // Merge session metadata (email, expiration, etc.) with existing metadata
109
+ if (sessionMetadata) {
110
+ config.sessionMetadata = {
111
+ ...config.sessionMetadata,
112
+ ...sessionMetadata
113
+ };
114
+ }
115
+ // Auto-detect authentication method if not explicitly provided
116
+ // If we have a session cookie but no auth method specified, prefer session auth
117
+ if (!authMethod && sessionCookie) {
118
+ config.authMethod = "session";
119
+ }
120
+ }
121
+ // Enhanced dual folder support: Load from BOTH collections/ AND tables/ directories
122
+ const configFileDir = path.dirname(actualConfigPath);
123
+ // Look for collections/tables directories in the same directory as the config file
124
+ const collectionsDir = resolveCollectionsDir(configFileDir);
125
+ const tablesDir = resolveTablesDir(configFileDir);
126
+ // Initialize collections array
127
+ config.collections = [];
128
+ // Load from collections/ directory first (higher priority)
129
+ const collectionsResult = await discoverCollections(collectionsDir);
130
+ config.collections.push(...collectionsResult.collections);
131
+ // Load from tables/ directory second (lower priority, check for conflicts)
132
+ const tablesResult = await discoverTables(tablesDir, collectionsResult.loadedNames);
133
+ config.collections.push(...tablesResult.tables);
134
+ // Combine conflicts from both discovery operations
135
+ const allConflicts = [...collectionsResult.conflicts, ...tablesResult.conflicts];
136
+ // Report conflicts if any
137
+ if (allConflicts.length > 0) {
138
+ MessageFormatter.warning(`Found ${allConflicts.length} naming conflicts between collections/ and tables/`, { prefix: "Config" });
139
+ allConflicts.forEach(conflict => {
140
+ MessageFormatter.info(` - '${conflict.name}': ${conflict.source1} (used) vs ${conflict.source2} (skipped)`, { prefix: "Config" });
141
+ });
142
+ }
143
+ // Fallback: If neither directory exists, try legacy single-directory detection
144
+ if (!fs.existsSync(collectionsDir) && !fs.existsSync(tablesDir)) {
145
+ // Determine directory (collections or tables) based on server version / API mode
146
+ let dirName = "collections";
147
+ try {
148
+ const det = await detectAppwriteVersionCached(config.appwriteEndpoint, config.appwriteProject, config.appwriteKey);
149
+ if (det.apiMode === 'tablesdb' || isVersionAtLeast(det.serverVersion, '1.8.0')) {
150
+ dirName = 'tables';
151
+ }
152
+ else {
153
+ // Try health version if not provided
154
+ const ver = await fetchServerVersion(config.appwriteEndpoint);
155
+ if (isVersionAtLeast(ver || undefined, '1.8.0'))
156
+ dirName = 'tables';
157
+ }
158
+ }
159
+ catch { }
160
+ const legacyItems = await discoverLegacyDirectory(configFileDir, dirName);
161
+ config.collections.push(...legacyItems);
162
+ }
163
+ // Ensure array exists even if empty
164
+ config.collections = config.collections || [];
165
+ // Log the final result
166
+ const allCollections = config.collections || [];
167
+ const fromCollectionsDir = allCollections.filter((c) => !c._isFromTablesDir).length;
168
+ const fromTablesDir = allCollections.filter((c) => c._isFromTablesDir).length;
169
+ const totalLoaded = allCollections.length;
170
+ if (totalLoaded > 0) {
171
+ if (fromTablesDir > 0) {
172
+ MessageFormatter.success(`Successfully loaded ${totalLoaded} items total: ${fromCollectionsDir} from collections/ and ${fromTablesDir} from tables/`, { prefix: "Config" });
173
+ }
174
+ else {
175
+ MessageFormatter.success(`Successfully loaded ${totalLoaded} collections from collections/`, { prefix: "Config" });
176
+ }
177
+ }
178
+ // Validate configuration if requested
179
+ let validation;
180
+ if (validate) {
181
+ validation = validateCollectionsTablesConfig(config);
182
+ // In strict mode, treat warnings as errors
183
+ if (strictMode && validation.warnings.length > 0) {
184
+ const strictValidation = {
185
+ ...validation,
186
+ isValid: false,
187
+ errors: [...validation.errors, ...validation.warnings.map(w => ({ ...w, severity: "error" }))],
188
+ warnings: []
189
+ };
190
+ validation = strictValidation;
191
+ }
192
+ // Report validation results if requested
193
+ if (reportValidation) {
194
+ reportValidationResults(validation, { verbose: true });
195
+ }
196
+ // Throw error if validation fails in strict mode
197
+ if (strictMode && !validation.isValid) {
198
+ throw new Error(`Configuration validation failed in strict mode. Found ${validation.errors.length} validation errors.`);
199
+ }
200
+ }
201
+ return { config, actualConfigPath, validation };
202
+ };
203
+ /**
204
+ * Loads the Appwrite configuration and all collection configurations from a specified directory.
205
+ * Supports both YAML and TypeScript config formats with backward compatibility.
206
+ * @param configDir The directory containing the config file and collections folder.
207
+ * @param options Loading options including validation settings and session preservation.
208
+ * @returns The loaded Appwrite configuration including collections.
209
+ */
210
+ export const loadConfig = async (configDir, options = {}) => {
211
+ const { validate = false, strictMode = false, reportValidation = false } = options;
212
+ let config = null;
213
+ let actualConfigPath = null;
214
+ // Convert session preservation options to YAML format
215
+ const yamlSessionOptions = options.preserveAuth ? {
216
+ sessionCookie: options.preserveAuth.sessionCookie,
217
+ authMethod: options.preserveAuth.authMethod,
218
+ sessionMetadata: options.preserveAuth.sessionMetadata,
219
+ } : undefined;
220
+ // First try to find and load YAML config
221
+ const yamlConfigPath = findYamlConfig(configDir);
222
+ if (yamlConfigPath) {
223
+ config = yamlSessionOptions
224
+ ? await loadYamlConfigWithSession(yamlConfigPath, yamlSessionOptions)
225
+ : await loadYamlConfig(yamlConfigPath);
226
+ actualConfigPath = yamlConfigPath;
227
+ }
228
+ // Fall back to TypeScript config if YAML not found or failed to load
229
+ if (!config) {
230
+ const configPath = path.join(configDir, "appwriteConfig.ts");
231
+ // Only try to load TypeScript config if the file exists
232
+ if (fs.existsSync(configPath)) {
233
+ const unregister = register(); // Register tsx enhancement
234
+ try {
235
+ const configUrl = pathToFileURL(configPath).href;
236
+ const configModule = (await import(configUrl));
237
+ config = configModule.default?.default || configModule.default || configModule;
238
+ if (!config) {
239
+ throw new Error("Failed to load config");
240
+ }
241
+ actualConfigPath = configPath;
242
+ }
243
+ finally {
244
+ unregister(); // Unregister tsx when done
245
+ }
246
+ }
247
+ }
248
+ if (!config) {
249
+ throw new Error("No valid configuration found");
250
+ }
251
+ // Preserve session authentication if provided
252
+ // This allows maintaining session context when config is reloaded during CLI operations
253
+ if (options.preserveAuth) {
254
+ const { sessionCookie, authMethod, sessionMetadata } = options.preserveAuth;
255
+ // Inject session cookie into the loaded config
256
+ if (sessionCookie) {
257
+ config.sessionCookie = sessionCookie;
258
+ }
259
+ // Set or override authentication method preference
260
+ if (authMethod) {
261
+ config.authMethod = authMethod;
262
+ }
263
+ // Merge session metadata (email, expiration, etc.) with existing metadata
264
+ if (sessionMetadata) {
265
+ config.sessionMetadata = {
266
+ ...config.sessionMetadata,
267
+ ...sessionMetadata
268
+ };
269
+ }
270
+ // Auto-detect authentication method if not explicitly provided
271
+ // If we have a session cookie but no auth method specified, prefer session auth
272
+ if (!authMethod && sessionCookie) {
273
+ config.authMethod = "session";
274
+ }
275
+ }
276
+ // Enhanced dual folder support: Load from BOTH collections/ AND tables/ directories
277
+ const configFileDir = actualConfigPath ? path.dirname(actualConfigPath) : configDir;
278
+ // Look for collections/tables directories in the same directory as the config file
279
+ const collectionsDir = resolveCollectionsDir(configFileDir);
280
+ const tablesDir = resolveTablesDir(configFileDir);
281
+ // Initialize collections array
282
+ config.collections = [];
283
+ // Load from collections/ directory first (higher priority)
284
+ const collectionsResult = await discoverCollections(collectionsDir);
285
+ config.collections.push(...collectionsResult.collections);
286
+ // Load from tables/ directory second (lower priority, check for conflicts)
287
+ const tablesResult = await discoverTables(tablesDir, collectionsResult.loadedNames);
288
+ config.collections.push(...tablesResult.tables);
289
+ // Combine conflicts from both discovery operations
290
+ const allConflicts = [...collectionsResult.conflicts, ...tablesResult.conflicts];
291
+ // Report conflicts if any
292
+ if (allConflicts.length > 0) {
293
+ MessageFormatter.warning(`Found ${allConflicts.length} naming conflicts between collections/ and tables/`, { prefix: "Config" });
294
+ allConflicts.forEach(conflict => {
295
+ MessageFormatter.info(` - '${conflict.name}': ${conflict.source1} (used) vs ${conflict.source2} (skipped)`, { prefix: "Config" });
296
+ });
297
+ }
298
+ // Fallback: If neither directory exists, try legacy single-directory detection
299
+ if (!fs.existsSync(collectionsDir) && !fs.existsSync(tablesDir)) {
300
+ // Determine directory (collections or tables) based on server version / API mode
301
+ let dirName = "collections";
302
+ try {
303
+ const det = await detectAppwriteVersionCached(config.appwriteEndpoint, config.appwriteProject, config.appwriteKey);
304
+ if (det.apiMode === 'tablesdb' || isVersionAtLeast(det.serverVersion, '1.8.0')) {
305
+ dirName = 'tables';
306
+ }
307
+ else {
308
+ const ver = await fetchServerVersion(config.appwriteEndpoint);
309
+ if (isVersionAtLeast(ver || undefined, '1.8.0'))
310
+ dirName = 'tables';
311
+ }
312
+ }
313
+ catch { }
314
+ const legacyItems = await discoverLegacyDirectory(configFileDir, dirName);
315
+ config.collections.push(...legacyItems);
316
+ }
317
+ // Ensure array exists even if empty
318
+ config.collections = config.collections || [];
319
+ // Log the final result
320
+ const allCollections = config.collections || [];
321
+ const fromCollectionsDir = allCollections.filter((c) => !c._isFromTablesDir).length;
322
+ const fromTablesDir = allCollections.filter((c) => c._isFromTablesDir).length;
323
+ const totalLoaded = allCollections.length;
324
+ if (totalLoaded > 0) {
325
+ if (fromTablesDir > 0) {
326
+ MessageFormatter.success(`Successfully loaded ${totalLoaded} items total: ${fromCollectionsDir} from collections/ and ${fromTablesDir} from tables/`, { prefix: "Config" });
327
+ }
328
+ else {
329
+ MessageFormatter.success(`Successfully loaded ${totalLoaded} collections from collections/`, { prefix: "Config" });
330
+ }
331
+ }
332
+ // Log successful config loading
333
+ if (actualConfigPath) {
334
+ MessageFormatter.success(`Loaded config from: ${actualConfigPath}`, { prefix: "Config" });
335
+ }
336
+ // Validate configuration if requested
337
+ if (validate) {
338
+ let validation = validateCollectionsTablesConfig(config);
339
+ // In strict mode, treat warnings as errors
340
+ if (strictMode && validation.warnings.length > 0) {
341
+ validation = {
342
+ ...validation,
343
+ isValid: false,
344
+ errors: [...validation.errors, ...validation.warnings.map(w => ({ ...w, severity: "error" }))],
345
+ warnings: []
346
+ };
347
+ }
348
+ // Report validation results if requested
349
+ if (reportValidation) {
350
+ reportValidationResults(validation, { verbose: true });
351
+ }
352
+ // Throw error if validation fails in strict mode
353
+ if (strictMode && !validation.isValid) {
354
+ throw new Error(`Configuration validation failed in strict mode. Found ${validation.errors.length} validation errors.`);
355
+ }
356
+ }
357
+ return config;
358
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Path resolution utilities for Appwrite configuration and schema directories
3
+ */
4
+ /**
5
+ * Resolves the schema output directory path
6
+ * @param configPath - Base configuration directory path
7
+ * @returns Full path to schemas directory
8
+ */
9
+ export declare function resolveSchemaDir(configPath: string): string;
10
+ /**
11
+ * Resolves the collections directory path
12
+ * @param configPath - Base configuration directory path
13
+ * @returns Full path to collections directory
14
+ */
15
+ export declare function resolveCollectionsDir(configPath: string): string;
16
+ /**
17
+ * Resolves the tables directory path
18
+ * @param configPath - Base configuration directory path
19
+ * @returns Full path to tables directory
20
+ */
21
+ export declare function resolveTablesDir(configPath: string): string;
22
+ /**
23
+ * Resolves the YAML schema directory path
24
+ * @param configPath - Base configuration directory path
25
+ * @returns Full path to .yaml_schemas directory
26
+ */
27
+ export declare function resolveYamlSchemaDir(configPath: string): string;
28
+ /**
29
+ * Resolves the import data directory path
30
+ * @param configPath - Base configuration directory path
31
+ * @returns Full path to importData directory
32
+ */
33
+ export declare function resolveImportDataDir(configPath: string): string;
34
+ /**
35
+ * Resolves the .appwrite configuration directory
36
+ * @param startDir - Directory to start searching from
37
+ * @returns Path to .appwrite directory or null if not found
38
+ */
39
+ export declare function resolveAppwriteDir(startDir: string): string | null;
40
+ /**
41
+ * Resolves a collection file path within the collections directory
42
+ * @param configPath - Base configuration directory path
43
+ * @param fileName - Name of the collection file (e.g., "User.ts" or "User.yaml")
44
+ * @returns Full path to the collection file
45
+ */
46
+ export declare function resolveCollectionFile(configPath: string, fileName: string): string;
47
+ /**
48
+ * Resolves a table file path within the tables directory
49
+ * @param configPath - Base configuration directory path
50
+ * @param fileName - Name of the table file (e.g., "User.ts" or "User.yaml")
51
+ * @returns Full path to the table file
52
+ */
53
+ export declare function resolveTableFile(configPath: string, fileName: string): string;
@@ -0,0 +1,72 @@
1
+ import path from "path";
2
+ /**
3
+ * Path resolution utilities for Appwrite configuration and schema directories
4
+ */
5
+ /**
6
+ * Resolves the schema output directory path
7
+ * @param configPath - Base configuration directory path
8
+ * @returns Full path to schemas directory
9
+ */
10
+ export function resolveSchemaDir(configPath) {
11
+ return path.join(configPath, "schemas");
12
+ }
13
+ /**
14
+ * Resolves the collections directory path
15
+ * @param configPath - Base configuration directory path
16
+ * @returns Full path to collections directory
17
+ */
18
+ export function resolveCollectionsDir(configPath) {
19
+ return path.join(configPath, "collections");
20
+ }
21
+ /**
22
+ * Resolves the tables directory path
23
+ * @param configPath - Base configuration directory path
24
+ * @returns Full path to tables directory
25
+ */
26
+ export function resolveTablesDir(configPath) {
27
+ return path.join(configPath, "tables");
28
+ }
29
+ /**
30
+ * Resolves the YAML schema directory path
31
+ * @param configPath - Base configuration directory path
32
+ * @returns Full path to .yaml_schemas directory
33
+ */
34
+ export function resolveYamlSchemaDir(configPath) {
35
+ return path.join(configPath, ".yaml_schemas");
36
+ }
37
+ /**
38
+ * Resolves the import data directory path
39
+ * @param configPath - Base configuration directory path
40
+ * @returns Full path to importData directory
41
+ */
42
+ export function resolveImportDataDir(configPath) {
43
+ return path.join(configPath, "importData");
44
+ }
45
+ /**
46
+ * Resolves the .appwrite configuration directory
47
+ * @param startDir - Directory to start searching from
48
+ * @returns Path to .appwrite directory or null if not found
49
+ */
50
+ export function resolveAppwriteDir(startDir) {
51
+ const appwriteDir = path.join(startDir, ".appwrite");
52
+ // Note: Actual existence check should be done by caller
53
+ return appwriteDir;
54
+ }
55
+ /**
56
+ * Resolves a collection file path within the collections directory
57
+ * @param configPath - Base configuration directory path
58
+ * @param fileName - Name of the collection file (e.g., "User.ts" or "User.yaml")
59
+ * @returns Full path to the collection file
60
+ */
61
+ export function resolveCollectionFile(configPath, fileName) {
62
+ return path.join(resolveCollectionsDir(configPath), fileName);
63
+ }
64
+ /**
65
+ * Resolves a table file path within the tables directory
66
+ * @param configPath - Base configuration directory path
67
+ * @param fileName - Name of the table file (e.g., "User.ts" or "User.yaml")
68
+ * @returns Full path to the table file
69
+ */
70
+ export function resolveTableFile(configPath, fileName) {
71
+ return path.join(resolveTablesDir(configPath), fileName);
72
+ }
@@ -0,0 +1,119 @@
1
+ import type { AppwriteConfig } from "@njdamstra/appwrite-utils";
2
+ export interface AppwriteProjectConfig {
3
+ projectId: string;
4
+ endpoint?: string;
5
+ projectName?: string;
6
+ settings?: {
7
+ services?: Record<string, boolean>;
8
+ auth?: {
9
+ methods?: Record<string, boolean>;
10
+ security?: Record<string, any>;
11
+ };
12
+ };
13
+ functions?: Array<{
14
+ $id: string;
15
+ name: string;
16
+ runtime: string;
17
+ entrypoint?: string;
18
+ path?: string;
19
+ commands?: string;
20
+ events?: string[];
21
+ }>;
22
+ databases?: Array<{
23
+ $id: string;
24
+ name: string;
25
+ enabled?: boolean;
26
+ }>;
27
+ collections?: Array<{
28
+ $id: string;
29
+ $permissions?: string[];
30
+ databaseId: string;
31
+ name: string;
32
+ enabled?: boolean;
33
+ documentSecurity?: boolean;
34
+ attributes: Array<{
35
+ key: string;
36
+ type: string;
37
+ required?: boolean;
38
+ array?: boolean;
39
+ size?: number;
40
+ default?: any;
41
+ encrypt?: boolean;
42
+ [key: string]: any;
43
+ }>;
44
+ indexes?: Array<{
45
+ key: string;
46
+ type: string;
47
+ attributes: string[];
48
+ orders?: string[];
49
+ }>;
50
+ }>;
51
+ tablesDB?: Array<{
52
+ $id: string;
53
+ name: string;
54
+ enabled?: boolean;
55
+ }>;
56
+ tables?: Array<{
57
+ $id: string;
58
+ $permissions?: string[];
59
+ databaseId: string;
60
+ name: string;
61
+ enabled?: boolean;
62
+ rowSecurity?: boolean;
63
+ columns: Array<{
64
+ key: string;
65
+ type: string;
66
+ required?: boolean;
67
+ array?: boolean;
68
+ size?: number;
69
+ default?: any;
70
+ encrypt?: boolean;
71
+ unique?: boolean;
72
+ [key: string]: any;
73
+ }>;
74
+ indexes?: Array<{
75
+ key: string;
76
+ type: string;
77
+ attributes: string[];
78
+ orders?: string[];
79
+ }>;
80
+ }>;
81
+ buckets?: Array<{
82
+ bucketId?: string;
83
+ $id?: string;
84
+ name: string;
85
+ maximumFileSize?: number;
86
+ allowedFileExtensions?: string[];
87
+ encryption?: boolean;
88
+ antiVirus?: boolean;
89
+ [key: string]: any;
90
+ }>;
91
+ }
92
+ /**
93
+ * Find appwrite.json or appwrite.config.json in current directory or parents
94
+ */
95
+ export declare function findAppwriteProjectConfig(startDir?: string): string | null;
96
+ /**
97
+ * Load and parse appwrite project configuration
98
+ */
99
+ export declare function loadAppwriteProjectConfig(configPath?: string): AppwriteProjectConfig | null;
100
+ /**
101
+ * Detect API mode from project configuration
102
+ */
103
+ export declare function detectApiModeFromProject(projectConfig: AppwriteProjectConfig): "legacy" | "tablesdb" | "auto";
104
+ /**
105
+ * Convert project config to AppwriteConfig format
106
+ */
107
+ export declare function projectConfigToAppwriteConfig(projectConfig: AppwriteProjectConfig, existingConfig?: Partial<AppwriteConfig>): Partial<AppwriteConfig>;
108
+ /**
109
+ * Get collection/table definitions from project config
110
+ */
111
+ export declare function getCollectionsFromProject(projectConfig: AppwriteProjectConfig): any[];
112
+ /**
113
+ * Check if project config indicates TablesDB usage
114
+ */
115
+ export declare function isTablesDBProject(projectConfig: AppwriteProjectConfig): boolean;
116
+ /**
117
+ * Get the appropriate directory name based on project config
118
+ */
119
+ export declare function getProjectDirectoryName(projectConfig: AppwriteProjectConfig): "tables" | "collections";