appwrite-utils-cli 0.0.286 → 0.9.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 (109) hide show
  1. package/README.md +122 -96
  2. package/dist/collections/attributes.d.ts +4 -0
  3. package/dist/collections/attributes.js +224 -0
  4. package/dist/collections/indexes.d.ts +4 -0
  5. package/dist/collections/indexes.js +27 -0
  6. package/dist/collections/methods.d.ts +16 -0
  7. package/dist/collections/methods.js +216 -0
  8. package/dist/databases/methods.d.ts +6 -0
  9. package/dist/databases/methods.js +33 -0
  10. package/dist/interactiveCLI.d.ts +19 -0
  11. package/dist/interactiveCLI.js +555 -0
  12. package/dist/main.js +227 -62
  13. package/dist/migrations/afterImportActions.js +37 -40
  14. package/dist/migrations/appwriteToX.d.ts +26 -25
  15. package/dist/migrations/appwriteToX.js +42 -6
  16. package/dist/migrations/attributes.js +21 -20
  17. package/dist/migrations/backup.d.ts +93 -87
  18. package/dist/migrations/collections.d.ts +6 -0
  19. package/dist/migrations/collections.js +149 -20
  20. package/dist/migrations/converters.d.ts +2 -18
  21. package/dist/migrations/converters.js +13 -2
  22. package/dist/migrations/dataLoader.d.ts +276 -161
  23. package/dist/migrations/dataLoader.js +535 -292
  24. package/dist/migrations/databases.js +8 -2
  25. package/dist/migrations/helper.d.ts +3 -0
  26. package/dist/migrations/helper.js +21 -0
  27. package/dist/migrations/importController.d.ts +5 -2
  28. package/dist/migrations/importController.js +125 -88
  29. package/dist/migrations/importDataActions.d.ts +9 -1
  30. package/dist/migrations/importDataActions.js +15 -3
  31. package/dist/migrations/indexes.js +3 -2
  32. package/dist/migrations/logging.js +20 -8
  33. package/dist/migrations/migrationHelper.d.ts +9 -4
  34. package/dist/migrations/migrationHelper.js +6 -5
  35. package/dist/migrations/openapi.d.ts +1 -1
  36. package/dist/migrations/openapi.js +33 -18
  37. package/dist/migrations/queue.js +3 -2
  38. package/dist/migrations/relationships.d.ts +2 -2
  39. package/dist/migrations/schemaStrings.js +53 -41
  40. package/dist/migrations/setupDatabase.d.ts +2 -4
  41. package/dist/migrations/setupDatabase.js +24 -105
  42. package/dist/migrations/storage.d.ts +3 -1
  43. package/dist/migrations/storage.js +110 -16
  44. package/dist/migrations/transfer.d.ts +30 -0
  45. package/dist/migrations/transfer.js +337 -0
  46. package/dist/migrations/users.d.ts +2 -1
  47. package/dist/migrations/users.js +78 -43
  48. package/dist/schemas/authUser.d.ts +2 -2
  49. package/dist/storage/methods.d.ts +15 -0
  50. package/dist/storage/methods.js +207 -0
  51. package/dist/storage/schemas.d.ts +687 -0
  52. package/dist/storage/schemas.js +175 -0
  53. package/dist/utils/getClientFromConfig.d.ts +4 -0
  54. package/dist/utils/getClientFromConfig.js +16 -0
  55. package/dist/utils/helperFunctions.d.ts +11 -1
  56. package/dist/utils/helperFunctions.js +38 -0
  57. package/dist/utils/retryFailedPromises.d.ts +2 -0
  58. package/dist/utils/retryFailedPromises.js +21 -0
  59. package/dist/utils/schemaStrings.d.ts +13 -0
  60. package/dist/utils/schemaStrings.js +403 -0
  61. package/dist/utils/setupFiles.js +110 -61
  62. package/dist/utilsController.d.ts +40 -22
  63. package/dist/utilsController.js +164 -84
  64. package/package.json +13 -15
  65. package/src/collections/attributes.ts +483 -0
  66. package/src/collections/indexes.ts +53 -0
  67. package/src/collections/methods.ts +331 -0
  68. package/src/databases/methods.ts +47 -0
  69. package/src/init.ts +64 -64
  70. package/src/interactiveCLI.ts +767 -0
  71. package/src/main.ts +292 -83
  72. package/src/migrations/afterImportActions.ts +553 -490
  73. package/src/migrations/appwriteToX.ts +237 -174
  74. package/src/migrations/attributes.ts +483 -422
  75. package/src/migrations/backup.ts +205 -205
  76. package/src/migrations/collections.ts +545 -300
  77. package/src/migrations/converters.ts +161 -150
  78. package/src/migrations/dataLoader.ts +1615 -1304
  79. package/src/migrations/databases.ts +44 -25
  80. package/src/migrations/dbHelpers.ts +92 -92
  81. package/src/migrations/helper.ts +40 -0
  82. package/src/migrations/importController.ts +448 -384
  83. package/src/migrations/importDataActions.ts +315 -307
  84. package/src/migrations/indexes.ts +40 -37
  85. package/src/migrations/logging.ts +29 -16
  86. package/src/migrations/migrationHelper.ts +207 -201
  87. package/src/migrations/openapi.ts +83 -70
  88. package/src/migrations/queue.ts +118 -119
  89. package/src/migrations/relationships.ts +324 -324
  90. package/src/migrations/schemaStrings.ts +472 -460
  91. package/src/migrations/setupDatabase.ts +118 -219
  92. package/src/migrations/storage.ts +538 -358
  93. package/src/migrations/transfer.ts +608 -0
  94. package/src/migrations/users.ts +362 -285
  95. package/src/migrations/validationRules.ts +63 -63
  96. package/src/schemas/authUser.ts +23 -23
  97. package/src/setup.ts +8 -8
  98. package/src/storage/methods.ts +371 -0
  99. package/src/storage/schemas.ts +205 -0
  100. package/src/types.ts +9 -9
  101. package/src/utils/getClientFromConfig.ts +17 -0
  102. package/src/utils/helperFunctions.ts +181 -127
  103. package/src/utils/index.ts +2 -2
  104. package/src/utils/loadConfigs.ts +59 -59
  105. package/src/utils/retryFailedPromises.ts +27 -0
  106. package/src/utils/schemaStrings.ts +473 -0
  107. package/src/utils/setupFiles.ts +228 -182
  108. package/src/utilsController.ts +325 -194
  109. package/tsconfig.json +37 -37
package/src/main.ts CHANGED
@@ -1,83 +1,292 @@
1
- #!/usr/bin/env node
2
- import { program } from "commander";
3
- import { UtilsController } from "./utilsController.js";
4
-
5
- // Setup the main CLI program
6
- program
7
- .version("1.0.0")
8
- .description("Utility CLI for Appwrite configurations and operations")
9
- .option("--endpoint <endpoint>", "Set the Appwrite endpoint", undefined)
10
- .option("--project <project>", "Set the Appwrite project ID", undefined)
11
- .option("--key <key>", "Set the Appwrite API key", undefined)
12
- .option("--backup", "Perform a backup before executing the command", false)
13
- .option("--dev", "Run in development environment", false)
14
- .option("--prod", "Run in production environment", false)
15
- .option("--staging", "Run in staging environment", false)
16
- .option("--sync", "Synchronize configurations", false)
17
- .option("--wipe", "Wipe databases", false)
18
- .option("--wipe-docs", "Wipe documents", false)
19
- .option("--wipe-users", "Wipe users", false)
20
- .option("--generate", "Generate schemas", false)
21
- .option("--import", "Import data", false)
22
- .option("--write-data", "Write data to file", false)
23
- .option("-h, --help", "Display help for command", false);
24
-
25
- program.on("--help", () => {
26
- console.log("");
27
- console.log("Examples:");
28
- console.log(
29
- " $ npx appwrite-utils-cli appwrite-migrate --sync --endpoint https://appwrite.example.com --project 123456 --key 7890"
30
- );
31
- console.log(
32
- " $ npx appwrite-utils-cli appwrite-migrate --sync --dev --backup"
33
- );
34
- console.log(
35
- " $ npx appwrite-utils-cli appwrite-migrate --wipe --wipe-docs --wipe-users --dev"
36
- );
37
- console.log(
38
- " $ npx appwrite-utils-cli appwrite-migrate --generate --import --write-data --dev"
39
- );
40
- console.log(
41
- " $ npx appwrite-utils-cli appwrite-migrate --sync --generate --import --write-data --dev --backup"
42
- );
43
- console.log(" $ npx appwrite-utils-cli appwrite-create");
44
- console.log(
45
- "For more information, visit https://github.com/zachhandley/appwrite-utils"
46
- );
47
- console.log("");
48
- });
49
-
50
- // Parse and handle options
51
- program.action(async (options) => {
52
- const currentUserDir = process.cwd();
53
- const controller = new UtilsController(currentUserDir);
54
- try {
55
- // Convert Commander options to the format expected by UtilsController
56
- const setupOptions = {
57
- sync: options.sync,
58
- runProd: options.prod,
59
- runStaging: options.staging,
60
- runDev: options.dev,
61
- doBackup: options.backup,
62
- wipeDatabases: options.wipe,
63
- wipeDocumentStorage: options.wipeDocs,
64
- wipeUsers: options.wipeUsers,
65
- generateSchemas: options.generate,
66
- generateMockData: false, // Assuming this needs to be set based on other conditions
67
- importData: options.import,
68
- checkDuplicates: false, // Assuming this needs to be set based on other conditions
69
- shouldWriteFile: options.writeData,
70
- endpoint: options.endpoint,
71
- project: options.project,
72
- key: options.key,
73
- };
74
- console.log("Running operation...", setupOptions);
75
-
76
- await controller.run(setupOptions);
77
- console.log("Operation completed successfully.");
78
- } catch (error) {
79
- console.error("Error during operation:", error);
80
- }
81
- });
82
-
83
- program.parse(process.argv);
1
+ #!/usr/bin/env node
2
+ import yargs from "yargs";
3
+ import { type ArgumentsCamelCase } from "yargs";
4
+ import { hideBin } from "yargs/helpers";
5
+ import { InteractiveCLI } from "./interactiveCLI.js";
6
+ import { UtilsController, type SetupOptions } from "./utilsController.js";
7
+ import type { TransferOptions } from "./migrations/transfer.js";
8
+ import { Databases, Storage, type Models } from "node-appwrite";
9
+ import { getClient } from "./utils/getClientFromConfig.js";
10
+
11
+ interface CliOptions {
12
+ it?: boolean;
13
+ dbIds?: string;
14
+ collectionIds?: string;
15
+ bucketIds?: string;
16
+ wipe?: "all" | "docs" | "users";
17
+ generate?: boolean;
18
+ import?: boolean;
19
+ backup?: boolean;
20
+ writeData?: boolean;
21
+ push?: boolean;
22
+ sync?: boolean;
23
+ endpoint?: string;
24
+ projectId?: string;
25
+ apiKey?: string;
26
+ transfer?: boolean;
27
+ fromDbId?: string;
28
+ toDbId?: string;
29
+ fromCollectionId?: string;
30
+ toCollectionId?: string;
31
+ fromBucketId?: string;
32
+ toBucketId?: string;
33
+ remoteEndpoint?: string;
34
+ remoteProjectId?: string;
35
+ remoteApiKey?: string;
36
+ }
37
+
38
+ type ParsedArgv = ArgumentsCamelCase<CliOptions>;
39
+
40
+ const argv = yargs(hideBin(process.argv))
41
+ .command("migrate", "Run Appwrite migrations", (yargs) => {
42
+ return yargs
43
+ .option("it", {
44
+ alias: ["interactive", "i"],
45
+ type: "boolean",
46
+ description: "Run in interactive mode",
47
+ })
48
+ .option("dbIds", {
49
+ type: "string",
50
+ description: "Comma-separated list of database IDs to operate on",
51
+ })
52
+ .option("collectionIds", {
53
+ alias: ["collIds"],
54
+ type: "string",
55
+ description: "Comma-separated list of collection IDs to operate on",
56
+ })
57
+ .option("bucketIds", {
58
+ type: "string",
59
+ description: "Comma-separated list of bucket IDs to operate on",
60
+ })
61
+ .option("wipe", {
62
+ choices: ["all", "docs", "users"] as const,
63
+ description:
64
+ "Wipe data (all: everything, docs: only documents, users: only user data)",
65
+ })
66
+ .option("generate", {
67
+ type: "boolean",
68
+ description: "Generate TypeScript schemas from database schemas",
69
+ })
70
+ .option("import", {
71
+ type: "boolean",
72
+ description: "Import data into your databases",
73
+ })
74
+ .option("backup", {
75
+ type: "boolean",
76
+ description: "Perform a backup of your databases",
77
+ })
78
+ .option("writeData", {
79
+ type: "boolean",
80
+ description: "Write converted imported data to file",
81
+ })
82
+ .option("push", {
83
+ type: "boolean",
84
+ description:
85
+ "Push your local Appwrite config to your configured Appwrite Project",
86
+ })
87
+ .option("sync", {
88
+ type: "boolean",
89
+ description:
90
+ "Synchronize by pulling your Appwrite config from your configured Appwrite Project",
91
+ })
92
+ .option("endpoint", {
93
+ type: "string",
94
+ description: "Set the Appwrite endpoint",
95
+ })
96
+ .option("projectId", {
97
+ type: "string",
98
+ description: "Set the Appwrite project ID",
99
+ })
100
+ .option("apiKey", {
101
+ type: "string",
102
+ description: "Set the Appwrite API key",
103
+ })
104
+ .option("transfer", {
105
+ type: "boolean",
106
+ description: "Transfer data between databases or collections",
107
+ })
108
+ .option("fromDbId", {
109
+ alias: ["fromDb"],
110
+ type: "string",
111
+ description: "Set the source database ID for transfer",
112
+ })
113
+ .option("toDbId", {
114
+ alias: ["toDb"],
115
+ type: "string",
116
+ description: "Set the destination database ID for transfer",
117
+ })
118
+ .option("fromCollectionId", {
119
+ alias: ["fromCollId", "fromColl"],
120
+ type: "string",
121
+ description: "Set the source collection ID for transfer",
122
+ })
123
+ .option("toCollectionId", {
124
+ alias: ["toCollId", "toColl"],
125
+ type: "string",
126
+ description: "Set the destination collection ID for transfer",
127
+ })
128
+ .option("fromBucketId", {
129
+ alias: ["fromBucket"],
130
+ type: "string",
131
+ description: "Set the source bucket ID for transfer",
132
+ })
133
+ .option("toBucketId", {
134
+ alias: ["toBucket"],
135
+ type: "string",
136
+ description: "Set the destination bucket ID for transfer",
137
+ })
138
+ .option("remoteEndpoint", {
139
+ type: "string",
140
+ description: "Set the remote Appwrite endpoint for transfers",
141
+ })
142
+ .option("remoteProjectId", {
143
+ type: "string",
144
+ description: "Set the remote Appwrite project ID for transfers",
145
+ })
146
+ .option("remoteApiKey", {
147
+ type: "string",
148
+ description: "Set the remote Appwrite API key for transfers",
149
+ });
150
+ })
151
+ .help()
152
+ .parse();
153
+
154
+ async function main() {
155
+ const parsedArgv = (await argv) as ParsedArgv;
156
+ const controller = new UtilsController(process.cwd());
157
+ await controller.init();
158
+
159
+ if (parsedArgv.it) {
160
+ const cli = new InteractiveCLI(process.cwd(), controller);
161
+ await cli.run();
162
+ } else {
163
+ // Handle non-interactive mode with the new options
164
+ const options: SetupOptions = {
165
+ databases: parsedArgv.dbIds
166
+ ? await controller.getDatabasesByIds(
167
+ parsedArgv.dbIds.replace(" ", "").split(",")
168
+ )
169
+ : undefined,
170
+ collections: parsedArgv.collectionIds
171
+ ? parsedArgv.collectionIds.replace(" ", "").split(",")
172
+ : undefined,
173
+ doBackup: parsedArgv.backup,
174
+ wipeDatabase: parsedArgv.wipe === "all" || parsedArgv.wipe === "docs",
175
+ wipeDocumentStorage: parsedArgv.wipe === "all",
176
+ wipeUsers: parsedArgv.wipe === "all" || parsedArgv.wipe === "users",
177
+ generateSchemas: parsedArgv.generate,
178
+ importData: parsedArgv.import,
179
+ checkDuplicates: false,
180
+ shouldWriteFile: parsedArgv.writeData,
181
+ };
182
+
183
+ if (parsedArgv.push) {
184
+ await controller.syncDb();
185
+ }
186
+
187
+ if (
188
+ options.wipeDatabase ||
189
+ options.wipeDocumentStorage ||
190
+ options.wipeUsers
191
+ ) {
192
+ if (options.wipeDatabase) {
193
+ for (const db of options.databases || []) {
194
+ await controller.wipeDatabase(db);
195
+ }
196
+ }
197
+ if (options.wipeDocumentStorage && parsedArgv.bucketIds) {
198
+ for (const bucketId of parsedArgv.bucketIds.split(",")) {
199
+ await controller.wipeDocumentStorage(bucketId);
200
+ }
201
+ }
202
+ if (options.wipeUsers) {
203
+ await controller.wipeUsers();
204
+ }
205
+ }
206
+
207
+ if (options.doBackup) {
208
+ for (const db of options.databases || []) {
209
+ await controller.backupDatabase(db);
210
+ }
211
+ }
212
+
213
+ if (options.generateSchemas) {
214
+ await controller.generateSchemas();
215
+ }
216
+
217
+ if (options.importData) {
218
+ await controller.importData(options);
219
+ }
220
+
221
+ if (parsedArgv.transfer) {
222
+ const isRemote = !!parsedArgv.remoteEndpoint;
223
+ const fromDb = await controller.getDatabasesByIds([parsedArgv.fromDbId!]);
224
+ let toDb: Models.Database | undefined;
225
+ let targetDatabases: Databases | undefined;
226
+ let targetStorage: Storage | undefined;
227
+
228
+ if (isRemote) {
229
+ if (
230
+ !parsedArgv.remoteEndpoint ||
231
+ !parsedArgv.remoteProjectId ||
232
+ !parsedArgv.remoteApiKey
233
+ ) {
234
+ throw new Error("Remote transfer details are missing");
235
+ }
236
+ const remoteClient = getClient(
237
+ parsedArgv.remoteEndpoint,
238
+ parsedArgv.remoteProjectId,
239
+ parsedArgv.remoteApiKey
240
+ );
241
+ targetDatabases = new Databases(remoteClient);
242
+ targetStorage = new Storage(remoteClient);
243
+ const remoteDbs = await targetDatabases.list();
244
+ toDb = remoteDbs.databases.find((db) => db.$id === parsedArgv.toDbId);
245
+ } else {
246
+ toDb = (await controller.getDatabasesByIds([parsedArgv.toDbId!]))[0];
247
+ }
248
+
249
+ if (!fromDb[0] || !toDb) {
250
+ throw new Error("Source or target database not found");
251
+ }
252
+
253
+ let sourceBucket, targetBucket;
254
+ if (parsedArgv.fromBucketId) {
255
+ sourceBucket = await controller.storage?.getBucket(
256
+ parsedArgv.fromBucketId
257
+ );
258
+ }
259
+ if (parsedArgv.toBucketId) {
260
+ if (isRemote) {
261
+ targetBucket = await targetStorage?.getBucket(parsedArgv.toBucketId);
262
+ } else {
263
+ targetBucket = await controller.storage?.getBucket(
264
+ parsedArgv.toBucketId
265
+ );
266
+ }
267
+ }
268
+
269
+ const transferOptions: TransferOptions = {
270
+ isRemote,
271
+ fromDb: fromDb[0],
272
+ targetDb: toDb,
273
+ transferEndpoint: parsedArgv.remoteEndpoint,
274
+ transferProject: parsedArgv.remoteProjectId,
275
+ transferKey: parsedArgv.remoteApiKey,
276
+ sourceBucket: sourceBucket,
277
+ targetBucket: targetBucket,
278
+ };
279
+
280
+ await controller.transferData(transferOptions);
281
+ }
282
+
283
+ if (parsedArgv.sync) {
284
+ await controller.synchronizeConfigurations(options.databases);
285
+ }
286
+ }
287
+ }
288
+
289
+ main().catch((error) => {
290
+ console.error("An error occurred:", error);
291
+ process.exit(1);
292
+ });