appwrite-utils-cli 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/{src/adapters/index.ts → dist/adapters/index.d.ts} +0 -1
  2. package/dist/adapters/index.js +10 -0
  3. package/dist/backups/operations/bucketBackup.d.ts +19 -0
  4. package/dist/backups/operations/bucketBackup.js +197 -0
  5. package/dist/backups/operations/collectionBackup.d.ts +30 -0
  6. package/dist/backups/operations/collectionBackup.js +201 -0
  7. package/dist/backups/operations/comprehensiveBackup.d.ts +25 -0
  8. package/dist/backups/operations/comprehensiveBackup.js +238 -0
  9. package/dist/backups/schemas/bucketManifest.d.ts +93 -0
  10. package/dist/backups/schemas/bucketManifest.js +33 -0
  11. package/dist/backups/schemas/comprehensiveManifest.d.ts +108 -0
  12. package/dist/backups/schemas/comprehensiveManifest.js +32 -0
  13. package/dist/backups/tracking/centralizedTracking.d.ts +34 -0
  14. package/dist/backups/tracking/centralizedTracking.js +274 -0
  15. package/dist/cli/commands/configCommands.d.ts +8 -0
  16. package/dist/cli/commands/configCommands.js +210 -0
  17. package/dist/cli/commands/databaseCommands.d.ts +14 -0
  18. package/dist/cli/commands/databaseCommands.js +696 -0
  19. package/dist/cli/commands/functionCommands.d.ts +7 -0
  20. package/dist/cli/commands/functionCommands.js +330 -0
  21. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  22. package/dist/cli/commands/importFileCommands.js +674 -0
  23. package/dist/cli/commands/schemaCommands.d.ts +7 -0
  24. package/dist/cli/commands/schemaCommands.js +169 -0
  25. package/dist/cli/commands/storageCommands.d.ts +5 -0
  26. package/dist/cli/commands/storageCommands.js +142 -0
  27. package/dist/cli/commands/transferCommands.d.ts +5 -0
  28. package/dist/cli/commands/transferCommands.js +382 -0
  29. package/dist/collections/columns.d.ts +13 -0
  30. package/dist/collections/columns.js +1339 -0
  31. package/dist/collections/indexes.d.ts +12 -0
  32. package/dist/collections/indexes.js +215 -0
  33. package/dist/collections/methods.d.ts +19 -0
  34. package/dist/collections/methods.js +605 -0
  35. package/dist/collections/tableOperations.d.ts +87 -0
  36. package/dist/collections/tableOperations.js +466 -0
  37. package/dist/collections/transferOperations.d.ts +8 -0
  38. package/dist/collections/transferOperations.js +411 -0
  39. package/dist/collections/wipeOperations.d.ts +17 -0
  40. package/dist/collections/wipeOperations.js +306 -0
  41. package/dist/databases/methods.d.ts +6 -0
  42. package/dist/databases/methods.js +35 -0
  43. package/dist/databases/setup.d.ts +5 -0
  44. package/dist/databases/setup.js +45 -0
  45. package/dist/examples/yamlTerminologyExample.d.ts +42 -0
  46. package/dist/examples/yamlTerminologyExample.js +272 -0
  47. package/dist/functions/deployments.d.ts +4 -0
  48. package/dist/functions/deployments.js +146 -0
  49. package/dist/functions/fnConfigDiscovery.d.ts +3 -0
  50. package/dist/functions/fnConfigDiscovery.js +108 -0
  51. package/dist/functions/methods.d.ts +16 -0
  52. package/dist/functions/methods.js +174 -0
  53. package/dist/init.d.ts +2 -0
  54. package/dist/init.js +57 -0
  55. package/dist/interactiveCLI.d.ts +36 -0
  56. package/dist/interactiveCLI.js +952 -0
  57. package/dist/main.d.ts +2 -0
  58. package/dist/main.js +1125 -0
  59. package/dist/migrations/afterImportActions.d.ts +17 -0
  60. package/dist/migrations/afterImportActions.js +305 -0
  61. package/dist/migrations/appwriteToX.d.ts +211 -0
  62. package/dist/migrations/appwriteToX.js +493 -0
  63. package/dist/migrations/comprehensiveTransfer.d.ts +147 -0
  64. package/dist/migrations/comprehensiveTransfer.js +1315 -0
  65. package/dist/migrations/dataLoader.d.ts +755 -0
  66. package/dist/migrations/dataLoader.js +1272 -0
  67. package/dist/migrations/importController.d.ts +25 -0
  68. package/dist/migrations/importController.js +283 -0
  69. package/dist/migrations/importDataActions.d.ts +50 -0
  70. package/dist/migrations/importDataActions.js +230 -0
  71. package/dist/migrations/relationships.d.ts +29 -0
  72. package/dist/migrations/relationships.js +203 -0
  73. package/dist/migrations/services/DataTransformationService.d.ts +55 -0
  74. package/dist/migrations/services/DataTransformationService.js +158 -0
  75. package/dist/migrations/services/FileHandlerService.d.ts +75 -0
  76. package/dist/migrations/services/FileHandlerService.js +236 -0
  77. package/dist/migrations/services/ImportOrchestrator.d.ts +99 -0
  78. package/dist/migrations/services/ImportOrchestrator.js +493 -0
  79. package/dist/migrations/services/RateLimitManager.d.ts +138 -0
  80. package/dist/migrations/services/RateLimitManager.js +279 -0
  81. package/dist/migrations/services/RelationshipResolver.d.ts +120 -0
  82. package/dist/migrations/services/RelationshipResolver.js +332 -0
  83. package/dist/migrations/services/UserMappingService.d.ts +109 -0
  84. package/dist/migrations/services/UserMappingService.js +277 -0
  85. package/dist/migrations/services/ValidationService.d.ts +74 -0
  86. package/dist/migrations/services/ValidationService.js +260 -0
  87. package/dist/migrations/transfer.d.ts +30 -0
  88. package/dist/migrations/transfer.js +661 -0
  89. package/dist/migrations/yaml/YamlImportConfigLoader.d.ts +131 -0
  90. package/dist/migrations/yaml/YamlImportConfigLoader.js +383 -0
  91. package/dist/migrations/yaml/YamlImportIntegration.d.ts +93 -0
  92. package/dist/migrations/yaml/YamlImportIntegration.js +341 -0
  93. package/dist/migrations/yaml/generateImportSchemas.d.ts +30 -0
  94. package/dist/migrations/yaml/generateImportSchemas.js +1327 -0
  95. package/dist/schemas/authUser.d.ts +24 -0
  96. package/dist/schemas/authUser.js +17 -0
  97. package/dist/setup.d.ts +2 -0
  98. package/{src/setup.ts → dist/setup.js} +0 -3
  99. package/dist/setupCommands.d.ts +58 -0
  100. package/dist/setupCommands.js +489 -0
  101. package/dist/setupController.d.ts +9 -0
  102. package/dist/setupController.js +34 -0
  103. package/dist/shared/backupMetadataSchema.d.ts +94 -0
  104. package/dist/shared/backupMetadataSchema.js +38 -0
  105. package/dist/shared/backupTracking.d.ts +18 -0
  106. package/dist/shared/backupTracking.js +176 -0
  107. package/dist/shared/confirmationDialogs.d.ts +75 -0
  108. package/dist/shared/confirmationDialogs.js +236 -0
  109. package/dist/shared/migrationHelpers.d.ts +61 -0
  110. package/dist/shared/migrationHelpers.js +145 -0
  111. package/{src/shared/operationLogger.ts → dist/shared/operationLogger.d.ts} +1 -11
  112. package/dist/shared/operationLogger.js +12 -0
  113. package/dist/shared/operationQueue.d.ts +40 -0
  114. package/dist/shared/operationQueue.js +310 -0
  115. package/dist/shared/operationsTable.d.ts +26 -0
  116. package/dist/shared/operationsTable.js +287 -0
  117. package/dist/shared/operationsTableSchema.d.ts +48 -0
  118. package/dist/shared/operationsTableSchema.js +35 -0
  119. package/dist/shared/progressManager.d.ts +62 -0
  120. package/dist/shared/progressManager.js +215 -0
  121. package/dist/shared/relationshipExtractor.d.ts +56 -0
  122. package/dist/shared/relationshipExtractor.js +138 -0
  123. package/dist/shared/selectionDialogs.d.ts +220 -0
  124. package/dist/shared/selectionDialogs.js +588 -0
  125. package/dist/storage/backupCompression.d.ts +20 -0
  126. package/dist/storage/backupCompression.js +67 -0
  127. package/dist/storage/methods.d.ts +44 -0
  128. package/dist/storage/methods.js +475 -0
  129. package/dist/storage/schemas.d.ts +842 -0
  130. package/dist/storage/schemas.js +175 -0
  131. package/dist/tables/indexManager.d.ts +65 -0
  132. package/dist/tables/indexManager.js +294 -0
  133. package/{src/types.ts → dist/types.d.ts} +1 -6
  134. package/dist/types.js +3 -0
  135. package/dist/users/methods.d.ts +16 -0
  136. package/dist/users/methods.js +276 -0
  137. package/dist/utils/configMigration.d.ts +1 -0
  138. package/dist/utils/configMigration.js +261 -0
  139. package/dist/utils/index.js +2 -0
  140. package/dist/utils/loadConfigs.d.ts +50 -0
  141. package/dist/utils/loadConfigs.js +357 -0
  142. package/dist/utils/setupFiles.d.ts +4 -0
  143. package/dist/utils/setupFiles.js +1190 -0
  144. package/dist/utilsController.d.ts +114 -0
  145. package/dist/utilsController.js +898 -0
  146. package/package.json +6 -3
  147. package/CHANGELOG.md +0 -35
  148. package/CONFIG_TODO.md +0 -1189
  149. package/SELECTION_DIALOGS.md +0 -146
  150. package/SERVICE_IMPLEMENTATION_REPORT.md +0 -462
  151. package/scripts/copy-templates.ts +0 -23
  152. package/src/backups/operations/bucketBackup.ts +0 -277
  153. package/src/backups/operations/collectionBackup.ts +0 -310
  154. package/src/backups/operations/comprehensiveBackup.ts +0 -342
  155. package/src/backups/schemas/bucketManifest.ts +0 -78
  156. package/src/backups/schemas/comprehensiveManifest.ts +0 -76
  157. package/src/backups/tracking/centralizedTracking.ts +0 -352
  158. package/src/cli/commands/configCommands.ts +0 -265
  159. package/src/cli/commands/databaseCommands.ts +0 -931
  160. package/src/cli/commands/functionCommands.ts +0 -419
  161. package/src/cli/commands/importFileCommands.ts +0 -815
  162. package/src/cli/commands/schemaCommands.ts +0 -200
  163. package/src/cli/commands/storageCommands.ts +0 -151
  164. package/src/cli/commands/transferCommands.ts +0 -454
  165. package/src/collections/attributes.ts.backup +0 -1555
  166. package/src/collections/columns.ts +0 -2025
  167. package/src/collections/indexes.ts +0 -350
  168. package/src/collections/methods.ts +0 -714
  169. package/src/collections/tableOperations.ts +0 -542
  170. package/src/collections/transferOperations.ts +0 -589
  171. package/src/collections/wipeOperations.ts +0 -449
  172. package/src/databases/methods.ts +0 -49
  173. package/src/databases/setup.ts +0 -77
  174. package/src/examples/yamlTerminologyExample.ts +0 -346
  175. package/src/functions/deployments.ts +0 -221
  176. package/src/functions/fnConfigDiscovery.ts +0 -103
  177. package/src/functions/methods.ts +0 -284
  178. package/src/init.ts +0 -62
  179. package/src/interactiveCLI.ts +0 -1201
  180. package/src/main.ts +0 -1517
  181. package/src/migrations/afterImportActions.ts +0 -579
  182. package/src/migrations/appwriteToX.ts +0 -668
  183. package/src/migrations/comprehensiveTransfer.ts +0 -2285
  184. package/src/migrations/dataLoader.ts +0 -1729
  185. package/src/migrations/importController.ts +0 -440
  186. package/src/migrations/importDataActions.ts +0 -315
  187. package/src/migrations/relationships.ts +0 -333
  188. package/src/migrations/services/DataTransformationService.ts +0 -196
  189. package/src/migrations/services/FileHandlerService.ts +0 -311
  190. package/src/migrations/services/ImportOrchestrator.ts +0 -675
  191. package/src/migrations/services/RateLimitManager.ts +0 -363
  192. package/src/migrations/services/RelationshipResolver.ts +0 -461
  193. package/src/migrations/services/UserMappingService.ts +0 -345
  194. package/src/migrations/services/ValidationService.ts +0 -349
  195. package/src/migrations/transfer.ts +0 -1113
  196. package/src/migrations/yaml/YamlImportConfigLoader.ts +0 -439
  197. package/src/migrations/yaml/YamlImportIntegration.ts +0 -446
  198. package/src/migrations/yaml/generateImportSchemas.ts +0 -1354
  199. package/src/schemas/authUser.ts +0 -23
  200. package/src/setupCommands.ts +0 -602
  201. package/src/setupController.ts +0 -43
  202. package/src/shared/backupMetadataSchema.ts +0 -93
  203. package/src/shared/backupTracking.ts +0 -211
  204. package/src/shared/confirmationDialogs.ts +0 -327
  205. package/src/shared/migrationHelpers.ts +0 -232
  206. package/src/shared/operationQueue.ts +0 -376
  207. package/src/shared/operationsTable.ts +0 -338
  208. package/src/shared/operationsTableSchema.ts +0 -60
  209. package/src/shared/progressManager.ts +0 -278
  210. package/src/shared/relationshipExtractor.ts +0 -214
  211. package/src/shared/selectionDialogs.ts +0 -802
  212. package/src/storage/backupCompression.ts +0 -88
  213. package/src/storage/methods.ts +0 -711
  214. package/src/storage/schemas.ts +0 -205
  215. package/src/tables/indexManager.ts +0 -409
  216. package/src/types/node-appwrite-tablesdb.d.ts +0 -44
  217. package/src/users/methods.ts +0 -358
  218. package/src/utils/configMigration.ts +0 -348
  219. package/src/utils/loadConfigs.ts +0 -457
  220. package/src/utils/setupFiles.ts +0 -1236
  221. package/src/utilsController.ts +0 -1263
  222. package/tests/README.md +0 -497
  223. package/tests/adapters/AdapterFactory.test.ts +0 -277
  224. package/tests/integration/syncOperations.test.ts +0 -463
  225. package/tests/jest.config.js +0 -25
  226. package/tests/migration/configMigration.test.ts +0 -546
  227. package/tests/setup.ts +0 -62
  228. package/tests/testUtils.ts +0 -340
  229. package/tests/utils/loadConfigs.test.ts +0 -350
  230. package/tests/validation/configValidation.test.ts +0 -412
  231. package/tsconfig.json +0 -44
  232. /package/{src → dist}/functions/templates/count-docs-in-collection/README.md +0 -0
  233. /package/{src → dist}/functions/templates/count-docs-in-collection/src/main.ts +0 -0
  234. /package/{src → dist}/functions/templates/count-docs-in-collection/src/request.ts +0 -0
  235. /package/{src → dist}/functions/templates/hono-typescript/README.md +0 -0
  236. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/request.ts +0 -0
  237. /package/{src → dist}/functions/templates/hono-typescript/src/adapters/response.ts +0 -0
  238. /package/{src → dist}/functions/templates/hono-typescript/src/app.ts +0 -0
  239. /package/{src → dist}/functions/templates/hono-typescript/src/context.ts +0 -0
  240. /package/{src → dist}/functions/templates/hono-typescript/src/main.ts +0 -0
  241. /package/{src → dist}/functions/templates/hono-typescript/src/middleware/appwrite.ts +0 -0
  242. /package/{src → dist}/functions/templates/typescript-node/README.md +0 -0
  243. /package/{src → dist}/functions/templates/typescript-node/src/context.ts +0 -0
  244. /package/{src → dist}/functions/templates/typescript-node/src/main.ts +0 -0
  245. /package/{src → dist}/functions/templates/uv/README.md +0 -0
  246. /package/{src → dist}/functions/templates/uv/pyproject.toml +0 -0
  247. /package/{src → dist}/functions/templates/uv/src/__init__.py +0 -0
  248. /package/{src → dist}/functions/templates/uv/src/context.py +0 -0
  249. /package/{src → dist}/functions/templates/uv/src/main.py +0 -0
  250. /package/{src/utils/index.ts → dist/utils/index.d.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ import type { InteractiveCLI } from "../../interactiveCLI.js";
2
+ export declare const functionCommands: {
3
+ createFunction(cli: InteractiveCLI): Promise<void>;
4
+ deployFunction(cli: InteractiveCLI): Promise<void>;
5
+ deleteFunction(cli: InteractiveCLI): Promise<void>;
6
+ updateFunctionSpec(cli: InteractiveCLI): Promise<void>;
7
+ };
@@ -0,0 +1,330 @@
1
+ import inquirer from "inquirer";
2
+ import { join } from "node:path";
3
+ import fs from "node:fs";
4
+ import os from "node:os";
5
+ import { ulid } from "ulidx";
6
+ import chalk from "chalk";
7
+ import { Query } from "node-appwrite";
8
+ import { MessageFormatter } from 'appwrite-utils-helpers';
9
+ import { createFunctionTemplate, deleteFunction, downloadLatestFunctionDeployment, listFunctions, listSpecifications, } from "../../functions/methods.js";
10
+ import { deployLocalFunction } from "../../functions/deployments.js";
11
+ import { discoverFnConfigs, mergeDiscoveredFunctions } from "../../functions/fnConfigDiscovery.js";
12
+ import { addFunctionToYamlConfig, findYamlConfig } from "appwrite-utils-helpers";
13
+ import { RuntimeSchema } from "appwrite-utils";
14
+ export const functionCommands = {
15
+ async createFunction(cli) {
16
+ const { name } = await inquirer.prompt([
17
+ {
18
+ type: "input",
19
+ name: "name",
20
+ message: "Function name:",
21
+ validate: (input) => input.length > 0,
22
+ },
23
+ ]);
24
+ const { template } = await inquirer.prompt([
25
+ {
26
+ type: "list",
27
+ name: "template",
28
+ message: "Select a template:",
29
+ choices: [
30
+ { name: "TypeScript Node.js", value: "typescript-node" },
31
+ { name: "TypeScript with Hono Web Framework", value: "hono-typescript" },
32
+ { name: "Python with UV", value: "uv" },
33
+ { name: "Count Documents in Collection", value: "count-docs-in-collection" },
34
+ { name: "None (Empty Function)", value: "none" },
35
+ ],
36
+ },
37
+ ]);
38
+ // Get template defaults
39
+ const templateDefaults = cli.getTemplateDefaults(template);
40
+ const { runtime } = await inquirer.prompt([
41
+ {
42
+ type: "list",
43
+ name: "runtime",
44
+ message: "Select runtime:",
45
+ choices: Object.values(RuntimeSchema.Values),
46
+ default: templateDefaults.runtime,
47
+ },
48
+ ]);
49
+ const specifications = await listSpecifications(cli.controller.appwriteServer);
50
+ const { specification } = await inquirer.prompt([
51
+ {
52
+ type: "list",
53
+ name: "specification",
54
+ message: "Select specification:",
55
+ choices: [
56
+ { name: "None", value: undefined },
57
+ ...specifications.specifications.map((s) => ({
58
+ name: s.slug,
59
+ value: s.slug,
60
+ })),
61
+ ],
62
+ default: templateDefaults.specification,
63
+ },
64
+ ]);
65
+ const functionConfig = {
66
+ $id: ulid(),
67
+ name,
68
+ runtime,
69
+ events: [],
70
+ execute: ["any"],
71
+ enabled: true,
72
+ logging: true,
73
+ entrypoint: templateDefaults.entrypoint,
74
+ commands: templateDefaults.commands,
75
+ specification: specification || templateDefaults.specification,
76
+ scopes: [],
77
+ timeout: 15,
78
+ schedule: "",
79
+ installationId: "",
80
+ providerRepositoryId: "",
81
+ providerBranch: "",
82
+ providerSilentMode: false,
83
+ providerRootDirectory: "",
84
+ templateRepository: "",
85
+ templateOwner: "",
86
+ templateRootDirectory: "",
87
+ };
88
+ if (template !== "none") {
89
+ await createFunctionTemplate(template, name, "./functions");
90
+ }
91
+ // Add to in-memory config
92
+ if (!cli.controller.config.functions) {
93
+ cli.controller.config.functions = [];
94
+ }
95
+ cli.controller.config.functions.push(functionConfig);
96
+ // If using YAML config, also add to YAML file
97
+ const yamlConfigPath = findYamlConfig(cli.currentDir);
98
+ if (yamlConfigPath) {
99
+ try {
100
+ await addFunctionToYamlConfig(yamlConfigPath, functionConfig);
101
+ }
102
+ catch (error) {
103
+ MessageFormatter.warning(`Function created but failed to update YAML config: ${error instanceof Error ? error.message : error}`, { prefix: "Functions" });
104
+ }
105
+ }
106
+ MessageFormatter.success("Function created successfully!", { prefix: "Functions" });
107
+ },
108
+ async deployFunction(cli) {
109
+ await cli.initControllerIfNeeded();
110
+ if (!cli.controller?.config) {
111
+ MessageFormatter.error("Failed to initialize controller or load config", undefined, { prefix: "Functions" });
112
+ return;
113
+ }
114
+ // Discover per-function .fnconfig.yaml definitions and merge with central list for selection
115
+ // No global prompt; we'll handle conflicts per-function if both exist.
116
+ let discovered = [];
117
+ let central = cli.controller.config.functions || [];
118
+ try {
119
+ discovered = discoverFnConfigs(cli.currentDir);
120
+ const merged = mergeDiscoveredFunctions(central, discovered);
121
+ cli.controller.config.functions = merged;
122
+ }
123
+ catch { }
124
+ const functions = await cli.selectFunctions("Select function(s) to deploy:", true, true);
125
+ if (!functions?.length) {
126
+ MessageFormatter.error("No function selected", undefined, { prefix: "Functions" });
127
+ return;
128
+ }
129
+ for (const functionConfig of functions) {
130
+ if (!functionConfig) {
131
+ MessageFormatter.error("Invalid function configuration", undefined, { prefix: "Functions" });
132
+ return;
133
+ }
134
+ // Resolve effective config for this function (prefer per-function choice if both sources exist)
135
+ const byIdOrName = (arr) => arr.find((f) => f?.$id === functionConfig.$id || f?.name === functionConfig.name);
136
+ const centralDef = byIdOrName(central);
137
+ const discoveredDef = byIdOrName(discovered);
138
+ let effectiveConfig = functionConfig;
139
+ if (centralDef && discoveredDef) {
140
+ try {
141
+ const answer = await inquirer.prompt([
142
+ {
143
+ type: 'list',
144
+ name: 'cfgChoice',
145
+ message: `Multiple configs found for '${functionConfig.name}'. Which to use?`,
146
+ choices: [
147
+ { name: 'config.yaml (central)', value: 'central' },
148
+ { name: '.fnconfig.yaml (local file)', value: 'fnconfig' },
149
+ { name: 'Merge (.fnconfig overrides central)', value: 'merge' },
150
+ ],
151
+ default: 'fnconfig'
152
+ }
153
+ ]);
154
+ if (answer.cfgChoice === 'central')
155
+ effectiveConfig = centralDef;
156
+ else if (answer.cfgChoice === 'fnconfig')
157
+ effectiveConfig = discoveredDef;
158
+ else
159
+ effectiveConfig = { ...centralDef, ...discoveredDef };
160
+ }
161
+ catch { }
162
+ }
163
+ // Ensure functions array exists
164
+ if (!cli.controller.config.functions) {
165
+ cli.controller.config.functions = [];
166
+ }
167
+ const functionNameLower = effectiveConfig.name
168
+ .toLowerCase()
169
+ .replace(/\s+/g, "-");
170
+ // Debug logging
171
+ MessageFormatter.info(`🔍 Function deployment debug:`, { prefix: "Functions" });
172
+ MessageFormatter.info(` Function name: ${effectiveConfig.name}`, { prefix: "Functions" });
173
+ MessageFormatter.info(` Function ID: ${effectiveConfig.$id}`, { prefix: "Functions" });
174
+ MessageFormatter.info(` Config dirPath: ${effectiveConfig.dirPath || 'undefined'}`, { prefix: "Functions" });
175
+ if (effectiveConfig.dirPath) {
176
+ const expandedPath = effectiveConfig.dirPath.startsWith('~/')
177
+ ? effectiveConfig.dirPath.replace('~', os.homedir())
178
+ : effectiveConfig.dirPath;
179
+ MessageFormatter.info(` Expanded dirPath: ${expandedPath}`, { prefix: "Functions" });
180
+ }
181
+ MessageFormatter.info(` Appwrite folder: ${cli.controller.getAppwriteFolderPath()}`, { prefix: "Functions" });
182
+ MessageFormatter.info(` Current working dir: ${process.cwd()}`, { prefix: "Functions" });
183
+ // Resolve config dirPath relative to central YAML if it's relative
184
+ const yamlConfigPath = findYamlConfig(cli.currentDir);
185
+ const yamlBaseDir = yamlConfigPath ? require('node:path').dirname(yamlConfigPath) : process.cwd();
186
+ const expandTildePath = (p) => (p?.startsWith('~/') ? p.replace('~', os.homedir()) : p);
187
+ // Check locations in priority order:
188
+ const priorityLocations = [
189
+ // 1. Config dirPath if specified (with tilde expansion)
190
+ effectiveConfig.dirPath
191
+ ? (require('node:path').isAbsolute(expandTildePath(effectiveConfig.dirPath))
192
+ ? expandTildePath(effectiveConfig.dirPath)
193
+ : require('node:path').resolve(yamlBaseDir, expandTildePath(effectiveConfig.dirPath)))
194
+ : undefined,
195
+ // 2. Appwrite config folder/functions/name
196
+ join(cli.controller.getAppwriteFolderPath(), "functions", functionNameLower),
197
+ // 3. Current working directory/functions/name
198
+ join(process.cwd(), "functions", functionNameLower),
199
+ // 4. Current working directory/name
200
+ join(process.cwd(), functionNameLower),
201
+ ].filter((val) => val !== undefined);
202
+ MessageFormatter.info(`🔍 Priority locations to check:`, { prefix: "Functions" });
203
+ priorityLocations.forEach((loc, i) => {
204
+ MessageFormatter.info(` ${i + 1}. ${loc}`, { prefix: "Functions" });
205
+ });
206
+ let functionPath = null;
207
+ // Check each priority location
208
+ for (const location of priorityLocations) {
209
+ MessageFormatter.info(` Checking: ${location} - ${fs.existsSync(location) ? 'EXISTS' : 'NOT FOUND'}`, { prefix: "Functions" });
210
+ if (fs.existsSync(location)) {
211
+ MessageFormatter.success(`✅ Found function at: ${location}`, { prefix: "Functions" });
212
+ functionPath = location;
213
+ break;
214
+ }
215
+ }
216
+ // If not found in priority locations, do a broader search
217
+ if (!functionPath) {
218
+ MessageFormatter.info(`Function not found in primary locations, searching subdirectories...`, { prefix: "Functions" });
219
+ // Search in both appwrite config directory and current working directory
220
+ functionPath = await cli.findFunctionInSubdirectories([cli.controller.getAppwriteFolderPath(), process.cwd()], functionNameLower);
221
+ }
222
+ if (!functionPath) {
223
+ const { shouldDownload } = await inquirer.prompt([
224
+ {
225
+ type: "confirm",
226
+ name: "shouldDownload",
227
+ message: "Function not found locally. Would you like to download the latest deployment?",
228
+ default: false,
229
+ },
230
+ ]);
231
+ if (shouldDownload) {
232
+ try {
233
+ MessageFormatter.progress("Downloading latest deployment...", { prefix: "Functions" });
234
+ const { path: downloadedPath, function: remoteFunction } = await downloadLatestFunctionDeployment(cli.controller.appwriteServer, effectiveConfig.$id, join(cli.controller.getAppwriteFolderPath(), "functions"));
235
+ MessageFormatter.success(`✨ Function downloaded to ${downloadedPath}`, { prefix: "Functions" });
236
+ functionPath = downloadedPath;
237
+ effectiveConfig.dirPath = downloadedPath;
238
+ const existingIndex = cli.controller.config.functions.findIndex((f) => f?.$id === remoteFunction.$id);
239
+ if (existingIndex >= 0) {
240
+ cli.controller.config.functions[existingIndex].dirPath =
241
+ downloadedPath;
242
+ }
243
+ await cli.reloadConfigWithSessionPreservation();
244
+ }
245
+ catch (error) {
246
+ MessageFormatter.error("Failed to download function deployment", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
247
+ return;
248
+ }
249
+ }
250
+ else {
251
+ MessageFormatter.error(`Function ${effectiveConfig.name} not found locally. Cannot deploy.`, undefined, { prefix: "Functions" });
252
+ return;
253
+ }
254
+ }
255
+ if (!cli.controller.appwriteServer) {
256
+ MessageFormatter.error("Appwrite server not initialized", undefined, { prefix: "Functions" });
257
+ return;
258
+ }
259
+ try {
260
+ await deployLocalFunction(cli.controller.appwriteServer, effectiveConfig.name, {
261
+ ...effectiveConfig,
262
+ dirPath: functionPath,
263
+ }, functionPath, yamlBaseDir);
264
+ MessageFormatter.success("Function deployed successfully!", { prefix: "Functions" });
265
+ }
266
+ catch (error) {
267
+ MessageFormatter.error("Failed to deploy function", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
268
+ }
269
+ }
270
+ },
271
+ async deleteFunction(cli) {
272
+ const functions = await cli.selectFunctions("Select functions to delete:", true, false);
273
+ if (!functions.length) {
274
+ MessageFormatter.error("No functions selected", undefined, { prefix: "Functions" });
275
+ return;
276
+ }
277
+ for (const func of functions) {
278
+ try {
279
+ await deleteFunction(cli.controller.appwriteServer, func.$id);
280
+ MessageFormatter.success(`✨ Function ${func.name} deleted successfully!`, { prefix: "Functions" });
281
+ }
282
+ catch (error) {
283
+ MessageFormatter.error(`Failed to delete function ${func.name}`, error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
284
+ }
285
+ }
286
+ },
287
+ async updateFunctionSpec(cli) {
288
+ const remoteFunctions = await listFunctions(cli.controller.appwriteServer, [Query.limit(1000)]);
289
+ const localFunctions = cli.getLocalFunctions();
290
+ const allFunctions = [
291
+ ...remoteFunctions.functions,
292
+ ...localFunctions.filter((f) => !remoteFunctions.functions.some((rf) => rf.name === f.name)),
293
+ ];
294
+ const functionsToUpdate = await inquirer.prompt([
295
+ {
296
+ type: "checkbox",
297
+ name: "functionId",
298
+ message: "Select functions to update:",
299
+ choices: allFunctions.map((f) => ({
300
+ name: `${f.name} (${f.$id})${localFunctions.some((lf) => lf.name === f.name)
301
+ ? " (Local)"
302
+ : " (Remote)"}`,
303
+ value: f.$id,
304
+ })),
305
+ loop: true,
306
+ },
307
+ ]);
308
+ const specifications = await listSpecifications(cli.controller.appwriteServer);
309
+ const { specification } = await inquirer.prompt([
310
+ {
311
+ type: "list",
312
+ name: "specification",
313
+ message: "Select new specification:",
314
+ choices: specifications.specifications.map((s) => ({
315
+ name: `${s.slug}`,
316
+ value: s.slug,
317
+ })),
318
+ },
319
+ ]);
320
+ try {
321
+ for (const functionId of functionsToUpdate.functionId) {
322
+ await cli.controller.updateFunctionSpecifications(functionId, specification);
323
+ MessageFormatter.success(`Successfully updated function specification to ${specification}`, { prefix: "Functions" });
324
+ }
325
+ }
326
+ catch (error) {
327
+ MessageFormatter.error("Error updating function specification", error instanceof Error ? error : new Error(String(error)), { prefix: "Functions" });
328
+ }
329
+ }
330
+ };
@@ -0,0 +1,7 @@
1
+ import type { DatabaseAdapter } from "appwrite-utils-helpers";
2
+ import type { InteractiveCLI } from "../../interactiveCLI.js";
3
+ export declare function importFileFromPath(adapter: DatabaseAdapter, filePath: string, databaseId: string, tableId: string): Promise<void>;
4
+ export declare function importFilePromptMissing(adapter: DatabaseAdapter, database: any, filePath: string, targetDb?: string, targetTable?: string): Promise<void>;
5
+ export declare const importFileCommands: {
6
+ importFile(cli: InteractiveCLI): Promise<void>;
7
+ };