@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,24 @@
1
+ import { z } from "zod";
2
+ export declare const AuthUserSchema: z.ZodObject<{
3
+ $id: z.ZodString;
4
+ $createdAt: z.ZodOptional<z.ZodString>;
5
+ $updatedAt: z.ZodOptional<z.ZodString>;
6
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
7
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
9
+ prefs: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
10
+ labels: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
11
+ }, z.core.$strip>;
12
+ export type AuthUser = z.infer<typeof AuthUserSchema>;
13
+ export declare const AuthUserCreateSchema: z.ZodObject<{
14
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
15
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
16
+ $createdAt: z.ZodOptional<z.ZodString>;
17
+ $updatedAt: z.ZodOptional<z.ZodString>;
18
+ phone: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ prefs: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
20
+ labels: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
21
+ userId: z.ZodOptional<z.ZodString>;
22
+ password: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>;
24
+ export type AuthUserCreate = z.infer<typeof AuthUserCreateSchema>;
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ export const AuthUserSchema = z.object({
3
+ $id: z.string(),
4
+ $createdAt: z.string().optional(),
5
+ $updatedAt: z.string().optional(),
6
+ name: z.string().nullish(),
7
+ email: z.string().email("Invalid Email Address").nullish(),
8
+ phone: z.string().nullish(),
9
+ prefs: z.record(z.string(), z.string()).optional().default({}),
10
+ labels: z.array(z.string()).optional().default([]),
11
+ });
12
+ export const AuthUserCreateSchema = AuthUserSchema.omit({
13
+ $id: true,
14
+ }).extend({
15
+ userId: z.string().optional(),
16
+ password: z.string().optional(),
17
+ });
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/setup.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { setupDirsFiles } from "./utils/setupFiles.js";
3
+ const args = process.argv.slice(2);
4
+ const genExample = args.includes("--example");
5
+ setupDirsFiles(genExample);
@@ -0,0 +1,58 @@
1
+ import { type ApiMode } from "./utils/versionDetection.js";
2
+ /**
3
+ * Terminology configuration for API mode-specific naming
4
+ */
5
+ interface TerminologyConfig {
6
+ container: "table" | "collection";
7
+ containerName: "Table" | "Collection";
8
+ fields: "columns" | "attributes";
9
+ fieldName: "Column" | "Attribute";
10
+ security: "rowSecurity" | "documentSecurity";
11
+ schemaRef: "table.schema.json" | "collection.schema.json";
12
+ items: "rows" | "documents";
13
+ }
14
+ /**
15
+ * Detection result with source information
16
+ */
17
+ interface ApiModeDetectionResult {
18
+ apiMode: ApiMode;
19
+ useTables: boolean;
20
+ detectionSource: "appwrite.json" | "server-version" | "default";
21
+ serverVersion?: string;
22
+ }
23
+ /**
24
+ * Get terminology configuration based on API mode
25
+ */
26
+ export declare function getTerminologyConfig(useTables: boolean): TerminologyConfig;
27
+ /**
28
+ * Detect API mode using multiple detection sources
29
+ * Priority: appwrite.json > server version > default (collections)
30
+ */
31
+ export declare function detectApiMode(basePath: string): Promise<ApiModeDetectionResult>;
32
+ /**
33
+ * Create directory structure for Appwrite project
34
+ */
35
+ export declare function createProjectDirectories(basePath: string, useTables: boolean): {
36
+ appwriteFolder: string;
37
+ containerFolder: string;
38
+ schemaFolder: string;
39
+ yamlSchemaFolder: string;
40
+ dataFolder: string;
41
+ };
42
+ /**
43
+ * Create example YAML schema file with correct terminology
44
+ */
45
+ export declare function createExampleSchema(containerFolder: string, terminology: TerminologyConfig): string;
46
+ /**
47
+ * Create JSON schema for YAML validation
48
+ */
49
+ export declare function createYamlValidationSchema(yamlSchemaFolder: string, useTables: boolean): string;
50
+ /**
51
+ * Initialize a new Appwrite project with correct directory structure and terminology
52
+ */
53
+ export declare function initProject(basePath?: string, forceApiMode?: 'legacy' | 'tablesdb'): Promise<void>;
54
+ /**
55
+ * Create a new collection or table schema file
56
+ */
57
+ export declare function createSchema(name: string, basePath?: string, forceApiMode?: 'legacy' | 'tablesdb'): Promise<void>;
58
+ export {};
@@ -0,0 +1,490 @@
1
+ import { mkdirSync, writeFileSync, existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { ulid } from "ulidx";
4
+ import { MessageFormatter } from "./shared/messageFormatter.js";
5
+ import { detectAppwriteVersionCached, fetchServerVersion, isVersionAtLeast } from "./utils/versionDetection.js";
6
+ import { loadAppwriteProjectConfig, findAppwriteProjectConfig, isTablesDBProject } from "./utils/projectConfig.js";
7
+ import { findYamlConfig, generateYamlConfigTemplate } from "./config/yamlConfig.js";
8
+ import { loadYamlConfig } from "./config/yamlConfig.js";
9
+ import { hasSessionAuth } from "./utils/sessionAuth.js";
10
+ /**
11
+ * Get terminology configuration based on API mode
12
+ */
13
+ export function getTerminologyConfig(useTables) {
14
+ return useTables
15
+ ? {
16
+ container: "table",
17
+ containerName: "Table",
18
+ fields: "columns",
19
+ fieldName: "Column",
20
+ security: "rowSecurity",
21
+ schemaRef: "table.schema.json",
22
+ items: "rows"
23
+ }
24
+ : {
25
+ container: "collection",
26
+ containerName: "Collection",
27
+ fields: "attributes",
28
+ fieldName: "Attribute",
29
+ security: "documentSecurity",
30
+ schemaRef: "collection.schema.json",
31
+ items: "documents"
32
+ };
33
+ }
34
+ /**
35
+ * Detect API mode using multiple detection sources
36
+ * Priority: appwrite.json > server version > default (collections)
37
+ */
38
+ export async function detectApiMode(basePath) {
39
+ let useTables = false;
40
+ let detectionSource = "default";
41
+ let serverVersion;
42
+ try {
43
+ // Priority 1: Check for existing appwrite.json project config
44
+ const projectConfigPath = findAppwriteProjectConfig(basePath);
45
+ if (projectConfigPath) {
46
+ const projectConfig = loadAppwriteProjectConfig(projectConfigPath);
47
+ if (projectConfig) {
48
+ useTables = isTablesDBProject(projectConfig);
49
+ detectionSource = "appwrite.json";
50
+ MessageFormatter.info(`Detected ${useTables ? 'TablesDB' : 'Collections'} project from ${projectConfigPath}`, { prefix: "Setup" });
51
+ return {
52
+ apiMode: useTables ? 'tablesdb' : 'legacy',
53
+ useTables,
54
+ detectionSource
55
+ };
56
+ }
57
+ }
58
+ // Priority 2: Try reading existing YAML config for version detection
59
+ const yamlPath = findYamlConfig(basePath);
60
+ if (yamlPath) {
61
+ const cfg = await loadYamlConfig(yamlPath);
62
+ if (cfg) {
63
+ const endpoint = cfg.appwriteEndpoint;
64
+ const projectId = cfg.appwriteProject;
65
+ if (hasSessionAuth(endpoint, projectId)) {
66
+ MessageFormatter.info("Using session authentication for version detection", { prefix: "Setup" });
67
+ }
68
+ const ver = await fetchServerVersion(endpoint);
69
+ serverVersion = ver || undefined;
70
+ if (isVersionAtLeast(ver || undefined, '1.8.0')) {
71
+ useTables = true;
72
+ detectionSource = "server-version";
73
+ MessageFormatter.info(`Detected TablesDB support (Appwrite ${ver})`, { prefix: "Setup" });
74
+ }
75
+ else {
76
+ MessageFormatter.info(`Using Collections API (Appwrite ${ver || 'unknown'})`, { prefix: "Setup" });
77
+ }
78
+ return {
79
+ apiMode: useTables ? 'tablesdb' : 'legacy',
80
+ useTables,
81
+ detectionSource,
82
+ serverVersion
83
+ };
84
+ }
85
+ }
86
+ }
87
+ catch (error) {
88
+ MessageFormatter.warning(`Version detection failed, defaulting to Collections API: ${error instanceof Error ? error.message : String(error)}`, { prefix: "Setup" });
89
+ }
90
+ // Default to Collections API
91
+ return {
92
+ apiMode: 'legacy',
93
+ useTables: false,
94
+ detectionSource: 'default'
95
+ };
96
+ }
97
+ /**
98
+ * Create directory structure for Appwrite project
99
+ */
100
+ export function createProjectDirectories(basePath, useTables) {
101
+ const appwriteFolder = path.join(basePath, ".appwrite");
102
+ const containerName = useTables ? "tables" : "collections";
103
+ const containerFolder = path.join(appwriteFolder, containerName);
104
+ const schemaFolder = path.join(appwriteFolder, "schemas");
105
+ const yamlSchemaFolder = path.join(appwriteFolder, ".yaml_schemas");
106
+ const dataFolder = path.join(appwriteFolder, "importData");
107
+ // Create all directories
108
+ for (const dir of [appwriteFolder, containerFolder, schemaFolder, yamlSchemaFolder, dataFolder]) {
109
+ if (!existsSync(dir)) {
110
+ mkdirSync(dir, { recursive: true });
111
+ }
112
+ }
113
+ return {
114
+ appwriteFolder,
115
+ containerFolder,
116
+ schemaFolder,
117
+ yamlSchemaFolder,
118
+ dataFolder
119
+ };
120
+ }
121
+ /**
122
+ * Create example YAML schema file with correct terminology
123
+ */
124
+ export function createExampleSchema(containerFolder, terminology) {
125
+ const yamlExample = `# yaml-language-server: $schema=../.yaml_schemas/${terminology.schemaRef}
126
+ # Example ${terminology.containerName} Definition
127
+ name: Example${terminology.containerName}
128
+ id: example_${terminology.container}_${Date.now()}
129
+ ${terminology.security}: false
130
+ enabled: true
131
+ permissions:
132
+ - permission: read
133
+ target: any
134
+ - permission: create
135
+ target: users
136
+ - permission: update
137
+ target: users
138
+ - permission: delete
139
+ target: users
140
+ ${terminology.fields}:
141
+ - key: title
142
+ type: string
143
+ size: 255
144
+ required: true
145
+ description: "The title of the item"
146
+ - key: description
147
+ type: string
148
+ size: 1000
149
+ required: false
150
+ description: "A longer description"
151
+ - key: isActive
152
+ type: boolean
153
+ required: false
154
+ default: true${terminology.container === 'table' ? `
155
+ - key: uniqueCode
156
+ type: string
157
+ size: 50
158
+ required: false
159
+ unique: true
160
+ description: "Unique identifier code (TablesDB feature)"` : ''}
161
+ indexes:
162
+ - key: title_search
163
+ type: fulltext
164
+ attributes:
165
+ - title
166
+ importDefs: []
167
+ `;
168
+ const examplePath = path.join(containerFolder, `Example${terminology.containerName}.yaml`);
169
+ writeFileSync(examplePath, yamlExample);
170
+ MessageFormatter.info(`Created example ${terminology.container} definition with ${terminology.fields} terminology`, { prefix: "Setup" });
171
+ return examplePath;
172
+ }
173
+ /**
174
+ * Create JSON schema for YAML validation
175
+ */
176
+ export function createYamlValidationSchema(yamlSchemaFolder, useTables) {
177
+ const schemaFileName = useTables ? "table.schema.json" : "collection.schema.json";
178
+ const containerType = useTables ? "Table" : "Collection";
179
+ const fieldsName = useTables ? "columns" : "attributes";
180
+ const fieldsDescription = useTables ? "Table columns (fields)" : "Collection attributes (fields)";
181
+ const securityField = useTables ? "rowSecurity" : "documentSecurity";
182
+ const securityDescription = useTables ? "Enable row-level permissions" : "Enable document-level permissions";
183
+ const itemType = useTables ? "row" : "document";
184
+ const schema = {
185
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
186
+ "$id": `https://appwrite-utils.dev/schemas/${schemaFileName}`,
187
+ "title": `Appwrite ${containerType} Definition`,
188
+ "description": `Schema for defining Appwrite ${useTables ? 'tables' : 'collections'} in YAML${useTables ? ' (TablesDB API)' : ''}`,
189
+ "type": "object",
190
+ "properties": {
191
+ "name": {
192
+ "type": "string",
193
+ "description": `The name of the ${useTables ? 'table' : 'collection'}`
194
+ },
195
+ "id": {
196
+ "type": "string",
197
+ "description": `The ID of the ${useTables ? 'table' : 'collection'} (optional, auto-generated if not provided)`,
198
+ "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]{0,35}$"
199
+ },
200
+ [securityField]: {
201
+ "type": "boolean",
202
+ "default": false,
203
+ "description": securityDescription
204
+ },
205
+ "enabled": {
206
+ "type": "boolean",
207
+ "default": true,
208
+ "description": `Whether the ${useTables ? 'table' : 'collection'} is enabled`
209
+ },
210
+ "permissions": {
211
+ "type": "array",
212
+ "description": `${containerType}-level permissions`,
213
+ "items": {
214
+ "type": "object",
215
+ "properties": {
216
+ "permission": {
217
+ "type": "string",
218
+ "enum": ["read", "create", "update", "delete"],
219
+ "description": "The permission type"
220
+ },
221
+ "target": {
222
+ "type": "string",
223
+ "description": "Permission target (e.g., 'any', 'users', 'users/verified', 'label:admin')"
224
+ }
225
+ },
226
+ "required": ["permission", "target"],
227
+ "additionalProperties": false
228
+ }
229
+ },
230
+ [fieldsName]: {
231
+ "type": "array",
232
+ "description": fieldsDescription,
233
+ "items": {
234
+ "type": "object",
235
+ "properties": {
236
+ "key": {
237
+ "type": "string",
238
+ "description": `${useTables ? 'Column' : 'Attribute'} name`,
239
+ "pattern": "^[a-zA-Z][a-zA-Z0-9]*$"
240
+ },
241
+ "type": {
242
+ "type": "string",
243
+ "enum": ["string", "integer", "double", "boolean", "datetime", "email", "ip", "url", "enum", "relationship"],
244
+ "description": `${useTables ? 'Column' : 'Attribute'} data type`
245
+ },
246
+ "size": {
247
+ "type": "number",
248
+ "description": `Maximum size for string ${useTables ? 'columns' : 'attributes'}`,
249
+ "minimum": 1,
250
+ "maximum": 1073741824
251
+ },
252
+ "required": {
253
+ "type": "boolean",
254
+ "default": false,
255
+ "description": `Whether the ${useTables ? 'column' : 'attribute'} is required`
256
+ },
257
+ "array": {
258
+ "type": "boolean",
259
+ "default": false,
260
+ "description": `Whether the ${useTables ? 'column' : 'attribute'} is an array`
261
+ },
262
+ // Encryption flag for string types
263
+ "encrypt": {
264
+ "type": "boolean",
265
+ "default": false,
266
+ "description": `Enable encryption for string ${useTables ? 'columns' : 'attributes'}`
267
+ },
268
+ ...(useTables ? {
269
+ "unique": {
270
+ "type": "boolean",
271
+ "default": false,
272
+ "description": "Whether the column values must be unique (TablesDB feature)"
273
+ }
274
+ } : {}),
275
+ "default": {
276
+ "description": `Default value for the ${useTables ? 'column' : 'attribute'}`
277
+ },
278
+ "description": {
279
+ "type": "string",
280
+ "description": `${useTables ? 'Column' : 'Attribute'} description`
281
+ },
282
+ "min": {
283
+ "type": "number",
284
+ "description": `Minimum value for numeric ${useTables ? 'columns' : 'attributes'}`
285
+ },
286
+ "max": {
287
+ "type": "number",
288
+ "description": `Maximum value for numeric ${useTables ? 'columns' : 'attributes'}`
289
+ },
290
+ "elements": {
291
+ "type": "array",
292
+ "items": {
293
+ "type": "string"
294
+ },
295
+ "description": `Allowed values for enum ${useTables ? 'columns' : 'attributes'}`
296
+ },
297
+ "relatedCollection": {
298
+ "type": "string",
299
+ "description": `Related ${useTables ? 'table' : 'collection'} name for relationship ${useTables ? 'columns' : 'attributes'}`
300
+ },
301
+ "relationType": {
302
+ "type": "string",
303
+ "enum": ["oneToOne", "oneToMany", "manyToOne", "manyToMany"],
304
+ "description": "Type of relationship"
305
+ },
306
+ "twoWay": {
307
+ "type": "boolean",
308
+ "description": "Whether the relationship is bidirectional"
309
+ },
310
+ "twoWayKey": {
311
+ "type": "string",
312
+ "description": "Key name for the reverse relationship"
313
+ },
314
+ "onDelete": {
315
+ "type": "string",
316
+ "enum": ["cascade", "restrict", "setNull"],
317
+ "description": `Action to take when related ${itemType} is deleted`
318
+ },
319
+ "side": {
320
+ "type": "string",
321
+ "enum": ["parent", "child"],
322
+ "description": "Side of the relationship"
323
+ }
324
+ },
325
+ "required": ["key", "type"],
326
+ "additionalProperties": false,
327
+ "allOf": [
328
+ {
329
+ "if": {
330
+ "properties": { "type": { "const": "enum" } }
331
+ },
332
+ "then": {
333
+ "required": ["elements"]
334
+ }
335
+ },
336
+ {
337
+ "if": {
338
+ "properties": { "type": { "const": "relationship" } }
339
+ },
340
+ "then": {
341
+ "required": ["relatedCollection", "relationType"]
342
+ }
343
+ }
344
+ ]
345
+ }
346
+ },
347
+ "indexes": {
348
+ "type": "array",
349
+ "description": `Database indexes for the ${useTables ? 'table' : 'collection'}`,
350
+ "items": {
351
+ "type": "object",
352
+ "properties": {
353
+ "key": {
354
+ "type": "string",
355
+ "description": "Index name"
356
+ },
357
+ "type": {
358
+ "type": "string",
359
+ "enum": ["key", "fulltext", "unique"],
360
+ "description": "Index type"
361
+ },
362
+ "attributes": {
363
+ "type": "array",
364
+ "items": {
365
+ "type": "string"
366
+ },
367
+ "description": `${useTables ? 'Columns' : 'Attributes'} to index`,
368
+ "minItems": 1
369
+ },
370
+ "orders": {
371
+ "type": "array",
372
+ "items": {
373
+ "type": "string",
374
+ "enum": ["ASC", "DESC"]
375
+ },
376
+ "description": `Sort order for each ${useTables ? 'column' : 'attribute'}`
377
+ }
378
+ },
379
+ "required": ["key", "type", "attributes"],
380
+ "additionalProperties": false
381
+ }
382
+ },
383
+ "importDefs": {
384
+ "type": "array",
385
+ "description": "Import definitions for data migration",
386
+ "default": []
387
+ }
388
+ },
389
+ "required": ["name"],
390
+ "additionalProperties": false
391
+ };
392
+ const schemaPath = path.join(yamlSchemaFolder, schemaFileName);
393
+ writeFileSync(schemaPath, JSON.stringify(schema, null, 2));
394
+ return schemaPath;
395
+ }
396
+ /**
397
+ * Initialize a new Appwrite project with correct directory structure and terminology
398
+ */
399
+ export async function initProject(basePath, forceApiMode) {
400
+ const projectPath = basePath || process.cwd();
401
+ // Detect API mode
402
+ const detection = forceApiMode
403
+ ? {
404
+ apiMode: forceApiMode,
405
+ useTables: forceApiMode === 'tablesdb',
406
+ detectionSource: 'forced',
407
+ }
408
+ : await detectApiMode(projectPath);
409
+ const { useTables, detectionSource } = detection;
410
+ const terminology = getTerminologyConfig(useTables);
411
+ // Create directory structure
412
+ const dirs = createProjectDirectories(projectPath, useTables);
413
+ // Generate YAML config
414
+ const configPath = path.join(dirs.appwriteFolder, "config.yaml");
415
+ generateYamlConfigTemplate(configPath);
416
+ // Create example schema file
417
+ createExampleSchema(dirs.containerFolder, terminology);
418
+ // Create JSON validation schema
419
+ createYamlValidationSchema(dirs.yamlSchemaFolder, useTables);
420
+ // Success messages
421
+ const containerType = useTables ? "TablesDB" : "Collections";
422
+ MessageFormatter.success(`Created YAML config and setup files/directories in .appwrite/ folder.`, { prefix: "Setup" });
423
+ MessageFormatter.info(`Project configured for ${containerType} API (${detectionSource} detection)`, { prefix: "Setup" });
424
+ MessageFormatter.info("You can now configure your project in .appwrite/config.yaml", { prefix: "Setup" });
425
+ MessageFormatter.info(`${terminology.containerName}s can be defined in .appwrite/${terminology.container}s/ as .yaml files`, { prefix: "Setup" });
426
+ MessageFormatter.info("Schemas will be generated in .appwrite/schemas/", { prefix: "Setup" });
427
+ MessageFormatter.info("Import data can be placed in .appwrite/importData/", { prefix: "Setup" });
428
+ if (useTables) {
429
+ MessageFormatter.info("TablesDB features: unique constraints, enhanced performance, row-level security", { prefix: "Setup" });
430
+ }
431
+ }
432
+ /**
433
+ * Create a new collection or table schema file
434
+ */
435
+ export async function createSchema(name, basePath, forceApiMode) {
436
+ const projectPath = basePath || process.cwd();
437
+ // Detect API mode
438
+ const detection = forceApiMode
439
+ ? {
440
+ apiMode: forceApiMode,
441
+ useTables: forceApiMode === 'tablesdb',
442
+ detectionSource: 'forced',
443
+ }
444
+ : await detectApiMode(projectPath);
445
+ const { useTables } = detection;
446
+ const terminology = getTerminologyConfig(useTables);
447
+ // Find or create container directory
448
+ const appwriteFolder = path.join(projectPath, ".appwrite");
449
+ const containerFolder = path.join(appwriteFolder, useTables ? "tables" : "collections");
450
+ if (!existsSync(containerFolder)) {
451
+ mkdirSync(containerFolder, { recursive: true });
452
+ }
453
+ // Create YAML schema file
454
+ const yamlSchema = `# yaml-language-server: $schema=../.yaml_schemas/${terminology.schemaRef}
455
+ # ${terminology.containerName} Definition: ${name}
456
+ name: ${name}
457
+ id: ${ulid()}
458
+ ${terminology.security}: false
459
+ enabled: true
460
+ permissions:
461
+ - permission: read
462
+ target: any
463
+ - permission: create
464
+ target: users
465
+ - permission: update
466
+ target: users
467
+ - permission: delete
468
+ target: users
469
+ ${terminology.fields}:
470
+ # Add your ${terminology.fields} here
471
+ # Example:
472
+ # - key: title
473
+ # type: string
474
+ # size: 255
475
+ # required: true
476
+ # description: "The title of the item"
477
+ indexes:
478
+ # Add your indexes here
479
+ # Example:
480
+ # - key: title_search
481
+ # type: fulltext
482
+ # attributes:
483
+ # - title
484
+ importDefs: []
485
+ `;
486
+ const schemaPath = path.join(containerFolder, `${name}.yaml`);
487
+ writeFileSync(schemaPath, yamlSchema);
488
+ MessageFormatter.success(`Created ${terminology.container} schema: ${schemaPath}`, { prefix: "Setup" });
489
+ MessageFormatter.info(`Add your ${terminology.fields} to define the ${terminology.container} structure`, { prefix: "Setup" });
490
+ }
@@ -0,0 +1,9 @@
1
+ import type { AppwriteConfig } from "@njdamstra/appwrite-utils";
2
+ export declare class SetupController {
3
+ private currentDir;
4
+ private config;
5
+ constructor(currentDir: string);
6
+ runSetup(withExampleData?: boolean): Promise<void>;
7
+ loadConfig(): Promise<AppwriteConfig | null>;
8
+ hasExistingConfig(): boolean;
9
+ }
@@ -0,0 +1,34 @@
1
+ import { setupDirsFiles } from "./utils/setupFiles.js";
2
+ import { loadConfig } from "./utils/loadConfigs.js";
3
+ import path from "path";
4
+ import fs from "fs";
5
+ import { MessageFormatter } from "./shared/messageFormatter.js";
6
+ export class SetupController {
7
+ currentDir;
8
+ config = null;
9
+ constructor(currentDir) {
10
+ this.currentDir = currentDir;
11
+ }
12
+ async runSetup(withExampleData = false) {
13
+ await setupDirsFiles(withExampleData, this.currentDir);
14
+ MessageFormatter.success("Setup completed successfully", { prefix: "Setup" });
15
+ }
16
+ async loadConfig() {
17
+ if (this.hasExistingConfig()) {
18
+ try {
19
+ const appwriteDir = path.join(this.currentDir, "appwrite");
20
+ this.config = await loadConfig(appwriteDir);
21
+ return this.config;
22
+ }
23
+ catch (error) {
24
+ MessageFormatter.error("Error loading config", error, { prefix: "Setup" });
25
+ return null;
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+ hasExistingConfig() {
31
+ const configPath = path.join(this.currentDir, "appwrite", "appwriteConfig.ts");
32
+ return fs.existsSync(configPath);
33
+ }
34
+ }
@@ -0,0 +1,20 @@
1
+ import type { CreateAttributeParams, UpdateAttributeParams } from "../adapters/DatabaseAdapter.js";
2
+ import type { Attribute } from "@njdamstra/appwrite-utils";
3
+ /**
4
+ * Map a schema Attribute into DatabaseAdapter CreateAttributeParams
5
+ * Only includes fields valid for the specific type to satisfy TS unions.
6
+ * Also normalizes min/max ordering for numeric types to avoid server errors.
7
+ */
8
+ export declare function mapToCreateAttributeParams(attr: Attribute, base: {
9
+ databaseId: string;
10
+ tableId: string;
11
+ }): CreateAttributeParams;
12
+ /**
13
+ * Map a schema Attribute into DatabaseAdapter UpdateAttributeParams
14
+ * Omits fields that are not explicitly provided, and guards enum updates
15
+ * so we never send an empty elements array (preserve existing on server).
16
+ */
17
+ export declare function mapToUpdateAttributeParams(attr: Attribute, base: {
18
+ databaseId: string;
19
+ tableId: string;
20
+ }): UpdateAttributeParams;