@njdamstra/appwrite-utils-cli 1.8.9 → 1.10.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 (284) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CONFIG_TODO.md +1189 -0
  3. package/SELECTION_DIALOGS.md +146 -0
  4. package/SERVICE_IMPLEMENTATION_REPORT.md +462 -0
  5. package/dist/adapters/index.d.ts +7 -8
  6. package/dist/adapters/index.js +7 -9
  7. package/dist/backups/operations/bucketBackup.js +2 -2
  8. package/dist/backups/operations/collectionBackup.d.ts +1 -1
  9. package/dist/backups/operations/collectionBackup.js +3 -3
  10. package/dist/backups/operations/comprehensiveBackup.d.ts +1 -1
  11. package/dist/backups/operations/comprehensiveBackup.js +2 -2
  12. package/dist/backups/tracking/centralizedTracking.d.ts +1 -1
  13. package/dist/backups/tracking/centralizedTracking.js +2 -2
  14. package/dist/cli/commands/configCommands.js +51 -7
  15. package/dist/cli/commands/databaseCommands.d.ts +1 -0
  16. package/dist/cli/commands/databaseCommands.js +119 -9
  17. package/dist/cli/commands/functionCommands.js +3 -3
  18. package/dist/cli/commands/importFileCommands.d.ts +7 -0
  19. package/dist/cli/commands/importFileCommands.js +674 -0
  20. package/dist/cli/commands/schemaCommands.js +3 -3
  21. package/dist/cli/commands/storageCommands.js +2 -3
  22. package/dist/cli/commands/transferCommands.js +3 -5
  23. package/dist/collections/attributes.d.ts +1 -1
  24. package/dist/collections/attributes.js +2 -35
  25. package/dist/collections/indexes.js +1 -3
  26. package/dist/collections/methods.d.ts +1 -1
  27. package/dist/collections/methods.js +111 -192
  28. package/dist/collections/tableOperations.d.ts +1 -0
  29. package/dist/collections/tableOperations.js +55 -23
  30. package/dist/collections/transferOperations.d.ts +1 -1
  31. package/dist/collections/transferOperations.js +3 -4
  32. package/dist/collections/wipeOperations.d.ts +4 -3
  33. package/dist/collections/wipeOperations.js +112 -39
  34. package/dist/databases/methods.js +2 -2
  35. package/dist/databases/setup.js +2 -2
  36. package/dist/examples/yamlTerminologyExample.js +2 -2
  37. package/dist/functions/deployments.d.ts +1 -1
  38. package/dist/functions/deployments.js +5 -5
  39. package/dist/functions/fnConfigDiscovery.js +2 -2
  40. package/dist/functions/methods.js +16 -4
  41. package/dist/init.js +1 -1
  42. package/dist/interactiveCLI.d.ts +6 -1
  43. package/dist/interactiveCLI.js +63 -9
  44. package/dist/main.js +130 -177
  45. package/dist/migrations/afterImportActions.js +2 -3
  46. package/dist/migrations/appwriteToX.d.ts +1 -1
  47. package/dist/migrations/appwriteToX.js +9 -7
  48. package/dist/migrations/comprehensiveTransfer.js +3 -5
  49. package/dist/migrations/dataLoader.js +2 -5
  50. package/dist/migrations/importController.js +3 -4
  51. package/dist/migrations/importDataActions.js +3 -3
  52. package/dist/migrations/relationships.js +1 -2
  53. package/dist/migrations/services/DataTransformationService.js +2 -2
  54. package/dist/migrations/services/FileHandlerService.js +1 -1
  55. package/dist/migrations/services/ImportOrchestrator.js +4 -4
  56. package/dist/migrations/services/RateLimitManager.js +1 -1
  57. package/dist/migrations/services/RelationshipResolver.js +1 -1
  58. package/dist/migrations/services/UserMappingService.js +1 -1
  59. package/dist/migrations/services/ValidationService.js +1 -1
  60. package/dist/migrations/transfer.d.ts +8 -4
  61. package/dist/migrations/transfer.js +106 -55
  62. package/dist/migrations/yaml/YamlImportConfigLoader.js +1 -1
  63. package/dist/migrations/yaml/YamlImportIntegration.js +2 -2
  64. package/dist/migrations/yaml/generateImportSchemas.js +1 -1
  65. package/dist/setupCommands.d.ts +1 -1
  66. package/dist/setupCommands.js +5 -6
  67. package/dist/setupController.js +1 -1
  68. package/dist/shared/backupTracking.d.ts +1 -1
  69. package/dist/shared/backupTracking.js +2 -2
  70. package/dist/shared/confirmationDialogs.js +1 -1
  71. package/dist/shared/migrationHelpers.d.ts +1 -1
  72. package/dist/shared/migrationHelpers.js +3 -3
  73. package/dist/shared/operationQueue.d.ts +1 -1
  74. package/dist/shared/operationQueue.js +2 -3
  75. package/dist/shared/operationsTable.d.ts +1 -1
  76. package/dist/shared/operationsTable.js +2 -2
  77. package/dist/shared/progressManager.js +1 -1
  78. package/dist/shared/selectionDialogs.js +9 -8
  79. package/dist/storage/methods.js +4 -4
  80. package/dist/storage/schemas.d.ts +2 -2
  81. package/dist/tables/indexManager.d.ts +65 -0
  82. package/dist/tables/indexManager.js +294 -0
  83. package/dist/types.d.ts +2 -2
  84. package/dist/types.js +1 -1
  85. package/dist/users/methods.js +2 -3
  86. package/dist/utils/configMigration.js +1 -1
  87. package/dist/utils/index.d.ts +1 -1
  88. package/dist/utils/index.js +1 -1
  89. package/dist/utils/loadConfigs.d.ts +2 -2
  90. package/dist/utils/loadConfigs.js +6 -7
  91. package/dist/utils/setupFiles.js +5 -7
  92. package/dist/utilsController.d.ts +15 -8
  93. package/dist/utilsController.js +57 -28
  94. package/package.json +7 -3
  95. package/src/adapters/index.ts +8 -34
  96. package/src/backups/operations/bucketBackup.ts +2 -2
  97. package/src/backups/operations/collectionBackup.ts +4 -4
  98. package/src/backups/operations/comprehensiveBackup.ts +3 -3
  99. package/src/backups/tracking/centralizedTracking.ts +3 -3
  100. package/src/cli/commands/configCommands.ts +72 -8
  101. package/src/cli/commands/databaseCommands.ts +161 -9
  102. package/src/cli/commands/functionCommands.ts +4 -3
  103. package/src/cli/commands/importFileCommands.ts +815 -0
  104. package/src/cli/commands/schemaCommands.ts +3 -3
  105. package/src/cli/commands/storageCommands.ts +2 -3
  106. package/src/cli/commands/transferCommands.ts +3 -6
  107. package/src/collections/attributes.ts +3 -39
  108. package/src/collections/indexes.ts +2 -4
  109. package/src/collections/methods.ts +115 -150
  110. package/src/collections/tableOperations.ts +57 -21
  111. package/src/collections/transferOperations.ts +4 -5
  112. package/src/collections/wipeOperations.ts +154 -51
  113. package/src/databases/methods.ts +2 -2
  114. package/src/databases/setup.ts +2 -2
  115. package/src/examples/yamlTerminologyExample.ts +2 -2
  116. package/src/functions/deployments.ts +6 -5
  117. package/src/functions/fnConfigDiscovery.ts +2 -2
  118. package/src/functions/methods.ts +17 -4
  119. package/src/init.ts +1 -1
  120. package/src/interactiveCLI.ts +75 -10
  121. package/src/main.ts +143 -287
  122. package/src/migrations/afterImportActions.ts +2 -3
  123. package/src/migrations/appwriteToX.ts +12 -8
  124. package/src/migrations/comprehensiveTransfer.ts +6 -6
  125. package/src/migrations/dataLoader.ts +2 -5
  126. package/src/migrations/importController.ts +3 -4
  127. package/src/migrations/importDataActions.ts +3 -3
  128. package/src/migrations/relationships.ts +1 -2
  129. package/src/migrations/services/DataTransformationService.ts +2 -2
  130. package/src/migrations/services/FileHandlerService.ts +1 -1
  131. package/src/migrations/services/ImportOrchestrator.ts +4 -4
  132. package/src/migrations/services/RateLimitManager.ts +1 -1
  133. package/src/migrations/services/RelationshipResolver.ts +1 -1
  134. package/src/migrations/services/UserMappingService.ts +1 -1
  135. package/src/migrations/services/ValidationService.ts +1 -1
  136. package/src/migrations/transfer.ts +126 -83
  137. package/src/migrations/yaml/YamlImportConfigLoader.ts +1 -1
  138. package/src/migrations/yaml/YamlImportIntegration.ts +2 -2
  139. package/src/migrations/yaml/generateImportSchemas.ts +1 -1
  140. package/src/setupCommands.ts +5 -6
  141. package/src/setupController.ts +1 -1
  142. package/src/shared/backupTracking.ts +3 -3
  143. package/src/shared/confirmationDialogs.ts +1 -1
  144. package/src/shared/migrationHelpers.ts +4 -4
  145. package/src/shared/operationQueue.ts +3 -4
  146. package/src/shared/operationsTable.ts +3 -3
  147. package/src/shared/progressManager.ts +1 -1
  148. package/src/shared/selectionDialogs.ts +9 -8
  149. package/src/storage/methods.ts +4 -4
  150. package/src/tables/indexManager.ts +409 -0
  151. package/src/types.ts +2 -2
  152. package/src/users/methods.ts +2 -3
  153. package/src/utils/configMigration.ts +1 -1
  154. package/src/utils/index.ts +1 -1
  155. package/src/utils/loadConfigs.ts +15 -7
  156. package/src/utils/setupFiles.ts +5 -7
  157. package/src/utilsController.ts +86 -32
  158. package/dist/adapters/AdapterFactory.d.ts +0 -94
  159. package/dist/adapters/AdapterFactory.js +0 -405
  160. package/dist/adapters/DatabaseAdapter.d.ts +0 -233
  161. package/dist/adapters/DatabaseAdapter.js +0 -50
  162. package/dist/adapters/LegacyAdapter.d.ts +0 -50
  163. package/dist/adapters/LegacyAdapter.js +0 -612
  164. package/dist/adapters/TablesDBAdapter.d.ts +0 -45
  165. package/dist/adapters/TablesDBAdapter.js +0 -571
  166. package/dist/config/ConfigManager.d.ts +0 -445
  167. package/dist/config/ConfigManager.js +0 -625
  168. package/dist/config/configMigration.d.ts +0 -87
  169. package/dist/config/configMigration.js +0 -390
  170. package/dist/config/configValidation.d.ts +0 -66
  171. package/dist/config/configValidation.js +0 -358
  172. package/dist/config/index.d.ts +0 -8
  173. package/dist/config/index.js +0 -7
  174. package/dist/config/services/ConfigDiscoveryService.d.ts +0 -126
  175. package/dist/config/services/ConfigDiscoveryService.js +0 -374
  176. package/dist/config/services/ConfigLoaderService.d.ts +0 -129
  177. package/dist/config/services/ConfigLoaderService.js +0 -540
  178. package/dist/config/services/ConfigMergeService.d.ts +0 -208
  179. package/dist/config/services/ConfigMergeService.js +0 -308
  180. package/dist/config/services/ConfigValidationService.d.ts +0 -214
  181. package/dist/config/services/ConfigValidationService.js +0 -310
  182. package/dist/config/services/SessionAuthService.d.ts +0 -225
  183. package/dist/config/services/SessionAuthService.js +0 -456
  184. package/dist/config/services/__tests__/ConfigMergeService.test.d.ts +0 -1
  185. package/dist/config/services/__tests__/ConfigMergeService.test.js +0 -271
  186. package/dist/config/services/index.d.ts +0 -13
  187. package/dist/config/services/index.js +0 -10
  188. package/dist/config/yamlConfig.d.ts +0 -722
  189. package/dist/config/yamlConfig.js +0 -702
  190. package/dist/functions/pathResolution.d.ts +0 -37
  191. package/dist/functions/pathResolution.js +0 -185
  192. package/dist/shared/attributeMapper.d.ts +0 -20
  193. package/dist/shared/attributeMapper.js +0 -203
  194. package/dist/shared/errorUtils.d.ts +0 -54
  195. package/dist/shared/errorUtils.js +0 -95
  196. package/dist/shared/functionManager.d.ts +0 -48
  197. package/dist/shared/functionManager.js +0 -336
  198. package/dist/shared/indexManager.d.ts +0 -24
  199. package/dist/shared/indexManager.js +0 -151
  200. package/dist/shared/jsonSchemaGenerator.d.ts +0 -50
  201. package/dist/shared/jsonSchemaGenerator.js +0 -290
  202. package/dist/shared/logging.d.ts +0 -61
  203. package/dist/shared/logging.js +0 -116
  204. package/dist/shared/messageFormatter.d.ts +0 -39
  205. package/dist/shared/messageFormatter.js +0 -162
  206. package/dist/shared/pydanticModelGenerator.d.ts +0 -17
  207. package/dist/shared/pydanticModelGenerator.js +0 -615
  208. package/dist/shared/schemaGenerator.d.ts +0 -40
  209. package/dist/shared/schemaGenerator.js +0 -556
  210. package/dist/utils/ClientFactory.d.ts +0 -87
  211. package/dist/utils/ClientFactory.js +0 -212
  212. package/dist/utils/configDiscovery.d.ts +0 -78
  213. package/dist/utils/configDiscovery.js +0 -472
  214. package/dist/utils/constantsGenerator.d.ts +0 -31
  215. package/dist/utils/constantsGenerator.js +0 -321
  216. package/dist/utils/dataConverters.d.ts +0 -46
  217. package/dist/utils/dataConverters.js +0 -139
  218. package/dist/utils/directoryUtils.d.ts +0 -22
  219. package/dist/utils/directoryUtils.js +0 -59
  220. package/dist/utils/getClientFromConfig.d.ts +0 -39
  221. package/dist/utils/getClientFromConfig.js +0 -199
  222. package/dist/utils/helperFunctions.d.ts +0 -63
  223. package/dist/utils/helperFunctions.js +0 -156
  224. package/dist/utils/pathResolvers.d.ts +0 -53
  225. package/dist/utils/pathResolvers.js +0 -72
  226. package/dist/utils/projectConfig.d.ts +0 -119
  227. package/dist/utils/projectConfig.js +0 -171
  228. package/dist/utils/retryFailedPromises.d.ts +0 -2
  229. package/dist/utils/retryFailedPromises.js +0 -23
  230. package/dist/utils/sessionAuth.d.ts +0 -48
  231. package/dist/utils/sessionAuth.js +0 -164
  232. package/dist/utils/typeGuards.d.ts +0 -35
  233. package/dist/utils/typeGuards.js +0 -57
  234. package/dist/utils/validationRules.d.ts +0 -43
  235. package/dist/utils/validationRules.js +0 -42
  236. package/dist/utils/versionDetection.d.ts +0 -58
  237. package/dist/utils/versionDetection.js +0 -251
  238. package/dist/utils/yamlConverter.d.ts +0 -100
  239. package/dist/utils/yamlConverter.js +0 -428
  240. package/dist/utils/yamlLoader.d.ts +0 -70
  241. package/dist/utils/yamlLoader.js +0 -267
  242. package/src/adapters/AdapterFactory.ts +0 -510
  243. package/src/adapters/DatabaseAdapter.ts +0 -306
  244. package/src/adapters/LegacyAdapter.ts +0 -841
  245. package/src/adapters/TablesDBAdapter.ts +0 -773
  246. package/src/config/ConfigManager.ts +0 -808
  247. package/src/config/README.md +0 -274
  248. package/src/config/configMigration.ts +0 -575
  249. package/src/config/configValidation.ts +0 -445
  250. package/src/config/index.ts +0 -10
  251. package/src/config/services/ConfigDiscoveryService.ts +0 -463
  252. package/src/config/services/ConfigLoaderService.ts +0 -740
  253. package/src/config/services/ConfigMergeService.ts +0 -388
  254. package/src/config/services/ConfigValidationService.ts +0 -394
  255. package/src/config/services/SessionAuthService.ts +0 -565
  256. package/src/config/services/__tests__/ConfigMergeService.test.ts +0 -351
  257. package/src/config/services/index.ts +0 -29
  258. package/src/config/yamlConfig.ts +0 -761
  259. package/src/functions/pathResolution.ts +0 -227
  260. package/src/shared/attributeMapper.ts +0 -229
  261. package/src/shared/errorUtils.ts +0 -110
  262. package/src/shared/functionManager.ts +0 -525
  263. package/src/shared/indexManager.ts +0 -254
  264. package/src/shared/jsonSchemaGenerator.ts +0 -383
  265. package/src/shared/logging.ts +0 -149
  266. package/src/shared/messageFormatter.ts +0 -208
  267. package/src/shared/pydanticModelGenerator.ts +0 -618
  268. package/src/shared/schemaGenerator.ts +0 -644
  269. package/src/utils/ClientFactory.ts +0 -240
  270. package/src/utils/configDiscovery.ts +0 -557
  271. package/src/utils/constantsGenerator.ts +0 -369
  272. package/src/utils/dataConverters.ts +0 -159
  273. package/src/utils/directoryUtils.ts +0 -61
  274. package/src/utils/getClientFromConfig.ts +0 -257
  275. package/src/utils/helperFunctions.ts +0 -228
  276. package/src/utils/pathResolvers.ts +0 -81
  277. package/src/utils/projectConfig.ts +0 -299
  278. package/src/utils/retryFailedPromises.ts +0 -29
  279. package/src/utils/sessionAuth.ts +0 -230
  280. package/src/utils/typeGuards.ts +0 -65
  281. package/src/utils/validationRules.ts +0 -88
  282. package/src/utils/versionDetection.ts +0 -292
  283. package/src/utils/yamlConverter.ts +0 -542
  284. package/src/utils/yamlLoader.ts +0 -371
@@ -1,7 +1,7 @@
1
1
  import inquirer from "inquirer";
2
2
  import chalk from "chalk";
3
- import { MessageFormatter } from "./messageFormatter.js";
4
- import { logger } from "./logging.js";
3
+ import { MessageFormatter } from '@njdamstra/appwrite-utils-helpers';
4
+ import { logger } from '@njdamstra/appwrite-utils-helpers';
5
5
  /**
6
6
  * Comprehensive selection dialog system for enhanced sync flow
7
7
  *
@@ -186,7 +186,7 @@ export class SelectionDialogs {
186
186
  if (showDatabaseContext) {
187
187
  MessageFormatter.section(`Table Selection for ${databaseName}`);
188
188
  }
189
- const configuredIds = new Set(configuredTables.map(table => table.$id || table.id));
189
+ const configuredIds = new Set(configuredTables.map(table => table.$id || table.id || table.tableId || table.name));
190
190
  let choices = [];
191
191
  if (showSelectAll && availableTables.length > 1) {
192
192
  choices.push({
@@ -196,18 +196,19 @@ export class SelectionDialogs {
196
196
  });
197
197
  }
198
198
  availableTables.forEach(table => {
199
- const isConfigured = configuredIds.has(table.$id);
199
+ const tableId = table.$id || table.id || table.tableId || table.name;
200
+ const isConfigured = configuredIds.has(tableId);
200
201
  const status = isConfigured ? chalk.green('✅') : chalk.blue('○');
201
- const name = `${status} ${table.name} (${table.$id})`;
202
+ const name = `${status} ${table.name} (${tableId})`;
202
203
  if (allowNewOnly && isConfigured) {
203
204
  return; // Skip configured tables if only allowing new ones
204
205
  }
205
206
  choices.push({
206
207
  name,
207
- value: table.$id,
208
+ value: tableId,
208
209
  short: table.name,
209
210
  // Do not preselect anything unless explicitly provided
210
- checked: defaultSelected.includes(table.$id)
211
+ checked: defaultSelected.includes(tableId)
211
212
  });
212
213
  });
213
214
  if (choices.length === 0) {
@@ -231,7 +232,7 @@ export class SelectionDialogs {
231
232
  }]);
232
233
  // Handle select all
233
234
  if (selectedTableIds.includes('__SELECT_ALL__')) {
234
- const allIds = availableTables.map(table => table.$id);
235
+ const allIds = availableTables.map(table => table.$id || table.id || table.tableId || table.name);
235
236
  if (allowNewOnly) {
236
237
  return allIds.filter(id => !configuredIds.has(id));
237
238
  }
@@ -1,15 +1,15 @@
1
1
  import { Compression, Databases, Permission, Query, Role, Storage, } from "node-appwrite";
2
2
  import { tryAwaitWithRetry } from "@njdamstra/appwrite-utils";
3
- import { getClientFromConfig } from "../utils/getClientFromConfig.js";
3
+ import { getClientFromConfig } from "@njdamstra/appwrite-utils-helpers";
4
4
  import { ulid } from "ulidx";
5
5
  import { logOperation } from "../shared/operationLogger.js";
6
6
  import { splitIntoBatches } from "../shared/migrationHelpers.js";
7
- import { retryFailedPromises } from "../utils/retryFailedPromises.js";
7
+ import { retryFailedPromises } from "@njdamstra/appwrite-utils-helpers";
8
8
  import { InputFile } from "node-appwrite/file";
9
- import { MessageFormatter, Messages } from "../shared/messageFormatter.js";
9
+ import { MessageFormatter, Messages } from "@njdamstra/appwrite-utils-helpers";
10
10
  import { ProgressManager } from "../shared/progressManager.js";
11
11
  import { recordBackup } from "../shared/backupTracking.js";
12
- import { AdapterFactory } from "../adapters/AdapterFactory.js";
12
+ import { AdapterFactory } from "@njdamstra/appwrite-utils-helpers";
13
13
  import { createBackupZip } from "./backupCompression.js";
14
14
  export const getStorage = (config) => {
15
15
  const client = getClientFromConfig(config);
@@ -12,11 +12,11 @@ export declare const BackupSchema: z.ZodObject<{
12
12
  }, z.core.$strip>;
13
13
  export type Backup = z.infer<typeof BackupSchema>;
14
14
  export declare const BackupCreateSchema: z.ZodObject<{
15
+ collections: z.ZodArray<z.ZodString>;
15
16
  documents: z.ZodDefault<z.ZodArray<z.ZodObject<{
16
17
  collectionId: z.ZodString;
17
18
  data: z.ZodString;
18
19
  }, z.core.$strip>>>;
19
- collections: z.ZodArray<z.ZodString>;
20
20
  database: z.ZodString;
21
21
  }, z.core.$strip>;
22
22
  export type BackupCreate = z.infer<typeof BackupCreateSchema>;
@@ -56,7 +56,6 @@ export declare const OperationSchema: z.ZodObject<{
56
56
  export type Operation = z.infer<typeof OperationSchema>;
57
57
  export declare const OperationCreateSchema: z.ZodObject<{
58
58
  error: z.ZodString;
59
- data: z.ZodAny;
60
59
  status: z.ZodDefault<z.ZodEnum<{
61
60
  error: "error";
62
61
  pending: "pending";
@@ -66,6 +65,7 @@ export declare const OperationCreateSchema: z.ZodObject<{
66
65
  cancelled: "cancelled";
67
66
  }>>;
68
67
  collectionId: z.ZodString;
68
+ data: z.ZodAny;
69
69
  operationType: z.ZodString;
70
70
  batches: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodString>>>;
71
71
  progress: z.ZodNumber;
@@ -0,0 +1,65 @@
1
+ import type { Index } from "@njdamstra/appwrite-utils";
2
+ import type { DatabaseAdapter } from "@njdamstra/appwrite-utils-helpers";
3
+ import type { Models } from "node-appwrite";
4
+ export interface IndexOperation {
5
+ type: 'create' | 'update' | 'skip' | 'delete';
6
+ index: Index;
7
+ existingIndex?: Models.Index;
8
+ reason?: string;
9
+ }
10
+ export interface IndexOperationPlan {
11
+ toCreate: IndexOperation[];
12
+ toUpdate: IndexOperation[];
13
+ toSkip: IndexOperation[];
14
+ toDelete: IndexOperation[];
15
+ }
16
+ export interface IndexExecutionResult {
17
+ created: string[];
18
+ updated: string[];
19
+ skipped: string[];
20
+ deleted: string[];
21
+ errors: Array<{
22
+ key: string;
23
+ error: string;
24
+ }>;
25
+ summary: {
26
+ total: number;
27
+ created: number;
28
+ updated: number;
29
+ skipped: number;
30
+ deleted: number;
31
+ errors: number;
32
+ };
33
+ }
34
+ /**
35
+ * Plan index operations by comparing desired indexes with existing ones
36
+ * Uses the existing isIndexEqualToIndex function for consistent comparison
37
+ */
38
+ export declare function planIndexOperations(desiredIndexes: Index[], existingIndexes: Models.Index[]): IndexOperationPlan;
39
+ /**
40
+ * Plan index deletions for indexes that exist but aren't in the desired configuration
41
+ */
42
+ export declare function planIndexDeletions(desiredIndexKeys: Set<string>, existingIndexes: Models.Index[]): IndexOperation[];
43
+ /**
44
+ * Execute index operations with proper error handling and status monitoring
45
+ */
46
+ export declare function executeIndexOperations(adapter: DatabaseAdapter, databaseId: string, tableId: string, plan: IndexOperationPlan): Promise<IndexExecutionResult>;
47
+ /**
48
+ * Execute index deletions with proper error handling
49
+ */
50
+ export declare function executeIndexDeletions(adapter: DatabaseAdapter, databaseId: string, tableId: string, deletions: IndexOperation[]): Promise<{
51
+ deleted: string[];
52
+ errors: Array<{
53
+ key: string;
54
+ error: string;
55
+ }>;
56
+ }>;
57
+ /**
58
+ * Main function to create/update indexes via adapter
59
+ * This replaces the messy inline code in methods.ts
60
+ */
61
+ export declare function createOrUpdateIndexesViaAdapter(adapter: DatabaseAdapter, databaseId: string, tableId: string, desiredIndexes: Index[], configIndexes?: Index[]): Promise<void>;
62
+ /**
63
+ * Handle index deletions for obsolete indexes
64
+ */
65
+ export declare function deleteObsoleteIndexesViaAdapter(adapter: DatabaseAdapter, databaseId: string, tableId: string, desiredIndexKeys: Set<string>): Promise<void>;
@@ -0,0 +1,294 @@
1
+ import { isIndexEqualToIndex } from "../collections/tableOperations.js";
2
+ import { MessageFormatter } from "@njdamstra/appwrite-utils-helpers";
3
+ import { delay, tryAwaitWithRetry } from "@njdamstra/appwrite-utils-helpers";
4
+ /**
5
+ * Plan index operations by comparing desired indexes with existing ones
6
+ * Uses the existing isIndexEqualToIndex function for consistent comparison
7
+ */
8
+ export function planIndexOperations(desiredIndexes, existingIndexes) {
9
+ const plan = {
10
+ toCreate: [],
11
+ toUpdate: [],
12
+ toSkip: [],
13
+ toDelete: []
14
+ };
15
+ for (const desiredIndex of desiredIndexes) {
16
+ const existingIndex = existingIndexes.find(idx => idx.key === desiredIndex.key);
17
+ if (!existingIndex) {
18
+ // Index doesn't exist - create it
19
+ plan.toCreate.push({
20
+ type: 'create',
21
+ index: desiredIndex,
22
+ reason: 'New index'
23
+ });
24
+ }
25
+ else if (isIndexEqualToIndex(existingIndex, desiredIndex)) {
26
+ // Index exists and is identical - skip it
27
+ plan.toSkip.push({
28
+ type: 'skip',
29
+ index: desiredIndex,
30
+ existingIndex,
31
+ reason: 'Index unchanged'
32
+ });
33
+ }
34
+ else {
35
+ // Index exists but is different - update it
36
+ plan.toUpdate.push({
37
+ type: 'update',
38
+ index: desiredIndex,
39
+ existingIndex,
40
+ reason: 'Index configuration changed'
41
+ });
42
+ }
43
+ }
44
+ return plan;
45
+ }
46
+ /**
47
+ * Plan index deletions for indexes that exist but aren't in the desired configuration
48
+ */
49
+ export function planIndexDeletions(desiredIndexKeys, existingIndexes) {
50
+ const deletions = [];
51
+ for (const existingIndex of existingIndexes) {
52
+ if (!desiredIndexKeys.has(existingIndex.key)) {
53
+ deletions.push({
54
+ type: 'delete',
55
+ index: existingIndex, // Convert Models.Index to Index for compatibility
56
+ reason: 'Obsolete index'
57
+ });
58
+ }
59
+ }
60
+ return deletions;
61
+ }
62
+ /**
63
+ * Execute index operations with proper error handling and status monitoring
64
+ */
65
+ export async function executeIndexOperations(adapter, databaseId, tableId, plan) {
66
+ const result = {
67
+ created: [],
68
+ updated: [],
69
+ skipped: [],
70
+ deleted: [],
71
+ errors: [],
72
+ summary: {
73
+ total: 0,
74
+ created: 0,
75
+ updated: 0,
76
+ skipped: 0,
77
+ deleted: 0,
78
+ errors: 0
79
+ }
80
+ };
81
+ // Execute creates
82
+ for (const operation of plan.toCreate) {
83
+ try {
84
+ await adapter.createIndex({
85
+ databaseId,
86
+ tableId,
87
+ key: operation.index.key,
88
+ type: operation.index.type,
89
+ attributes: operation.index.attributes,
90
+ orders: operation.index.orders || []
91
+ });
92
+ result.created.push(operation.index.key);
93
+ MessageFormatter.success(`Created index ${operation.index.key}`, { prefix: 'Indexes' });
94
+ // Wait for index to become available
95
+ await waitForIndexAvailable(adapter, databaseId, tableId, operation.index.key);
96
+ await delay(150); // Brief delay between operations
97
+ }
98
+ catch (error) {
99
+ const errorMessage = error instanceof Error ? error.message : String(error);
100
+ result.errors.push({ key: operation.index.key, error: errorMessage });
101
+ MessageFormatter.error(`Failed to create index ${operation.index.key}`, error instanceof Error ? error : new Error(String(error)), { prefix: 'Indexes' });
102
+ }
103
+ }
104
+ // Execute updates (delete + recreate)
105
+ for (const operation of plan.toUpdate) {
106
+ try {
107
+ // Delete existing index first
108
+ await adapter.deleteIndex({
109
+ databaseId,
110
+ tableId,
111
+ key: operation.index.key
112
+ });
113
+ await delay(100); // Brief delay for deletion to settle
114
+ // Create new index
115
+ await adapter.createIndex({
116
+ databaseId,
117
+ tableId,
118
+ key: operation.index.key,
119
+ type: operation.index.type,
120
+ attributes: operation.index.attributes,
121
+ orders: operation.index.orders || operation.existingIndex?.orders || []
122
+ });
123
+ result.updated.push(operation.index.key);
124
+ MessageFormatter.success(`Updated index ${operation.index.key}`, { prefix: 'Indexes' });
125
+ // Wait for index to become available
126
+ await waitForIndexAvailable(adapter, databaseId, tableId, operation.index.key);
127
+ await delay(150); // Brief delay between operations
128
+ }
129
+ catch (error) {
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+ result.errors.push({ key: operation.index.key, error: errorMessage });
132
+ MessageFormatter.error(`Failed to update index ${operation.index.key}`, error instanceof Error ? error : new Error(String(error)), { prefix: 'Indexes' });
133
+ }
134
+ }
135
+ // Execute skips
136
+ for (const operation of plan.toSkip) {
137
+ result.skipped.push(operation.index.key);
138
+ MessageFormatter.info(`Index ${operation.index.key} unchanged`, { prefix: 'Indexes' });
139
+ }
140
+ // Calculate summary
141
+ result.summary.total = result.created.length + result.updated.length + result.skipped.length + result.deleted.length;
142
+ result.summary.created = result.created.length;
143
+ result.summary.updated = result.updated.length;
144
+ result.summary.skipped = result.skipped.length;
145
+ result.summary.deleted = result.deleted.length;
146
+ result.summary.errors = result.errors.length;
147
+ return result;
148
+ }
149
+ /**
150
+ * Execute index deletions with proper error handling
151
+ */
152
+ export async function executeIndexDeletions(adapter, databaseId, tableId, deletions) {
153
+ const result = {
154
+ deleted: [],
155
+ errors: []
156
+ };
157
+ for (const operation of deletions) {
158
+ try {
159
+ await adapter.deleteIndex({
160
+ databaseId,
161
+ tableId,
162
+ key: operation.index.key
163
+ });
164
+ result.deleted.push(operation.index.key);
165
+ MessageFormatter.info(`Deleted obsolete index ${operation.index.key}`, { prefix: 'Indexes' });
166
+ // Wait briefly for deletion to settle
167
+ await delay(500);
168
+ }
169
+ catch (error) {
170
+ const errorMessage = error instanceof Error ? error.message : String(error);
171
+ result.errors.push({ key: operation.index.key, error: errorMessage });
172
+ MessageFormatter.error(`Failed to delete index ${operation.index.key}`, error instanceof Error ? error : new Error(String(error)), { prefix: 'Indexes' });
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ /**
178
+ * Wait for an index to become available with timeout and retry logic
179
+ * This is an adapter-aware version of the logic from collections/indexes.ts
180
+ */
181
+ async function waitForIndexAvailable(adapter, databaseId, tableId, indexKey, maxWaitTime = 60000, // 1 minute
182
+ checkInterval = 2000 // 2 seconds
183
+ ) {
184
+ const startTime = Date.now();
185
+ while (Date.now() - startTime < maxWaitTime) {
186
+ try {
187
+ const indexList = await adapter.listIndexes({ databaseId, tableId });
188
+ const indexes = indexList.data || indexList.indexes || [];
189
+ const index = indexes.find((idx) => idx.key === indexKey);
190
+ if (!index) {
191
+ MessageFormatter.error(`Index '${indexKey}' not found after creation`, undefined, { prefix: 'Indexes' });
192
+ return false;
193
+ }
194
+ switch (index.status) {
195
+ case 'available':
196
+ return true;
197
+ case 'failed':
198
+ MessageFormatter.error(`Index '${indexKey}' failed: ${index.error || 'unknown error'}`, undefined, { prefix: 'Indexes' });
199
+ return false;
200
+ case 'stuck':
201
+ MessageFormatter.warning(`Index '${indexKey}' is stuck`, { prefix: 'Indexes' });
202
+ return false;
203
+ case 'processing':
204
+ case 'deleting':
205
+ // Continue waiting
206
+ break;
207
+ default:
208
+ MessageFormatter.warning(`Unknown status '${index.status}' for index '${indexKey}'`, { prefix: 'Indexes' });
209
+ break;
210
+ }
211
+ }
212
+ catch (error) {
213
+ MessageFormatter.error(`Error checking index '${indexKey}' status: ${error}`, undefined, { prefix: 'Indexes' });
214
+ }
215
+ await delay(checkInterval);
216
+ }
217
+ MessageFormatter.warning(`Timeout waiting for index '${indexKey}' to become available (${maxWaitTime}ms)`, { prefix: 'Indexes' });
218
+ return false;
219
+ }
220
+ /**
221
+ * Main function to create/update indexes via adapter
222
+ * This replaces the messy inline code in methods.ts
223
+ */
224
+ export async function createOrUpdateIndexesViaAdapter(adapter, databaseId, tableId, desiredIndexes, configIndexes) {
225
+ if (!desiredIndexes || desiredIndexes.length === 0) {
226
+ MessageFormatter.info('No indexes to process', { prefix: 'Indexes' });
227
+ return;
228
+ }
229
+ MessageFormatter.info(`Processing ${desiredIndexes.length} indexes for table ${tableId}`, { prefix: 'Indexes' });
230
+ try {
231
+ // Get existing indexes
232
+ const existingIdxRes = await adapter.listIndexes({ databaseId, tableId });
233
+ const existingIndexes = existingIdxRes.data || existingIdxRes.indexes || [];
234
+ // Plan operations
235
+ const plan = planIndexOperations(desiredIndexes, existingIndexes);
236
+ // Show plan with icons (consistent with attribute handling)
237
+ const planParts = [];
238
+ if (plan.toCreate.length)
239
+ planParts.push(`➕ ${plan.toCreate.length} (${plan.toCreate.map(op => op.index.key).join(', ')})`);
240
+ if (plan.toUpdate.length)
241
+ planParts.push(`🔧 ${plan.toUpdate.length} (${plan.toUpdate.map(op => op.index.key).join(', ')})`);
242
+ if (plan.toSkip.length)
243
+ planParts.push(`⏭️ ${plan.toSkip.length}`);
244
+ MessageFormatter.info(`Plan → ${planParts.join(' | ') || 'no changes'}`, { prefix: 'Indexes' });
245
+ // Execute operations
246
+ const result = await executeIndexOperations(adapter, databaseId, tableId, plan);
247
+ // Show summary
248
+ MessageFormatter.info(`Summary → ➕ ${result.summary.created} | 🔧 ${result.summary.updated} | ⏭️ ${result.summary.skipped}`, { prefix: 'Indexes' });
249
+ // Handle errors if any
250
+ if (result.errors.length > 0) {
251
+ MessageFormatter.error(`${result.errors.length} index operations failed:`, undefined, { prefix: 'Indexes' });
252
+ for (const error of result.errors) {
253
+ MessageFormatter.error(` ${error.key}: ${error.error}`, undefined, { prefix: 'Indexes' });
254
+ }
255
+ }
256
+ }
257
+ catch (error) {
258
+ MessageFormatter.error('Failed to process indexes', error instanceof Error ? error : new Error(String(error)), { prefix: 'Indexes' });
259
+ throw error;
260
+ }
261
+ }
262
+ /**
263
+ * Handle index deletions for obsolete indexes
264
+ */
265
+ export async function deleteObsoleteIndexesViaAdapter(adapter, databaseId, tableId, desiredIndexKeys) {
266
+ try {
267
+ // Get existing indexes
268
+ const existingIdxRes = await adapter.listIndexes({ databaseId, tableId });
269
+ const existingIndexes = existingIdxRes.data || existingIdxRes.indexes || [];
270
+ // Plan deletions
271
+ const deletions = planIndexDeletions(desiredIndexKeys, existingIndexes);
272
+ if (deletions.length === 0) {
273
+ MessageFormatter.info('Plan → 🗑️ 0 indexes', { prefix: 'Indexes' });
274
+ return;
275
+ }
276
+ // Show deletion plan
277
+ MessageFormatter.info(`Plan → 🗑️ ${deletions.length} (${deletions.map(op => op.index.key).join(', ')})`, { prefix: 'Indexes' });
278
+ // Execute deletions
279
+ const result = await executeIndexDeletions(adapter, databaseId, tableId, deletions);
280
+ // Show results
281
+ if (result.deleted.length > 0) {
282
+ MessageFormatter.success(`Deleted ${result.deleted.length} indexes: ${result.deleted.join(', ')}`, { prefix: 'Indexes' });
283
+ }
284
+ if (result.errors.length > 0) {
285
+ MessageFormatter.error(`${result.errors.length} index deletions failed:`, undefined, { prefix: 'Indexes' });
286
+ for (const error of result.errors) {
287
+ MessageFormatter.error(` ${error.key}: ${error.error}`, undefined, { prefix: 'Indexes' });
288
+ }
289
+ }
290
+ }
291
+ catch (error) {
292
+ MessageFormatter.warning(`Could not evaluate index deletions: ${error?.message || error}`, { prefix: 'Indexes' });
293
+ }
294
+ }
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { ValidationRules } from "./utils/validationRules.js";
1
+ export type { ValidationRules } from "@njdamstra/appwrite-utils-helpers";
2
2
  export { type AuthUserCreate, AuthUserCreateSchema, type AuthUser, AuthUserSchema, } from "./schemas/authUser.js";
3
- export { validationRules } from "./utils/validationRules.js";
3
+ export { validationRules } from "@njdamstra/appwrite-utils-helpers";
4
4
  export { afterImportActions } from "./migrations/afterImportActions.js";
package/dist/types.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { AuthUserCreateSchema, AuthUserSchema, } from "./schemas/authUser.js";
2
- export { validationRules } from "./utils/validationRules.js";
2
+ export { validationRules } from "@njdamstra/appwrite-utils-helpers";
3
3
  export { afterImportActions } from "./migrations/afterImportActions.js";
@@ -1,11 +1,10 @@
1
1
  import { AppwriteException, Databases, ID, Query, Users, } from "node-appwrite";
2
2
  import { AuthUserSchema, } from "../schemas/authUser.js";
3
- import { logger } from "../shared/logging.js";
3
+ import { logger, MessageFormatter } from "@njdamstra/appwrite-utils-helpers";
4
4
  import { splitIntoBatches } from "../shared/migrationHelpers.js";
5
- import { getAppwriteClient, tryAwaitWithRetry, } from "../utils/helperFunctions.js";
5
+ import { getAppwriteClient, tryAwaitWithRetry, } from "@njdamstra/appwrite-utils-helpers";
6
6
  import { isUndefined } from "es-toolkit/compat";
7
7
  import { isEmpty } from "es-toolkit/compat";
8
- import { MessageFormatter } from "../shared/messageFormatter.js";
9
8
  export class UsersController {
10
9
  config;
11
10
  users;
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from "fs";
2
2
  import path from "path";
3
3
  import { existsSync } from "fs";
4
- import { MessageFormatter } from "../shared/messageFormatter.js";
4
+ import { MessageFormatter } from "@njdamstra/appwrite-utils-helpers";
5
5
  import { ConfirmationDialogs } from "../shared/confirmationDialogs.js";
6
6
  import yaml from "js-yaml";
7
7
  export async function migrateConfig(workingDir) {
@@ -1,2 +1,2 @@
1
- export * from "./helperFunctions.js";
1
+ export * from '@njdamstra/appwrite-utils-helpers';
2
2
  export * from "./setupFiles.js";
@@ -1,2 +1,2 @@
1
- export * from "./helperFunctions.js";
1
+ export * from '@njdamstra/appwrite-utils-helpers';
2
2
  export * from "./setupFiles.js";
@@ -1,5 +1,5 @@
1
1
  import { type AppwriteConfig } from "@njdamstra/appwrite-utils";
2
- import { type ValidationResult } from "../config/configValidation.js";
2
+ import { type ValidationResult } from "@njdamstra/appwrite-utils-helpers";
3
3
  /**
4
4
  * Session authentication preservation options for config loading
5
5
  */
@@ -28,7 +28,7 @@ export interface ConfigLoadingOptions {
28
28
  * @returns SessionPreservationOptions object
29
29
  */
30
30
  export declare function createSessionPreservation(sessionCookie: string, email?: string, expiresAt?: string): SessionPreservationOptions;
31
- export { findAppwriteConfig, findFunctionsDir } from "./configDiscovery.js";
31
+ export { findAppwriteConfig, findFunctionsDir } from '@njdamstra/appwrite-utils-helpers';
32
32
  /**
33
33
  * Loads the Appwrite configuration and returns both config and the path where it was found.
34
34
  * @param configDir The directory to search for config files.
@@ -4,12 +4,11 @@ import {} from "@njdamstra/appwrite-utils";
4
4
  import { register } from "tsx/esm/api"; // Import the register function
5
5
  import { pathToFileURL } from "node:url";
6
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";
7
+ import { findYamlConfig, loadYamlConfig, loadYamlConfigWithSession, extractSessionOptionsFromConfig, validateCollectionsTablesConfig, reportValidationResults } from "@njdamstra/appwrite-utils-helpers";
8
+ import { detectAppwriteVersionCached, fetchServerVersion, isVersionAtLeast } from '@njdamstra/appwrite-utils-helpers';
9
+ import { MessageFormatter } from "@njdamstra/appwrite-utils-helpers";
10
+ import { resolveCollectionsDir, resolveTablesDir } from '@njdamstra/appwrite-utils-helpers';
11
+ import { findAppwriteConfig, findAppwriteConfigTS, findFunctionsDir, discoverCollections, discoverTables, discoverLegacyDirectory } from '@njdamstra/appwrite-utils-helpers';
13
12
  /**
14
13
  * Helper function to create session preservation options from session data
15
14
  * @param sessionCookie The session cookie string
@@ -28,7 +27,7 @@ export function createSessionPreservation(sessionCookie, email, expiresAt) {
28
27
  };
29
28
  }
30
29
  // Re-export config discovery functions for backward compatibility
31
- export { findAppwriteConfig, findFunctionsDir } from "./configDiscovery.js";
30
+ export { findAppwriteConfig, findFunctionsDir } from '@njdamstra/appwrite-utils-helpers';
32
31
  /**
33
32
  * Loads the Appwrite configuration and returns both config and the path where it was found.
34
33
  * @param configDir The directory to search for config files.
@@ -1,15 +1,13 @@
1
1
  import { mkdirSync, writeFileSync, existsSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { findAppwriteConfig } from "./loadConfigs.js";
4
- import { loadYamlConfig } from "../config/yamlConfig.js";
5
- import { fetchServerVersion, isVersionAtLeast } from "./versionDetection.js";
6
- import { findYamlConfig } from "../config/yamlConfig.js";
4
+ import { loadYamlConfig, findYamlConfig, generateYamlConfigTemplate } from "@njdamstra/appwrite-utils-helpers";
5
+ import { fetchServerVersion, isVersionAtLeast } from '@njdamstra/appwrite-utils-helpers';
7
6
  import { ID } from "node-appwrite";
8
7
  import { ulid } from "ulidx";
9
- import { generateYamlConfigTemplate } from "../config/yamlConfig.js";
10
- import { loadAppwriteProjectConfig, findAppwriteProjectConfig, getProjectDirectoryName, isTablesDBProject } from "./projectConfig.js";
11
- import { hasSessionAuth, getSessionAuth } from "./sessionAuth.js";
12
- import { MessageFormatter } from "../shared/messageFormatter.js";
8
+ import { loadAppwriteProjectConfig, findAppwriteProjectConfig, getProjectDirectoryName, isTablesDBProject } from '@njdamstra/appwrite-utils-helpers';
9
+ import { hasSessionAuth, getSessionAuth } from '@njdamstra/appwrite-utils-helpers';
10
+ import { MessageFormatter } from "@njdamstra/appwrite-utils-helpers";
13
11
  // Example base configuration using types from appwrite-utils
14
12
  const baseConfig = {
15
13
  appwriteEndpoint: "https://cloud.appwrite.io/v1",
@@ -2,8 +2,8 @@ import { Client, Databases, Storage, type Models } from "node-appwrite";
2
2
  import { type AppwriteConfig, type AppwriteFunction, type Specification } from "@njdamstra/appwrite-utils";
3
3
  import { type AfterImportActions, type ConverterFunctions, type ValidationRules } from "@njdamstra/appwrite-utils";
4
4
  import { type TransferOptions } from "./migrations/transfer.js";
5
- import type { DatabaseAdapter } from './adapters/DatabaseAdapter.js';
6
- import { type ValidationResult } from "./config/configValidation.js";
5
+ import type { DatabaseAdapter } from '@njdamstra/appwrite-utils-helpers';
6
+ import { type ValidationResult } from "@njdamstra/appwrite-utils-helpers";
7
7
  import type { DatabaseSelection, BucketSelection } from "./shared/selectionDialogs.js";
8
8
  export interface SetupOptions {
9
9
  databases?: Models.Database[];
@@ -19,6 +19,18 @@ export interface SetupOptions {
19
19
  checkDuplicates?: boolean;
20
20
  shouldWriteFile?: boolean;
21
21
  }
22
+ export interface ControllerInitOptions {
23
+ validate?: boolean;
24
+ strictMode?: boolean;
25
+ useSession?: boolean;
26
+ sessionCookie?: string;
27
+ preferJson?: boolean;
28
+ overrides?: {
29
+ appwriteEndpoint?: string;
30
+ appwriteProject?: string;
31
+ appwriteKey?: string;
32
+ };
33
+ }
22
34
  export declare class UtilsController {
23
35
  private static instance;
24
36
  private isInitialized;
@@ -50,12 +62,7 @@ export declare class UtilsController {
50
62
  appwriteProject?: string;
51
63
  appwriteKey?: string;
52
64
  });
53
- init(options?: {
54
- validate?: boolean;
55
- strictMode?: boolean;
56
- useSession?: boolean;
57
- sessionCookie?: string;
58
- }): Promise<void>;
65
+ init(options?: ControllerInitOptions): Promise<void>;
59
66
  reloadConfig(): Promise<void>;
60
67
  ensureDatabaseConfigBucketsExist(databases?: Models.Database[]): Promise<void>;
61
68
  ensureDatabasesExist(databases?: Models.Database[]): Promise<void>;